SQL

Posted czg-0705

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL相关的知识,希望对你有一定的参考价值。

SQL:

数据类型

数值类:

字符串:

Int 2个字节

Shall 四个字节

数据定义语言( DDL),包括 CREATE(创建)命令、 ALTER(修改)命令、 DROP(删

除)命令等。

数据操纵语言( DML),包括 INSERT(插入)命令、 UPDATE(更新)命令、 DELETE

(删除)命令、 SELECT … FOR UPDATE(查询)等。

数据查询语言( DQL),包括基本查询语句、 Order By 子句、 Group By 子句等。

事务控制语言( TCL),包括 COMMIT(提交)命令、 SAVEPOINT(保存点)命令、

ROLLBACK(回滚)命令。

数据控制语言( DCL), GRANT(授权)命令、 REVOKE(撤销)命令。

Oracle 数据库的核心是表,表中的列使用到的常见数据类型如下:

类型 含义

CHAR(length) 存储固定长度的字符串。参数 length 指定了长度,如果存储的字符串长

度小于 length,用空格填充。默认长度是 1,最长不超过 2000 字节。

VARCHAR2(length) 存储可变长度的字符串。 length 指定了该字符串的最大长度。默认长度

是 1,最长不超过 4000 字符。

NUMBER(p, s) 既可以存储浮点数,也可以存储整数, p 表示数字的最大位数(如果是小数包括整数部分和小数部分和小数点, p 默认是 38 为), s 是指小数位数。

DATE 存储日期和时间, 存储纪元、 4 位年、月、日、时、分、秒,存储时间从公元前 4712 年 1 月 1 日到公元后 4712 年 12 月 31 日。

TIMESTAMP 不但存储日期的年月日,时分秒,以及秒后 6 位,同时包含时区。

CLOB 存储大的文本,比如存储非结构化的 XML 文档

BLOB 存储二进制对象,如图形、视频、声音等。

对应 NUMBER 类型的示例:

格式 输入的数字 实际的存储

NUMBER           1234.567   1234.567

NUMBER( 6, 2) 123.4567   123.46

NUMBER( 4, 2) 12345.67   输入的数字超过了所指定的精度,数据库不能存储

对于日期类型,可以使用 sysdate 内置函数可以获取当前的系统日期和时间,返回 DATE

类型,用 systimestamp 函数可以返回当前日期、时间和时区。

SELECT SYSDATE,SYSTIMESTAMP FROM DUAL

dual 表在系统中只有一行一列,某些时候为了输出常量而使用dual,实际上dual并不提供数据,仅仅为了满足from的存在

复制表格和数据

CREATE TABLE maleStu AS

SELECT * FROM student where ssex=‘男‘;

仅仅复制表格,但不填入数据

CREATE TABLE maleStu AS SELECT * FROM student where 1=2;

一次插入多条数据

INSERT INTO maleStu SELECT * FROM student;

select sname into myname from student where sid=10002

select sid,to_char(birthday,‘ddmmyy‘) from stu

指定日期和时间,并转换为DATE格式

TO_DATE(‘1909 08 09 06:30:10‘,‘ YYYY MM DD HH24:MI:SS‘)

alter   session   set   nls_date_format=‘yyyy-mm-dd‘;

在 Oracle 中,日期是国际化的,不同的区域安装的数据库,默认的日期格式不同,

因此为了程序便于移植,日期的输入要使用 TO_DATE 函数对日期格式化后输入,采

用格式化字符串对日期进行格式化时,格式化字符串中字符不区分大小写,常见的

格式化字符如下:

1. yyyy 表示四位年份

2. mm 表示两位月份,比如 3 月表示为 03

3. dd 表示两位日期

4. hh24 表示小时从 0-23, hh12 也表示小时从 0-11。

5. mi 表示分钟

6. ss 表示秒

select sysdate from dual

SELECT DATEPART(HH,GETDATE()) from dual

SELECT DATEADD (hh,12,getdate()) from dual

Oracle 中的算术运算符,没有 C#中的算术运算符丰富,只有+、 -、 *、 /四个,其中除号

(/)的结果是浮点数。求余运算只能借助函数: MOD(x,y):返回 x 除以 y 的余数。

select mod(10,3) from dual

在 Oracle 中,字符串的连接用双竖线( ||)表示

select (sname||‘是‘||ssex||‘同学‘) as 信息描述 from student where ssex=‘男‘

sql%rowcount,sql%found、sql%notfound、sql%isopen

sql%rowcount用于记录修改的条数,就如你在sqlplus下执行delete from之后提示已删除xx行一样,这个参数必须要在一个修改语句和commit之间放置,否则你就得不到正确的修改行数。

