最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySql中JOIN的用法示例詳解

 更新時(shí)間:2022年03月24日 10:11:32   作者:一只小逸白  
join顧名思義就是連接兩張表,大致分為內(nèi)連接,外連接,右連接,左連接,自然連接,今天通過本文給大家介紹MySql中JOIN的用法詳解,感興趣的朋友一起看看吧

上次面試被問到JOIN,自己都已經(jīng)忘了課堂上講的笛卡爾積那些就是JOIN,最近重新復(fù)習(xí)了一遍

JOIN的含義就如英文單詞“join”一樣,連接兩張表,大致分為內(nèi)連接,外連接,右連接,左連接,自然連接。

先創(chuàng)建兩個(gè)表,下面用于示例

    CREATE TABLE t_blog(
        id INT PRIMARY KEY AUTO_INCREMENT,
        title VARCHAR(50),
        typeId INT
    );
    SELECT * FROM t_blog;
    +----+-------+--------+
    | id | title | typeId |
    +----+-------+--------+
    |  1 | aaa   |      1 |
    |  2 | bbb   |      2 |
    |  3 | ccc   |      3 |
    |  4 | ddd   |      4 |
    |  5 | eee   |      4 |
    |  6 | fff   |      3 |
    |  7 | ggg   |      2 |
    |  8 | hhh   |   NULL |
    |  9 | iii   |   NULL |
    | 10 | jjj   |   NULL |
    +----+-------+--------+
    -- 博客的類別
    CREATE TABLE t_type(
        id INT PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR(20)
    );
    SELECT * FROM t_type;
    +----+------------+
    | id | name       |
    +----+------------+
    |  1 | C++        |
    |  2 | C          |
    |  3 | Java       |
    |  4 | C#         |
    |  5 | Javascript |
    +----+------------+

笛卡爾積:CROSS JOIN

要理解各種JOIN首先要理解笛卡爾積。笛卡爾積就是將A表的每一條記錄與B表的每一條記錄強(qiáng)行拼在一起。所以,如果A表有n條記錄,B表有m條記錄,笛卡爾積產(chǎn)生的結(jié)果就會(huì)產(chǎn)生n*m條記錄。下面的例子,t_blog有10條記錄,t_type有5條記錄,所有他們倆的笛卡爾積有50條記錄。有五種產(chǎn)生笛卡爾積的方式如下。

SELECT * FROM t_blog CROSS JOIN t_type;
    SELECT * FROM t_blog INNER JOIN t_type;
    SELECT * FROM t_blog,t_type;
    SELECT * FROM t_blog NATURE JOIN t_type;
    select * from t_blog NATURA join t_type;
    +----+-------+--------+----+------------+
    | id | title | typeId | id | name       |
    +----+-------+--------+----+------------+
    |  1 | aaa   |      1 |  1 | C++        |
    |  1 | aaa   |      1 |  2 | C          |
    |  1 | aaa   |      1 |  3 | Java       |
    |  1 | aaa   |      1 |  4 | C#         |
    |  1 | aaa   |      1 |  5 | Javascript |
    |  2 | bbb   |      2 |  1 | C++        |
    |  2 | bbb   |      2 |  2 | C          |
    |  2 | bbb   |      2 |  3 | Java       |
    |  2 | bbb   |      2 |  4 | C#         |
    |  2 | bbb   |      2 |  5 | Javascript |
    |  3 | ccc   |      3 |  1 | C++        |
    |  3 | ccc   |      3 |  2 | C          |
    |  3 | ccc   |      3 |  3 | Java       |
    |  3 | ccc   |      3 |  4 | C#         |
    |  3 | ccc   |      3 |  5 | Javascript |
    |  4 | ddd   |      4 |  1 | C++        |
    |  4 | ddd   |      4 |  2 | C          |
    |  4 | ddd   |      4 |  3 | Java       |
    |  4 | ddd   |      4 |  4 | C#         |
    |  4 | ddd   |      4 |  5 | Javascript |
    |  5 | eee   |      4 |  1 | C++        |
    |  5 | eee   |      4 |  2 | C          |
    |  5 | eee   |      4 |  3 | Java       |
    |  5 | eee   |      4 |  4 | C#         |
    |  5 | eee   |      4 |  5 | Javascript |
    |  6 | fff   |      3 |  1 | C++        |
    |  6 | fff   |      3 |  2 | C          |
    |  6 | fff   |      3 |  3 | Java       |
    |  6 | fff   |      3 |  4 | C#         |
    |  6 | fff   |      3 |  5 | Javascript |
    |  7 | ggg   |      2 |  1 | C++        |
    |  7 | ggg   |      2 |  2 | C          |
    |  7 | ggg   |      2 |  3 | Java       |
    |  7 | ggg   |      2 |  4 | C#         |
    |  7 | ggg   |      2 |  5 | Javascript |
    |  8 | hhh   |   NULL |  1 | C++        |
    |  8 | hhh   |   NULL |  2 | C          |
    |  8 | hhh   |   NULL |  3 | Java       |
    |  8 | hhh   |   NULL |  4 | C#         |
    |  8 | hhh   |   NULL |  5 | Javascript |
    |  9 | iii   |   NULL |  1 | C++        |
    |  9 | iii   |   NULL |  2 | C          |
    |  9 | iii   |   NULL |  3 | Java       |
    |  9 | iii   |   NULL |  4 | C#         |
    |  9 | iii   |   NULL |  5 | Javascript |
    | 10 | jjj   |   NULL |  1 | C++        |
    | 10 | jjj   |   NULL |  2 | C          |
    | 10 | jjj   |   NULL |  3 | Java       |
    | 10 | jjj   |   NULL |  4 | C#         |
    | 10 | jjj   |   NULL |  5 | Javascript |
    +----+-------+--------+----+------------+

內(nèi)連接:INNER JOIN

內(nèi)連接INNER JOIN是最常用的連接操作。從數(shù)學(xué)的角度講就是求兩個(gè)表的交集,從笛卡爾積的角度講就是從笛卡爾積中挑出ON子句條件成立的記錄。有INNER JOIN,WHERE(等值連接),STRAIGHT_JOIN,JOIN(省略INNER)四種寫法。

SELECT * FROM t_blog INNER JOIN t_type ON t_blog.typeId=t_type.id;
    SELECT * FROM t_blog,t_type WHERE t_blog.typeId=t_type.id;
    SELECT * FROM t_blog STRAIGHT_JOIN t_type ON t_blog.typeId=t_type.id; --注意STRIGHT_JOIN有個(gè)下劃線
    SELECT * FROM t_blog JOIN t_type ON t_blog.typeId=t_type.id;
    +----+-------+--------+----+------+
    | id | title | typeId | id | name |
    +----+-------+--------+----+------+
    |  1 | aaa   |      1 |  1 | C++  |
    |  2 | bbb   |      2 |  2 | C    |
    |  7 | ggg   |      2 |  2 | C    |
    |  3 | ccc   |      3 |  3 | Java |
    |  6 | fff   |      3 |  3 | Java |
    |  4 | ddd   |      4 |  4 | C#   |
    |  5 | eee   |      4 |  4 | C#   |
    +----+-------+--------+----+------+

左連接:LEFT JOIN

左連接LEFT JOIN的含義就是求兩個(gè)表的交集外加左表剩下的數(shù)據(jù)。依舊從笛卡爾積的角度講,就是先從笛卡爾積中挑出ON子句條件成立的記錄,然后加上左表中剩余的記錄(見最后三條)。

SELECT * FROM t_blog LEFT JOIN t_type ON t_blog.typeId=t_type.id;
    +----+-------+--------+------+------+
    | id | title | typeId | id   | name |
    +----+-------+--------+------+------+
    |  1 | aaa   |      1 |    1 | C++  |
    |  2 | bbb   |      2 |    2 | C    |
    |  7 | ggg   |      2 |    2 | C    |
    |  3 | ccc   |      3 |    3 | Java |
    |  6 | fff   |      3 |    3 | Java |
    |  4 | ddd   |      4 |    4 | C#   |
    |  5 | eee   |      4 |    4 | C#   |
    |  8 | hhh   |   NULL | NULL | NULL |
    |  9 | iii   |   NULL | NULL | NULL |
    | 10 | jjj   |   NULL | NULL | NULL |
    +----+-------+--------+------+------+

右連接:RIGHT JOIN

