数据过滤
1. 等值查找
2. 范围查找
3. 模糊匹配
字符的模糊匹配可以用like+通配符
- 出现bank
- 出现bank和beijing
- 先后出现beijing和bank
计算字段
别名,打折问题
函数
- 字符串的截取:substring(字符串,起始位置,截取字符数)起始位置为1
- 字符串的拼接:concat(字符串1,字符串2,字符串3,...)
- 字母大写:upper(字符串)
问题:查询2020年1月的所有订单
where year(order_date) = '2020'and month(order_date) = '1'where date_format(order_date, '%Y-%m')='2020-01'
汇总数据
- sum
- max,min
- count() count(1)和count(*)都是统计行数,count(列名)会过滤空值
全表汇总
分组汇总
group by having 聚合函数
窗口函数
使用子查询
先从表a得到订单号,再从表b得到用户信息
select cust_id,
(select sum(item_price*quantity)
from OrderItems a
where a.order_num = b.order_num
) total_ordered
from Orders b
order by total_ordered desc
关联子查询的运算逻辑?
- 先执行外查询select * from Orders b
- 将外查询中间结果传给子查询,b.order_num = 第一条订单号a1
- 内部查询,相当于select sum(xx) from OrderItems where order_num = ‘a1’
- 子查询结果返回给外部查询,得到订单号为a1的总价
- 得到用户id和用户订单总价的关系
联结表
题目一:确定最佳顾客
思路:三张表内连接
select
c.cust_name,
sum(oi.item_price * oi.quantity) as total_price
from
OrderItems oi
join Orders od on oi.order_num = od.order_num
join Customers c on c.cust_id = od.cust_id
group by c.cust_name having total_price > 1000
order by total_price
题目二:返回所有产品的相关订单信息
思路:题目要求用outer join,但是mysql不支持,所以用left + right + union(去重)来实现outer join的效果
题目三:返回所有产品的总订单数 思路:聚合函数作用在order_num 列,不会统计null
select p.prod_name,count(o.order_num) as orders
from Products p
left join OrderItems o
on p.prod_id = o.prod_id
group by p.prod_name
order by p.prod_name
组合查询
union / union all
总结:
- union结合两个select语句,等价于使用where 条件1 or 条件2
- union组合的列,需要具有相同的数据类型,后续拼接的列自动改名为首次出现的列名
- union会自动去重,union all不会去重