mysql默认join是什么类型_MySQL:join语句类型
MySQL:join語句類型
join從句的類型有以下幾種:
內鏈接(inner)
右外連接(right outer)
左外連接(left outer)
全外連接(full outer)
交叉鏈接(cross)
連接條件:使用ON設定連接條件,也可以用WHERE代替
· ON:設定連接條件
· WHERE:進行結果集記錄的過濾
一,內連接inner join:
內連接是返回左表及右表符合連接條件的記錄,在MySQL中JOIN與INNER JOIN是等價的
語法為:select a.user_name,a.over,b.over from user1 as a join user2 as b on a.user_name=b.user_name;
( 選擇表中字段 ) (a為user1別名) ( 公共部分 )
例如:SELECT * FROM tabA JOIN tabB ON tabA.name = tabB.name;表示返回都含有的name值對應的字段
其連接關系如下圖所示:
二,右外連接:left outer join
顯示右表中的全部記錄和左表中符合連接條件的記錄
如果某字段只存在某一表,那么另一表的里字段返回 NULL
以下語句查詢出A表中的key和B表中的key相等的部分 ,而結果查詢出了B表中所有的數據和B表和A表相同的部分
select from tableA A right join TableB B on A.key=B.key
以下語句查詢出A表中的key和B表中的key相等的部分,而結果查詢出了B表中有的,而A表中沒有的數據,效果類似于inner join
select from tableA A right join TableB B on A.key=B.key where B.key IS NULL
它的連接關系圖如下所示:
三,左外連接:left outer join
顯示左表中的全部記錄和右表中符合連接條件的記錄
若某字段只存在某一表,則另一表的里字段返回 NULL
以下語句查詢出A表中的key和B表中的key相等的部分 ,而結果查詢出了A表中所有的數據和B表和A表相同的部分
select from tableA A left join TableB B on A.key=B.key
以下語句查詢出A表中的key和B表中的key相等的部分,而結果查詢出了A表中有的,而B表中沒有的數據,效果類似于inner join
select from tableA A left join TableB B on A.key=B.key where B.key IS NULL
它的連接關系圖如下所示:
四,交叉連接
(笛卡爾積連接):A*B,其實就是將兩個表進行相乘,一般項目中很少用到笛卡爾積連接
select * from user1 a cross join user2 b;
如上語句:如果user1表中有3條記錄,user2中有4條記錄,則結果就有12條記錄
五,MySQL 中 不會支持 full join
解決方法:采用左連接和右連接結合+ union all 方法來取得兩表的合集
select a.user_name , a.over , b.over
from user1 a
left join user2 b on a.user_name = b.user_name
union all
select b.user_name , b.over, a.over
from user1 a
right join user2 b on a.user_name = b.user_name
六,MySQL 聯合更新技巧:
題目:將user1表中user_name與user2表中user_name相同的user1表的over替換成user2表中的over值?
一般的正常思路:
update user1
set over='齊天大圣'
where user1.user_name in(
select b.user_name from user1 a left join user2 b on a.user_name = b.user_name);
這樣去執行思路上是對的,但是MySQL不支持這種機制
解決方法:
update user1 a
join (
select b.user_name from user1 a join user2 b on a.user_name = b.user_name
) b on a.user_name = b.user_name set a.over='齊天大圣'
七,join優化子查詢技巧:
一般子查詢寫法:(數據小時,沒有多大影響,如果數據量大時,則要消耗大量的查詢)
select a.user_name , a.voer , (select over from user2 where a.user_name = b,user_name) as over2
from user1 a;
join優化后的寫法如下所示:
select a.user_name , a.over , b.over from user1 a
left join user2 b on a.user_name = b.user_name
八,MySQL 使用join優化聚合子查詢:
問題:如何查詢出四人組中打怪最多的日期?
一般思路:聚合子查詢
select a.user_name , b.timestr , b.kills
from user1 a join user_kills b on a.id = b.user_id
where b.kills = (select MAX(c.kills) from user_kills c where c.user_id = b.user_id)
優化后的方法:
select a.user_name , b.timestr , b.kills
from user1 a
join user_kills b on a.id = b.user_id
join user_kills c on c.user_id = b.user_id
group by a.user_name , b.timestr , b.kills
having b.kills = MAX(c.kills)
九,分類聚合方式查詢每一個用戶某一個字段數據最大的兩條數據:
select d.user_name ,c.ctimestr,kills from
(select user_id ,timestr ,kills ,(
select count(*) from user_kills b where b.user_id = a.user_id and a.kills <= b.kills) as cnt
from user_kills a group by user_id,timestr,kills) c
join user1 d on c.user_id = d.id where cnt <= 2
總結
以上是生活随笔為你收集整理的mysql默认join是什么类型_MySQL:join语句类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP使用纯真IP数据库
- 下一篇: linux下的十六进制编辑器---wxH