同理右連接RIGHT JOIN就是求兩個(gè)表的交集外加右表剩下的數(shù)據(jù)。再次從笛卡爾積的角度描述,右連接就是從笛卡爾積中挑出ON子句條件成立的記錄,然后加上右表中剩余的記錄(見最后一條)。

SELECT * FROM t_blog RIGHT JOIN t_type ON t_blog.typeId=t_type.id;
    +------+-------+--------+----+------------+
    | id   | title | typeId | id | name       |
    +------+-------+--------+----+------------+
    |    1 | aaa   |      1 |  1 | C++        |
    |    2 | bbb   |      2 |  2 | C          |
    |    3 | ccc   |      3 |  3 | Java       |
    |    4 | ddd   |      4 |  4 | C#         |
    |    5 | eee   |      4 |  4 | C#         |
    |    6 | fff   |      3 |  3 | Java       |
    |    7 | ggg   |      2 |  2 | C          |
    | NULL | NULL  |   NULL |  5 | Javascript |
    +------+-------+--------+----+------------+

外連接:OUTER JOIN

外連接就是求兩個(gè)集合的并集。從笛卡爾積的角度講就是從笛卡爾積中挑出ON子句條件成立的記錄,然后加上左表中剩余的記錄,最后加上右表中剩余的記錄。另外MySQL不支持OUTER JOIN,但是我們可以對(duì)左連接和右連接的結(jié)果做UNION操作來實(shí)現(xiàn)。

SELECT * FROM t_blog LEFT JOIN t_type ON t_blog.typeId=t_type.id
    UNION
    SELECT * FROM t_blog RIGHT JOIN t_type ON t_blog.typeId=t_type.id;
    +------+-------+--------+------+------------+
    | id   | title | typeId | id   | name       |
    +------+-------+--------+------+------------+
    |    1 | aaa   |      1 |    1 | C++        |
    |    2 | bbb   |      2 |    2 | C          |
    |    7 | ggg   |      2 |    2 | C          |
    |    3 | ccc   |      3 |    3 | Java       |
    |    6 | fff   |      3 |    3 | Java       |
    |    4 | ddd   |      4 |    4 | C#         |
    |    5 | eee   |      4 |    4 | C#         |
    |    8 | hhh   |   NULL | NULL | NULL       |
    |    9 | iii   |   NULL | NULL | NULL       |
    |   10 | jjj   |   NULL | NULL | NULL       |
    | NULL | NULL  |   NULL |    5 | Javascript |
    +------+-------+--------+------+------------+

USING子句

MySQL中連接SQL語(yǔ)句中,ON子句的語(yǔ)法格式為:table1.column_name = table2.column_name。當(dāng)模式設(shè)計(jì)對(duì)聯(lián)接表的列采用了相同的命名樣式時(shí),就可以使用 USING 語(yǔ)法來簡(jiǎn)化 ON 語(yǔ)法,格式為:USING(column_name)。
所以,USING的功能相當(dāng)于ON,區(qū)別在于USING指定一個(gè)屬性名用于連接兩個(gè)表,而ON指定一個(gè)條件。另外,SELECT *時(shí),USING會(huì)去除USING指定的列,而ON不會(huì)。實(shí)例如下。

SELECT * FROM t_blog INNER JOIN t_type ON t_blog.typeId =t_type.id;
    +----+-------+--------+----+------+
    | id | title | typeId | id | name |
    +----+-------+--------+----+------+
    |  1 | aaa   |      1 |  1 | C++  |
    |  2 | bbb   |      2 |  2 | C    |
    |  7 | ggg   |      2 |  2 | C    |
    |  3 | ccc   |      3 |  3 | Java |
    |  6 | fff   |      3 |  3 | Java |
    |  4 | ddd   |      4 |  4 | C#   |
    |  5 | eee   |      4 |  4 | C#   |
    +----+-------+--------+----+------+
    SELECT * FROM t_blog INNER JOIN t_type USING(typeId);
    ERROR 1054 (42S22): Unknown column 'typeId' in 'from clause'
    SELECT * FROM t_blog INNER JOIN t_type USING(id); -- 應(yīng)為t_blog的typeId與t_type的id不同名,無法用Using,這里用id代替下。
    +----+-------+--------+------------+
    | id | title | typeId | name       |
    +----+-------+--------+------------+
    |  1 | aaa   |      1 | C++        |
    |  2 | bbb   |      2 | C          |
    |  3 | ccc   |      3 | Java       |
    |  4 | ddd   |      4 | C#         |
    |  5 | eee   |      4 | Javascript |
    +----+-------+--------+------------+

