多表查詢
我們在查詢表格的過程中,往往要將多個表組合查詢使用,並且要實現多個表之間查詢數據,例如,查詢成績,再將成績和學生表連接起來
這個時候就要用到我們的多表查詢了
交叉連接
不帶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
利用左連接和右鏈接實現全連接
select 表1.屬性1,表2.屬性2,..., 表n.屬性n
from 表1 right join 表2
union
select 表1.屬性1,表2.屬性2... 表n.屬性n
from <表1> left join 表2
這裏有用到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 進行連接