好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Oracle数据库SQL重要语法总结

【SQL语句分类】 DQL—数据查询语言(SELECT) DML—数据操作语言(INSERT/ UPDATE/ DELETE/ MERGE) DDL—数据定义语言(CREATE/ ALTER/ DROP/ TRUNCATE) DCL—数据控制语言(GRANT/ REVOKE) TCL—事务控制语句(COMMIT/ ROLLBACK/ SAVEPOINT) 【查询基

【SQL语句分类】

DQL—数据查询语言(SELECT)

DML—数据操作语言(INSERT/ UPDATE/ DELETE/ MERGE)

DDL—数据定义语言(CREATE/ ALTER/ DROP/ TRUNCATE)

DCL—数据控制语言(GRANT/ REVOKE)

TCL—事务控制语句(COMMIT/ ROLLBACK/ SAVEPOINT)

【查询基础】

1、使用连接符将属性值连起来:select ename || ' ''s job is '||job as job from emp;

【注:这里要注意s前面的两个单引号,如果使用一个会出现问题】

2、取消重复(distinct) :select distinct job from emp;

3、取别名:select ename as "姓名" from emp;

4、查询表结构: desc emp;

5、条件查询where + 运算符

(1) between ...and...

(2) in(*, *, *, ....)

(3)like ,用于匹配字符串 ('%' //匹配任意多个字符; '_' //匹配一个字符)

(4) is null

(5) AND, OR, NOT IN/ between/ like/, is not null

6、条件显示查询结果

(1)ORDER BY: desc(降序);asc (默认升序) [null升序排在最后]

【函数】

1、字符函数

(1) LOWER(column|expression); UPPER(); INITCAP()//首字母大写

(2) CONCAT,连接两个值,等同于||

CONCAT(column1|expression1,column2|expression2);

(3) SUBSTR(‘String’, 1, 3) = ‘Str’//取从第1个位置开始,len=3的子串

【注:oracle的字符串默认是从第1个位置开始】

(6) LPAD(sal, 10, ‘*’) =******50000; RPAD(); 【左对齐,右对齐】

(7) TRIM(‘S’ FROM ‘SSMITH’) =MITH //去除字符串头尾的字符‘S‘

使用参数:TRIM(LEADING | TAILING | BOTH 'S' FROM 'SSMITH')

LEADING:去除头部字符; TAILING:去除尾部字符; BOTH:头尾都去除

(8) REPLACE(‘abc’. ‘b’, ‘d’) = ‘adc’ //替换

(9) To_char(str, [fm]) 将属性转变成字符串,也可以自己添加转换的格式(具体格式需要看属性的具体类型)

Select ename,to_char(hiredate, ‘yyyy-mm-dd’) as d from emp;

2、数字函数

(1) ROUND(列名|表达式, n), 将值四舍五入到小数点后第n位

(2) TRUNC(列名|表达式, n), 截取到小数点后第n位(不四舍五入)

(3) MOD(列名|表达式, n), 表达式对n取余



3、日期函数

(1)SYSDATE //返回当前时间

select to_char(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') as time from DUAL;

(2)MONTHS_BETWEEN //返回两个日期相隔的月数

select ename,hiredate,

round(months_between(to_date('01-10-3050','dd-mm-yyyy') , hiredate)) as months from emp;

(3)ADD_MONTHS(date, n) //在指定日期的基础上加上相应的月数

(4)NEXT_DAY(date,num)

返回某一个日期的下一个指定日期,求出date之后一周内某天num的日期,num可以是一个有效的表示星期几的数字,1为星期天

也可以直接输入如下所述的数据:NEXT_DAY(date, '星期一')

(5)LAST_DAY(date) //返回date所在月的最后一天

(6) ROUND(date, ['CC' | 'YY' | 'MM' | 'DD' | 'HH24' | 'MI' | 'SS' ])日期的四舍五入,默认格式是DD

(7)TRUNC(date[,’fmt’]) //截取, 默认格式是DD,将date截取为最近的天

(8)EXTRACT:返回日期类型中指定年、月、日

EXTRACT(YEAR | MONTH | DAY from hiredate)

4、转换函数

(1) TO_CHAR(date | number [, ‘fmt’]) 把日期类型、数字类型转换为字符类型

常用日期格式说明:

YYYY:4位数字表示年份

YY:2位数字表示年份,但无世纪转换

RR:2位数字表示年份,有世纪转换

当前年份0-49:指定年份0-49(当前世纪),指定年份50-99(上一个实际)

当前年份50-99:指定年份0-49(下一个世纪),指定年份59-99(当前世纪)

YEAR:年份的英文拼写

MM:2位数字表示月份

MONTH:月份的英文拼写

DY:星期的英文前三位字母

DAY:星期的英文拼写

DD:数字表示一月中的第几天

DDD:数字表示一年中的第几天

AM/ PM:上下午表示

HH/ HH12/ HH24:小时

MI:分钟

SS:秒、

TH:显示数字表示的英文序数词

SP:显示数字表示的拼写

SPTH:显示数字表示的序数词的拼写

数字的具体格式

9:一位数字

$:显示为美元符号

L:显示按照区域设置的本地货币符号

. :小数点

,:千分割符

【注意:进行数字类型到字符类型转换时,格式中的宽度一定要超过实际列宽度,否则会显示###,小数点后如果小于实际宽度,进行四舍五入处理。】

select ename,to_char(sal,'$99,999.00') as salary from emp;

(2)TO_DATE() 转换为时间格式

select to_date('2006-10-10','yyyy-mm-dd') + 15 from DUAL;

5、通用函数

【注意:数据格式可以是日期、字符、数字,数据类型必须匹配】

(2)NVL2(expression1, expression2, expression3),

(3)NULLIF(expression1, expression2), 如果两个参数不相等,返回第一个参数,如果相等,返回空

(4)COALESCE(expression1, expression2, …..,expression n), 返回第一个不为空的参数

(5) CASE的使用

selectename, deptno,

( case deptno

when 10 then '部门10'

when20 then '部门20'

when 30 then '部门30'

else '无'

end )dept

from emp;

也可以使用case判断取值范围

selectename, sal,

(case

when sal

when sal > 1000 then '多'

else '刚好'

from emp;


【多表查询】

1、 等值连接

select ename, job from dept, emp where dept.deptno = emp.deptno;

为表格取别名

select ename, job from dept D, emp E where D.deptno = E.deptno;

【注意:如果已经定义了表别名,就只能使用别名,不能使用原名】

2、 外连接

左外连接: select ename, dname from emp, dept where emp.deptno =dept.deptno(+);

右外连接: select ename, dname from emp, dept where emp.deptno(+) =dept.deptno;

【注意:没有+的表,会把内容显示完全】

3、 交叉连接CROSS JOIN(生成笛卡尔积)

select ename, dname from emp CROSS JOIN dept;

4、 自然连接 NATURAL JOIN

【连接条件:两个表中的值和数据类型都相同的同名列,如果列名相同数据类型不同则报错】

5、 USING子句

USING(column_name)

使用条件:两个表中存在两个以上相同的列(若只有1列,自然连接即可)

【注意:不要与自然连接NATURAL JOIN重复使用, 】

select ename, deptno from emp join dept using(deptno); --别忘记添加括号 和 关键字join

6、 ON子句

select ename,dname from emp join dept on emp.deptno = dept.deptno;

7、 左外连接:LEFT OUTER JOIN

select ename, dname from emp left outer join dept on emp.deptno = dept.deptno;

8、 右外连接:RIGHT OUTER JOIN
9、 全连接:FULL OUTER JOIN

select ename, dname from emp full outer join dept on emp.deptno = dept.deptno;

【集合运算】

1、 UNION联合运算

去掉重复行,默认排序

select ename,sal, deptno from emp

UNION

select ename, sal, deptno from emp

where deptno in(10, 20);

2、 UNION ALL

不去重复,默认情况下不排序

【分组函数】

1、 MIN/ MAX

可以对数字,也可以对字符

selectmin(sal), max(sal) from emp;

select min(ename), max(ename) from emp;

2、 SUM/ AVG

select sum(sal), avg(sal) from emp;

3、 COUNT

select count(*)from emp;

4、 DISTINCT取消重复

select count(distinct deptno) from emp;

5、 空值处理问题

select avg(comm)from emp; //空值不算在内

6、 GROUP BY

select deptno,sum(sal) from emp group by deptno;

select job, mgr, avg(sal) from emp group by job, mgr order by job;

【注意:group by字句可以不出现在select中;select子句中的出现的飞分组函数列必须在GROUP BY子句中出现】

7、 HAVING子句(完成组函数筛选判断)

select job, avg(sal) from emp where avg > 1000 group by avg;

(错误,此处不能使用where)

select job, avg(sal) from emp group by job having avg(sal) > 1000;

(改为使用having, having中不能使用别名)

【select的执行过程:FROM--WHERE--GROUP BY--HAVING --SELECT--ORDER BY】

【子查询】

1、 单行子查询:使用单行操作符,where可以出现在having中

2、 多行子查询,多行操作符:IN, ANY, ALL

3、 子查询中有空值

例如:select ename, sal from emp

where empno not in ( select mgr from emp where mgr is not null);

结果为:未选定行

原因:子查询中返回值中包含有空值(恰好NOT IN操作符对空值不忽略)

4、 EXISTS, NOT EXISTS

EXISTS子查询如果有记录找到,子查询语句不会继续进行,返回true

例如:select ename from emp e

where exists(select '1' from emp where manager_id = e.empno)

这里‘1’只是占位用,无实际意义【为表取别名 不能用as】

NOT EXISTS 操作符运算方法与NOT IN不同,只会返回true 或false,不会返回空值,所以不需要考虑子查询中的空值问题


【数据操作DML】

1、 INSERT插入

insert into dept values(60, 'qqq', 'xxx');

insert into dept(deptno, loc) values(70, 'sss');

insert into hhh select * from eee where XXX(条件)

2、UPDATE

update emp set deptno = 10 where ename ='SCOTT';

3、 DELETE 删除

delete from emp where empno = 7788;

delete 不能删除被其他表引用的数据(违反完整性约束条件的数据)

4、 MERGE 合并数据

根据指定条件执行插入或者更新操作。

如果条件满足执行更新操作,否则执行插入操作。

on(T1.a = T2.a)

when matched then

update set T1.b = T2.b

when not matched then

insert(a,b) values(T2.a, T2.b);

5、 ROWID

是表中虚拟的列,包含该行数据的物理位置信息

select rowid, dname from dept;

//AAAMgxAAEAAAAAMAAA qqq

进行快速定位

6、 事务的特征:ACID

原子性Atomicity:独立的工作单元,要么全都成功,要么全都失败

一致性Consistency:一旦事务完成,不管成功还是失败,整个系统处于操作规则的统一状态,即数据不会损坏

隔离性Isolation:不会被其他事务干扰,所以事务应被隔离起来

持久性Durability:一旦事务提交,对数据库中的数据改变就是永久的

7、 事务的控制

显示控制:显示提交(commit),显示回滚(rollback)

隐式控制:隐式提交(执行DDL或DCL语句,从SQL*PLUS使用EXIT或QUIT命令退出),隐式回滚(从SQL*PLUS强行退出,客户端到服务器端异常中断,系统崩溃)

8、 事务:

显示提交:commit(commit之后,rollback就没有意义了)

显示回滚:rollback

设立保存点:savepoint// (返回保存点 :rollback to)

例如:

insert into dept values(60, 'xxx', 'xxx');

savepoint insert_a;

insert into dept values(80, 'xxx', 'xxx');

rollback to insert_a;

即取消insert intodept values(80, 'xxx', 'xxx');操作

【表和约束】

1、 命名:

(1) 必须由字母开头,长度在1-30字符之间

(2) 名字中只能包含A-Z,a-z,0-9,_(下划线),$, #

(3) 不能使用保留字

(4) 名字大小写不敏感

2、 建表

create table dossier(

id number(4),

cname varchar2(20),

birthday date,

stature number(3),

weight number(5,2),

country_code char(2) default '01');

create table user_table(

user_id number(9) PRIMARY KEY,

user_name varchar2(50),

user_passwd varchar2(50) NOT NULL,

user_state varchar2(1) NOT NULL);

(用子查询的方式创建表)

as

select empno, ename, sal + 1000 as newsal

from emp

where deptno = 10;

3、添加列

不能指定添加位置,成为最后一列

alter table dossier add (sex char(1));

更改列属性

alter table dossier modify (sex char(2));

默认值

alter table dossier modify (sex default '男');

删除列

1、 alter table dossier drop column sex;

2、 alter table dossier drop (country_code);

3、删除表

drop table table_nale

重命名表

rename dossier to haha;

4、约束

NOT NULL非空

UNIQUE唯一值

PRIMARY KEY主码

FOREIGN KEY外表中列的引用

CHECK指定一个必须为真的条件

5、 相关数据字典

select table_name from user_tables;

查询数据字典结构

desc user_tables;


6、 数据说明补充,char,varchar,varchar2

(1)varchar和varchar2的区别在于后者把所有字符都占两字节,前者只对汉字和全角等字符占两字节。

(2)nvarchar和nvarchar2的区别和上面一样, 与上面区别在于是根据Unicode 标准所进行的定义的类型,通常用于支持多国语言类似系统的定义。

1.char char的长度是固定的,比如说,你定义了char(20),即使你你插入abc,不足二十个字节,数据库也会在abc后面自动加上17个空格,以补足二十个字节; char是区分中英文的,中文在char中占两个字节,而英文占一个,所以char(20)你只能存20个字母或10个汉字。 char适用于长度比较固定的,一般不含中文的情况

2.varchar/varchar2 varchar是长度不固定的,比如说,你定义了varchar(20),当你插入abc,则在数据库中只占3个字节。 varchar同样区分中英文,这点同char。 varchar2基本上等同于varchar,它是oracle自己定义的一个非工业标准varchar, 不同在于,varchar2用null代替varchar的空字符串 varchar/varchar2适用于长度不固定的,一般不含中文的情况

3.nvarchar/nvarchar2 nvarchar和nvarchar2是长度不固定的 nvarchar不区分中英文, 比如说:你定义了nvarchar(20),你可以存入20个英文字母/汉字或中英文组合,这个20定义的是字符数而不是字节数 nvarchar2基本上等同于nvarchar,不同在于nvarchar2中存的英文字母也占两个字节 nvarchar/nvarchar2适用于存放中文

查看更多关于Oracle数据库SQL重要语法总结的详细内容...

  阅读:58次