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

相关推荐
2301_813599552 小时前
Go语言怎么做秒杀系统_Go语言秒杀系统实战教程【实用】
jvm·数据库·python
NCIN EXPE6 小时前
redis 使用
数据库·redis·缓存
MongoDB 数据平台6 小时前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
极客on之路6 小时前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家6 小时前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver
lThE ANDE6 小时前
开启mysql的binlog日志
数据库·mysql
yejqvow127 小时前
CSS如何控制placeholder文字的颜色_使用--placeholder伪元素
jvm·数据库·python
oLLI PILO7 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库
m0_743623927 小时前
HTML怎么创建多语言切换器_HTML语言选择下拉结构【指南】
jvm·数据库·python