MySQL必備知識多表查詢

多表查詢

我們在查詢表格的過程中,往往要將多個表組合查詢使用,並且要實現多個表之間查詢數據,例如,查詢成績,再將成績和學生表連接起來
這個時候就要用到我們的多表查詢了

交叉連接

不帶WHERE條件子句,它將會返回被連接的兩個表的笛卡爾積,返回結果的行數等於兩個錶行數的乘積,有where子句,往往會先生成兩個錶行數乘積的數據表,然後才根據where條件從中選擇
交叉連接的語法格式

select <表名1.屬性名1>..., 
       <表名n.屬性名n>..., 
       from <表名1>,<表名2> 
       where <條件表達式>;

這裏有涉及到一個笛卡爾積的概念,也就是多個表中所有數據都相互匹配一次
兩個集合X和Y,又稱直積,即將所有可以匹配的行數據都匹配上了一次

內連接

交叉連接產生的笛卡爾積的產生的額外的判斷和消耗,如果要查詢比較大的數據的話查,詢的效率相當低下,所以需求一個更高效的一個查詢範式,內連接比交叉連接更省空間,並且效率更高
使用比較運算符,根據表中匹配的屬性,列出與連接條件相匹配的數據,
內連接關鍵字: inner join on

select [表名1.屬性名1,...][表名n.屬性名n,...] 
        from [數據庫名1.表名1] 
        inner join [數據庫名2.表名2] 
        on 條件表達式;

外連接

外連接就是把內連接再進行篩選再添加進來,會保留一部分的數據又分爲左外連接、右外連接和全外連接
1.左外連接(左連接)
是以左表爲基準,顯示左表查詢字段所有記錄,右表只顯示和左表匹配的記錄,沒有匹配的用NULL代替。
關鍵字: left join

select [表名1.屬性名1,...,表名n.屬性名n.] 
      from <表名1> 
      left join <表名2> 
      on 條件表達式;

2.右外連接(右連接)
是以右表爲基準,顯示右表查詢字段所有記錄,左表只顯示和右表匹配的記錄,沒有匹配的用NULL代替。
關鍵字: right join

select <表名1.屬性名1,……,表名n.屬性名n> 
       from <表名1> 
       right join <表名2> 
       on 條件表達式; 等於 
select 表名1.屬性名1,……, 表名n.屬性名n 
       from 表名2 
       left join 表名1 
       on 條件表達式;

3.全外連接(全連接)
全連接的左右表不做限制,顯示全部數據,沒有匹配的數據用NULL代替。
關鍵字: full join
注意: mysql 不支持全連接
使用左連接和右連接加上 union 合併實現全連接
取別名
在查詢時可以給屬性取別名,使得讀取出的數據更直觀。
語句:as

select <屬性名> as <別名> from <表名> as <別名>;

其中語句as可以省略

合併的使用

1.合併: union
MySQL UNION 操作符用於連接兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT語句會刪除重複的數據。

select <單個屬性> 
       from <表名稱> 
       union select <單個屬性> 
       from <表名稱>;

2.合併查詢結果
關鍵字
UNION 語句:用於將不同表中相同列中查詢的數據展示出來;(不包括重複數據)
ALL: 可選,包含重複數據。
使用形式如下:

select <屬性名> 
       FROM <表名> 
       union (all) select <列名稱> 
       from <表名稱>

用於合併多個select語句的結果,要求第一個sql語句返回的列與第二個sql語句返回的列相同
3.通過查詢的結果集向表中插入數據

insert into <表名> select <數據> union all

利用左連接和右鏈接實現全連接

select1.屬性1,2.屬性2,..., 表n.屬性n 
      from1 right join2 
union 
select1.屬性1,2.屬性2... 表n.屬性n 
       from <1> left join2

這裏有用到union連接兩個查詢語句來實現全連接。

多表聯查

可以連接查詢多個表中的數據(一般最好不要超過4個表)
一般格式:

select <表名1.屬性名1,……,表名n.屬性名n> 
        from <表名1> 
        inner join <表名2> on <條件表達式> 
        inner join <表名3> on <條件表達式> 
        left join <表名n> on <條件表達式> 
        right join ......

多表聯查的兩種格式的區別及表取別名的使用:

##將員工和部門已經薪資都查詢出來 
select e.e_name as 姓名,enter_date as 入職日期,d_name as 部門, 
s_number as 薪資,m_name as 職位 
from employee_tb as e 
inner join department_tb as d on e.department_id=d.d_id 
inner join salary_tb as s on s.employee_id=e.e_id 
left join management_tb as m on m.employee_id=e.e_id;

總結

  • 交叉連接
    交叉連接連接的效率過低,不推薦使用(會產生n1*n2)
  • 內連接
    找到兩張表相符合條件的數據,進行篩選連接
  • 外連接
    外連接會保留一張表的數據,將另外一張表的數據進行條件篩選連接,沒有符合連接條件將另外一張表用null填充
  • 多表連接
    連續使用多個 inner join 進行連接
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章