在执行DML(insert,update,delete)语句时,可以用到以下三个隐式游标(游标是维护查询结果的内存中的一个区域,运行DML时打开,完成时关闭,用sql%isopen检查是否打开):

if sql%rowcount = 0 then

    dbms_output.put_line(‘部门删除失败...‘);

end if;

或者

if sql%notfound then

    dbms_output.put_line(‘部门删除失败...‘);

end if;

VNL函数

NVL(eExpression1, eExpression2)

如果 eExpression1 的计算结果为 null 值,则 NVL( ) 返回 eExpression2。如果 eExpression1 的计算结果不是 null 值,则返回 eExpression1。eExpression1 和 eExpression2 可以是任意一种数据类型。如果 eExpression1 与 eExpression2 的结果皆为 null 值,则 NVL( ) 返回 .NULL.。

select case

           when snativeplace=‘南京‘ then ‘江苏‘

           when snativeplace=‘无锡‘ then ‘江苏‘

           when snativeplace=‘合肥‘ then ‘安徽‘

           when snativeplace=‘滁州‘ then ‘安徽‘

           else ‘其他地区‘

         end 省份,count(*) 人数

from student

group by case

           when snativeplace=‘南京‘ then ‘江苏‘

           when snativeplace=‘无锡‘ then ‘江苏‘

           when snativeplace=‘合肥‘ then ‘安徽‘

           when snativeplace=‘滁州‘ then ‘安徽‘

           else ‘其他地区‘

         end

集合运算就是将两个或者多个结果集组合成为一个结果集。集合运算包括:

  INTERSECT(交集),返回两个查询共有的记录。

  UNION ALL(并集),返回各个查询的所有记录,包括重复记录。

  UNION(并集),返回各个查询的所有记录,不包括重复记录。

  MINUS(补集),返回第一个查询检索出的记录减去第二个查询检索出的记录之后剩

余的记录。

当使用集合操作的时候,要注意:查询所返回的列数以及列的类型必须匹配,列名可以

不同。

例如:查询哪个学生没有选课

select sid from student

minus

select distinct sid from mark

insert into newStu

select * from student where sclass=‘1班‘

union

select * from student where sclass=‘2班‘

内联,外联与并列查询的区别

select sname,avg(cmark)

from student s,mark sc

where s.sid=sc.sid

group by s.sid,sname

select sname,avg(cmark)

from student s inner join mark sc on s.sid=sc.sid

group by s.sid,sname

select *

from student s inner join mark sc on s.sid=sc.sid

select *

from student s left outer join mark sc on s.sid=sc.sid

select *

from student s right outer join mark sc on s.sid=sc.sid

select *

from student s full outer join mark sc on s.sid=sc.sid

伪列:rowid、rownum

表中的每一行在数据文件中都有一个物理地址, ROWID 伪列返回的就是该行的物理地

址。使用 ROWID 可以快速的定位表中的某一行。 ROWID 值可以唯一的标识表中的一行

是表格的固有属性,不会随着记录先后顺序的调整而改变

select rowid,s.* from student s order by sage desc

ROWNUM 为结果集中每一行标识一个行号,rownum是在from子句执行时动态生成

select * from student where rownum<5

找出学生表中第6到第10条记录

delete用于逐行删除,速度较慢,但是可以回滚,属于DML语句

如:

savepoint beforedel;--创建复原点

delete from student where sname=‘张三‘;

select * from student where sname=‘张三‘;

rollback to beforedel;--回滚数据

select * from student where sname=‘张三‘

而truncate用于块删除,可以迅速删除表格所有数据,

但是无法恢复数据,回滚无效,属于DDL

truncate table student

字符函数

字符函数接受字符参数,这些参数可以是表中的列,也可以是一个字符串表达式。 下表

列出了常用的字符函数。

函数 说明

ASCII(x) 返回字符 x 的 ASCII 码。

CONCAT(x,y) 连接字符串 x 和 y。

INSTR(x, str [,start] [,n])

在 x 中查找 str,可以指定从 start 开始,也可以指定从

第 n 次开始。

select instr(‘hello world‘,‘world‘) from dual

LENGTH(x) 返回 x 的长度。

LOWER(x) x 转换为小写。

UPPER(x) x 转换为大写。

LTRIM(x[,trim_str]) 把 x 的左边截去 trim_str 字符串,缺省截去空格。

RTRIM(x[,trim_str]) 把 x 的右边截去 trim_str 字符串,缺省截去空格。

TRIM([trim_str FROM] x) 把 x 的两边截去 trim_str 字符串,缺省截去空格。

