MYSQL的連接查詢
阿新 • • 發佈:2018-09-04
rom 邏輯 結點 社區 div join 語法 分享 --
- 連接能幹什麽?
當查詢結果的列來源於多張表時,需要將多張表連接成一個大的數據集進行匯總顯示。
- MYSQL的三種連接
1.內連接查詢,查詢的結果為兩個表匹配到的數據
2.右(外)連接查詢,查詢的結果為兩個表匹配到的數據和右表特有的數據,對於左表中不存在的數據使用null填充。
3.左(外)連接查詢:查詢的結果為兩個表匹配到的數據和左表特有的數據,對於右表中不存在的數據使用null填充。
- 連接基本語法
select * from 表1 inner或left或right join 表2 on 表1.列 運算符 表2.列
應用場景:
1.學生表有的學生來自1,2,3班,但是班級表只有1,2班。如果使用內連接把這兩個表拼在一起,就要舍棄學生表的一些學生。
mysql> select * from students inner join classes on students.cls_id=classes.id; +----+-----------+------+--------+--------+--------+-----------+----+------+ | id | name | age | height | gender | cls_id | is_delete | id | name | +----+-----------+------+--------+--------+--------+-----------+----+------+| 1 | 小明 | 18 | 180.00 | 女 | 1 | | 1 | 1班 | | 2 | 小月月 | 18 | 180.00 | 女 | 2 | | 2 | 2班 | | 3 | 彭於晏 | 29 | 185.00 | 男 | 1 | | 1 | 1班 | | 4 | 劉德華 | 59 | 175.00 | 男 | 2 | | 2 | 2班 | | 5 | 黃蓉 | 38| 160.00 | 女 | 1 | | 1 | 1班 | | 6 | 鳳姐 | 28 | 150.00 | 保密 | 2 | | 2 | 2班 | | 7 | 王祖賢 | 18 | 172.00 | 女 | 1 | | 1 | 1班 | | 8 | 周傑倫 | 36 | NULL | 男 | 1 | | 1 | 1班 | | 9 | 程坤 | 27 | 181.00 | 男 | 2 | | 2 | 2班 | | 10 | 劉亦菲 | 25 | 166.00 | 女 | 2 | | 2 | 2班 | +----+-----------+------+--------+--------+--------+-----------+----+------+
2.學生表有的學生來自1,2,3班,但是班級表只有1,2班。如果學生表是右表,班級表是左表。使用右連接把這兩個表拼在一起,班級別表沒有3班,就要用null來填充信息。
mysql> select * from classes as c right join students as s on c.id=s.cls_id; +------+------+----+-----------+------+--------+--------+--------+-----------+ | id | name | id | name | age | height | gender | cls_id | is_delete | +------+------+----+-----------+------+--------+--------+--------+-----------+ | 1 | 1班 | 1 | 小明 | 18 | 180.00 | 女 | 1 | | | 1 | 1班 | 3 | 彭於晏 | 29 | 185.00 | 男 | 1 | | | 1 | 1班 | 5 | 黃蓉 | 38 | 160.00 | 女 | 1 | | | 1 | 1班 | 7 | 王祖賢 | 18 | 172.00 | 女 | 1 | | | 1 | 1班 | 8 | 周傑倫 | 36 | NULL | 男 | 1 | | | 2 | 2班 | 2 | 小月月 | 18 | 180.00 | 女 | 2 | | | 2 | 2班 | 4 | 劉德華 | 59 | 175.00 | 男 | 2 | | | 2 | 2班 | 6 | 鳳姐 | 28 | 150.00 | 保密 | 2 | | | 2 | 2班 | 9 | 程坤 | 27 | 181.00 | 男 | 2 | | | 2 | 2班 | 10 | 劉亦菲 | 25 | 166.00 | 女 | 2 | | | NULL | NULL | 11 | 金星 | 33 | 162.00 | 中性 | 3 | | | NULL | NULL | 12 | 靜香 | 12 | 180.00 | 女 | 4 | | | NULL | NULL | 13 | 郭靖 | 12 | 170.00 | 男 | 4 | | | NULL | NULL | 14 | 周傑 | 34 | 176.00 | 女 | 5 | | +------+------+----+-----------+------+--------+--------+--------+-----------+
3.左連接和右連接基本一樣,我們需要實驗可以調換下學生表和班級表的順序即可。
mysql> select * from students as s left join classes as c on s.cls_id=c.id;
- 自連接
相對於兩個表的連接,自連接稍微抽象一點,就是自己連接自己。
自連接的示例就不用上面的數據庫了,我們用全國省份和城市的表。
關於這個表的說明:
- 因為省沒有所屬的省份,所以可以填寫為null
- 城市所屬的省份pid,填寫省所對應的編號id
- 這就是自關聯,表中的某一列,關聯了這個表中的另外一列,但是它們的業務邏輯含義是不一樣的,城市信息的pid引用的是省信息的id
- 在這個表中,結構不變,可以添加區縣、鄉鎮街道、村社區等信息
問題: 如果還是要查詢廣東省對應的所有的市的信息,咱們應該怎麽做呢? areas表和自身進行連接操作 就稱為自連接。
表的數據很大,有3000多條,所以只展示一小部分。
mysql> select * from areas; +--------+-----------------------------------------------+--------+ | aid | atitle | pid | +--------+-----------------------------------------------+--------+ | 110000 | 北京市 | NULL | | 110100 | 北京市 | 110000 | | 110101 | 東城區 | 110100 | | 110102 | 西城區 | 110100 | | 110103 | 朝陽區 | 110100 | | 110104 | 豐臺區 | 110100 | | 110105 | 石景山區 | 110100 | | 110106 | 海澱區 | 110100 | | 110107 | 門頭溝區 | 110100 | | 110108 | 房山區 | 110100 | | 110109 | 通州區 | 110100 | | 110110 | 順義區 | 110100 | | 110111 | 昌平區 | 110100 | | 110112 | 大興區 | 110100 | | 110113 | 懷柔區 | 110100 | | 110114 | 平谷區 | 110100 | | 110115 | 密雲縣 | 110100 | | 110116 | 延慶縣 | 110100 | | 120000 | 天津市 | NULL | | 120100 | 天津市 | 120000 | | 120101 | 和平區 | 120100 | | 120102 | 河東區 | 120100 | | 120103 | 河西區 | 120100 |
既然是自連接,我們就先把兩個表用內連接連接在一起。
mysql> select * from areas as province inner join areas as city on province.aid=city.pid where province.atitle=‘廣東省‘; +--------+-----------+------+--------+-----------+--------+ | aid | atitle | pid | aid | atitle | pid | +--------+-----------+------+--------+-----------+--------+ | 440000 | 廣東省 | NULL | 440100 | 廣州市 | 440000 | | 440000 | 廣東省 | NULL | 440200 | 韶關市 | 440000 | | 440000 | 廣東省 | NULL | 440300 | 深圳市 | 440000 | | 440000 | 廣東省 | NULL | 440400 | 珠海市 | 440000 | | 440000 | 廣東省 | NULL | 440500 | 汕頭市 | 440000 | | 440000 | 廣東省 | NULL | 440600 | 佛山市 | 440000 | | 440000 | 廣東省 | NULL | 440700 | 江門市 | 440000 | | 440000 | 廣東省 | NULL | 440800 | 湛江市 | 440000 | | 440000 | 廣東省 | NULL | 440900 | 茂名市 | 440000 | | 440000 | 廣東省 | NULL | 441200 | 肇慶市 | 440000 | | 440000 | 廣東省 | NULL | 441300 | 惠州市 | 440000 | | 440000 | 廣東省 | NULL | 441400 | 梅州市 | 440000 | | 440000 | 廣東省 | NULL | 441500 | 汕尾市 | 440000 | | 440000 | 廣東省 | NULL | 441600 | 河源市 | 440000 | | 440000 | 廣東省 | NULL | 441700 | 陽江市 | 440000 | | 440000 | 廣東省 | NULL | 441800 | 清遠市 | 440000 | | 440000 | 廣東省 | NULL | 441900 | 東莞市 | 440000 | | 440000 | 廣東省 | NULL | 442000 | 中山市 | 440000 | | 440000 | 廣東省 | NULL | 445100 | 潮州市 | 440000 | | 440000 | 廣東省 | NULL | 445200 | 揭陽市 | 440000 | | 440000 | 廣東省 | NULL | 445300 | 雲浮市 | 440000 | +--------+-----------+------+--------+-----------+--------+
# 註意右表沒有廣東省的,因為連接的結點是province.aid=city.pid。廣東省的pid是null。不滿足條件
這其實就是自連接了。需要去掉左表的表可以這樣操作:
mysql> select city.* from areas as province join areas as city on province.aid=city.pid where province.atitle=‘廣東省‘; +--------+-----------+--------+ | aid | atitle | pid | +--------+-----------+--------+ | 440100 | 廣州市 | 440000 | | 440200 | 韶關市 | 440000 | | 440300 | 深圳市 | 440000 | | 440400 | 珠海市 | 440000 | | 440500 | 汕頭市 | 440000 | | 440600 | 佛山市 | 440000 | | 440700 | 江門市 | 440000 | | 440800 | 湛江市 | 440000 | | 440900 | 茂名市 | 440000 | | 441200 | 肇慶市 | 440000 | | 441300 | 惠州市 | 440000 | | 441400 | 梅州市 | 440000 | | 441500 | 汕尾市 | 440000 | | 441600 | 河源市 | 440000 | | 441700 | 陽江市 | 440000 | | 441800 | 清遠市 | 440000 | | 441900 | 東莞市 | 440000 | | 442000 | 中山市 | 440000 | | 445100 | 潮州市 | 440000 | | 445200 | 揭陽市 | 440000 | | 445300 | 雲浮市 | 440000 | +--------+-----------+--------+
MYSQL的連接查詢