SQL Cookbook:操作多个表

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转换为一个可以用作标准值比较的真实值

 

转载于:https://www.cnblogs.com/zcy-backend/p/6813482.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值