REPLACE(x,old,new) 在 x 中查找 old,并替换为 new。

SUBSTR(x,start[,length]) 返回 x 的字串,从 start 处开始,截取 length 个字符,

缺省 length,默认到结尾。

示例 示例结果

SELECT ASCII(‘a‘) FROM DUAL 97

SELECT CONCAT(‘Hello‘, ‘ world‘) FROM DUAL Hello world

SELECT INSTR(‘Hello world‘, ‘or‘) FROM DUAL 8

SELECT LENGTH(‘Hello‘) FROM DUAL 5

SELECT LOWER(‘hElLO‘) FROM DUAL; hello

SELECT UPPER(‘hello‘) FROM DUAL HELLO

SELECT LTRIM(‘===HELLO===‘, ‘=‘) FROM DUAL HELLO===

SELECT ‘==‘||LTRIM(‘ HELLO===‘) FROM DUAL ==HELLO===

SELECT RTRIM(‘===HELLO===‘, ‘=‘) FROM DUAL ===HELLO

SELECT ‘=‘||TRIM(‘ HELLO ‘)||‘=‘ FROM DUAL =HELLO=

SELECT TRIM(‘=‘ FROM ‘===HELLO===‘);--   FROM DUAL HELLO

SELECT REPLACE(‘ABCDE‘,‘CD‘,‘AAA‘)   FROM DUAL ABAAAE

SELECT SUBSTR(‘ABCDE‘,2) FROM DUAL BCDE

SELECT SUBSTR(‘ABCDE‘,2,3) FROM DUAL BCD

数学函数

数学函数接受数字参数,参数可以来自表中的一列,也可以是一个数字表达式。

函数 说明 示例

ABS(x) x 绝对值 ABS(-3)=3

ACOS(x) x 的反余弦 ACOS(1)=0

COS(x) 余弦 COS(1)=1.57079633

CEIL(x) 大于或等于 x 的最小值 CEIL(5.4)=6

FLOOR(x) 小于或等于 x 的最大值 FLOOR(5.8)=5

LOG(x,y) x 为底 y 的对数 LOG(2,4)=2

MOD(x,y) x 除以 y 的余数 MOD(8,3)=2

POWER(x,y) x 的 y 次幂 POWER(2,3)=8

ROUND(x[,y]) x 在第 y 位四舍五入 ROUND(3.456,2)=3.46

SQRT(x) x 的平方根 SQRT(4)=2

TRUNC(x[,y]) x 在第 y 位截断 TRUNC(3.456,2)=3.45

select dbms_random.value from dual

说明:

1. ROUND(X[,Y]),四舍五入。

在缺省 y 时,默认 y=0;比如: ROUND(3.56)=4。

y 是正整数,就是四舍五入到小数点后 y 位。 ROUND(5.654,2)=5.65。

y 是负整数,四舍五入到小数点左边|y|位。 ROUND(351.654,-2)=400。

2. TRUNC(x[,y]),直接截取,不四舍五入。

在缺省 y 时,默认 y=0;比如: TRUNC (3.56)=3。

y 是正整数,就是四舍五入到小数点后 y 位。 TRUNC (5.654,2)=5.65。

y 是负整数,四舍五入到小数点左边|y|位。 TRUNC (351.654,-2)=300。

日期函数

日期函数对日期进行运算。常用的日期函数有:

1. LAST_DAY(d),返回指定日期当月的最后一天。

select SYSDATE,LAST_DAY(SYSDATE) from dual

2.EXTRACT(fmt FROM d),提取日期中的特定部分。

fmt 为: YEAR、 MONTH、 DAY、 HOUR、 MINUTE、 SECOND。其中 YEAR、 MONTH、 DAY

可以为 DATE 类型匹配,也可以与 TIMESTAMP 类型匹配;但是 HOUR、 MINUTE、 SECOND 必

须与 TIMESTAMP 类型匹配

select SYSDATE 时间,

       EXTRACT(YEAR from SYSDATE) 年,

       EXTRACT(MONTH from SYSDATE) 月,

       EXTRACT(DAY from SYSDATE) 日,

       EXTRACT(HOUR from SYSTIMESTAMP) 时,

       EXTRACT(MINUTE from SYSTIMESTAMP) 分,

       EXTRACT(SECOND from SYSTIMESTAMP) 秒

from dual

select months_between(sysdate,to_date(‘1983-02-20‘,‘yyyy-mm-dd‘))/12 from dual

TO_CHAR(d|n[,fmt])

把日期和数字转换为指定格式的字符串。 fmt 是格式化字符串

针对数字的格式化,格式化字符有:

参数 示例 说明

9       999     指定位置处显示数字。

