多表查詢
笛卡爾積查詢
笛卡爾積查詢:就是兩張表相乘,若左邊表有M條信息,右邊表有N條信息,那么查詢顯示的信息總共為M*N條,這其中往往包含大量錯誤數據,需要用where+條件來過濾無用信息
# 笛卡爾積查詢語句
select * from dept,emp;
+------+--------+------+--------+------+---------+
| id | name | id | name | sex | dept_id |
+------+--------+------+--------+------+---------+
| 1 | 市場 | 1 | 大黃 | m | 1 |
| 2 | 財務 | 1 | 大黃 | m | 1 |
| 3 | 行政 | 1 | 大黃 | m | 1 |
| 1 | 市場 | 2 | 老王 | m | 2 |
| 2 | 財務 | 2 | 老王 | m | 2 |
| 3 | 行政 | 2 | 老王 | m | 2 |
| 1 | 市場 | 3 | 老李 | w | 30 |
| 2 | 財務 | 3 | 老李 | w | 30 |
| 3 | 行政 | 3 | 老李 | w | 30 |
+------+--------+------+--------+------+---------+
# 這里面有很多錯誤的信息,我們可以在后面+where 條件來過濾信息
select * from dept,emp where dept_id = dept.id;
+------+--------+------+--------+------+---------+
| id | name | id | name | sex | dept_id |
+------+--------+------+--------+------+---------+
| 1 | 市場 | 1 | 大黃 | m | 1 |
| 2 | 財務 | 2 | 老王 | m | 2 |
+------+--------+------+--------+------+---------+
內連接查詢
本質上就是笛卡爾積查詢
# 查詢語句
# select * from dept inner join emp on dept_id = dept.id;
# inner 可以不寫
select * from dept join emp on dept_id = dept.id;
# join替代了逗號,如果多個表,就加多join,
# on 替代了where,on也是過濾信息
+------+--------+------+--------+------+---------+
| id | name | id | name | sex | dept_id |
+------+--------+------+--------+------+---------+
| 1 | 市場 | 1 | 大黃 | m | 1 |
| 2 | 財務 | 2 | 老王 | m | 2 |
+------+--------+------+--------+------+---------+
左外連接查詢
左邊的表無論是否能匹配都要完整顯示
右邊的僅展示匹配上的記錄
select * from dept left join emp on dept_id = dept.id;
+------+--------+------+--------+------+---------+
| id | name | id | name | sex | dept_id |
+------+--------+------+--------+------+---------+
| 1 | 市場 | 1 | 大黃 | m | 1 |
| 2 | 財務 | 2 | 老王 | m | 2 |
| 3 | 行政 | NULL | NULL | NULL | NULL |
+------+--------+------+--------+------+---------+
右外連接查詢
右邊的表無論是否能夠匹配都要完整顯示
左邊的僅展示匹配上的記錄
select * from dept right join emp on dept_id = dept.id;
+------+--------+------+--------+------+---------+
| id | name | id | name | sex | dept_id |
+------+--------+------+--------+------+---------+
| 1 | 市場 | 1 | 大黃 | m | 1 |
| 2 | 財務 | 2 | 老王 | m | 2 |
| NULL | NULL | 3 | 老李 | w | 30 |
+------+--------+------+--------+------+---------+
全外連接查詢
無論是否匹配成功,兩邊表的數據都要全部顯示
mysql 不支持全外連接,所以我們得用到union來拼接左連接和右連接,來組合成一個全外連接查詢表
# 需求:查詢所有員工與所有部門的對應關系
select * from emp full join dept on dept_id = dept.id;
# 注意:mysql不支持全外連接
select * from emp left join dept on dept_id = dept.id
union
select * from emp right join dept on dept_id = dept.id;
# union 將自動去除重復的記錄
# union 必須保證兩個查詢結果的列數相同,一般用在多個結果完全一致時
# union all 不去重復
+------+--------+------+---------+------+--------+
| id | name | sex | dept_id | id | name |
+------+--------+------+---------+------+--------+
| 1 | 大黃 | m | 1 | 1 | 市場 |
| 2 | 老王 | m | 2 | 2 | 財務 |
| 3 | 老李 | w | 30 | NULL | NULL |
| NULL | NULL | NULL | NULL | 3 | 行政 |
+------+--------+------+---------+------+--------+
總結:外連接查詢,查到的是沒有對應關系的記錄,但是這樣的數據原本就是有問題的,所以最常用的是內連接查詢.
內連接表示: 只顯示匹配成的記錄
外連接: 沒有匹配成功的也要實現