比如有tablea ,tableb,tablea和tableb是一對多
需求一:根據tableb的某寫字段,查詢出tablea
分析:如果此時使用內鏈結 則相應的語句是:select a.* from tablea a ,tableb b where a.id =tableb.aid and b.code='4401'
此時返回的結果是tablea在tableb有子資料的的部分資料,而如果表tablea中的某條資料,在表tableb中不存在子資料,此時是查詢不出來!
如果使用的是外連線,則相應的語句如下:select a.* from tablea a left join tableb b on a.id=b.aid and b.code='4401';
此時返回的結果是tablea中的全部資料,而且有重複數出現,則應該用distinct過濾,語句如下:
:selectdistincta.* from tablea a left join tableb b on a.id=b.aid and b.code='4401';
2:如果查詢要返回的是一的一方,而且只想返回在多的一方存在記錄的資料,則使用屋內連線。
內連線: 只連線匹配的行
左外連線: 包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行
右外連線: 包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配的行
全外連線: 包含左、右兩個表的全部行,不管另外一邊的表中是否存在與它們匹配的行。
交叉連線: 生成笛卡爾積-它不使用任何匹配或者選取條件,而是直接將乙個資料來源中的每個行與另乙個資料來源的每個行都一一匹配
舉個例子吧。
表aid name
1 張
2 李
3 王
表bid address a_id
1 北京 1
2 上海 3
3 南京 10
/******************************** left join 左連線*****************************************/
包容性:a表包容b表,左連線左表是全的.(left join 或 left outer join )
sql語句如下:
select a.name, b.address
from a
left join b on a.id = b.a_id
查詢結果為:
name address
張 北京
李 null
王 上海
/******************************** right join 右連線*****************************************/
包容性:b表包容a表,右連線右表是全的.(right join 或 right outer join )
sql語句如下:
select a.name, b.address
from a
right join b on a.id = b.a_id
查詢結果為:
name address
張 北京
王 上海
null 南京
/******************************** inner join 內連線*****************************************/
排他性: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
/******************************** full join 全連線*****************************************/
注釋:全外連線返回參與連線的兩個資料集合中的全部資料,無論它們是否具有與之相匹配的行。在功能上,它等價於
對這兩個資料集合分別進行左外連線和右外連線,然後再使用消去重複行的並操作將上述兩個結果集合並為乙個結果集
。(full join 或 full outer join )
sql語句如下:
select * from a
full join b
查詢結果為:
id name id address a_id
1 張 1 北京 1
2 李 1 北京 1
3 王 1 北京 1
1 張 2 上海 3
2 李 2 上海 3
3 王 2 上海 3
1 張 3 南京 10
2 李 3 南京 10
3 王 3 南京 10
/******************************** cross join(不帶條件where...)***********************************/
注釋:返回3*3=9條記錄,即笛卡爾積
sql語句如下:
select * from a
cross join b
查詢結果為:
id name id address a_id
1 張 1 北京 1
2 李 1 北京 1
3 王 1 北京 1
1 張 2 上海 3
2 李 2 上海 3
3 王 2 上海 3
1 張 3 南京 10
2 李 3 南京 10
3 王 3 南京 10
cross join等價於:
select * from a,b
注意:1. on a.id = b.id 等同於 using(id)//這裡欄位名要相同
2. 當 mysql 在從乙個表中檢索資訊時,你可以提示它選擇了哪乙個索引。
如果 explain 顯示 mysql 使用了可能的索引列表中錯誤的索引,這個特性將是很有用的。
通過指定 use index (key_list),你可以告訴 mysql 使用可能的索引中最合適的乙個索引在表中查詢記錄行。
可選的二選一句法 ignore index (key_list) 可被用於告訴 mysql 不使用特定的索引。
效率問題:
1.inner join比left join快
注:inner join 內連線等價於下面的sql: select a.name, b.address from a, b where a.id = b.a_id
所以一般要用一般的連線就可以了.
2.連線欄位建索引
內連線外連線
內連線 內連線也叫連線,是最早的一種連線,最早被稱為普通連線或自然連線。內連線是從結果中刪除其他被連線表中沒有匹配行的所有行,所以內連線可能會丟失資訊。內連線的語法 select fieldlist from table1 inner join table2 on table1.column tab...
SQL 內連線,外連線(左外連線 右外連線)
參考整理筆記 關鍵字 inner join on 語句 select from a table a inner join b table bon a.a id b.b id 執行結果 說明 組合兩個表中的記錄,返回關聯字段相符的記錄,也就是返回兩個表的交集 陰影 部分。關鍵字 left join o...
Oracle外連線,左外連線,右外連線,內連線簡析
內連線即普通等值連線 select e.ename,e.job,e.sal,d.dname from emp e inner join dept d on e.deptno d.deptno where e.sal 2000 select e.ename e.job,e.sal d.dname fr...