.       9.9     指定位置返回小数点

,       99,99   指定位置返回一个逗号

$       $999    数字开头返回一个美元符号

EEEE    9.99EEEE 科学计数法表示

L L999 数字前加一个本地货币符号

PR 999PR 如果数字式负数则用尖括号进行表示

    select sysdate,add_months(sysdate,12) from dual;        --加1年

select sysdate,add_months(sysdate,1) from dual;        --加1月

select sysdate,to_char(sysdate+7,‘yyyy-mm-dd HH24:MI:SS‘) from dual;   --加1星期

select sysdate,to_char(sysdate+1,‘yyyy-mm-dd HH24:MI:SS‘) from dual;   --加1天

select sysdate,to_char(sysdate+1/24,‘yyyy-mm-dd HH24:MI:SS‘) from dual;  --加1小时

select sysdate,to_char(sysdate+1/24/60,‘yyyy-mm-dd HH24:MI:SS‘) from dual;  --加1分钟

select sysdate,to_char(sysdate+1/24/60/60,‘yyyy-mm-dd HH24:MI:SS‘) from dual;  --加1秒

  减法

select sysdate,add_months(sysdate,-12) from dual;        --减1年

select sysdate,add_months(sysdate,-1) from dual;        --减1月

select sysdate,to_char(sysdate-7,‘yyyy-mm-dd HH24:MI:SS‘) from dual;   --减1星期

select sysdate,to_char(sysdate-1,‘yyyy-mm-dd HH24:MI:SS‘) from dual;   --减1天

select sysdate,to_char(sysdate-1/24,‘yyyy-mm-dd HH24:MI:SS‘) from dual;  --减1小时

select sysdate,to_char(sysdate-1/24/60,‘yyyy-mm-dd HH24:MI:SS‘) from dual;  --减1分钟

select sysdate,to_char(sysdate-1/24/60/60,‘yyyy-mm-dd HH24:MI:SS‘) from dual;  --减1秒

Oracle关于时间/日期的操作

1.日期时间间隔操作

  当前时间减去7分钟的时间

select sysdate,sysdate - interval ‘7‘ MINUTE from dual

  当前时间减去7小时的时间

select sysdate - interval ‘7‘ hour from dual

  当前时间减去7天的时间

select sysdate - interval ‘7‘ day from dual

  当前时间减去7月的时间

select sysdate,sysdate - interval ‘7‘ month from dual

  当前时间减去7年的时间

select sysdate,sysdate - interval ‘7‘ year from dual

  时间间隔乘以一个数字

select sysdate,sysdate - 8 *interval ‘2‘ hour from dual

2.日期到字符操作

select sysdate,to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss‘) from dual

select sysdate,to_char(sysdate,‘yyyy-mm-dd hh:mi:ss‘) from dual

select sysdate,to_char(sysdate,‘yyyy-ddd hh:mi:ss‘) from dual

select sysdate,to_char(sysdate,‘yyyy-mm iw-d hh:mi:ss‘) from dual

TO_DATE(x [,fmt])

把一个字符串以 fmt 格式转换为一个日期类型

TO_NUMBER(x[,fmt])

把一个字符串以 fmt 格式转换为一个数字。

SELECT TO_NUMBER(‘-$12,345.67‘,‘$99,999.99‘) 金额 from dual

序列

序列(Sequence)是用来生成连续的整数数据的对象。序列常常用来作为主键中增长列,

序列中的可以升序生成,也可以降序生成。创建序列的语法是:

语法结构:创建序列

CREATE SEQUENCE sequence_name

[START WITH num]

[INCREMENT BY increment]

[MAXVALUE num|NOMAXVALUE]

[MINVALUE num|NOMINVALUE]

[CYCLE|NOCYCLE]

[CACHE num|NOCACHE]

语法解析:

① START WITH:从某一个整数开始,升序默认值是 1,降序默认值是-1。

② INCREMENT BY:增长数。如果是正数则升序生成,如果是负数则降序生成。升序默

认值是 1,降序默认值是-1。

③ MAXVALUE:指最大值。

④ NOMAXVALUE:这是最大值的默认选项,升序的最大值是: 1027,降序默认值是-1。

⑤ MINVALUE:指最小值。

⑥ NOMINVALUE:这是默认值选项,升序默认值是 1,降序默认值是-1026。

⑦ CYCLE:表示如果升序达到最大值后,从最小值重新开始;如果是降序序列,达到最

小值后,从最大值重新开始。

⑧ NOCYCLE:表示不重新开始,序列升序达到最大值、降序达到最小值后就报错。默

认 NOCYCLE。

