1. 程式人生 > >MYSQL的連接查詢

MYSQL的連接查詢

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的連接查詢