簡單查詢、復雜查詢
簡單查詢: 單表
復雜查詢:
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)