next up previous contents
Next: NULL 值 Up: Clause 紀錄詢問條件 Previous: PHP 排序   Contents   DYWANG_HOME

Join 結合查詢

  1. 到目前為止,所有的詢問都只針對一個資料表,但實際工作時,往往是結合多個工作表的詢問。
  2. 為了示範 JOIN 查詢,必須新增一個與資料表 tbl 相關的資料表 dcount,包含 author 及 dcount 兩個欄位,其中 author 與資料表 tbl 中的欄位 author 是相關的資料, 登入 mariadb。
    [root@kvm8 ~]# mycli -S /var/lib/mysql/mysql.sock -uroot -p123qwe
    mariadb 10.3.11-MariaDB
    mycli 1.20.1
    Chat: https://gitter.im/dbcli/mycli
    Mail: https://groups.google.com/forum/#!forum/mycli-users
    Home: http://mycli.net
    Thanks to the contributor - Steve Robbins
    
  3. 使用資料庫 dyw。
    mariadb root@localhost:(none)> use dyw;                                         
    You are now connected to database "dyw" as user "root"
    Time: 0.001s
    
  4. 新增資料表 dcount,包含 author 及 dcount 兩個欄位。
    mariadb root@localhost:dyw> create table dcount(author varchar(40) not null,dcou
                                nt int);                                            
    Query OK, 0 rows affected
    Time: 0.104s
    
  5. 在資料表 dcount 插入 4 筆紀錄。
    mariadb root@localhost:dyw> insert into dcount(author,dcount) values('dywang',4)
                                ,('linda',3),('peter',2),('rita',1);                
    Query OK, 4 rows affected
    Time: 0.005s
    
  6. 查詢資料表 dcount_tbl 共有 4 筆紀錄。
    mariadb root@localhost:dyw> select * from dcount;                               
    +--------+--------+
    | author | dcount |
    +--------+--------+
    | dywang | 4      |
    | linda  | 3      |
    | peter  | 2      |
    | rita   | 1      |
    +--------+--------+
    4 rows in set
    Time: 0.021s
    
  7. 資料表 tbl 新增 1 筆紀錄。
    mariadb root@localhost:dyw> insert into tbl (title,author,submission_date) value
                                s("python","david",'2020-01-19');                   
    Query OK, 1 row affected
    Time: 0.007s
    
  8. 查詢資料表 tbl 共有 4 筆紀錄,3 筆紀錄作者同時也出現在資料表 dcount。
    mariadb root@localhost:dyw> select * from tbl;                                  
    +----+---------+--------+-----------------+
    | id | title   | author | submission_date |
    +----+---------+--------+-----------------+
    | 1  | c++     | peter  | 2020-01-28      |
    | 2  | MariaDB | dywang | 2020-01-01      |
    | 4  | c++     | dywang | 2020-01-11      |
    | 5  | python  | david  | 2020-01-19      |
    +----+---------+--------+-----------------+
    
    4 rows in set
    Time: 0.028s
    
  9. JOIN 結合兩個資料表 tbl 及 dcount 的查詢,FROM 後的兩個資料表各給 a 及 b 來代表,WHERE 則限制兩個資料表同時出現的紀錄。 查詢方式是搜尋欄位 author 同時出現在資料表 a 與 b 的紀錄。JOIN 也可使用逗號「,」代替。
    mariadb root@localhost:dyw> select a.id,a.author,b.dcount from tbl a JOIN dcount
                                 b where a.author=b.author;                         
    +----+--------+--------+
    | id | author | dcount |
    +----+--------+--------+
    | 2  | dywang | 4      |
    | 4  | dywang | 4      |
    | 1  | peter  | 2      |
    +----+--------+--------+
    
    3 rows in set
    Time: 0.028s
    
  10. LEFT JOIN 不同於 JOIN,是選擇左邊資料表所有紀錄,若右邊資料表有共同的紀錄則一起列出。 因為資料表 dcount 中並沒有 author='david',所以這筆紀錄的 dcount 為 NULL。
    mariadb root@localhost:dyw> select a.id,a.author,b.dcount from tbl a LEFT JOIN d
                                count b on a.author=b.author;                       
    +----+--------+--------+
    | id | author | dcount |
    +----+--------+--------+
    | 2  | dywang | 4      |
    | 4  | dywang | 4      |
    | 1  | peter  | 2      |
    | 5  | david  | <null> |
    +----+--------+--------+
    
    4 rows in set
    Time: 0.032s
    
  11. RIGHT JOIN 則是選擇右邊資料表所有紀錄,若邊資料表有共同的紀錄則一起列出。 因為資料表 tbl 中並沒有 author='linda' 及 author='rita',所以這兩筆紀錄的 id 為 NULL。
    mariadb root@localhost:dyw> select a.id,b.author,b.dcount from tbl a RIGHT JOIN 
                                dcount b on a.author=b.author;                      
    +--------+--------+--------+
    | id     | author | dcount |
    +--------+--------+--------+
    | 1      | peter  | 2      |
    | 2      | dywang | 4      |
    | 4      | dywang | 4      |
    | <null> | linda  | 3      |
    | <null> | rita   | 1      |
    +--------+--------+--------+
    
    5 rows in set
    Time: 0.031s
    



De-Yu Wang 2020-04-07