综合数据和分组函数
1. 常用的分组函数:COUNT AVG SUM MAX MIN
2. GROUP BY
3. HAVING
4. 分组函数只能嵌套两层
5. 除了COUNT(*)外,其他的分组函数都不处理空值。
多表查询
1. 主键和实体完整性
主键:它是关系数据库表中的某一列或某几列的组合;它能够唯一的表示关系数据库表中的任一行。
实体完整性:主键不能包含空值(NULL),并且主键必须能够唯一标识任一行。
2. 外键和引用完整性
外键:是关系数据库表中的某一列或某几列的组合,它的值或者与另一个表中的某一列(一般为主键)相匹配,或者为空值。
引用完整性:(1)外键必须为空值或者有相匹配的项 (2)外键可以没有相对应的键属性,但不可以有无效的项。
3. 相等连接
如: select *
fromemp,dept
whereemp.deptno = dept.deptno
orderby sal
笛卡尔乘积形成的条件:
l 查询语句中漏掉了连接条件
l 查询语句中两个表中的所有行都满足连接条件
l 查询语句中的连接条件无效
在实际工作中应该尽量的避免出现笛卡尔乘积,在多表连接查询语句的WHERE字句中,必须永远是用有效而正确的连接条件。
4. 自连接
1 select w.empno,w.ename,w.job,w.mgr,
2 m.ename,m.job
3 from emp w,emp m
4 wherew.mgr = m.empno
5 andw.job like 'ANA%'
5. 不等连接
selecte.empno,e.ename,e.job,e.sal,s.grade
from emp e,salgrade s
where e.sal betweens.losal and s.hisal
and s.grade > 2;
6. 外连接
外连接的连接运算符为(+),该连接运算符既可以放在等号的左面也可以放在等号的右面,但是一定要放在缺少信息的那一面。
1 select empno,ename,sal,emp.deptno,dept.deptno,loc
2 fromemp,dept
3* where emp.deptno(+)= dept.deptno
QL> /
EMPNO ENAME SAL DEPTNO DEPTNO LOC
------------------- ---------- ---------- ---------- ------------
7369 SMITH 800 20 20 DALLAS
7499 ALLEN 1600 30 30 CHICAGO
7521 WARD 1250 30 30 CHICAGO
7566 JONES 2975 20 20 DALLAS
7654 MARTIN 1250 30 30 CHICAGO
7698 BLAKE 2850 30 30 CHICAGO
7782 CLARK 2450 10 10 NEW YORK
7788 SCOTT 3000 20 20 DALLAS
7839 KING 5000 10 10 NEW YORK
7844 TURNER 1500 30 30 CHICAGO
7876 ADAMS 1100 20 20 DALLAS
EMPNO ENAME SAL DEPTNO DEPTNO LOC
------------------- ---------- ---------- ---------- ------------
7900 JAMES 950 30 30 CHICAGO
7902 FORD 3000 20 20 DALLAS
7934 MILLER 1300 10 10 NEW YORK
40 BOSTON
WHERE子句也可以写成 dept.deptno = emp.deptno(+)。
7. SQL:1999语法的连接
selecte.empno,e.ename,e.sal,e.deptno,d.loc
from emp e
CROSS JOIN deptd
使用USING子句的连接
selecte.empno,e.ename,e.sal,deptno,d.loc
from emp e
join dept d
using(deptno)
order by d.loc;
使用ON子句的连接
select e.empno,e.ename,e.sal,e.deptno,d.loc
from emp e
join dept d
on(e.deptno = d.deptno)
order by d.loc
左外连接
selectempno,ename,sal,emp.deptno,loc
from dept
left outer joinemp
on(emp.deptno =dept.deptno);
右外连接
selecte.empno,e.ename,e.sal,e.deptno,d.deptno,d.loc
from emp e
right outer joindept d
on (e.deptno =d.deptno)