1. 程式人生 > >SQL Cookbook:操作多個表

SQL Cookbook:操作多個表

規則 原因 解決 pre nio union all logs 使用 所有

1、記錄集的疊加

使用union all

union all包含重復的結果,union篩選掉重復項(可能需要排序)

1 select * from film where film_id < 5
2 union all
3 select * from film where film_id > 995\G

2、組合相關的行

1 select f.title, a.first_name 
2 from film f, actor a, film_actor fa 
3 where f.film_id = fa.film_id and a.actor_id = fa.actor_id and
f.film_id = 10\G

以上連接方法是等值連接,這是內連接的一種。

如果希望連接邏輯放在from子句中,那麽可以使用join關鍵字

1 select f.title, a.first_name 
2 from film f join film_actor fa on f.film_id = fa.film_id join actor a on fa.actor_id = a.actor_id 
3 where f.film_id = 10\G

4、or與null組合的坑

在sql中,true or null結果是true,false or null結果是null,舉例:

1
mysql> select title from film where film_id not in (1,2,3,null)\G 2 Empty set (0.03 sec)

原因是in查詢等價於:

1 mysql> select title from film where not (film_id = 1 or film_id = 2 or film_id = 3 or film_id = null)\G
2 Empty set (0.02 sec)

其中where從句等價於:

1 (false or false or null)

最終答案是null。

要解決這個問題,可以使用is判斷null:

1 mysql> select title from film where not (film_id = 1 or film_id = 2 or film_id = 3 or film_id is null)\G

5、left join

A a left outer join B b

返回A中所有行,B中匹配則返回,不匹配則為null

6、n-1規則

如果from子句有n個表,那麽為了避免產生笛卡爾積,最少需要使用n-1個聯接數

7、full outer join on

返回兩個表中丟失的行以及所有匹配的行

8、在運算和比較時使用null

使用coalesce函數將null轉換為一個可以用作標準值比較的真實值

SQL Cookbook:操作多個表