MySQL中join語句的根本應用教程及其字段對機能的影響。本站提示廣大學習愛好者:(MySQL中join語句的根本應用教程及其字段對機能的影響)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL中join語句的根本應用教程及其字段對機能的影響正文
join語句的根本應用
SQL(MySQL) JOIN 用於依據兩個或多個表中的字段之間的關系,從這些表中獲得數據。
JOIN 平日與 ON 症結字搭配應用,根本語法以下:
... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona
table1 平日稱為左表,table2 稱為右表。ON 症結字用於設定婚配前提,用於限制在成果聚集中想要哪些行。假如須要指定其他前提,前面可以加上 WHERE 前提 或許 LIMIT 以限制記載前往數量等。
上面以最多見的兩表銜接來講明 MySQL JOIN 的用法,關於多表 JOIN 請拜見《MySQL JOIN 多表》。
MySQL JOIN 分類
JOIN 依照功效年夜致分為以下三類:
關於 MySQL FULL JOIN 全銜接
MySQL 沒有供給 SQL 尺度中的 FULL JOIN(全銜接):兩個表記載都掏出,而不論彼此能否有對應記載。要處理此成績,可使用 UNION 症結字來歸並 LEFT JOIN 與 RIGHT JOIN,到達模仿 FULL JOIN 的目標。
MySQL INNER JOIN
INNER JOIN 用於獲得兩個表中存在銜接婚配關系的記載。上面是兩個原始數據表:
article 表中文章的所屬用戶是經由過程 uid 這個字段與 user 表聯系關系起來的。經由過程不雅察數據不難發明,關於 uid=3 的用戶,並沒有揭橥任何文章;而文章中 aid=4 卻沒法在 uid 表中找到對應記載(能夠是該用戶被刪除而其所屬的文章卻被保存了上去)。
我們列出所用文章與用戶逐個對應的數據。
SELECT … INNER JOIN … ON 語句以下:
SELECT article.aid,article.title,user.username FROM article INNER JOIN user ON article.uid = user.uid
前往查詢成果以下:
關於 INNER JOIN,同等與上面的 SQL 語句:
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
獲得的成果是被銜接的兩個數據表的乘積,即笛卡爾積。
現實上,在 MySQL 中(僅限於 MySQL) CROSS JOIN 與 INNER JOIN 的表示是一樣的,在不指定 ON 前提獲得的成果都是笛卡爾積,反之獲得兩個表完整婚配的成果。
INNER JOIN 與 CROSS JOIN 可以省略 INNER 或 CROSS 症結字,是以上面的 SQL 後果是一樣的:
平板視圖打印?
... FROM table1 INNER JOIN table2 ... FROM table1 CROSS JOIN table2 ... FROM table1 JOIN table2
join的字段字符集編碼對機能的影響
先來看一下示例代碼:
建utf-8編碼的表 t1:
CREATE TABLE IF NOT EXISTS `t1` ( `name` varchar(50) NOT NULL DEFAULT '', KEY `name` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
隨意拔出些數據,數目年夜一點,前面試驗成果更清楚,偷個懶,結構隨機字符串拔出語句
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) )
每次履行拔出一筆記錄,用你熟習的劇本(python,php,shell等都行)寫個輪回,履行一萬次以上。
將該表復制成一個新表t2,刪除一部門數據,1000條閣下便可。(推舉應用phpMyAdmin)
再將t2復制為t3,並將字段改成gb2312編碼。
應用一個left join語句,寫一個語句,查出t2/t3比t1少了哪些記載。
語句很簡略,以下:
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裡履行成果:
顯示行 0 - 29 ( 1,129 總計, 查詢消費 0.0010 秒)
均勻耗時年夜概為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履行成果:
顯示行 0 - 29 ( 30 總計, 查詢消費 0.1871 秒)
差兩個數目級!
查詢語句說明: