汇总函数
-- 查询 products中最高价格,最低价格是多少?
SELECT max(prod_price), min(prod_price) FROM products;
-- 查询products表中 vendid =1001 相关商品的数量
select vend_id, count(*) from products
WHERE vend_id=1001;
-- 按照 vend_id 进行分组,统计每一个 vend_id 对应的商品数量。
SELECT vend_id,COUNT(*) FROM products
GROUP BY vend_id
-- 按照 vend_id 进行分组,统计每一个 vend_id 对应的商品最大价格,最小价格。
SELECT vend_id, max(prod_price), min(prod_price), COUNT(*),sum(prod_price),AVG(prod_price) FROM products
GROUP BY vend_id;
-- 统计订单表orders中 每个 cust_id 对应的订单数
select cust_id,count(*) FROM orders
GROUP BY cust_id;
-- 统计订单表orders中 2005-09月份的订单总数
select "2005-09" as 月份, count(*) as 订单总量 from orders
WHERE order_date LIKE "2005-09%"
时间函数
-- 返回当前的日期
SELECT CurDate()
-- (1+1)*3 的数学运算
select (1+1)*3
-- 当前时间
SELECT curTime()
-- 年,月
SELECT YEAR(order_date), MONTH(order_date) from orders
-- 合并字符串
SELECT CONCAT("2005","-","09")
-- 合并
SELECT CONCAT(YEAR(order_date),'-',MONTH(order_date)) from orders;
Date_Format() 函数使用
使用方式
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
select NOW();
SELECT DATE_FORMAT(NOW(),'%Y')
SELECT DATE_FORMAT(NOW(),'%y')
-- 2021-08
SELECT DATE_FORMAT(NOW(),'%Y %M')
SELECT DATE_FORMAT(NOW(),'%Y-%m') # 2021-08
练习
-- orders表中每个月的订单数
-- 2005-09 3
-- 2005-10 2
-- 日期 改为 年-月 这样的格式
SELECT DATE_FORMAT(order_date,'%Y-%m') as 日期,COUNT(*) as 订单数 from orders
GROUP BY 日期
-- checkin 表中 每个月考勤人次
-- 2021-07 x
-- 2021-08 y
select DATE_FORMAT(checkin_time,'%Y-%m') as 日期, count(*) from checkin
GROUP BY 日期
-- 统计3天之内的所有考勤信息
-- 查询最近3天的考勤信息
SELECT * from checkin
WHERE DATEDIFF(NOW(),checkin_time) <= 3;
-- 计算所有订单的总价值
select sum(quantity*item_price) as "总价值" FROM orderitems;
-- 计算每个订单总额 分组
-- 20005 x
-- 20006 y
-- ...
SELECT order_num, sum(quantity*item_price) from orderitems
GROUP BY order_num;
子查询
-- 1. orderitems找到 购买tnt2的订单号
SELECT order_num FROM orderitems
WHERE prod_id = "tnt2"
-- 2. orders 订单表中 根据订单号再订单表中找到对应的 客户id
SELECT cust_id from orders
where order_num in
(SELECT order_num FROM orderitems -- 使用子查询 第一步获取到的结果
WHERE prod_id = "tnt2")
-- 3 customers 表中根据 cust_id 找到对应的相关人员信息
select * from customers
WHERE cust_id in (
SELECT cust_id from orders
where order_num in
(SELECT order_num FROM orderitems -- 使用子查询 第一步获取到的结果
WHERE prod_id = "tnt2")
)
作业
请在heros 表中进行相关查询;
查询出2016年上架(birthdate)的所有英雄 (日期函数)
select * from heros where Year(birthdate) = 2016
role_main 字段进行分组,统计出 每组中的英雄数量
select role_main, count(*) FROM heros
GROUP BY role_main
查询主要定位(role_main)或者次要定位(role_assist)是法师或是射手的英雄,同时英雄的上线时间不在 2016-01-01 到 2017-01-01 之间(不包含Null时间)。
select * from heros
WHERE (role_main in("法师","射手") OR role_assist in ("法师","射手"))
AND
(birthdate not BETWEEN "2016-01-01" and "2017-01-01")
AND
birthdate is not null;
上架日期(birthdate)为空的英雄个数;
select COUNT(*) from heros
WHERE birthdate is null;
根据主要定位进行分组(role_main), 分别统计每组英雄中血量值max(hp_max)最高的英雄名字 查询结果为 | 主要角色(role_main) | 英雄名字(name) | 最大血量(hp_max) | | —- | —- | —- | | | | | | | | |
-- 每组中血量的最大值
SELECT role_main,MAX(hp_max) from heros
GROUP BY role_main
-- 将 查询的结果作为临时表
SELECT name, hp_max, role_main from heros,
(SELECT role_main as 主要定位,MAX(hp_max) as 最大血量 from heros GROUP BY role_main) as tmp
WHERE hp_max = 最大血量 AND role_main = 主要定位
使用inner join 方式内连接查询
SELECT name,heros.role_main,hp_max from heros
INNER JOIN (select role_main, max(hp_max) as 最大血量 FROM heros GROUP BY role_main) as hm
ON heros.role_main = hm.role_main and heros.hp_max = 最大血量
根据下面4个表进行操作
customers, orderitems,products,vendors
orderitems 表中单个订单 购买商品数量(quantity)超过10个的订单.
SELECT order_num, sum(quantity) from orderitems
GROUP BY order_num
HAVING sum(quantity)> 10
显示customers 表中每个客户的订单总数 (书中找到答案)
SELECT cust_name, (select count(cust_id) FROM orders WHERE customers.cust_id = orders.cust_id) from customers
左联方式
SELECT cust_name, 订单数 from customers
LEFT JOIN (SELECT cust_id, COUNT(*) as 订单数 FROM orders GROUP BY cust_id) as tmp
ON customers.cust_id = tmp.cust_id
| 客户名称 cust_name | 订单总数 | | —- | —- | | | | | | |
查询prod_id为TNT2的供应商 名字(vend_name),供应商地址(vend_adrress) (子查询 参考https://www.yuque.com/imhelloworld/bypiud/bw2nt4#zK5J7)
select * FROM products
INNER JOIN vendors
ON products.vend_id = vendors.vend_id
WHERE prod_id="tnt2"
统计orderitems表中 每个商品的销售金额 | 商品id (prod_id) | 销售数量 | 销售金额 | | —- | —- | —- | | ANV01 | | | | ANV02 | | | | …. | | |
select prod_id, sum(quantity),sum(quantity*item_price) as total_price FROM orderitems
GROUP BY prod_id
- 所有已经销售出去的商品当中,销售数量最高的商品名字(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 ```