SQL進階部分二

表之間關(guān)系

一對一

? 一夫一妻
?

一對多關(guān)系

? 一個人可以擁有多輛汽車师崎,要求查詢某個人擁有的所有車輛扯躺。

? 創(chuàng)建Person表

? 創(chuàng)建Car表

多對多關(guān)系

? 學(xué)生選課舱痘,一個學(xué)生可以選修多門課程钓觉,每門課程可供多個學(xué)生選擇派殷。
? 一個學(xué)生可以有多個老師还最,而一個老師也可以有多個學(xué)生

? 1.創(chuàng)建老師表

? 2.創(chuàng)建學(xué)生表

? 3.創(chuàng)建學(xué)生與老師關(guān)系表

? 4.添加外鍵

? 為什么要拆分表,避免大量冗余數(shù)據(jù)的出現(xiàn)

?

多表查詢

合并結(jié)果集

什么是合并結(jié)果集

? 合并結(jié)果集就是把兩個select語句的查詢結(jié)果合并到一起

合并結(jié)果集的兩種方式

? UNION
? 合并時去除重復(fù)記錄
? UNION ALL
? 合并時不去除重復(fù)記錄

? 格式
? UNION
? SELECT * FROM 表1 UNION SELECT * FROM 表2毡惜;
? SELECT * FROM 表1 UNION ALL SELECT * FROM 表2;
? 示例
? 創(chuàng)建表

? UNION

? UNION ALL

? 注意事項

? 被合并的兩個結(jié)果:列數(shù)拓轻、列類型必須相同。

連接查詢

什么是連接查詢

? 也可以叫跨表查詢虱黄,需要關(guān)聯(lián)多個表進行查詢

什么是笛卡爾集

? 假設(shè)集合A={a,b}悦即,集合B={0,1,2},
? 則兩個集合的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}橱乱。
? 可以擴展到多個集合的情況

? 同時查詢兩個表辜梳,出現(xiàn)的就是笛卡爾集結(jié)果

?

? 查詢時給表起別名

?


?

多表聯(lián)查,如何保證數(shù)據(jù)正確
在查詢時要把主鍵和外鍵保持一致

?

? 主表當(dāng)中的數(shù)據(jù)參照子表當(dāng)中的數(shù)據(jù)
? 原理
? 逐行判斷泳叠,相等的留下作瞄,不相等的全不要

? 根據(jù)連接方式分類

內(nèi)連接

? 等值連接
? 兩個表同時出現(xiàn)的id號(值)才顯示

? 與多表聯(lián)查約束主外鍵是一樣,只是寫法改變了危纫。
? ON后面只寫主外鍵
? 如果還有條件直接在后面寫where

? 多表聯(lián)查后面還有條件就直接寫and

? 多表連接

? 建立學(xué)生宗挥,分?jǐn)?shù),科目表

? 使用99連接法

?

? 使用內(nèi)聯(lián)查詢

? 非等值連接
? 示例表

建表語句

