多表查詢常涉及到到表連線的問題,主要涉及到內連線:
inner join
,外連線:
left join(or left outer join),right join(or right outer join),full join
和交叉連線:
cross join
。inner join
也叫等值鏈結。內連線具有排他性,而
outer join
卻是包容性的。
表連線進行查詢都是會產生一張中間的臨時表,然後再將這張臨時表返回給使用者。通用的
sql語句:
select (
待查詢欄位名
) from
表一(join type)
表二on (join condition) [
其他對臨時表記錄進行過濾的條件];
幾種連線方式查詢結果區別大致如下:
inner join:
只返回兩個表中連線字段相同的行(即符合條件的行);
left join:
返回包括左表中的所有記錄和右表中聯結字段相等的記錄;
right join:
返回包括右表中的所有記錄和左表中聯結字段相等的記錄;
full join:
兩個連線表的所有記錄;
cross join
:不帶where
子句,返回所有資料行的笛卡爾乘積.
表一
:tab_emp
id
emp_name
dept
1eric huang12
alice33
peter14
green
表二:
tab_dept
id
dept_name
1研發部
2財務部
3國際事業部
4綜合管理部
5銷售部
inner join
方式:
sql>
select
t1.emp_name, t2.dept_name
from
tab_emp t1
inner
join
tab_dept t2
ont1.dept=t2.id;
執行結果:
分析:可以看出採用
inner join
方式時,只會列出滿足連線條件的記錄;
left join
方式:
sql>
select
t1.emp_name, t2.dept_name
from
tab_emp t1
left
join
tab_dept t2
ont1.dept=t2.id;
執行結果:
分析:可以看出採用
left join
方式時,左表中的記錄和右表中聯結字段相等的記錄會全部列出,而右表中連線欄位不相等的字段全部為
null
;right join
方式:
sql>
select
t1.emp_name, t2.dept_name
from
tab_emp t1
right
join
tab_dept t2
ont1.dept=t2.id;
執行結果:
分析:可以看出採用
right join
方式時,返回包括右表中的所有記錄和左表中聯結字段相等的記錄
;,若左表中連線欄位不相等的字段全部為
null
;full join
方式:
sql>
select
t1.emp_name, t2.dept_name
from
tab_emp t1
full
join
tab_dept t2
ont1.dept=t2.id;
執行結果:
分析:可以看出採用
full join
方式時,左表的所有記錄會全部返回,右表的所有記錄也會全部返回,匹配的就直接列出,不匹配的某一邊的記錄值為
null
就行;cross join
方式:
值得注意的是該方式語法上和其他幾種有點差別,不能用
on子句。
select * from [
表一] cross join [
表二] 或者
select * from [
表一], [表二]
sql>
select
t1.emp_name, t2.dept_name
from
tab_emp t1
cross
join
tab_dept t2;
分析:最後返回的記錄數實際上就是兩張表記錄數的乘積。該型別的
join
句法不需要連線條件,乙個表中的所有行分別都會連線另乙個表的所有行,得到的結果被稱為乙個笛卡爾積。
最後總結一下,實際專案開發中
cross join
用得比較少,它是不能使用
on關鍵字的,其它都要用。一般先進行連線獲取到需要的新錶資料,然後使用其他子句如
where
子句進行過濾,
group by
子句進行聚合,
order by
子句進行排序等等操作。
採用join
方式多表連線查詢時,如果如果用到了
group by
,group by
的排序順序必須和
select
中列出的字段順序的一致
. 這可能是由於
group by
決定了表的排序方式
, 如果是左外連線
, 如果右邊沒有對應的話
,還要填補空值
. 如果排序方式對應不起來
, 就會錯亂。
mysql 多表鏈結查詢
我要做乙個按銷售數量排序的查詢sql操作,現在有如下3個表,要求獲取d product表中的所有資料 包括沒有銷售記錄的資料 以及d item表中的銷售數量 product num欄位的值 查詢條件是d category表的id,按d item表中的銷售數量 product num欄位的值 請問這樣...
MySQL 多表鏈結查詢
多表鏈結查詢時從多個表中獲取資料 table reference inner join outer join table reference on conditional expr 根據連線條件從多個表中查詢選擇資料,顯示這些表中與連線條件匹配的資料行,組合成新紀錄 就是匹配兩表相同的行 交集 內連...
多表鏈結的問題
select a.b.c.d.from a left join b on a.id b.id left join c on a.id c.id left join d on a.id d.id where a.id in 首先會把a和b按照id 關聯,得出來的合集再和進行關聯,依次類推 如果a裡id...