汇总函数

-- 查询 products中最高价格,最低价格是多少?SELECT max(prod_price), min(prod_price) FROM products;-- 查询products表中 vendid =1001 相关商品的数量select vend_id, count(*) from productsWHERE vend_id=1001;
-- 按照 vend_id 进行分组,统计每一个 vend_id 对应的商品数量。SELECT vend_id,COUNT(*) FROM productsGROUP BY vend_id-- 按照 vend_id 进行分组,统计每一个 vend_id 对应的商品最大价格,最小价格。SELECT vend_id, max(prod_price), min(prod_price), COUNT(*),sum(prod_price),AVG(prod_price) FROM productsGROUP BY vend_id;
-- 统计订单表orders中 每个 cust_id 对应的订单数select cust_id,count(*) FROM ordersGROUP BY cust_id;-- 统计订单表orders中 2005-09月份的订单总数select "2005-09" as 月份, count(*) as 订单总量 from ordersWHERE 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-08SELECT 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 ordersGROUP BY 日期

-- checkin 表中 每个月考勤人次-- 2021-07 x-- 2021-08 yselect DATE_FORMAT(checkin_time,'%Y-%m') as 日期, count(*) from checkinGROUP BY 日期

-- 统计3天之内的所有考勤信息-- 查询最近3天的考勤信息SELECT * from checkinWHERE 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 orderitemsGROUP BY order_num;
子查询
-- 1. orderitems找到 购买tnt2的订单号SELECT order_num FROM orderitemsWHERE prod_id = "tnt2"-- 2. orders 订单表中 根据订单号再订单表中找到对应的 客户idSELECT cust_id from orderswhere order_num in(SELECT order_num FROM orderitems -- 使用子查询 第一步获取到的结果WHERE prod_id = "tnt2")-- 3 customers 表中根据 cust_id 找到对应的相关人员信息select * from customersWHERE cust_id in (SELECT cust_id from orderswhere 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 herosGROUP BY role_main
查询主要定位(role_main)或者次要定位(role_assist)是法师或是射手的英雄,同时英雄的上线时间不在 2016-01-01 到 2017-01-01 之间(不包含Null时间)。
select * from herosWHERE (role_main in("法师","射手") OR role_assist in ("法师","射手"))AND(birthdate not BETWEEN "2016-01-01" and "2017-01-01")ANDbirthdate is not null;
上架日期(birthdate)为空的英雄个数;
select COUNT(*) from herosWHERE birthdate is null;
根据主要定位进行分组(role_main), 分别统计每组英雄中血量值max(hp_max)最高的英雄名字 查询结果为 | 主要角色(role_main) | 英雄名字(name) | 最大血量(hp_max) | | —- | —- | —- | | | | | | | | |
-- 每组中血量的最大值SELECT role_main,MAX(hp_max) from herosGROUP 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 tmpWHERE hp_max = 最大血量 AND role_main = 主要定位
使用inner join 方式内连接查询
SELECT name,heros.role_main,hp_max from herosINNER JOIN (select role_main, max(hp_max) as 最大血量 FROM heros GROUP BY role_main) as hmON heros.role_main = hm.role_main and heros.hp_max = 最大血量
根据下面4个表进行操作
customers, orderitems,products,vendors
orderitems 表中单个订单 购买商品数量(quantity)超过10个的订单.
SELECT order_num, sum(quantity) from orderitemsGROUP BY order_numHAVING 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 customersLEFT JOIN (SELECT cust_id, COUNT(*) as 订单数 FROM orders GROUP BY cust_id) as tmpON 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 productsINNER JOIN vendorsON products.vend_id = vendors.vend_idWHERE prod_id="tnt2"
统计orderitems表中 每个商品的销售金额 | 商品id (prod_id) | 销售数量 | 销售金额 | | —- | —- | —- | | ANV01 | | | | ANV02 | | | | …. | | |
select prod_id, sum(quantity),sum(quantity*item_price) as total_price FROM orderitemsGROUP 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 ```
