數(shù)據(jù)庫(kù)操作(七)

回顧:
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è)小功能。
將小功能先完成毕莱,最后做拼接器贩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末颅夺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蛹稍,更是在濱河造成了極大的恐慌吧黄,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唆姐,死亡現(xiàn)場(chǎng)離奇詭異拗慨,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)奉芦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門赵抢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人仗阅,你說(shuō)我怎么就攤上這事昌讲。” “怎么了减噪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵短绸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我筹裕,道長(zhǎng)醋闭,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任朝卒,我火速辦了婚禮证逻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抗斤。我一直安慰自己囚企,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布瑞眼。 她就那樣靜靜地躺著龙宏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伤疙。 梳的紋絲不亂的頭發(fā)上银酗,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音徒像,去河邊找鬼黍特。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锯蛀,可吹牛的內(nèi)容都是我干的灭衷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼旁涤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼今布!你這毒婦竟也來(lái)了经备?” 一聲冷哼從身側(cè)響起拭抬,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤部默,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后造虎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體傅蹂,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年算凿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了份蝴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氓轰,死狀恐怖婚夫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情署鸡,我是刑警寧澤案糙,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站靴庆,受9級(jí)特大地震影響时捌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜炉抒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一奢讨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧焰薄,春花似錦拿诸、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至凡桥,卻和暖如春蟀伸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缅刽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工啊掏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衰猛。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓迟蜜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親啡省。 傳聞我的和親對(duì)象是個(gè)殘疾皇子娜睛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容