mysql-多表聯查(實例)


多表查詢

笛卡爾積查詢

笛卡爾積查詢:就是兩張表相乘,若左邊表有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 | 行政   |
+------+--------+------+---------+------+--------+

總結:外連接查詢,查到的是沒有對應關系的記錄,但是這樣的數據原本就是有問題的,所以最常用的是內連接查詢.

內連接表示: 只顯示匹配成的記錄

外連接: 沒有匹配成功的也要實現


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM