【SQL】DAY3 经典题目专辑

105 阅读2分钟

数据过滤

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

关联子查询的运算逻辑?

  1. 先执行外查询select * from Orders b
  2. 将外查询中间结果传给子查询,b.order_num = 第一条订单号a1
  3. 内部查询,相当于select sum(xx) from OrderItems where order_num = ‘a1’
  4. 子查询结果返回给外部查询,得到订单号为a1的总价
  5. 得到用户id和用户订单总价的关系

sql 执行顺序-子查询_子查询先执行_稀饭小姐的博客-CSDN博客

联结表

题目一:确定最佳顾客

image.png

image.png

思路:三张表内连接

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
总结:

  1. union结合两个select语句,等价于使用where 条件1 or 条件2
  2. union组合的列,需要具有相同的数据类型,后续拼接的列自动改名为首次出现的列名
  3. union会自动去重,union all不会去重