汇总函数

image.png

  1. -- 查询 products中最高价格,最低价格是多少?
  2. SELECT max(prod_price), min(prod_price) FROM products;
  3. -- 查询products表中 vendid =1001 相关商品的数量
  4. select vend_id, count(*) from products
  5. WHERE vend_id=1001;
  1. -- 按照 vend_id 进行分组,统计每一个 vend_id 对应的商品数量。
  2. SELECT vend_id,COUNT(*) FROM products
  3. GROUP BY vend_id
  4. -- 按照 vend_id 进行分组,统计每一个 vend_id 对应的商品最大价格,最小价格。
  5. SELECT vend_id, max(prod_price), min(prod_price), COUNT(*),sum(prod_price),AVG(prod_price) FROM products
  6. GROUP BY vend_id;
  1. -- 统计订单表orders 每个 cust_id 对应的订单数
  2. select cust_id,count(*) FROM orders
  3. GROUP BY cust_id;
  4. -- 统计订单表orders 2005-09月份的订单总数
  5. select "2005-09" as 月份, count(*) as 订单总量 from orders
  6. WHERE order_date LIKE "2005-09%"

时间函数

image.png

  1. -- 返回当前的日期
  2. SELECT CurDate()
  3. -- 1+1)*3 的数学运算
  4. select (1+1)*3
  5. -- 当前时间
  6. SELECT curTime()
  7. -- 年,月
  8. SELECT YEAR(order_date), MONTH(order_date) from orders
  9. -- 合并字符串
  10. SELECT CONCAT("2005","-","09")
  11. -- 合并
  12. SELECT CONCAT(YEAR(order_date),'-',MONTH(order_date)) from orders;

Date_Format() 函数使用

使用方式

  1. select date_format(时间,格式)
格式 描述
%a 缩写星期名
%b 缩写月名
%c 月,数值
%D 带有英文前缀的月中的天
%d 月的天,数值(00-31)
%e 月的天,数值(0-31)
%f 微秒
%H 小时 (00-23)
%h 小时 (01-12)
%I 小时 (01-12)
%i 分钟,数值(00-59)
%j 年的天 (001-366)
%k 小时 (0-23)
%l 小时 (1-12)
%M 月名
%m 月,数值(00-12)
%p AM 或 PM
%r 时间,12-小时(hh:mm:ss AM 或 PM)
%S 秒(00-59)
%s 秒(00-59)
%T 时间, 24-小时 (hh:mm:ss)
%U 周 (00-53) 星期日是一周的第一天
%u 周 (00-53) 星期一是一周的第一天
%V 周 (01-53) 星期日是一周的第一天,与 %X 使用
%v 周 (01-53) 星期一是一周的第一天,与 %x 使用
%W 星期名
%w 周的天 (0=星期日, 6=星期六)
%X 年,其中的星期日是周的第一天,4 位,与 %V 使用
%x 年,其中的星期一是周的第一天,4 位,与 %v 使用
%Y 年,4 位
%y 年,2 位

更多关于 dateformat的使用可以参考: https://www.w3school.com.cn/sql/func_date_format.asp

  1. select NOW();
  2. SELECT DATE_FORMAT(NOW(),'%Y')
  3. SELECT DATE_FORMAT(NOW(),'%y')
  4. -- 2021-08
  5. SELECT DATE_FORMAT(NOW(),'%Y %M')
  6. SELECT DATE_FORMAT(NOW(),'%Y-%m') # 2021-08

练习

  1. -- orders表中每个月的订单数
  2. -- 2005-09 3
  3. -- 2005-10 2
  1. -- 日期 改为 年-月 这样的格式
  2. SELECT DATE_FORMAT(order_date,'%Y-%m') as 日期,COUNT(*) as 订单数 from orders
  3. GROUP BY 日期

image.png

  1. -- checkin 表中 每个月考勤人次
  2. -- 2021-07 x
  3. -- 2021-08 y
  4. select DATE_FORMAT(checkin_time,'%Y-%m') as 日期, count(*) from checkin
  5. GROUP BY 日期

image.png

  1. -- 统计3天之内的所有考勤信息
  2. -- 查询最近3天的考勤信息
  3. SELECT * from checkin
  4. WHERE DATEDIFF(NOW(),checkin_time) <= 3;
  1. -- 计算所有订单的总价值
  2. select sum(quantity*item_price) as "总价值" FROM orderitems;
  3. -- 计算每个订单总额 分组
  4. -- 20005 x
  5. -- 20006 y
  6. -- ...
  7. SELECT order_num, sum(quantity*item_price) from orderitems
  8. GROUP BY order_num;

子查询

  1. -- 1. orderitems找到 购买tnt2的订单号
  2. SELECT order_num FROM orderitems
  3. WHERE prod_id = "tnt2"
  4. -- 2. orders 订单表中 根据订单号再订单表中找到对应的 客户id
  5. SELECT cust_id from orders
  6. where order_num in
  7. (SELECT order_num FROM orderitems -- 使用子查询 第一步获取到的结果
  8. WHERE prod_id = "tnt2")
  9. -- 3 customers 表中根据 cust_id 找到对应的相关人员信息
  10. select * from customers
  11. WHERE cust_id in (
  12. SELECT cust_id from orders
  13. where order_num in
  14. (SELECT order_num FROM orderitems -- 使用子查询 第一步获取到的结果
  15. WHERE prod_id = "tnt2")
  16. )

作业

请在heros 表中进行相关查询;
image.png

  1. 查询出2016年上架(birthdate)的所有英雄 (日期函数)

    1. select * from heros where Year(birthdate) = 2016
  2. role_main 字段进行分组,统计出 每组中的英雄数量

    1. select role_main, count(*) FROM heros
    2. GROUP BY role_main
  3. 查询主要定位(role_main)或者次要定位(role_assist)是法师或是射手的英雄,同时英雄的上线时间不在 2016-01-01 到 2017-01-01 之间(不包含Null时间)。

    1. select * from heros
    2. WHERE (role_main in("法师","射手") OR role_assist in ("法师","射手"))
    3. AND
    4. (birthdate not BETWEEN "2016-01-01" and "2017-01-01")
    5. AND
    6. birthdate is not null;
  4. 上架日期(birthdate)为空的英雄个数;

    1. select COUNT(*) from heros
    2. WHERE birthdate is null;
  5. 根据主要定位进行分组(role_main), 分别统计每组英雄中血量值max(hp_max)最高的英雄名字 查询结果为 | 主要角色(role_main) | 英雄名字(name) | 最大血量(hp_max) | | —- | —- | —- | | | | | | | | |

  1. -- 每组中血量的最大值
  2. SELECT role_main,MAX(hp_max) from heros
  3. GROUP BY role_main
  4. -- 查询的结果作为临时表
  5. SELECT name, hp_max, role_main from heros,
  6. (SELECT role_main as 主要定位,MAX(hp_max) as 最大血量 from heros GROUP BY role_main) as tmp
  7. WHERE hp_max = 最大血量 AND role_main = 主要定位

使用inner join 方式内连接查询

  1. SELECT name,heros.role_main,hp_max from heros
  2. INNER JOIN (select role_main, max(hp_max) as 最大血量 FROM heros GROUP BY role_main) as hm
  3. ON heros.role_main = hm.role_main and heros.hp_max = 最大血量

根据下面4个表进行操作
customers, orderitems,products,vendors

  1. orderitems 表中单个订单 购买商品数量(quantity)超过10个的订单.

    1. SELECT order_num, sum(quantity) from orderitems
    2. GROUP BY order_num
    3. HAVING sum(quantity)> 10
  2. 显示customers 表中每个客户的订单总数 (书中找到答案)

    1. SELECT cust_name, (select count(cust_id) FROM orders WHERE customers.cust_id = orders.cust_id) from customers

    左联方式

    1. SELECT cust_name, 订单数 from customers
    2. LEFT JOIN (SELECT cust_id, COUNT(*) as 订单数 FROM orders GROUP BY cust_id) as tmp
    3. ON customers.cust_id = tmp.cust_id

    | 客户名称 cust_name | 订单总数 | | —- | —- | | | | | | |

  3. 查询prod_id为TNT2的供应商 名字(vend_name),供应商地址(vend_adrress) (子查询 参考https://www.yuque.com/imhelloworld/bypiud/bw2nt4#zK5J7

    1. select * FROM products
    2. INNER JOIN vendors
    3. ON products.vend_id = vendors.vend_id
    4. WHERE prod_id="tnt2"
  4. 统计orderitems表中 每个商品的销售金额 | 商品id (prod_id) | 销售数量 | 销售金额 | | —- | —- | —- | | ANV01 | | | | ANV02 | | | | …. | | |

  1. select prod_id, sum(quantity),sum(quantity*item_price) as total_price FROM orderitems
  2. GROUP BY prod_id
  1. 所有已经销售出去的商品当中,销售数量最高的商品名字(prod_name),商品单价(prod_price),供应商id(vend_id) ```sql — 最大销售量

SELECT max(销售量) from (select prod_id, sum(quantity) as 销售量 FROM orderitems GROUP BY prod_id) as t1

— 根据最大销售量找产品

select prod_id, sum(quantity) as 销售量 FROM orderitems GROUP BY prod_id HAVING 销售量 = ( SELECT max(销售量) from (select prod_id, sum(quantity) as 销售量 FROM orderitems GROUP BY prod_id) as t1 )

SELECT prod_name, prod_price,销售量 FROM products INNER JOIN ( select prod_id, sum(quantity) as 销售量 FROM orderitems GROUP BY prod_id HAVING 销售量 = ( SELECT max(销售量) from (select prod_id, sum(quantity) as 销售量 FROM orderitems GROUP BY prod_id) as t1 )) as tmp ON tmp.prod_id = products.prod_id ```