程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL中join語句的根本應用教程及其字段對機能的影響

MySQL中join語句的根本應用教程及其字段對機能的影響

編輯:MySQL綜合教程

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 依照功效年夜致分為以下三類:

  1. INNER JOIN(內銜接):獲得兩個表中存在銜接婚配關系的記載。
  2. LEFT JOIN(左銜接):獲得左表(table1)完整記載,等於右表(table2)並沒有對應婚配記載。
  3. RIGHT JOIN(右銜接):與 LEFT JOIN 相反,獲得右表(table2)完整記載,等於左表(table1)並沒有婚配對應記載。
  4. 關於 MySQL FULL JOIN 全銜接

    MySQL 沒有供給 SQL 尺度中的 FULL JOIN(全銜接):兩個表記載都掏出,而不論彼此能否有對應記載。要處理此成績,可使用 UNION 症結字來歸並 LEFT JOIN 與 RIGHT JOIN,到達模仿 FULL JOIN 的目標。

    MySQL INNER JOIN

    INNER JOIN 用於獲得兩個表中存在銜接婚配關系的記載。上面是兩個原始數據表:

    https://www.aspphp.online/shujuku/UploadFiles_3118/201707/2017072814244454.png (366×317)

    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
    

    前往查詢成果以下:

    https://www.aspphp.online/shujuku/UploadFiles_3118/201707/2017072814244495.png (273×126)

    關於 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 秒)
    差兩個數目級!

    查詢語句說明:

    20151216104614308.png (697×497)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved