查询基础
逻辑运算符
含有NULL时的真值
- SQL中的逻辑运算是三值逻辑,即包括真、假、不确定。
聚合与排序
为聚合结果指定条件
having子句
- having子句用于对集合指定条件过滤。having子句位于group by子句后面。
select `product_type`, count(*)
from shop
group by `product_type`
having count(*) = 2;
- having子句中能够使用的要素有:常数、聚合函数、group by子句中指定的列名(即聚合键)。
复杂查询
视图
视图的创建
create view shop_sum (`product_type`, `cnt_product`)
as
select `product_type`, count(*)
from shop
group by `product_type`;
限制
- 定义视图时不能使用
order by
。
- 对视图更新是有条件的:
select
子句中未使用distinct
。
from
子句中只有一张表。
- 未使用
group by
子句。
- 未使用
having
子句。
子查询
- 子查询就是将用来定义视图的select子句直接用于from子句中。
select `product_type`, `cnt_product`
from (
select `product_type`, count(*) as `cnt_product`
from `shop`
group by `product_type`
) as `product_sum`;
标量子查询
select `product_id`, `product_name`, `sale_price`
from `shop`
where sale_price > (
select avg(sale_price)
from `shop`
);
关联子查询
- 在普通子查询中添加where子句,使其变为标量子查询。
select `product_id`, `product_name`, `sale_price`
from `shop` as `s1`
where sale_price > (
select avg(sale_price)
from `shop` as `s2`
where `s1`.`product_type` = `s2`.`product_type`
group by `product_type`
)
;
函数、谓词、case表达式
谓词
like
%
代表0字符及以上的任意字符串,_
代表任意一个字符。
select *
from test.like_sample.like_test
where strcol like 'abc%';
select *
from test.like_sample.like_test
where strcol like 'abc__';
between
select *
from `shop`
where sale_price between 100 and 1000;
is null、is not null
in
select `product_name`, `purchase_price`
from `shop`
where putchase_price in (320, 500, 5000);
使用子查询作为in的参数
select `product_name`, `sale_price`
from `shop`
where `product_id` in (
select `product_id`
from `all_shops`
where `shop_id` = '000c'
);
exists
- 判断是否存在满足条件的某种记录,存在则返回真,不存在则返回假。
select `product_name`, `sale_price`
from `product` as p
where exists (
select *
from shop_product as sp
where sp.shop_id = '000c'
and sp.product_id = p.product_id
);
case表达式
- 满足
when
子句就执行对应的then
子句,否则到下一个when
子句,直到没有when
子句后执行else
子句。
select sum(
case when `product_type` = 'A'
then `sale_price` else 0 end
) as `sum_price_clothes`,
sum(
case when `product_type` = 'b'
then `sale_price` else 0 end
) as `sum_price_kitchen`,
sum(
case when `product_type` = 'C'
then `sale_price` else 0 end
) as `sum_price_office`
from `product`;