⑨ CACHE:使用 CACHE 选项时,该序列会根据序列规则预生成一组序列号。保留在内

存中,当使用下一个序列号时,可以更快的响应。当内存中的序列号用完时,系统

再生成一组新的序列号,并保存在缓存中,这样可以提高生成序列号的效率。 Oracle

默认会生产 20 个序列号。

⑩ NOCACHE:不预先在内存中生成序列号

创建一个从 1 开始,默认最大值,每次增长 1 的序列,要求 NOCYCLE,缓存中

有 30 个预先分配好的序列号

CREATE SEQUENCE MYSEQ

MINVALUE 1

START WITH 1

NOMAXVALUE

INCREMENT BY 1

NOCYCLE

CACHE 30

create table stu(

  sid number primary key,

  sname varchar2(20)

)

insert into stu values(MYSEQ.NEXTVAL,‘小明‘);

insert into stu values(MYSEQ.NEXTVAL,‘小张‘);

序列创建之后,可以通过序列对象的 CURRVAL 和 NEXTVAL 两个“伪列”分别访问该序

列的当前值和下一个值

SELECT MYSEQ.NEXTVAL FROM DUAL;

SELECT MYSEQ.CURRVAL FROM DUAL;

使用 ALTER SEQUENCE 可以修改序列

使用 DROP SEQUENCE 命令可以删除一个序列对象。

视图

视图( View)实际上是一张或者多张表上的预定义查询,这些表称为基表。从视图中

查询信息与从表中查询信息的方法完全相同。 只需要简单的 SELECT…FROM 即可。

视图具有以下优点:

1. 可以限制用户只能通过视图检索数据。这样就可以对最终用户屏蔽建表时底层的基

表。

2. 可以将复杂的查询保存为视图。可以对最终用户屏蔽一定的复杂性。

3. 限制某个视图只能访问基表中的部分列或者部分行的特定数据。这样可以实现一定

的安全性。

4. 从多张基表中按一定的业务逻辑抽出用户关心的部分,形成一张虚拟表。

语法结构:创建视图

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name

AS

SELECT查询

[WITH READ ONLY CONSTRAINT]

语法解析:

1. OR REPLACE:如果视图已经存在,则替换旧视图。

2. FORCE:即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表

创建成功后,视图才能正常使用。

3. NOFORCE:如果基表不存在,无法创建视图,该项是默认选项。

4. WITH READ ONLY:默认可以通过视图对基表执行增删改操作,但是有很多在基表上

的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视

图执行 insert 操作), WITH READ ONLY 说明视图是只读视图,不能通过该视图进行

增删改操作。现实开发中,基本上不通过视图对表中的数据进行增删改操作。

PL/SQL 块

PL/SQL 是一种块结构的语言,一个 PL/SQL 程序包含了一个或者多个逻辑块,逻辑块中

可以声明变量,变量在使用之前必须先声明。除了正常的执行程序外, PL/SQL 还提供了专

门的异常处理部分进行异常处理。每个逻辑块分为三个部分,语法是:

语法结构:PL/SQL 块的语法

[DECLARE

--declaration statements] ①

BEGIN

--executable statements ②

[EXCEPTION

--exception statements] ③

END;

语法解析:

① 声明部分:声明部分包含了变量和常量的定义。这个部分由关键字 DECLARE 开始,

如果不声明变量或者常量,可以省略这部分。

② 执行部分:执行部分是 PL/SQL 块的指令部分,由关键字 BEGIN 开始,关键字 END

结尾。所有的可执行 PL/SQL 语句都放在这一部分,该部分执行命令并操作变量。

其他的 PL/SQL 块可以作为子块嵌套在该部分。 PL/SQL 块的执行部分是必选的。注

意 END 关键字后面用分号结尾。

③ 异常处理部分:该部分是可选的,该部分用 EXCEPTION 关键字把可执行部分分成两

个小部分,之前的程序是正常运行的程序,一旦出现异常就跳转到异常部分执行。

PL/SQL 是一种编程语言,与 Java 和 C#一样,除了有自身独有的数据类型、变量声明和赋

值以及流程控制语句外, PL/SQL 还有自身的语言特性:

PL/SQL 对大小写不敏感,为了良好的程序风格,开发团队都会选择一个合适的编码标准。

比如有的团队规定:关键字全部大些,其余的部分小写。

PL/SQL 块中的每一条语句都必须以分号结束, SQL 语句可以是多行的,但分号表示该语

句结束。一行中可以有多条 SQL 语句,他们之间以分号分隔,但是不推荐一行中写多条语

句。

PL/SQL 中的特殊符号说明:

类型 符号 说明

