1. 程式人生 > >Mysql筆記(四)多表連線查詢

Mysql筆記(四)多表連線查詢

版權宣告:本文為博主原創文章,轉載請附上博文連結! https://blog.csdn.net/csdnluolei/article/details/83410321

資料庫的建立參考我的另一篇部落格 https://blog.csdn.net/csdnluolei/article/details/83409945

#多表連線查詢

  1. 交叉連線:交叉連線又叫笛卡爾積,它是指不使用任何條件,直接將一個表的所有記錄和另一個表中的所有記錄一一匹配。取兩個表並集。
  2. 內連線則是隻有條件的交叉連線,根據某個條件篩選出符合條件的記錄,不符合條件的記錄不會出現在結果集中,即內連線只連線匹配的行。取兩個表交集。
  3. 外連線左外連線、右外連線、全外連結
  4. 左外連線,也稱左連線,左表為主表,左表中的所有記錄都會出現在結果集中,對於那些在右表中並沒有匹配的記錄,仍然要顯示,右邊對應的那些欄位值以NULL來填充。
  5. 右外連線,也稱右連線,右表為主表,左連線和右連線可以互換。
  6. MySQL目前還不支援全外連線。可以用左連線union右連線實現。

自連線只有一個表的查詢

#JOIN

#相當於我們平時用的where,就是把兩張表中同時滿足a.id=b.id的資料找出來;

SELECT *FROM tb_depta JOIN tb_emp b ON a.s_id=b.s_id;

#1、交叉連線/迪卡爾交集

SELECT *FROM tb_dept,tb_emp;

#標準

SELECT 

*

FROM

tb_dept

CROSS JOIN

tb_emp;

#2、內連線,條件:主外來鍵關聯

 
  1. SELECT
    
    *
    
    FROM
    
    tb_dept
    
    INNER JOINt b_emp
    
    WHERE
    
    tb_dept.deptno=tb_emp.dept_id;

     

#3、外連線

#左連線:以左表為主表,取兩表交集,加上左表剩下的將被查詢

 
SELECT

*

FROM

tb_deptd

LEFT JOIN tb_empe

ONd.deptno=e.dept_id;

#右連線

 

SELECT

*

FROM

tb_dept d

RIGHT JOIN tb_empe

ON d.deptno=e.dept_id;

#4、自連線:只涉及到一個表

 
SELECT

*

FROM

tb_empe1,tb_empe2

WHERE

e1.dept_id=e2.dept_id;

#5、外連線:OUTERJOIN(MySQL不支援OUTERJOIN,)

#外連線就是求兩個集合的並集。從笛卡爾積的角度講就是從笛卡爾積中挑出ON子句條件成立的記錄,然後加上左表中剩餘的記錄,最後加上右表中剩餘的記錄。

#另外MySQL不支援OUTERJOIN,但是我們可以對左連線和右連線的結果做UNION操作來實現。

 
SELECT

*

FROM

tb_deptd

LEFT JOIN tb_empe

ON d.deptno=e.dept_id

UNION

SELECT

*

FROM

tb_deptd

RIGHT JOIN tb_empe

ON d.deptno=e.dept_id;

#USING子句

#功能相當於ON,區別在於USING指定一個屬性名用於連線兩個表,而ON指定一個條件。

#deptno與dept_id不同名,無法用Using,這裡用id代替下。

 

 

SELECT

*

FROM

tb_deptd

LEFT JOIN tb_empe

USING(id);

#子查詢

#查詢工資比Smith高的員工資訊

 
SELECT

*

FROM

tb_emp

WHERE

sal>(

SELECT

sal

FROM

tb_emp

WHERE

ename='Smith'

);

#查詢月工資最高的員工姓名

 
SELECT

ename

FROM

tb_emp

WHERE

sal=(SELECT MAX(sal) FROM tb_emp);

#ANY與子查詢返回的任意值比較,大於最小,小於最大

#查詢工資比開發工程師工資高的員工資訊

 
SELECT

*

FROM

tb_emp

WHERE

sal>ANY(

SELECT

sal

FROM

tb_emp

WHERE

job='開發工程師'

);

#ALL,大於最大,小於最小

#查詢工資比開發工程師工資低的員工資訊

 
SELECT

*

FROM

tb_emp

WHERE

sal<ALL(

SELECT

sal

FROM

tb_emp

WHERE

job='開發工程師'