MYSQL-連接查詢:
# 連接查詢:把多張表進行記錄的連接(按照某個條件進行資料的拼接)
# 分類
1,內鏈接
2,外連接
# 左外
# 右外
3,自然連接
4,交叉連接
MYSQL-內鏈接 :
# inner join (inner關鍵字可以省略) [inner join比left join快]
# 從左表中取出每一條記錄,與右表中的所有記錄進行匹配
# 匹配必須是某個條件,在左表和右表中相同【公共部分】,才會保留結果.否則,不保留
# 基本語法
SELECT * FROM [左表] innder join [右表] on [左表].[欄位]=[右表].[欄位];
# 內連接,可以沒有on,那么系統會保留所有的結果,沒錯.又是傳說中的笛卡爾積
# '還可以使用where代替on,但是效率沒有on高'
例子:
排他性: A,B表中至少有1個匹配時,才回傳行,兩表的【交集】
SQL陳述句如下:
select A.name,B.address from A
inner join B
on A.id = B.A_id
查詢結果為:
name address
張 北京
王 上海
inner join 內連接等價于下面的sql:
SELECT A.name, B.address
FROM A, B
WHERE A.id = B.A_id
MYSQL-外連接:
1, 左外
左外連接: 包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行,
【通俗:就是2張表,查左表滿足條件的所有以及右表中含有左表條件的資料,where (右表條件)..is not null顯示不為null的數】
# 以某張表為主,取出里面的所有記錄.每條與另外一張表.不管能不能匹配上條件.最終都會保留.如果不能匹配,那么其他表的欄位都置空
# left join (left join 是left outer join的簡寫)
# 基本語法
SELECT
...
FROM
[左表]
LEFT JOIN
[右表]
ON
[條件]
# 會把左邊所有的資料都顯示出來,如果右表沒有匹配的資料.以null顯示
例:SELECT * from a_table a LEFT JOIN b_table b on a.a_id = b.b_id (where b_id is not NULL);
2,右外
右外連接: 包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配的行
【通俗:就是2張表,查右表滿足條件的所有以及左表中含有右表條件的資料,where (左表條件)..is not null顯示不為null的數】
# right join
# 基本語法
SELECT
...
FROM
[左表]
RIGHT JOIN
[右表]
ON
[條件]
# 會把右表所有的資料都顯示出來,如果左表沒有匹配的資料.以null顯示
例:SELECT * from a_table a RIGHT JOIN b_table b on a.a_id = b.b_id (where a_id is not NULL);
MYSQL-自然連接:
# natural join
# MYSQL方言,其他資料庫不一定有
# '自動的匹配連接條件',但是.不怎么建議使用.是以'欄位名稱作為匹配模式'
# 基本語法
SELECT ...FROM [表1] natural join [表2]; //內連接
* 自動使用同名欄位作為連接條件,結果中會合并該欄位
SELECT ...FROM [表1] left natural join [表2]; //左外自然連接
SELECT ...FROM [表1] right natural join [表2]; //右外自然連接
MYSQL-交叉連接:
# cross join
# 從一張表中回圈取出每一條記錄,每條記錄都去另外一張表進行匹配.而且匹配一定保留(沒有條件匹配不帶條件where...)
# 而連接本身欄位就會增加(保留) -- 笛卡爾積(笛卡爾是沒有意義的,【盡量要避免】)
# 存在的價值:保證連接這種結構的完整性而已.
# 基本語法
SELECT * from [左表] cross join [右表]; == select * from [左表],[右表];
select * from emp cross join dept;
# 也可以加上條件
select *
from emp e
cross join
dept d
on e.deptno=d.deptno ;
【兩表連接如果要避免回傳笛卡爾積,必須確保至少一方表是唯一的,否則在能查到記錄的情況下,不論哪一種連接方式一定會回傳笛卡爾積記錄集的,】
MYSQL-全外:
# 全外(MYSQL不支持,但是我們可以通過其他方式實作)
# 這個就是,左右兩表都是相同的,兩個表的所有內容都必須全部出來,如果沒有對應記錄的,就用null填充
select * from 表1 left outer join 表2 on 表1.欄位=表2.欄位
union
select * from 表1 right outer join 表2 on 表1.欄位=表2.欄位;
-聯合查詢 ,把他們的結果集合并一下就出來了
例: SELECT * from a_table a LEFT JOIN b_table b on a.a_id = b.b_id (where b_id is not NULL) UNION SELECT * from a_table a
LEFT JOIN b_table b on a.a_id = b.b_id (where b_id is not NULL);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/24722.html
標籤:其他
下一篇:任務調度器
