MySQL 連線查詢彙總
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);
本文由部落格一文多發平臺 OpenWrite 釋出!