Mysql查询与统计

单表查询

例如:查询某个表中的某些数据

sql 复制代码
select * from 表名;
select 字段1,字段2 from 表名;

多表查询:join on

例如:查询多个表中的数据,例如:表1写的是商品信息:商品ID,名字,表2写的是价格信息:商品ID,价格,多表查询看商品ID,商品名称,价格

sql 复制代码
select * from 表1 join 表2 on 表1的字段a=表2的字段b;

数据筛选:where

例如:查询价格是大于10元的汉堡

查询条件:

  • 空值:IS NULL , IS NOT NULL ,ISNULL()
  • 模糊匹配:LIKE ,NOT LIKE 通配符 % ,_
  • 确定集合:IN ,NOT IN
  • 确定范围:
    • BETWEEN AND(相当于闭集合BETWEEN,AND) ,
    • NOT BETWEEN AND(不属于闭集合BETWEEN,AND的范围)
  • 比较:= , > , < , >= , <= , (<> , !=不等于)

多个条件:

AND 和、OR 或

sql 复制代码
select * from 表1 join 表2 on 表1的字段a=表2的字段b
where 字段1>10;

数据分组+筛选:group by...having

例如:查询今天购买不同商品的人有多少个。按照商品分类,按照日期限定

GROUP BY 字段1,字段2,字段3....HAVING 字段1>10

sql 复制代码
select 字段1, SUM(population), SUM(area)
from 表名
group by 字段1
having SUM(字段1)>10000

备注:

  1. where 是先筛选后连接,having是先连接后筛选;一个查询中可以同时使用,where效率会高点
  2. select 后的字段,必须通过group by分组。例如:不能select 字段2...group by 字段1,having不限制

数据排序:order by

例如:按照货品销量从大到小排序显示

ASC:正序,默认为正序

DESC:倒序

时间类型的函数

计算同比,环比,去年现在到今年的数据变化(和时间相关的查询)

获取:

  • SECOND(date):获取 date 中的秒
  • MINUTE(date):获取 date 中的分
  • HOUR(date):获取 date 中的小时;EXTRACT(HOUR FROM 日期字段时分秒)
  • DAY(date):获取 date 中的日
  • MONTH(date):获取 date 中的月
  • YEAR(date):获取 date 中的年

计算

  • DATE_ADD(date, INTERVAL 表达式 type):表示计算从时间点"date"开始,向前或者向后一段时间间隔的时间。"表达式"的值为时间间隔数,正数表示向后,负数表示向前,"type"表示时间间隔的单位(比如年、月、日等)。
  • LAST_DAY(date):表示获取日期时间"date"所在月份的最后一天的日期
  • DATEDIFF(date1,date2),表示日期"date1"与日期"date2"之间差几天。计算哪天->哪天的平均值

其他

  • CURDATE()获取当前日期
  • DAYOFWEEK(date):获取日期"date"是周几。1 表示周日,2 表示周一,以此类推,直到 7 表示周六

案例:计算去年这时候到今年这时候的数据,去年当前时间后一天为开始时间。假设现在时:2020-12-10

sql 复制代码
SELECT DATE_ADD('2020-12-10', INTERVAL - 1 YEAR);---2019-12-10
SELECT DATE_ADD(DATE_ADD('2020-12-10', INTERVAL - 1 YEAR),INTERVAL - 1 MONTH);---2019-11-10
SELECT LAST_DAY(DATE_ADD(DATE_ADD('2020-12-10', INTERVAL - 1 YEAR),INTERVAL - 1 MONTH));---2019-11-10
SELECT DATE_ADD(LAST_DAY(DATE_ADD(DATE_ADD('2020-12-10', INTERVAL - 1 YEAR),INTERVAL - 1 MONTH)),INTERVAL 1 DAY);----2019-12-01

条件判断

根据场景显示数据: 例如:当查到的次品率<a时,显示为合格,>=a时显示为不合格

CASE 表达式 WHEN 值1 THEN 表达式1 WHEN 值2 THEN 表达式2 ELSE 表达式m END

