亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL中join語(yǔ)句的基本使用教程及其字段對(duì)性能的影響

 更新時(shí)間:2015年12月16日 10:49:39   作者:fengyqf  
這篇文章主要介紹了MySQL中join語(yǔ)句的基本使用及其字段對(duì)性能的影響,舉了實(shí)例來(lái)觀測(cè)join所作用的不同字段字符集編碼所造成的性能差異,需要的朋友可以參考下

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):

  1. INNER JOIN(內(nèi)連接):取得兩個(gè)表中存在連接匹配關(guān)系的記錄。
  2. LEFT JOIN(左連接):取得左表(table1)完全記錄,即是右表(table2)并無(wú)對(duì)應(yīng)匹配記錄。
  3. 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ù)表:

20151216104417019.png (366×317)

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é)果如下:

20151216104447947.png (273×126)

對(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ǔ)句解釋:

20151216104614308.png (697×497)

相關(guān)文章

最新評(píng)論