六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

MySQL中對(duì)于Join的使用示例分享

[摘要]在MySQL(以5.1為例)中,表連接的語(yǔ)法可以參見(jiàn)MySQL官方手冊(cè):MySQL官方手冊(cè)-JOIN在查詢中,連接的語(yǔ)法類(lèi)似SELECT select_expr FROM table_referen...
在MySQL(以5.1為例)中,表連接的語(yǔ)法可以參見(jiàn)MySQL官方手冊(cè):MySQL官方手冊(cè)-JOIN

在查詢中,連接的語(yǔ)法類(lèi)似

SELECT select_expr FROM table_references


table_references(對(duì)表的引用)的定義如下(也可以看成連接表達(dá)式):(暈暈暈哈)

table_references:
    table_reference [, table_reference] ...

table_reference:
    table_factor
    join_table

table_factor:
    tbl_name [[AS] alias] [index_hint_list]
    table_subquery [AS] alias
    ( table_references )
    { OJ table_reference LEFT OUTER JOIN table_reference
        ON conditional_expr }

join_table:
    table_reference [INNER   CROSS] JOIN table_factor [join_condition]
    table_reference STRAIGHT_JOIN table_factor
    table_reference STRAIGHT_JOIN table_factor ON conditional_expr
    table_reference {LEFT RIGHT} [OUTER] JOIN table_reference join_condition
    table_reference NATURAL [{LEFT RIGHT} [OUTER]] JOIN table_factor

join_condition:
    ON conditional_expr
    USING (column_list)

index_hint_list:
    index_hint [, index_hint] ...

index_hint:
    USE {INDEX KEY}
      [{FOR {JOIN ORDER BY GROUP BY}] ([index_list])
    IGNORE {INDEX KEY}
      [{FOR {JOIN ORDER BY GROUP BY}] (index_list)
    FORCE {INDEX KEY}
      [{FOR {JOIN ORDER BY GROUP BY}] (index_list)

index_list:
    index_name [, index_name] ...


其中,table_factor是基本的表選擇,而join_table是基于表的一些擴(kuò)展。
下面,通過(guò)實(shí)驗(yàn)介紹一下表連接。
首先,假設(shè)有以下幾個(gè)表

table1
idbook
1java
2c++
3php


table2
idauthor
2zhang
3wang
4li


table3
authoryear
zhang2003
ma2006
liu2011

Inner Join 內(nèi)連接
將兩個(gè)表中存在連接關(guān)系的字段,組成的記錄集,叫做內(nèi)連接。
內(nèi)連接等價(jià)于

mysql> select table1.id as id,book,author from table1, table2 where table1.id=table2.id;
+------+------+--------+
  id     book   author  
+------+------+--------+
     2   c++    zhang   
     3   php    wang    
+------+------+--------+
2 rows in set (0.00 sec)
mysql> select * from table1 inner join table2 using (id);
+------+------+--------+
  id     book   author  
+------+------+--------+
     2   c++    zhang   
     3   php    wang    
+------+------+--------+
2 rows in set (0.00 sec)


可以看出,兩者是等價(jià)的。沒(méi)有Using子句的Inner Join相當(dāng)于是求兩個(gè)table的笛卡爾積。
Cross Join 交叉連接
在Mysql中,Cross Join可以用逗號(hào)表達(dá)式表示,例如(table1, table 2)。在Mysql中,Cross Join 和 Inner Join 是等價(jià)的,但是在標(biāo)準(zhǔn)SQL中,它們并不等價(jià),Inner Join 用于帶有on表達(dá)式的連接,反之用Cross Join。以下兩個(gè)SQL語(yǔ)句是等價(jià)的。
Cross Join 指的是兩個(gè)table的笛卡爾積。以下三句SQL是等價(jià)的。

mysql> select * from table1 inner join table2;
mysql> select * from table1 cross join table2;
mysql> select * from (table1, table2);
mysql> select * from table1 nature join table2;
結(jié)果集:
+------+------+------+--------+
  id     book   id     author  
+------+------+------+--------+
     1   java      2   zhang   
     2   c++       2   zhang   
     3   php       2   zhang   
     1   java      3   wang    
     2   c++       3   wang    
     3   php       3   wang    
     1   java      4   li      
     2   c++       4   li      
     3   php       4   li      
+------+------+------+--------+


不難理解,下面兩句SQL也是等價(jià)的。

mysql> select * from table1 left join (table2, table3) on (table2.id = table1.id and table2.author = table3.author);
mysql> select * from table1 left join (table2 cross join table3) on (table2.id = table1.id and table2.author = table3.author);
結(jié)果集:
+------+------+------+--------+--------+------+
  id     book   id     author   author   year  
+------+------+------+--------+--------+------+
     1   java   NULL   NULL     NULL     NULL  
     2   c++       2   zhang    zhang    2003  
     3   php    NULL   NULL     NULL     NULL  
+------+------+------+--------+--------+------+


Natural Join 自然連接
NATURAL [LEFT] JOIN:這個(gè)句子的作用相當(dāng)于INNER JOIN,或者是在USING子句中包含了聯(lián)結(jié)的表中所有公共字段的Left JOIN(左聯(lián)結(jié))。
也就是說(shuō):下面兩個(gè)SQL是等價(jià)的。

mysql> select * from table1 natural join table2;
mysql> select * from table1 inner join table2 using (id);

結(jié)果集:
+------+------+--------+
  id     book   author  
+------+------+--------+
     2   c++    zhang   
     3   php    wang    
+------+------+--------+


同時(shí),下面兩個(gè)SQL也是等價(jià)的。

mysql> select * from table1 natural left join table2;
mysql> select * from table1 left join table2 using(id);
結(jié)果集:
+------+------+--------+
  id     book   author  
+------+------+--------+
     1   java   NULL    
     2   c++    zhang   
     3   php    wang    
+------+------+--------+


Left Join 左外連接
左外連接A、B表的意思就是將表A中的全部記錄和表B中字段連接形成的記錄集,這里注意的是最后出來(lái)的記錄集會(huì)包括表A的全部記錄。
左連接表1,表二等價(jià)于右連接表二,表一。如下兩個(gè)SQL是等價(jià)的:

mysql> select * from table1 left join table2 using (id);
mysql> select * from table2 right join table1 using (id);
結(jié)果集:
+------+------+--------+
  id     book   author  
+------+------+--------+
     1   java   NULL    
     2   c++    zhang   
     3   php    wang    
+------+------+--------+


Right Join 右外連接

右外連接和左外連接是類(lèi)似的。為了方便數(shù)據(jù)庫(kù)便于訪問(wèn),推薦使用左外連接代替右外連接。

最后,講一下Mysql表連接的一些注意事項(xiàng)。

1、兩個(gè)表求差集的方法
如果求 左表 - 右表 的差集,使用類(lèi)似下面的SQL:

SELECT left_tbl.* FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id WHERE right_tbl.id IS NULL;
例如
mysql> select table1.* from table1 left join table2 using(id) where table2.id is null;
+------+------+
  id     book  
+------+------+
     1   java  
+------+------+
1 row in set (0.00 sec)


2、Using子句
Using子句可以使用On子句重寫(xiě)。但是使用Select * 查詢出的結(jié)果有差別。以下兩句話是等價(jià)的:

mysql> select id, book, author from table1 join table2 using (id);
mysql> select table1.id, book, author from table1 join table2 on table1.id=table2.id;
結(jié)果集:
+------+------+--------+
  id     book   author  
+------+------+--------+
     2   c++    zhang   
     3   php    wang    
+------+------+--------+


但是下面兩個(gè)有些許不同,使用on時(shí)候,重復(fù)的部分會(huì)被輸出兩次。

mysql> select * from table1 join table2 using (id);
+------+------+--------+
  id     book   author  
+------+------+--------+
     2   c++    zhang   
     3   php    wang    
+------+------+--------+
2 rows in set (0.00 sec)
mysql> select * from table1 join table2 on table1.id=table2.id;
+------+------+------+--------+
  id     book   id     author  
+------+------+------+--------+
     2   c++       2   zhang   
     3   php       3   wang    
+------+------+------+--------+
2 rows in set (0.00 sec)


3、Straight Join的使用
STRAIGHT_JOIN 和 JOIN相似,除了大部分情況下,在使用STRAIGHT_JOIN時(shí)候,先讀右表后讀左表。而在大部分情況下是先讀左表的。STRAIGHT_JOIN僅用于少數(shù)情況下的表連接性能優(yōu)化,比如右表記錄數(shù)目明顯少于左表。

4、Mysql表連接的運(yùn)算順序
在MySQL 5.1版本中,INNER JOIN, CROSS JOIN, LEFT JOIN, 和RIGHT JOIN 比逗號(hào)表達(dá)式具有更高的優(yōu)先級(jí)。
因此SQL1被解析成SQL3,而不是SQL2。

SQL1 : SELECT * FROM t1, t2 JOIN t3 ON (t1.i1 = t3.i3);
SQL2 : SELECT * FROM (t1, t2) JOIN t3 ON (t1.i1 = t3.i3);
SQL3 : SELECT * FROM t1, (t2 JOIN t3 ON (t1.i1 = t3.i3));


因此會(huì)報(bào)錯(cuò),找不到i1列。因此以后在寫(xiě)這樣的查詢的時(shí)候,最好寫(xiě)明白,不要省略括號(hào),這樣能避免很多錯(cuò)誤。

5、循環(huán)的自然連接
在MySQL 5.1版本中,SQL1等價(jià)于SQL3, 而在MySQL以前版本中,SQL1等價(jià)于SQL2。

SQL1 : SELECT ... FROM t1 NATURAL JOIN t2 NATURAL JOIN t3;
SQL2 : SELECT ... FROM t1, t2, t3 WHERE t1.b = t2.b AND t2.c = t3.c;
SQL3 : SELECT ... FROM t1, t2, t3 WHERE t1.b = t2.b AND t2.c = t3.c AND t1.a = t3.a;

以上就是MySQL中關(guān)于Join的使用示例分享的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!


學(xué)習(xí)教程快速掌握從入門(mén)到精通的SQL知識(shí)。




主站蜘蛛池模板: 手机看片久久国产免费不卡 | 四虎永久影院 | 深夜成人福利视频 | 中文天堂| 亚洲欧美日韩精品久久 | 色涩在线观看 | 亚洲 欧美 清纯 丝袜 另类 | 欧美性色黄大片四虎影视 | 欧美视频自拍偷拍 | 日韩成人小视频 | 色综合久久88色综合天天小说 | 日本免费黄视频 | 亚洲白嫩在线观看 | 色五丁香 | 日本最新中文字幕 | 天天爽夜夜爽天天做夜夜做 | 四虎国产精品永久地址51 | 亚洲成a人片777777久久 | 一级黄色片免费的 | 青娱乐九色 | 日韩美女一区 | 亚洲国产美女精品久久 | 天天天天做夜夜夜夜 | 日韩欧美视频一区二区 | 日日噜噜夜夜狠狠视频欧美人 | 深爱婷婷 | 天堂在线链接 | 一级毛片视频免费 | 亚洲男男在线 | 中文娱乐网在线观看 | 一级黄色网 | 日本青草 | 日本韩国高清 | 日韩黄色录像 | 伊人影院综合 | 午夜精品福利在线观看 | 色综合久久天天综合观看 | 亚洲免费网站观看视频 | 日产精品一二三四区国产 | 亚洲第一黄网站 | 青青草激情视频 |