CREATE TABLE `emp` (

  `empno` int(11) NOT NULL,
  `ename` varchar(255) DEFAULT NULL,
  `job` varchar(255) DEFAULT NULL,
  `mgr` varchar(255) DEFAULT NULL,
  `hiredate` date DEFAULT NULL,
  `salary` decimal(10,0) DEFAULT NULL,
  `comm` double DEFAULT NULL,
  `deptno` int(11) DEFAULT NULL,
  PRIMARY KEY (`empno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `emp` VALUES (7369, '孫悟空', '職員', '7902', '2010-12-17', 800, NULL, 20);
INSERT INTO `emp` VALUES (7499, '孫尚香', '銷售人員', '7698', '2011-2-20', 1600, 300, 30);
INSERT INTO `emp` VALUES (7521, '李白', '銷售人員', '7698', '2011-2-22', 1250, 500, 30);
INSERT INTO `emp` VALUES (7566, '程咬金', '經(jīng)理', '7839', '2011-4-2', 2975, NULL, 20);
INSERT INTO `emp` VALUES (7654, '妲己', '銷售人員', '7698', '2011-9-28', 1250, 1400, 30);
INSERT INTO `emp` VALUES (7698, '蘭陵王', '經(jīng)理', '7839', '2011-5-1', 2854, NULL, 30);
INSERT INTO `emp` VALUES (7782, '虞姬', '經(jīng)理', '7839', '2011-6-9', 2450, NULL, 10);
INSERT INTO `emp` VALUES (7788, '項羽', '檢查員', '7566', '2017-4-19', 3000, NULL, 20);
INSERT INTO `emp` VALUES (7839, '張飛', '總裁', NULL, '2010-6-12', 5000, NULL, 10);
INSERT INTO `emp` VALUES (7844, '蔡文姬', '銷售人員', '7698', '2011-9-8', 1500, 0, 30);
INSERT INTO `emp` VALUES (7876, '阿珂', '職員', '7788', '2017-5-23', 1100, NULL, 20);
INSERT INTO `emp` VALUES (7900, '劉備', '職員', '7698', '2011-12-3', 950, NULL, 30);
INSERT INTO `emp` VALUES (7902, '諸葛亮', '檢查員', '7566', '2011-12-3', 3000, NULL, 20);
INSERT INTO `emp` VALUES (7934, '魯班', '職員', '7782', '2012-1-23', 1300, NULL, 10);

CREATE TABLE `dept` (
  `deptno` bigint(2) NOT NULL AUTO_INCREMENT COMMENT '表示部門編號种蝶,由兩位數(shù)字所組成',
  `dname` varchar(14) DEFAULT NULL COMMENT '部門名稱契耿,最多由14個字符所組成',
  `local` varchar(13) DEFAULT NULL COMMENT '部門所在的位置',
  PRIMARY KEY (`deptno`)
) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8;

INSERT INTO `dept` VALUES (10, '財務(wù)部', '北京');
INSERT INTO `dept` VALUES (20, '調(diào)研部', '上海');
INSERT INTO `dept` VALUES (30, '銷售部', '王者峽谷');
INSERT INTO `dept` VALUES (40, '運營部', '騰訊大樓');

CREATE TABLE `salgrade` (
  `grade` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '工資等級',
  `lowSalary` int(11) DEFAULT NULL COMMENT '此等級的最低工資',
  `highSalary` int(11) DEFAULT NULL COMMENT '此等級的最高工資',
  PRIMARY KEY (`grade`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

INSERT INTO `salgrade` VALUES (1, 700, 1200);
INSERT INTO `salgrade` VALUES (2, 1201, 1400);
INSERT INTO `salgrade` VALUES (3, 1401, 2000);
INSERT INTO `salgrade` VALUES (4, 2001, 3000);
INSERT INTO `salgrade` VALUES (5, 3001, 9999);

?

查詢所有員工的姓名,工資螃征,所在部門的名稱以及工資的等級
? 1.查詢所有員工的姓名搪桂,工資

? 2.查詢所有員工的姓名,工資和所有部門

?

? 3.查詢所有員工的姓名盯滚,工資和所在部門及工資等級

外連接

? 左外連接(左連接)
? 兩表滿足條件相同的數(shù)據(jù)查出來踢械,如果左邊表當(dāng)中有不相同的數(shù)據(jù),也把左邊表當(dāng)中的數(shù)據(jù)查出來魄藕。
? 左邊表當(dāng)中的數(shù)據(jù)全部查出内列,右邊表當(dāng)中,只查出滿足條件的內(nèi)容

?
? 使用內(nèi)連接時背率,周七不會查出來话瞧,沒有成績嫩与,缺考了。把所有考過試的學(xué)生分?jǐn)?shù)查出來移稳。

?

? 使用左連接查詢所有學(xué)生及學(xué)生的考試分?jǐn)?shù)

? 左連接會把左表當(dāng)中的數(shù)據(jù)全部查出蕴纳,右表當(dāng)中只查出滿足條件的數(shù)據(jù)
? 可以省略outer不寫
? 查詢時,兩個表可以不需要建立主外鍵約束

? 右外連接(右連接)

? 右連接會把右當(dāng)中的數(shù)據(jù)全部查出个粱,左表當(dāng)中只查出滿足條件的數(shù)據(jù)

?

?

? 右邊表當(dāng)中 的所有數(shù)據(jù)全部查出古毛,左邊表只查出滿足條件的記錄
? 站在表的角度去看,使用左連接就把左邊表當(dāng)中的內(nèi)容全部查出都许,右邊查出滿足條件的稻薇。
? 使用右連接,就把右邊表當(dāng)中的數(shù)據(jù)全部查出胶征。左邊查出滿足條件的塞椎。

自然連接

? 連接查詢會產(chǎn)生無用笛卡爾集,我們通常使用主外鍵關(guān)系等式來去除它睛低。
? 而自然連接無需你去給出主外鍵等式案狠,它會自動找到這一等式
? 也就是說不用去寫條件

        select * from stu natural join score;

? 要求
? 兩張連接的表中列名稱和類型,需要完全一致的列作為條件
? 會去除相同的列

子查詢

什么是子查詢

? 一個select語句中包含另一個完整的select語句。
? 或兩個以上SELECT钱雷,那么就是子查詢語句了骂铁。

子查詢出現(xiàn)的位置

? where后,把select查詢出的結(jié)果當(dāng)作另一個select的條件值
? from后罩抗,把查詢出的結(jié)果當(dāng)作一個新表拉庵;

? 示例表

?

使用

? 查詢與項羽同一個部門人員工

? 1.先查出項羽所在的部門編號

?

? 2.再根據(jù)編號查同一部門的員工

?

? 把第1條查出來的結(jié)果當(dāng)?shù)?條語句的條件

? 查詢工資高于程咬金的員工
? 1.查出程咬金的工資

?

? 2.再去根據(jù)查出的結(jié)果查詢出大于該值的記錄員工名稱

?

? 工資高于30號部門所有人的員工信息
? 1.先查出30號部門工資最高的那個人

?

? 2.再到整個表中查詢大于30號部門工資最高的那個人

?

?

查詢工作和工資與妲己完全相同的員工信息
? 1.先查出妲已的工作和工資

?

? 2.根據(jù)查詢結(jié)果當(dāng)作條件再去查詢工作和工資相同的員工

? 由于是兩個條件,使用 IN進行判斷

?

有2個以上直接下屬的員工信息
? 1.對所有的上級編號進行分組
?

? 2.找出大于2個的套蒂,大于2個說明有兩個下屬

?

? 3.把上條的結(jié)果當(dāng)作員工編號時行查詢

?

? 查詢員工編號為7788的員工名稱钞支、員工工資、部門名稱操刀、部門地址

自連接

? 求7369員工編號烁挟、姓名、經(jīng)理編號和經(jīng)理姓名

? 以上這種方法只能查詢出一個經(jīng)理的名稱

? 自連接:自己連接自己骨坑,起別名

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撼嗓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子卡啰,更是在濱河造成了極大的恐慌静稻,老刑警劉巖警没,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匈辱,死亡現(xiàn)場離奇詭異,居然都是意外死亡杀迹,警方通過查閱死者的電腦和手機亡脸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人浅碾,你說我怎么就攤上這事大州。” “怎么了垂谢?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵厦画,是天一觀的道長。 經(jīng)常有香客問我滥朱,道長根暑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任徙邻,我火速辦了婚禮排嫌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缰犁。我一直安慰自己淳地,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布帅容。 她就那樣靜靜地躺著颇象,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丰嘉。 梳的紋絲不亂的頭發(fā)上夯到,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機與錄音饮亏,去河邊找鬼耍贾。 笑死,一個胖子當(dāng)著我的面吹牛路幸,可吹牛的內(nèi)容都是我干的荐开。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼简肴,長吁一口氣:“原來是場噩夢啊……” “哼晃听!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起砰识,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤能扒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辫狼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體初斑,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年膨处,在試婚紗的時候發(fā)現(xiàn)自己被綠了见秤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砂竖。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鹃答,靈堂內(nèi)的尸體忽然破棺而出乎澄,到底是詐尸還是另有隱情,我是刑警寧澤测摔,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布置济,位于F島的核電站,受9級特大地震影響锋八,放射性物質(zhì)發(fā)生泄漏舟肉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一查库、第九天 我趴在偏房一處隱蔽的房頂上張望路媚。 院中可真熱鬧,春花似錦樊销、人聲如沸整慎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裤园。三九已至,卻和暖如春剂府,著一層夾襖步出監(jiān)牢的瞬間拧揽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工腺占, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留淤袜,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓衰伯,卻偏偏與公主長得像铡羡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子意鲸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

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