简单查询、复杂查询
简单查询: 单表
复杂查询:
1. 子查询(嵌套查询)
2. 连接查询
************************连接查询****************************
一.什么是连接查询
把多张表连接在一起,一块查
二.什么时候使用
数据来自于多张表的时候,要使用连接查询
三.连接查询的分类
1. 内连接
2. 外连接
3. 交叉连接
4. 自然连接
****************************************内连接******************************
--需求:查询部门编号为10的员工姓名、薪水、部门名称
--数据来自多张表的时候 使用连接查询
--sql1999
select e.ename,e.sal,d.deptno,d.dname from dept d inner join emp e
on(d.deptno = e.deptno)
where e.deptno=10
执行过程: 先拿着左表的第一条记录 和右表的所有记录进行匹配,如果满足
连接条件, 左表的记录和右表记录首尾相连...第一趟
第二趟 拿着左表的第二条记录 和右表的所有记录进行匹配,如果满足连接条件
首尾相连..依次类推
--sql1992
select e.ename,e.sal,d.deptno,d.dname from dept d ,emp e
where d.deptno = e.deptno and d.deptno=10
****************************************外连接******************************
分类:
1.左外连接
2.右外连接
3.全外连接
一.左外连接
--需求:查询员工姓名、薪水、部门名称
--保证左表的数据都有,要使用左外连接
--左外连接: 在内连接的基础上,保证左表的数据都有
select d.dname,e.ename,e.sal,d.deptno from dept d left outer join emp e
on(d.deptno = e.deptno)
outer 可以省略
sql1992
select d.dname,e.ename,e.sal,d.deptno from dept d,emp e
where d.deptno = e.deptno(+)
二.右外连接
在内连接的基础上,保证右表的数据都有,如果左表以空补齐
select d.dname,e.ename,e.sal,d.deptno from emp e right outer join dept d
on(d.deptno = e.deptno)
--sql1992
select d.dname,e.ename,e.sal,d.deptno from dept d,emp e
where d.deptno = e.deptno(+)
三.全外连接
左外连接的查询结果 并上 右外连接的查询结果
--sql1999
select d.dname,e.ename,e.sal,d.deptno from dept d full outer join emp e
on(d.deptno = e.deptno)
--sql1992
select d.dname,e.ename,e.sal,d.deptno from dept d,emp e
where d.deptno = e.deptno(+)
UNION
select d.dname,e.ename,e.sal,d.deptno from dept d,emp e
where d.deptno(+) = e.deptno
************************交叉连接 cross join (笛卡尔积)****************************
左表中的每一条记录 和右表中的 每一条记录 收尾相连 左边4条 右表14条 查询结果 一共 56条记录
sql 1999
select * from dept cross join emp
sql1992
select * from dept,emp
************************自然连接 natural join****************************
有点类似于 内连接,它和内连接的区别有两个
select * from dept natural join emp
(1) 不需要写连接条件
把两张表中 相同的字段(名称相同、类型相同) 自动作为连接条件 给你加上
(2) 会自动的把重复的字段去掉
******************************等值连接和非等值连接*****************************
一.等值连接
连接条件相等的为等值连接,刚才学的都属于等值连接
select ename,dname from emp join dept
on (emp.deptno=dept.deptno);//1999sql
select ename,dname from emp join dept
using (deptno);--等同于上面
二.非等值连接
连接条件不相等 例如 != > < between 时 连接两张表的数据
连接第三张表
--需求: 姓名、薪水、部门名称 、薪水等级
select e.ename,e.sal,d.dname,s.grade from dept d inner join emp e
on (d.deptno = e.deptno) inner join salgrade s
on (e.sal between s.losal and s.hisal)
******************************集合操作*****************************
1.UNION 并集 重复的只显示一次
第一张表的查询结果
UNION
第一张表的查询结果
2.UNION ALL 重复的显示多次
3. INTERSECT 交集
4. MINUS 差集
*****************--演示需求1:按照部门进行分组之后 每个部门赚钱最多的那个人********************
select t.deptno,e.ename,t.max_sal from emp e
inner join
(select deptno,max(sal) max_sal from emp group by deptno) t
on(e.deptno = t.deptno and e.sal = t.max_sal)
*****************************演示需求2:求每个部门的平均薪水的等级********************
--演示需求2:求每个部门的平均薪水的等级
select t.deptno,t.avg_sal,s.grade from
(select deptno,avg(sal) avg_sal from emp group by deptno) t
inner join salgrade s
on(t.avg_sal between s.losal and s.hisal)
*******************特殊的连接查询---自关联************************
需求: SMITH的上司叫什么
--需求: SMITH的上司叫什么
--1. 先查SMITH上司的编号
select mgr from emp where ename='SMITH'
--2.7902这个员工的姓名
select ename from emp where empno=7902
--合并
现在的需求: 把所有员工的姓名 和它的上司叫什么同时显示出来
自关联: 一张表当两张表使用,自己和自己进行连接查询,叫做自关联
select employee.ename,manager.ename from emp manager
right join emp employee
on(manager.empno = employee.mgr)