select 子句顺序:
select > from > where > group by > having > order by;
1. 一些关键字及函数
- count 与 NULL:如果指定列名,count() 会忽略指定列的值为空的行,count(*) 则不忽略;
字段拼接(concat 函数)
select concat(vend_name, '(', vend_country, ')') from vendors order by vend_name;
- distinct:关键字作用于所有的列,不仅仅是跟在其后的那一列。
- limit:limit 5, 5 == limit 5 offset 5;
使用省略 from 子句的 select 进行测试、检验函数和计算
select 2*3; select trim(' aa bb '); select now();
- trim():函数去除字符串两端的空格,仅限两端,仅限空格
2. where 与 having
- where 过滤指定的是行;having 对(group by 后的)分组进行过滤
- where 处理的是单个行;
- having 对象则是已经通过 group by 聚合后的分组进行过滤;
- having 支持所有的 where 操作符;
- where 在数据分组前进行过滤,having 在数据分组后进行过滤,两者理论是上是可以同时出现(同框)的。
- having 的粒度是组,where 的粒度是行;
例1:查询订单超过2个的用户:
select cust_id, count(*) as order_num group by cust_id having count(*) >= 2;
例2:具有两个以上产品且价格大于等于4的供应商:
select vend_id, count(*) as num_vend from products where prod_price >= 4 group by vend_id having count(*) >= 2;