回顧:
1尤筐、sql的執(zhí)行順序
select ⑤
from ①
where ②
group by ③
having ④
order by ⑥
2、關(guān)聯(lián)查詢
多表聯(lián)合查詢耳胎,杜絕笛卡爾積現(xiàn)象奖年。
要求N張表聯(lián)合细诸,必須至少有N-1個(gè)連接條件。
內(nèi)連接:查詢出所有滿足連接條件的數(shù)據(jù)陋守。
外連接:查詢出數(shù)據(jù)震贵,滿足+不滿足條件的數(shù)據(jù)
左外連接
左表驅(qū)動(dòng)表(所有數(shù)據(jù))+ 右表匹配表(匹配)
右外連接
左表匹配表(匹配)+ 右表驅(qū)動(dòng)表(所有數(shù)據(jù))
全外連接
左表驅(qū)動(dòng)表(所有數(shù)據(jù))+ 右表驅(qū)動(dòng)表(所有數(shù)據(jù))
自連接
特殊連接查詢
驅(qū)動(dòng)、匹配表都來(lái)自于同一張表水评。
正課:
1猩系、子查詢
你是sql大牛,能否寫一條select sql就能查詢出想要的數(shù)據(jù)中燥。
如:查詢30部門最大工資的員工信息蝙眶。
--錯(cuò)
select *,max(sal) from emp
where deptno = 30;
select * from emp where deptno = 30
and sal = (
--30部門最高工資
select max(sal) from emp
where deptno = 30
);
如上所述:
當(dāng)無(wú)法使用一條select sql完成一個(gè)功能時(shí),
可以考慮使用sql嵌套的方式來(lái)完成褪那。
sql嵌套:
一條SQL語(yǔ)句中嵌套著另一條SQL查詢語(yǔ)句幽纷。
又被稱為---子查詢。
被嵌套在SQL語(yǔ)句中的查詢SQL博敬,稱為子查詢友浸,
子查詢所在的那條SQL語(yǔ)句,稱為父查詢偏窝。
注意:子查詢可以使用在DDL收恢、DML、DQL中祭往,
通常一般使用在DQL中為多伦意。
1)、子查詢使用在DDL中
create table emp_copy
as (select empno,ename,job,sal,deptno
from emp
);
結(jié)論:子查詢使用在建表語(yǔ)句中硼补,
實(shí)為表結(jié)構(gòu)驮肉、表數(shù)據(jù)的復(fù)制。
2)已骇、子查詢使用在DML中
insert into emp_copy
--values 注意:連values都沒(méi)有
(
select empno,ename,job,sal,deptno
from emp
);
3)离钝、子查詢使用在DQL中
DQL結(jié)構(gòu)
select
from
where
group by 不使用子查詢
having
order by 不使用子查詢r(jià)
子查詢的分類
根據(jù)子查詢的結(jié)果,可將子查詢分為:
①褪储、單行單列子查詢卵渴。
select max(sal) from emp
where deptno = 30;--查詢30部門的最高工資(1個(gè))
②、多行單列子查詢鲤竹。
select empno from emp
where deptno = 30;--查詢30部門的員工編號(hào)(多個(gè))
③浪读、多行多列子查詢。
select empno,ename,sal,deptno
from emp
where deptno = 30;--查詢30部門的員工信息(編號(hào),姓名碘橘,工資互订,部門編號(hào))(多條)
3-1)、子查詢使用在where子句中
--查詢與JONES員工相同部門的其他員工信息蛹屿。
--step1:查詢JONES員工所在部門
select deptno from emp where ename='JONES';
--step2:部門等于JONES部門的員工(其他員工)
select * from emp where deptno = (step1的結(jié)果)
and ename <> 'JONES';
--step3:sql拼接屁奏。
select * from emp
where deptno = (
--單行單列子查詢
select deptno from emp where ename='JONES'
)
and ename <> 'JONES';
--查詢與SMITH、ALLEN不在同一個(gè)部門的員工信息错负。
--step1:查詢出SMITH坟瓢、ALLEN所在部門
select deptno from emp
where ename = 'SMITH' or ename = 'ALLEN';--in ('SMITH'、'ALLEN')
--step2:查詢不在SMITH犹撒、ALLEN部門的員工
select * from emp
where deptno not in (step1的結(jié)果);
--step3:sql拼接
select * from emp
where deptno not in (
--多行單列子查詢
select deptno from emp
where ename = 'SMITH' or ename = 'ALLEN'
);
注意:where子句中折联,可以出現(xiàn)單行單列、多行單列子查詢识颊。
單行單列子查詢诚镰,一般使用 =、!=祥款、<...
多行單列子查詢清笨,一般使用 in、any刃跛、all抠艾。
***補(bǔ)充:
在子查詢中,需要引入主查詢的某些字段數(shù)據(jù)桨昙。
可以使用exists關(guān)鍵字检号。
--查詢有員工的部門信息
方式一:內(nèi)連接方式
select d.* from emp e,dept d
where e.deptno = d.deptno;
方式二:使用exists關(guān)鍵字
select * from dept d
where exists --存在以下關(guān)系
(
--只需要存在這種關(guān)系即可
--能有返回值,說(shuō)明關(guān)系存在
--所以無(wú)需關(guān)系確切的返回?cái)?shù)據(jù)內(nèi)容
select 1 from emp e
where e.deptno = d.deptno
);
3-2)蛙酪、子查詢使用在having子句中
--查收出最低薪水 高于 30部門最低薪水
的部門信息(部門編號(hào)齐苛、最低薪水)。
--step1:查詢出30部門的最低薪水
select min(sal) from emp where deptno=30;
--step2:查詢出各部門的最低薪水
select deptno,min(sal)
from emp
group by deptno;
--step3:最低薪水對(duì)比
select deptno,min(sal)
from emp
--where 后面無(wú)法使用聚合函數(shù)
--where min(sal) > (step1的結(jié)果)
group by deptno
--但是having可以使用聚合函數(shù)
having min(sal) > (step1的結(jié)果);
--step4:sql拼接
select deptno,min(sal)
from emp
--where 后面無(wú)法使用聚合函數(shù)
--where min(sal) > (step1的結(jié)果)
group by deptno
--但是having可以使用聚合函數(shù)
having min(sal) > (
select min(sal) from emp
where deptno=30
);
3-3)桂塞、子查詢使用from子句中
from 后面跟 表(多行多列結(jié)構(gòu))
所以一般多行多列子查詢會(huì)充當(dāng)臨時(shí)表(虛表凹蜂、匿名視圖)
的功能,使用在from后面藐俺。
多行多列子查詢作為臨時(shí)表炊甲,該表并不存在,
查詢到的數(shù)據(jù)欲芹,也只能在當(dāng)前sql中有效。
--查詢與30部門員工職位吟吝、工資都相同的
其他部門員工信息菱父。
--step1:先查出30部門的職位及工資
select job,sal from emp
where deptno=30;
--step2:查詢其他部門中員工信息
select * from emp
where deptno <> 30;
--step3:職位與工資匹配
select o.*
from (step2結(jié)果) o --其他部門人員,
(step1結(jié)果) th --30部門職位及工資
where o.job = th.job
and o.sal = th.sal;
--step4:sql
select o.*
from (select * from emp
where deptno <> 30) o, --其他部門人員,
(select job,sal from emp
where deptno=30) th --30部門職位及工資
where o.job = th.job
and o.sal = th.sal;
3-4)、子查詢使用在select語(yǔ)句中
把子查詢放在select子句中,在一定程度上
可以充當(dāng)外連接效果浙宜。
--查詢所有部門部門信息
select distinct d.*,
(select deptno from dept
where deptno not in(
select distinct deptno from emp
where deptno is not null)) noEmpDept
from dept d,emp e
where d.deptno = e.deptno;
或給一個(gè)確切的值
select distinct d.*,40 as noEmpDept
from dept d,emp e
where d.deptno = e.deptno;
4官辽、總結(jié):
1)、子查詢根據(jù)查詢結(jié)果可分為:
單行單列子查詢 (1個(gè)值)
多行單列子查詢 (多個(gè)值)
多行多列子查詢 (多條數(shù)據(jù))
2)粟瞬、子查詢可以使用在DDL同仆、DML、DQL中裙品。
其中使用在DQL中居多俗批。
3)、一條完整的DQL查詢語(yǔ)句市怎,如下:
select
from
where
group by
having
order by
一般 group by岁忘、order by后面跟查詢表的字段名。
不能亂使用子查詢的結(jié)果区匠。
select干像、from、where驰弄、having中可以使用子查詢麻汰。
a、其中where戚篙、having后面可以跟上
單行單列子查詢 一般使用 =五鲫、!=、>已球、<等關(guān)系運(yùn)算符臣镣。
多行單列子查詢 一般使用 in、not in智亮、any忆某、all
b、from后面可以跟上
多行多列子查詢 充當(dāng)臨時(shí)表阔蛉。
c弃舒、select后面只能跟上
單行單列子查詢(一般不建議這么用)
補(bǔ)充:
1、刪除數(shù)據(jù)
truncate table emp_copy;--刪除數(shù)據(jù)状原,保留表結(jié)構(gòu)
delete from emp_copy;--全表刪除數(shù)據(jù)
--truncate聋呢、delete的區(qū)別:
truncate不需要TCL支持
delete必須TCL支持
2、任何一個(gè)大功能sql都是由一個(gè)個(gè)小功能sql拼起來(lái)的颠区。
一定要將功能進(jìn)行分解削锰,分出一個(gè)個(gè)小功能。
將小功能先完成毕莱,最后做拼接器贩。