MySQL中join語(yǔ)句的基本使用教程及其字段對(duì)性能的影響
join語(yǔ)句的基本使用
SQL(MySQL) JOIN 用于根據(jù)兩個(gè)或多個(gè)表中的字段之間的關(guān)系,從這些表中得到數(shù)據(jù)。
JOIN 通常與 ON 關(guān)鍵字搭配使用,基本語(yǔ)法如下:
... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona
table1 通常稱為左表,table2 稱為右表。ON 關(guān)鍵字用于設(shè)定匹配條件,用于限定在結(jié)果集合中想要哪些行。如果需要指定其他條件,后面可以加上 WHERE 條件 或者 LIMIT 以限制記錄返回?cái)?shù)目等。
下面以最常見(jiàn)的兩表連接來(lái)說(shuō)明 MySQL JOIN 的用法,關(guān)于多表 JOIN 請(qǐng)參見(jiàn)《MySQL JOIN 多表》。
MySQL JOIN 分類(lèi)
JOIN 按照功能大致分為如下三類(lèi):
- INNER JOIN(內(nèi)連接):取得兩個(gè)表中存在連接匹配關(guān)系的記錄。
- LEFT JOIN(左連接):取得左表(table1)完全記錄,即是右表(table2)并無(wú)對(duì)應(yīng)匹配記錄。
- RIGHT JOIN(右連接):與 LEFT JOIN 相反,取得右表(table2)完全記錄,即是左表(table1)并無(wú)匹配對(duì)應(yīng)記錄。
關(guān)于 MySQL FULL JOIN 全連接
MySQL 沒(méi)有提供 SQL 標(biāo)準(zhǔn)中的 FULL JOIN(全連接):兩個(gè)表記錄都取出,而不管彼此是否有對(duì)應(yīng)記錄。要解決此問(wèn)題,可以使用 UNION 關(guān)鍵字來(lái)合并 LEFT JOIN 與 RIGHT JOIN,達(dá)到模擬 FULL JOIN 的目的。
MySQL INNER JOIN
INNER JOIN 用于取得兩個(gè)表中存在連接匹配關(guān)系的記錄。下面是兩個(gè)原始數(shù)據(jù)表:
article 表中文章的所屬用戶是通過(guò) uid 這個(gè)字段與 user 表關(guān)聯(lián)起來(lái)的。通過(guò)觀察數(shù)據(jù)不難發(fā)現(xiàn),對(duì)于 uid=3 的用戶,并沒(méi)有發(fā)表任何文章;而文章中 aid=4 卻無(wú)法在 uid 表中找到對(duì)應(yīng)記錄(可能是該用戶被刪除而其所屬的文章卻被保留了下來(lái))。
我們列出所用文章與用戶一一對(duì)應(yīng)的數(shù)據(jù)。
SELECT … INNER JOIN … ON 語(yǔ)句如下:
SELECT article.aid,article.title,user.username FROM article INNER JOIN user ON article.uid = user.uid
返回查詢結(jié)果如下:
對(duì)于 INNER JOIN,等同與下面的 SQL 語(yǔ)句:
SELECT article.aid,article.title,user.username FROM article,user WHERE article.uid = user.uid
CROSS JOIN
CROSS JOIN 即交叉連接,在不指定 ON 條件下:
SELECT article.aid,article.title,user.username FROM article CROSS JOIN user
得到的結(jié)果是被連接的兩個(gè)數(shù)據(jù)表的乘積,即笛卡爾積。
實(shí)際上,在 MySQL 中(僅限于 MySQL) CROSS JOIN 與 INNER JOIN 的表現(xiàn)是一樣的,在不指定 ON 條件得到的結(jié)果都是笛卡爾積,反之取得兩個(gè)表完全匹配的結(jié)果。
INNER JOIN 與 CROSS JOIN 可以省略 INNER 或 CROSS 關(guān)鍵字,因此下面的 SQL 效果是一樣的:
平板視圖打???
... FROM table1 INNER JOIN table2 ... FROM table1 CROSS JOIN table2 ... FROM table1 JOIN table2
join的字段字符集編碼對(duì)性能的影響
先來(lái)看一下示例代碼:
建utf-8編碼的表 t1:
CREATE TABLE IF NOT EXISTS `t1` ( `name` varchar(50) NOT NULL DEFAULT '', KEY `name` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
隨便插入些數(shù)據(jù),數(shù)量大一點(diǎn),后面實(shí)驗(yàn)結(jié)果更清晰,偷個(gè)懶,構(gòu)造隨機(jī)字符串插入語(yǔ)句
insert into t1(name) select concat( char(round((rand())*25)+97), char(round((rand())*25)+65), char(round((rand())*25)+65), char(round((rand())*25)+97), char(round((rand())*25)+65), char(round((rand())*25)+65), char(round((rand())*25)+97), char(round((rand())*25)+65) )
每次執(zhí)行插入一條記錄,用你熟悉的腳本(python,php,shell等都行)寫(xiě)個(gè)循環(huán),執(zhí)行一萬(wàn)次以上。
將該表復(fù)制成一個(gè)新表t2,刪除一部分?jǐn)?shù)據(jù),1000條左右即可。(推薦使用phpMyAdmin)
再將t2復(fù)制為t3,并將字段改為gb2312編碼。
使用一個(gè)left join語(yǔ)句,寫(xiě)一個(gè)語(yǔ)句,查出t2/t3比t1少了哪些記錄。
語(yǔ)句很簡(jiǎn)單,如下:
SELECT SQL_NO_CACHE t1.name, t2.name FROM t1 LEFT JOIN t2 ON t1.name = t2.name WHERE t2.name IS NULL LIMIT 0 , 30
注意加入 SQL_NO_CACHE ,禁用mysql緩存。
先看編碼一致的t2表,phpMyAdmin里執(zhí)行結(jié)果:
顯示行 0 - 29 ( 1,129 總計(jì), 查詢花費(fèi) 0.0010 秒)
平均耗時(shí)大概為0.0010秒
SELECT SQL_NO_CACHE t1.name, t3.name FROM t1 LEFT JOIN t3 ON t1.name = t3.name WHERE t2.name IS NULL LIMIT 0 , 30
phpMyAdmin執(zhí)行結(jié)果:
顯示行 0 - 29 ( 30 總計(jì), 查詢花費(fèi) 0.1871 秒)
差兩個(gè)數(shù)量級(jí)!
查詢語(yǔ)句解釋:
相關(guān)文章
MySql如何查看索引并實(shí)現(xiàn)優(yōu)化
這篇文章主要介紹了MySql如何查看索引并實(shí)現(xiàn)優(yōu)化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12CentOS7下mysql 8.0.16 安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了CentOS7下mysql 8.0.16 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05MySQL root賬號(hào)遠(yuǎn)程新建數(shù)據(jù)庫(kù)報(bào)錯(cuò)1044問(wèn)題及解決方法
這篇文章主要介紹了MySQL root賬號(hào)遠(yuǎn)程新建數(shù)據(jù)庫(kù)報(bào)錯(cuò)1044問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09mysql 數(shù)據(jù)庫(kù)備份和還原方法集錦 推薦
本文討論 MySQL 的備份和恢復(fù)機(jī)制,以及如何維護(hù)數(shù)據(jù)表,包括最主要的兩種表類(lèi)型:MyISAM 和 Innodb,文中設(shè)計(jì)的 MySQL 版本為 5.0.22。2010-03-03深入sql多表差異化聯(lián)合查詢的問(wèn)題詳解
本篇文章是對(duì)sql多表差異化聯(lián)合查詢的問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06getdata table表格數(shù)據(jù)join mysql方法
今天小編就為大家分享一篇關(guān)于getdata table表格數(shù)據(jù)join mysql方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02