sql 复制代码
CASE DAYOFWEEK(CURDATE()) - 1 WHEN 0 THEN 7 ELSE DAYOFWEEK(CURDATE()) - 1 END AS 周几

条件判断

  • IFNULL(V1,V2):表示如果 V1 的值不为空值,则返回 V1,否则返回 V2
  • IF(表达式,V1,V2):如果表达式为真(TRUE),则返回 V1,否则返回 V2

数学函数

例如:花费172.5元积分为172

  • 向上取整 CEIL(X) 和 CEILING(X):返回大于等于 X 的最小 INT 型整数-- -172.22=>173
  • 向下取整 FLOOR(X):返回小于等于 X 的最大 INT 型整数.---172.22=>172
  • 舍入函数 ROUND(X,D):X 表示要处理的数,D 表示保留的小数位数,处理的方式是四舍五入。ROUND(X) 表示保留 0 位小数

字符串函数

  • CONCAT(s1,s2,...):表示把字符串 s1、s2......拼接起来,组成一个字符串
  • CAST(表达式 AS CHAR):表示将表达式的值转换成字符串
  • CHAR_LENGTH(字符串):表示获取字符串的长度
  • SPACE(n):表示获取一个由 n 个空格组成的字符串 ---一般是补齐字段
  • SUBSTR(s,n)获取字符串s从第n个位置到第s结尾的子字符串
  • MID(s,n,len)获取字符串s从第n个位置开始长度为len的字符串
  • LTRIM(s)除掉左边的空格
  • RTRIM(s)除掉右边的空格

聚合函数

求和函数SUM(字段名称):例如:最近一周某个商品的销量之和

sql 复制代码
SELECT SUM(quantity), SUM(salesvalue) FROM  demo.transactiondetails;

求平均函数AVG() 例如:平均每天的销量、收益为多少

sql 复制代码
SELECT AVG(quantity) FROM  demo.transactiondetails;

最大值MAX()、最小函数MIN() 例如:当天销售量最大的产品

备注:查询中既求最大、也求最小时分别查询,结果为2条数据

sql 复制代码
SELECT MAX(quantity),MIN(salesvalue) FROM  demo.transactiondetails;

计数函数COUNT():例如:当天共有多少个订单

COUNT(*):统计一共有多少条记录; COUNT(字段):统计有多少个不为空的字段值

sql 复制代码
SELECT COUNT(*)  FROM demo.goodsmaster;

SELECT COUNT(specification)  FROM demo.goodsmaster;

进阶

CTE递归查询

相关推荐
weixin_3823952326 分钟前
0-500 人工厂的生产 PMC 系统怎么做?基于 Tauri + SQLite 的性能架构实践与 5000 物料压测实录
数据库·架构·sqlite
l1t1 小时前
DeepSeek总结的 DuckDB 2.0 文档新内容
服务器·网络·数据库
IvorySQL1 小时前
PostgreSQL 日报| PG19 主备切换挂起修复(10 月 17 日)
数据库·postgresql
roman_日积跬步-终至千里1 小时前
【数据Agent论文·查询与语义|11】EntSQL:给了业务文档,模型为何还是写不对SQL?
数据库·人工智能·sql·数据分析
2601_962885721 小时前
如何用 Python 算最大回撤和回撤恢复期?
java·数据库·python
zcn1262 小时前
Left join+or exists+like关联优化
数据库·sql优化改写
我科绝伦(Huanhuan Zhou)2 小时前
Oracle 表空间碎片整理实战:shrink space 与 move table 全解析
数据库·oracle
Yyyyyy~2 小时前
【Mysql】表的操作
数据库·mysql
TDengine (老段)2 小时前
工业数据十大痛点系列 · 第 6 篇
数据库·时序数据库·tdengine·涛思数据·idmp·工业数据分析·ai 分析数据
ly76893 小时前
PostgreSQL 流复制与高可用切换:主从延迟、同步提交与 Spring Boot 读写分离的边界
数据库·spring boot·postgresql·读写分离·流复制·高可用切换