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); mysql連線查詢例項 MySQL連線查詢例項詳解
建立表suppliers create table suppliers s id int not null auto increment,s name char 50 not null,s city char 50 null,s zip char 10 null,s call char 50 not...
mysql連線查詢例項 MySQL連線查詢例項詳解
建立表suppliers create table suppliers s id int not null auto increment,s name char 50 not null,s city char 50 null,s zip char 10 null,s call char 50 not...
mysql連線查詢on MySQL連線查詢例項詳解
建立表suppliers create table suppliers s id int not null auto increment,s name char 50 not null,s city char 50 null,s zip char 10 null,s call char 50 not...