自然連接:NATURE JOIN

自然連接就是USING子句的簡(jiǎn)化版,它找出兩個(gè)表中相同的列作為連接條件進(jìn)行連接。有左自然連接,右自然連接和普通自然連接之分。在t_blog和t_type示例中,兩個(gè)表相同的列是id,所以會(huì)拿id作為連接條件。
另外千萬(wàn)分清下面三條語(yǔ)句的區(qū)別 。
自然連接:SELECT * FROM t_blog NATURAL JOIN t_type;
笛卡爾積:SELECT * FROM t_blog NATURA JOIN t_type;
笛卡爾積:SELECT * FROM t_blog NATURE JOIN t_type;

SELECT * FROM t_blog NATURAL JOIN t_type;
    SELECT t_blog.id,title,typeId,t_type.name FROM t_blog,t_type WHERE t_blog.id=t_type.id;
    SELECT t_blog.id,title,typeId,t_type.name FROM t_blog INNER JOIN t_type ON t_blog.id=t_type.id;
    SELECT t_blog.id,title,typeId,t_type.name FROM t_blog INNER JOIN t_type USING(id);

    +----+-------+--------+------------+
    | id | title | typeId | name       |
    |  1 | aaa   |      1 | C++        |
    |  2 | bbb   |      2 | C          |
    |  3 | ccc   |      3 | Java       |
    |  4 | ddd   |      4 | C#         |
    |  5 | eee   |      4 | Javascript |
    SELECT * FROM t_blog NATURAL LEFT JOIN t_type;
    SELECT t_blog.id,title,typeId,t_type.name FROM t_blog LEFT JOIN t_type ON t_blog.id=t_type.id;
    SELECT t_blog.id,title,typeId,t_type.name FROM t_blog LEFT JOIN t_type USING(id);
    |  6 | fff   |      3 | NULL       |
    |  7 | ggg   |      2 | NULL       |
    |  8 | hhh   |   NULL | NULL       |
    |  9 | iii   |   NULL | NULL       |
    | 10 | jjj   |   NULL | NULL       |
    SELECT * FROM t_blog NATURAL RIGHT JOIN t_type;
    SELECT t_blog.id,title,typeId,t_type.name FROM t_blog RIGHT JOIN t_type ON t_blog.id=t_type.id;
    SELECT t_blog.id,title,typeId,t_type.name FROM t_blog RIGHT JOIN t_type USING(id);
    +----+------------+-------+--------+
    | id | name       | title | typeId |
    |  1 | C++        | aaa   |      1 |
    |  2 | C          | bbb   |      2 |
    |  3 | Java       | ccc   |      3 |
    |  4 | C#         | ddd   |      4 |
    |  5 | Javascript | eee   |      4 |

