Join 結合查詢

  1. 到目前為止,所有的詢問都只針對一個資料表,但實際工作時,往往是結合多個工作表的詢問。為了示範 JOIN 查詢,先新增一個與資料表 dyw 相關的資料表 dcount_tbl,包含 dyw_authordyw_count 兩個欄位,其中 dyw_author 與資料表 dyw_tbl 中的欄位 dyw_author 是相關的資料。
    [root@kvm8 html]# mysql -s -uroot -p123qwe
    mysql> use dyw;
    mysql> create table dcount_tbl(
        -> dyw_author varchar(40) not null,
        -> dyw_count int
        -> );
    mysql>
    
  2. 在資料表 dcount_tbl 插入 4 筆紀錄。
    mysql> insert into dcount_tbl(dyw_author,dyw_count)
        -> values
        -> ('dywang', 4),
        -> ('linda', 3),
        -> ('peter', 2),
        -> ('rita', 1)
        -> ;
    
  3. 查詢資料表 dcount_tbl 共有 4 筆紀錄。
    mysql> select * from dcount_tbl;
    dyw_author	dyw_count
    dywang	4
    linda	3
    peter	2
    rita	1
    
  4. 查詢資料表 dyw_tbl 共有 3 筆紀錄,其中 2 筆作者同時也出現在 資料表 dcount_tbl
    mysql> select * from dyw_tbl;
    dyw_id	dyw_title	dyw_author	submission_date
    1	c++	peter	2014-12-24
    3	MySQL	dywang	2014-12-12
    5	Perl	david	2014-12-27
    
  5. JOIN 結合兩個資料表 dyw_tbldcount_tbl 的查詢,FROM 後的兩個資料表各給 a 及 b 來代表,WHERE 則限制兩個資料表同時出現的紀錄。查詢方式是搜尋欄位 dyw_author 同時出現在資料表 a 與 b 的紀錄。JOIN 也可使用逗號「,」代替。
    mysql> select a.dyw_id,a.dyw_author,b.dyw_count 
        -> from dyw_tbl a JOIN dcount_tbl b 
        -> where a.dyw_author=b.dyw_author;
    dyw_id	dyw_author	dyw_count
    3	dywang	4
    1	peter	2
    
  6. LEFT JOIN 不同 JOIN,是選擇左邊資料表所有紀錄,若右邊資料表有共同的紀錄則一起列出。因為資料表 dcount_tbl 中並沒有 dyw_author='david',所以這筆紀錄的 dyw_count 為 NULL。
    mysql> select a.dyw_id,a.dyw_author,b.dyw_count 
        -> from dyw_tbl a left join dcount_tbl b 
        -> on a.dyw_author=b.dyw_author;
    dyw_id	dyw_author	dyw_count
    1	peter	2
    3	dywang	4
    5	david	NULL
    
  7. RIGHT JOIN 則是選擇右邊資料表所有紀錄,若邊資料表有共同的紀錄則一起列出。因為資料表 dyw_tbl 中並沒有 dyw_author='linda'dyw_author='rita',所以這兩筆紀錄的 dyw_iddyw_author 為 NULL。
    mysql> select a.dyw_id,a.dyw_author,b.dyw_count 
        -> from dyw_tbl a right join dcount_tbl b 
        -> on a.dyw_author=b.dyw_author;
    dyw_id	dyw_author	dyw_count
    3	dywang	4
    NULL	NULL	3
    1	peter	2
    NULL	NULL	1