SQL:结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和 程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
在Oracle开发中,客户端把SQL语句发送给服务器,服务器对SQL语句进行编译、执行,把执行的结果返回给客户端。Oracle SQL语句由如下命令组成:
Ø 数据定义语言(DDL),包括CREATE(创建)命令、ALTER(修改)命令、DROP(删除)命令等。
Ø 数据操纵语言(DML),包括INSERT(插入)命令、UPDATE(更新)命令、DELETE(删除)命令等。
Ø 数据查询语言(DQL),包括基本查询语句、Order By子句、Group By子句等。
Ø 事务控制语言(TCL),包括COMMIT(提交)命令、ROLLBACK(回滚)命令。
Ø 数据控制语言(DCL),GRANT(授权)命令、REVOKE(撤销)命令。
目前主流的数据库产品(比如:SQL Server、Oracle)都支持标准的SQL语句。数据定义语言,表的增删改操作,数据的简单查询,事务的提交和回滚,权限的授权和撤销等,Oracle与SQL Server在操作上基本一致。
下面简析SQL的数据查询语言内容
1.查询结构
select *|字段|表达式(聚合函数,常量)--如果有 group by,select中的表达式中字段必须包含于group by的字段中 from 表名 where 条件(对字段的限定,多个条件用and/or/not连接) group by 字段(多个字段,用逗号隔开) having 字段(对分组后的聚合值进行限定) order by 字段|表达式 例:
2.执行顺序
select 5 from 1 where 2 group by 3 having 4 order by 6
3.运算
算术运算 +、 - 、* 、/ 关系运算 >、 >= 、= 、<= 、< 、<>、 != 逻辑运算 not 、and 、or
4.空值
' '和null都是空值 查询用:is null/is not null (1)不参与算术、关系、聚合运算 (2)排序永远是最大的
5.虚拟表
dual
6.集合in
多个or判断可以用in集合替换
7.模糊查询like
通配符:'_'和'%'
_ :代替任意1个字符
%:代替任意个字符
8.聚合函数(一般配合分组使用group by)
sum/avg/count/min/max
9.子查询(select/update/delete中包含的select语句为子查询)
单行子查询:
-- 查看与7369员工工资相同的其他员工的信息
select * from emp
where sal = (select sal from emp where empno = 7369) and empno<>7369;
-- 查看和10号部门员工工资相同的其他部门的员工信息
select * from emp
where sal in (select sal from emp where deptno = 10);
多行子查询:
-- 查看和7369员工工资相同的其他员工的信息
select * from sal = (select sal from emp where empno = 7369)
--查看和10号部门员工工资相同的其他部门的员工信息
select * from emp
where sal in (select sal from emp where deptno =10) and deptno !=10;
10.集合运算(a={1,2,3} , b={2,3,4})
交集:INTERSECT -- 两者共有部分 并集(去重): UNION 并集(不去重):UNION ALL 补集:MINUS -- 前者有后者无 当使用集合操作的时候,要注意: 1.查询所返回的列数以及列的类型必须匹配,列名可以不同。 2.只有UNION ALL不会去重。其他三个都需要排序后去重,性能比较差 例题: (1).求员工表和部门表中的共有的部门编号 SELECT DEPTNO FROM EMP INTERSECT SELECT DEPTNO FROM DEPT; (2).求员工表或者部门表中所包含的部门编号(不去重) SELECT DEPTNO FROM EMP UNION ALL SELECT DEPTNO FROM DEPT; (3).求员工表或者部门表中所包含的部门编号(去重) SELECT DEPTNO FROM EMP UNION SELECT DEPTNO FROM DEPT; (4).求部门表中不在员工表中的部门编号 SELECT DEPTNO FROM DEPT MINUS SELECT DEPTNO FROM EMP; -- SELECT deptno FROM EMP MINUS SELECT deptno FROM DEPT;
11.去重(DISTINCT, GROUP BY, UNION, ROWID)
-- 查看部门编号(去重) SELECT DISTINCT DEPTNO FROM EMP; SELECT deptno FROM emp GROUP BY deptno; -- DISTINCT 只能出现在最前,不能一个字段去重一个字段不去重 -- 错误1 SELECT JOB, DISTINCT DEPTNO FROM EMP; -- 错误2 SELECT DISTINCT JOB,DISTINCT DEPTNO FROM EMP;
-- 三种等价去重性能对比
-- 性能最好 SELECT deptno,job FROM emp GROUP BY deptno,job; -- 性能其次 SELECT DISTINCT deptno,job FROM emp; -- 性能很差 SELECT deptno,job FROM emp UNION SELECT deptno,job FROM emp;
12. 连接查询(重点)
包括内联接(inner join 1种)和外联接(outer join 3种) (1)内连接(inner join):inner可省略 内连接写法1(标准写法) SELECT FROM 表名1 JOIN 表名2 ON 表名1.字段1=表名2.字段1 -- 等值连接 AND 表名1.字段2>=表名2.字段2 -- 不等连接 OR ...;例: -- 查询员工信息及其部门信息 SELECT * -- E.*,D.* / DEPTNO -- 指向对象才行 FROM DEPT E JOIN EMP D -- 两张表调换顺序无关 ON E.DEPTNO = D.DEPTNO; -- 顺序无关 D.DEPTNO=E.DEPTNO -- oracle SELECT * FROM EMP E, DEPT D WHERE E.DEPTNO=D.DEPTNO; 例: -- 查询员工信息及其部门信息 SELECT * -- E.*,D.* / DEPTNO -- 指向对象才行 FROM DEPT E JOIN EMP D -- 两张表调换顺序无关 ON E.DEPTNO = D.DEPTNO; -- 顺序无关 D.DEPTNO=E.DEPTNO -- oracle SELECT * FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO;
(2)左外连接(left outer join): outer可省略
left join 跟表的前后顺序有关 左外连接写法1(标准写法) SELECT FROM 表名1 -- 主表 LEFT JOIN 表名2 -- 从表 ON 表名1.字段1=表名2.字段1 -- 等值连接 AND 表名1.字段2>=表名2.字段2 -- 不等连接 OR ...; 下面额外加一点进阶的小知识 ---- 统计各部门人数,同时加上一个汇总项(总计:总人数)
今天就先分享这部分啦,明白断续,学起来
*本人不才,如知识点有误,欢迎来稿指正,谢谢!*