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

相关推荐
互联网搬砖老肖2 小时前
运维打铁: MongoDB 数据库集群搭建与管理
运维·数据库·mongodb
典学长编程3 小时前
数据库Oracle从入门到精通!第四天(并发、锁、视图)
数据库·oracle
积跬步,慕至千里4 小时前
clickhouse数据库表和doris数据库表迁移starrocks数据库时建表注意事项总结
数据库·clickhouse
极限实验室4 小时前
搭建持久化的 INFINI Console 与 Easysearch 容器环境
数据库
星辰离彬4 小时前
Java 与 MySQL 性能优化:Java应用中MySQL慢SQL诊断与优化实战
java·后端·sql·mysql·性能优化
白仑色5 小时前
Oracle PL/SQL 编程基础详解(从块结构到游标操作)
数据库·oracle·数据库开发·存储过程·plsql编程
程序猿小D6 小时前
[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的个人财务管理系统,推荐!
java·数据库·mysql·spring·毕业论文·ssm框架·个人财务管理系统
zhuiQiuMX6 小时前
脉脉maimai面试死亡日记
数据仓库·sql·面试
钢铁男儿7 小时前
C# 接口(什么是接口)
java·数据库·c#
__风__7 小时前
PostgreSQL kv(jsonb)存储
数据库·postgresql