Mysql的join語句


mysql超強功能之一:join

# group by 必須放在 order by 和 limit之前,不然會報錯
# 你可以在 SELECT, UPDATE 和 DELETE 語句中使用 Mysql 的 JOIN 來聯合多表查詢。
# JOIN 常用分為如下三類(但不僅僅只有這三類): 
# INNER JOIN(內連接,或等值連接):獲取兩個表中字段匹配關系的記錄;使用MySQL的INNER JOIN(也可以省略 INNER 使用 JOIN,效果一樣)
# LEFT JOIN(左連接):獲取左表所有記錄,即使右表沒有對應匹配的記錄。
# RIGHT JOIN(右連接): 與 LEFT JOIN 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄。

1. 首先是兩張表:

select * from my_test_copy;  #第一張表

 

select * from my_test;  #第二張表

 

2. cross join,類似一次join多個表,求笛卡爾積

select a.id, a.name_people, b.name_adress from my_test_copy as a, my_test as b; #可用
select a.id, a.name_people, b.name_adress from my_test_copy as a cross join my_test as b; #與上一句結果一致

select * from my_test_copy as a, my_test as b; #可用
select * from my_test_copy as a cross join my_test as b; #與上一句結果一致

 

3.  inner join會連接形成新的列

select a.id, a.name_people, b.name_adress from my_test_copy as a inner join my_test as b on a.name_adress=b.name_adress; #可用,或者用:(即不用 'as' 也行)
select a.id, a.name_people, b.name_adress from my_test_copy a inner join my_test b on a.name_adress=b.name_adress; #也可用

 

select a.id, a.name_people, a.name_adress from my_test a inner join my_test_copy b on a.name_adress=b.name_adress;   #針對於on的對應列進行笛卡爾積,返回所需要的列

 

select * from my_test a inner join my_test_copy b on a.name_adress=b.name_adress;  #相同列會自動加數字表示差異

 

4. 左連接 left join,不管怎樣,a的值都會返回,b的值中如果不存在則用NULL表示;連接表示連在一起,形成新的列,也算笛卡爾積 <a, b>;左連接LEFT JOIN的含義就是求兩個表的交集外加左表剩下的數據。依舊從笛卡爾積的角度講,就是先從笛卡爾積中挑出ON子句條件成立的記錄,然后加上左表中剩余的記錄(見結果中最后三條)。

select a.id, a.name_people, a.name_adress, b.id as b_id, b.name_people as name_people from my_test_copy a left join my_test b on a.name_adress=b.name_adress;

 

select * from my_test_copy a left join my_test b on a.name_adress=b.name_adress where b.name_adress is NULL; # 即left join中左邊多余的部分

 

5. 右連接 right join,不管怎樣,b的值都會返回,a的值中如果不存在則用NULL表示;連接表示連在一起,形成新的列,也算笛卡爾積 <a, b>;同理右連接RIGHT JOIN就是求兩個表的交集外加右表剩下的數據。再次從笛卡爾積的角度描述,右連接就是從笛卡爾積中挑出ON子句條件成立的記錄,然后加上右表中剩余的記錄。

select a.id, a.name_people, a.name_adress, b.id as b_id, b.name_people as name_people from my_test_copy a right join my_test b on a.name_adress=b.name_adress;

 

select * from my_test_copy a right join my_test b on a.name_adress=b.name_adress where a.name_adress is NULL; # 即right join中左邊多余的部分,此時該表為空。

 

6. 使用 using進行連接,using與on的效果相同,但是要兩個表的列名相同

# using 
select * from my_test_copy right join my_test using(name_adress);

7. where也可以用於連接

select * from my_test_copy, my_test where my_test_copy.name_adress=my_test.name_adress;  # 這樣也可以做到連接兩個表

8. 附加:外連接,即求兩個集合的並集。從笛卡爾積的角度講就是從笛卡爾積中挑出ON子句條件成立的記錄,然后加上左表中剩余的記錄,最后加上右表中剩余的記錄。另外MySQL不支持OUTER JOIN,但是我們可以對左連接和右連接的結果UNION操作來實現,例如:

select * from my_test_copy a left join my_test b on a.name_adress=b.name_adress
union 
select * from my_test_copy a right join my_test b on a.name_adress=b.name_adress;

 

參考:

https://www.cnblogs.com/beili/p/9140019.html

https://www.runoob.com/w3cnote/sql-join-image-explain.html

https://www.runoob.com/mysql/mysql-join.html


免責聲明!

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



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