赋值运算符 :=         Java 和 C#中都是等号, PL/SQL 的赋值是: =

特殊字符

           ||         字符串连接操作符。

           --         PL/SQL 中的单行注释。

         /*,*/        PL/SQL 中的多行注释,多行注释不能嵌套。

         <<,>>        标签分隔符。只为了标识程序特殊位置。

           ..         范围操作符,比如: 1..5 标识从1到5

算术运算符

        +, -, *, / 基本算术运算符。

          **          求幂操作,比如: 3**2=9

关系运算符

       >, <,>=,<=,=  基本关系运算符, =表示相等关系,不是赋值。

           <>,!=      不等关系。

逻辑运算符 AND,OR,NOT 逻辑运算符。

变量声明

PL/SQL 支持 SQL 中的数据类型, PL/SQL 中正常支持 NUMBER,VARCHAR2,DATE 等 Oracle

SQL 数据类型。声明变量必须指明变量的数据类型,也可以声明变量时对变量初始化,变量

声明必须在声明部分。声明变量的语法是:

语法格式:声明变量

变量名 数据类型[ :=初始值]

语法解析:

数据类型如果需要长度,可以用括号指明长度,比如: varchar2(20)。

代码演示:声明变量

DECLARE

  sname VARCHAR2(20) :=‘jerry‘; ①

BEGIN

  sname:=sname||‘ and tom‘; ②

  dbms_output.put_line(sname); ③        (set serveroutput on)

END;

声明常量

常量在声明时赋予初值,并且在运行时不允许重新赋值。使用 CONSTANT 关键字声明常

量。

代码演示:声明常量

DECLARE

  pi CONSTANT number :=3.14; --圆周率长值 ①

  r number DEFAULT 3; --圆的半径默认值3 ②

  area number; --面积。

BEGIN

  area:=pi*r*r; --计算面积

  dbms_output.put_line(area); --输出圆的面积

END;

标量数据类型

标量数据类型的变量只有一个值,且内部没有分量。标量数据类型包括数字型,字符型,

日期型和布尔型。这些类型有的是 Oracle SQL 中定义的数据类型,有的是 PL/SQL 自身附加

的数据类型。字符型和数字型又有子类型,子类型只与限定的范围有关,比如 NUMBER 类

型可以表示整数,也可以表示小数,而其子类型 POSITIVE 只表示正整数。

类型 说明

VARCHAR2(长度)

可变长度字符串, Oracle SQL 定义的数据类型,在 PL/SQL 中使用时最

常 32767 字节。在 PL/SQL 中使用没有默认长度,因此必须指定。

NUMBER(精度,小数) Oracle SQL 定义的数据类型。

DATE Oracle SQL 定义的日期类型。

TIMESTAMP Oracle SQL 定义的日期类型。

CHAR(长度) Oracle SQL 定义的日期类型,固定长度字符,最长 32767 字节,默认

长度是 1,如果内容不够用空格代替。

LONG

Oracle SQL 定义的数据类型,变长字符串基本类型,最长 32760 字节。

在 Oracle SQL 中最长 2147483647 字节。

BOOLEAN PL/SQL 附加的数据类型,逻辑值为 TRUE、 FALSE、 NULL

BINARY_INTEGER PL/SQL 附加的数据类型,介于-231 和 231 之间的整数。

PLS_INTEGER

PL/SQL 附加的数据类型,介于 -231 和 231 之间的整数。类似于

BINARY_INTEGER,只是 PLS_INTEGER 值上的运行速度更快。

NATURAL

PL/SQL 附加的数据类型, BINARY_INTEGER 子类型,表示从 0 开始的

自然数。

NATURALN 与 NATURAL 一样,只是要求 NATURALN 类型变量值不能为 NULL。

POSITIVE PL/SQL 附加的数据类型, BINARY_INTEGER 子类型,正整数。

POSITIVEN 与 POSITIVE 一样,只是要求 POSITIVE 的变量值不能为 NULL。

REAL Oracle SQL 定义的数据类型, 18 位精度的浮点数

INT,INTEGER,SMALLINT Oracle SQL 定义的数据类型, NUMBERDE 的子类型, 38 位精度整数。

SIGNTYPE PL/SQL 附加的数据类型, BINARY_INTEGER 子类型。值有: 1、 -1、 0。

STRING 与 VARCHAR2 相同

属性数据类型

当声明一个变量的值是数据库中的一行或者是数据库中某列时,可以直接使用属性类型

来声明。 Oracle 中存在两种属性类型: %TYPE 和%ROWTYPE。

  % ROWTYPE

引用数据库表中的一行作为数据类型,即 RECORD 类型(记录类型),是 PL/SQL 附加的

数据类型。表示一条记录,就相当于 C#中的一个对象。可以使用“ .”来访问记录中的属性。

代码演示:

DECLARE

  myemp EMP%ROWTYPE; ①

BEGIN

  SELECT * INTO myemp FROM emp WHERE empno=7934; ②

  dbms_output.put_line(myemp.ename); ③

END;

代码解析:

① 声明一个 myemp 对象,该对象表示 EMP 表中的一行。

② 从 EMP 表中查询一条记录放入 myemp 对象中。

③ 访问该对象的属性可以使用“ .”。

%TYPE

引用某个变量或者数据库的列的类型作为某变量的数据类型。

代码演示:%TYPE 应用

DECLARE

  sal emp.sal%TYPE; ①

  mysal number(4):=3000;

  totalsal mysal%TYPE; ②

BEGIN

  SELECT SAL INTO sal FROM emp WHERE empno=7934;

  totalsal:=sal+mysal;

  dbms_output.put_line(totalsal);

END;

declare

  stuid  student.sid%TYPE;

  stusex student.ssex%TYPE;

begin

  select sid,ssex into stuid,stusex

  from student where sname=‘&姓名‘;

  dbms_output.put_line(stuid||‘:‘||stusex);

end;

代码解析:

① 定义变量 sal 为 emp 表中 sal 列的类型。

② 定义 totalsal 是变量 mysal 的类型。

%TYPE 可以引用表中的某列作的类型为变量的数据类型,也可以引用某变量的类型作为

新变量的数据类型。

IF 条件 THEN

--条件结构体

END IF;

IF 条件 THEN

--条件成立结构体

ELSE

--条件不成立结构体

END IF;

IF 条件 1 THEN

--条件 1 成立结构体

ELSIF 条件 2 THEN

--条件 2 成立结构体

ELSE

--以上条件都不成立结构体

END IF;

范例:

DECLARE

  newSal emp.sal % TYPE;

BEGIN

  SELECT sal INTO newSal FROM emp

  WHERE ename=‘JAMES‘;

  IF newSal>900 THEN ①

    UPDATE emp

    SET comm=800

    WHERE ename=‘JAMES‘;

  END IF;

  COMMIT ; ②

END;

DECLARE

  v_grade CHAR(1):=UPPER(‘&grade‘);

  p_grade VARCHAR(20) ;

BEGIN

  if v_grade=‘A‘ then

    dbms_output.put_line(‘优秀‘);

  elsif v_grade=‘B‘ then

    dbms_output.put_line(‘良好‘);

  elsif v_grade=‘C‘ then

    dbms_output.put_line(‘中等‘);

  else

    dbms_output.put_line(‘差‘);

  end if;

END;

WHILE 条件 LOOP

--循环体

END LOOP;

DECLARE

  counter number(3):=0;

  sumResult number:=0;

BEGIN

  WHILE counter<100 LOOP

    counter := counter+1;

    sumResult := sumResult+counter;

  END LOOP;

  dbms_output.put_line(‘result is :‘||sumResult);

END;

FOR 循环变量 IN [REVERSE] 循环下限..循环上限 LOOP LOOP

--循环体

END LOOP;

DECLARE

  counter number(3):=0;

  sumResult number:=0;

BEGIN

  FOR counter IN 1..100 LOOP

    sumResult := sumResult+counter;

  END LOOP;

  dbms_output.put_line(‘result is :‘||sumResult);

END;

PL/SQL 的异常处理

在程序运行时出现的错误,称为异常。发生异常后,语句将停止执行, PL/SQL 引擎立

即将控制权转到 PL/SQL 块的异常处理部分。异常处理机制简化了代码中的错误检测。 PL/SQL

中任何异常出现时,每一个异常都对应一个异常码和异常信息。

预定义异常

为了 Oracle 开发和维护的方便,在 Oracle 异常中,为常见的异常码定义了对应的异常

名称,称为预定义异常,常见的预定义异常有:

异常名称 异常码 描述

DUP_VAL_ON_INDEX ORA-00001      试图向唯一索引列插入重复值

INVALID_CURSOR   ORA-01001      试图进行非法游标操作。

INVALID_NUMBER   ORA-01722      试图将字符串转换为数字

NO_DATA_FOUND    ORA-01403      SELECT INTO 语句中没有返回任何记录。没有信息

TOO_MANY_ROWS    ORA-01422      SELECT INTO 语句中返回多于 1 条记录。重复

ZERO_DIVIDE      ORA-01476      试图用 0 作为除数。

CURSOR_ALREADY_  OPEN ORA-06511 试图打开一个已经打开的游标