到此這篇關(guān)于MySql中JOIN的用法的文章就介紹到這了,更多相關(guān)MySql JOIN用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySql事務(wù)原理介紹及特性

    MySql事務(wù)原理介紹及特性

    事務(wù)就是一組DML語(yǔ)句組成,這些語(yǔ)句在邏輯上存在相關(guān)性,這一組DML語(yǔ)句要么全部成功,要么全部失敗,是一個(gè)整體。MySQL提供一種機(jī)制,保證我們達(dá)到這樣的效果。事務(wù)還規(guī)定不同的客戶端看到的數(shù)據(jù)是不相同的
    2022-09-09
  • MySQL錯(cuò)誤“Data?too?long”的原因、解決方案與優(yōu)化策略

    MySQL錯(cuò)誤“Data?too?long”的原因、解決方案與優(yōu)化策略

    MySQL作為重要的數(shù)據(jù)庫(kù)系統(tǒng),在數(shù)據(jù)插入時(shí)可能遇到“Data?too?long?for?column”錯(cuò)誤,本文探討了該錯(cuò)誤的原因、解決方案及預(yù)防措施,如調(diào)整字段長(zhǎng)度、使用TEXT類型等,旨在優(yōu)化數(shù)據(jù)庫(kù)設(shè)計(jì),提升性能和用戶體驗(yàn),需要的朋友可以參考下
    2024-09-09
  • MySQL中TINYINT、INT 和 BIGINT的具體使用

    MySQL中TINYINT、INT 和 BIGINT的具體使用

    MySQL提供了多種整數(shù)類型來滿足不同的數(shù)據(jù)存儲(chǔ)需求,本文主要介紹了MySQL中TINYINT、INT 和 BIGINT的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • linux系統(tǒng)中mysql數(shù)據(jù)庫(kù)的導(dǎo)入和導(dǎo)出

    linux系統(tǒng)中mysql數(shù)據(jù)庫(kù)的導(dǎo)入和導(dǎo)出

    本文給大家簡(jiǎn)單記錄了一下在linux系統(tǒng)中mysql數(shù)據(jù)庫(kù)的導(dǎo)入和導(dǎo)出的方法,有相同需求的小伙伴可以參考下
    2016-02-02
  • 使用java處理字符串公式運(yùn)算的方法

    使用java處理字符串公式運(yùn)算的方法

    本篇文章介紹了,使用java處理字符串公式運(yùn)算的方法。需要的朋友參考下
    2013-04-04
  • mysql存儲(chǔ)過程?返回?list結(jié)果集方式

    mysql存儲(chǔ)過程?返回?list結(jié)果集方式

    這篇文章主要介紹了mysql存儲(chǔ)過程?返回?list結(jié)果集方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • MySQL報(bào)錯(cuò):sql_mode=only_full_group_by的4種輕松解決方法(含舉例)

    MySQL報(bào)錯(cuò):sql_mode=only_full_group_by的4種輕松解決方法(含舉例)

    今天學(xué)mysql函數(shù)的時(shí)候在自己服務(wù)器上的MySQL碰見了個(gè)奇怪的問題,下面這篇文章主要給大家介紹了關(guān)于MySQL報(bào)錯(cuò):sql_mode=only_full_group_by的4種輕松解決方法,需要的朋友可以參考下
    2023-01-01
  • SQL Server索引設(shè)計(jì)基礎(chǔ)知識(shí)詳解使用

    SQL Server索引設(shè)計(jì)基礎(chǔ)知識(shí)詳解使用

    為了使索引的使用效率更高,在創(chuàng)建索引時(shí),必須考慮在哪些字段上創(chuàng)建索引和創(chuàng)建什么類型的索引。索引設(shè)計(jì)不合理或者缺少索引都會(huì)對(duì)數(shù)據(jù)庫(kù)和應(yīng)用程序的性能造成障礙。高效的索引對(duì)于獲得良好的性能非常重要。設(shè)計(jì)索引時(shí),應(yīng)該考慮相應(yīng)準(zhǔn)則
    2023-04-04
  • 如何恢復(fù)Mysql數(shù)據(jù)庫(kù)的詳細(xì)介紹

    如何恢復(fù)Mysql數(shù)據(jù)庫(kù)的詳細(xì)介紹

    這里說的MySql恢復(fù)數(shù)據(jù)庫(kù),是指沒有通過正常備份的情況下,通過Mysql保存的數(shù)據(jù)文件如何恢復(fù)數(shù)據(jù)庫(kù)
    2013-09-09
  • MySQL延遲關(guān)聯(lián)性能優(yōu)化方法

    MySQL延遲關(guān)聯(lián)性能優(yōu)化方法

    這篇文章主要介紹了MySQL延遲關(guān)聯(lián)性能優(yōu)化方法,本文講解了延遲關(guān)聯(lián)的背景、延遲關(guān)聯(lián)的分析、延遲關(guān)聯(lián)的解決等內(nèi)容,需要的朋友可以參考下
    2015-05-05

最新評(píng)論

搜索| 泰兴市| 漾濞| 抚州市| 达拉特旗| 房山区| 临安市| 湖南省| 两当县| 天柱县| 襄汾县| 泗阳县| 新泰市| 石渠县| 姜堰市| 沙湾县| 朔州市| 定兴县| 公主岭市| 霍山县| 永安市| 彩票| 乐昌市| 邵阳县| 鱼台县| 通城县| 东阿县| 漳浦县| 祁东县| 九江市| 南丰县| 黄大仙区| 顺义区| 湘潭县| 靖安县| 尼玛县| 枣强县| 汉川市| 灌云县| 林西县| 西畴县|