日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql默认join是什么类型_MySQL:join语句类型

發布時間:2023/12/19 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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语句类型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。