乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      MySQL的JOIN(一):用法

       云端素館 2019-06-21

      JOIN的含義就如英文單詞“join”一樣,連接兩張表,大致分為內(nèi)連接,外連接,右連接,左連接,自然連接。這里描述先甩出一張用爛了的圖,然后插入測試數(shù)據(jù)。

      View Code

      笛卡爾積:CROSS JOIN

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

      View Code

      內(nèi)連接:INNER JOIN

      內(nèi)連接INNER JOIN是最常用的連接操作。從數(shù)學(xué)的角度講就是求兩個表的交集,從笛卡爾積的角度講就是從笛卡爾積中挑出ON子句條件成立的記錄。有INNER JOIN,WHERE(等值連接),STRAIGHT_JOIN,JOIN(省略INNER)四種寫法。至于哪種好我會在MySQL的JOIN(二):優(yōu)化講述。示例如下。

      復(fù)制代碼
          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有個下劃線
          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# | +----+-------+--------+----+------+
      復(fù)制代碼

       

      左連接:LEFT JOIN

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

      復(fù)制代碼
          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 | +----+-------+--------+------+------+
      復(fù)制代碼

       

      右連接:RIGHT JOIN

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

      復(fù)制代碼
          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 | +------+-------+--------+----+------------+
      復(fù)制代碼

      外連接:OUTER JOIN

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

      復(fù)制代碼
          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 | +------+-------+--------+------+------------+
      復(fù)制代碼

      USING子句

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

      復(fù)制代碼
          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 | +----+-------+--------+------------+
      復(fù)制代碼

      自然連接:NATURE JOIN

      自然連接就是USING子句的簡化版,它找出兩個表中相同的列作為連接條件進行連接。有左自然連接,右自然連接普通自然連接之分。在t_blog和t_type示例中,兩個表相同的列是id,所以會拿id作為連接條件。
      另外千萬分清下面三條語句的區(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;

      View Code

      補充

      博客開頭給出的第一張圖除去講了的內(nèi)連接、左連接、右連接、外連接,還有一些特殊的韋恩圖,這里補充一下。

      View Code

      寫完這篇博客發(fā)現(xiàn)有點“孔乙己:茴字的四種寫法的感覺”,但還是有收獲的。另外,等三面通知等的好急啊!!

      引用

      http://www.cnblogs.com/fudashi/p/6572101.html

      http://blog.csdn.net/wjc19911118/article/details/9716391
      http://blog.csdn.net/taylor_tao/article/details/7068511

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多