PL/SQL 中用 EXCEPTION 关键字开始异常处理。具体语法是:

语法格式:异常处理

BEGIN

--可执行部分

EXCEPTION -- 异常处理开始

WHEN 异常名 1 THEN

--对应异常处理

WHEN 异常名 2 THEN

--对应异常处理

……

WHEN OTHERS THEN

--其他异常处理

END;

语法解析:

异常发生时,进入异常处理部分,具体的异常与若干个 WHEN 子句中指明的异常名匹

配,匹配成功就进入对应的异常处理部分,如果对应不成功,则进入 OTHERS 进行处理。

案例 :异常处理

代码演示:异常处理

DECLARE

  newSal emp.sal % TYPE;

BEGIN

  SELECT sal INTO newSal FROM emp;

EXCEPTION

  WHEN TOO_MANY_ROWS THEN

    dbms_output.put_line(‘返回的记录太多了‘);

  WHEN OTHERS THEN

    dbms_output.put_line(‘未知异常‘);

END;

返回的记录太多了

SGA:System Global Area是Oracle Instance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。

PGA:Process Global Area是为每个连接到Oracle database的用户进程保留的内存。是每个连接私有的。并不属于数据库实例

创建表空间

create tablespace ts_lisi

datafile ‘c:\lisidata.dbf‘

size 50m

autoextend on;

权限:

create session

create table

unlimited tablespace

connect

resource

dba

  例:

#sqlplus /nolog

SQL> conn / as sysdba;

SQL>create user username identified by password

SQL> grant dba to username;

SQL> conn username/password

SQL> select * from user_sys_privs;

  我们将从创建Oracle用户权限表开始谈起,然后讲解登陆等一般性动作,使大家对Oracle用户权限表有个深入的了解。

  一、创建

sys;//系统管理员,拥有最高权限

system;//本地管理员,次高权限

scott;//普通用户,密码默认为tiger,默认未解锁

  二、登陆

sqlplus / as sysdba;//登陆sys帐户

sqlplus sys as sysdba;//同上

sqlplus scott/tiger;//登陆普通用户scott

  三、管理用户

create user zhangsan;//在管理员帐户下,创建用户zhangsan

alert user zhangsan identified by tiger;//修改密码

  四,授予权限

1、默认的普通用户scott默认未解锁,不能进行那个使用,新建的用户也没有任何权限,必须授予权限

grant create session to zhangsan;//授予zhangsan用户创建session的权限,即登陆权限

grant unlimited tablespace to zhangsan;//授予zhangsan用户使用表空间的权限

grant create table to zhangsan;//授予创建表的权限

grant drop table to zhangsan;//授予删除表的权限

grant insert table to zhangsan;//插入表的权限

grant update table to zhangsan;//修改表的权限

grant all to public;//这条比较重要,授予所有权限(all)给所有用户(public)

2、oralce对权限管理比较严谨,普通用户之间也是默认不能互相访问的,需要互相授权

grant select on tablename to zhangsan;//授予zhangsan用户查看指定表的权限

grant drop on tablename to zhangsan;//授予删除表的权限

    revoke  delete on student from zhangsan;

    revoke  create table from zhangsan;

grant insert on tablename to zhangsan;//授予插入的权限

grant update on tablename to zhangsan;//授予修改表的权限

grant insert(id) on tablename to zhangsan;

grant update(id) on tablename to zhangsan;//授予对指定表特定字段的插入和修改权限,注意,只能是insert和update

grant alter all table to zhangsan;//授予zhangsan用户alert任意表的权限

  五、撤销权限

  基本语法同grant,关键字为revoke

  六、查看权限

select * from user_sys_privs;//查看当前用户所有权限

select * from user_tab_privs;//查看所用用户对表的权限

  七、操作表的用户的表

select * from zhangsan.tablename

  八、权限传递

  即用户A将权限授予B,B可以将操作的权限再授予C,命令如下:

grant alert table on tablename to zhangsan with admin option;//关键字 with admin option

grant alert table on tablename to zhangsan with grant option;//关键字 with grant option效果和admin类似

  九、角色

  角色即权限的集合,可以把一个角色授予给用户

create role myrole;//创建角色

grant create session to myrole;//将创建session的权限授予myrole

grant myrole to zhangsan;//授予zhangsan用户myrole的角色

drop role myrole;删除角色

以上是关于SQL的主要内容,如果未能解决你的问题,请参考以下文章

sql [sql技巧]一些sql技巧#sql

sql 2008 r2 在sql 2008上兼容么

SQL基础

有大神知道,sql server 中如何批量执行sql语句吗?

pl sql developer怎么执行sql

pl sql developer怎么执行sql