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递归查询

相关推荐
全栈老石1 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
倔强的石头_20 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号35 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏5 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐5 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再5 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip