Count() :查某相同数据共有几行。
Sum() :求和。
in() :查询相同值,括号中子查询结果=前面条件,则显示数据。
Order By :默认升序 asc/desc.
Group By : 分组查询(一对多)。
Having():筛选分组,类似where关键字,分组之后的条件筛选查询。
limit 0,1 : (起始位置,查询总数)
// 注意:group by必须在where之后,order by之前。
WHERE id = #{id} GROUP BY id having id > 10 order by create_time desc
Avg() :平均值
注意 AVG 计算平均分时,缺少一个字段数据,则会被忽略,导致计算不正确。
Max() : 某字段列中最大值 Min() :某字段列中最小值
Concat() :合并字符串
DISTINCT : 去重
例:SELECT a.id, a.name FROM A as a JOIN B ON a.id = b.id
【外连接】
A表outer join B表 ON a.id = b.id (查询出两表并集)
【左外连接】 A表 Left join B表 ON 条件(左表 + 并集部分)
【右外连接】 A表 Right join B表 ON 条件 (右表 + 并集部分)
-- 1.查询"1001"课程 比 "1002"课程成绩高的所有学生的学号及姓名。--
SELECT id AS '学号', `name` AS '姓名'
FROM student WHERE id IN (
SELECT a.s_id FROM
(SELECT s_id, score FROM grade WHERE c_id = 1001) a,
(SELECT s_id, score FROM grade WHERE c_id = 1002) b
WHERE a.score > b.score
AND a.s_id = b.s_id
)
EXISTS 检查子查询
select 字段名 from 表名1 where
exists ( select * from 表名2 where 表1.id = 表2.id) ;
/*
关键字EXISTS:构造子查询,子查询是否返回结果集,返回则才进行外层查询。
如果子查询的结果集不为空,则EXISTS返回的结果为TRUE,此时外层查询语句将进行查询;
如果子查询的结果集为空,则EXISTS返回的结果为FLASE,此时外层查询语句将不进行查询;
*/
-- 6.查询学过"1001"并且也学过编号"1004"课程的同学的学号、姓名;--
SELECT s.id, s.`name` FROM student s, grade g
WHERE g.s_id = s.id
AND g.c_id = 1001
AND EXISTS (
SELECT * FROM GRADE WHERE s_id = s.id
AND c_id = 1004
);
group_concat()
/*
* 函数:group_concat
* 作用:函数返回一个字符串结果,该结果由分组中的值连接组合而成。(一列多行数据,在一行显示。)
* group_concat( [DISTINCT] 连接字段 [Order BY 排序字段 ASC/DESC] [Separator ‘分隔符’] )
*/
select group_concat(stu.s_name)AS '姓名' from student stu
BETWEEN ... AND
/*
* 函数 BETWEEN ... AND 取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
*/
SELECT * FROM student WHERE s_birth BETWEEN '1990-1-1' AND '1990-12-31';
TIMESTAMPDIFF() 函数:计算两个日期的时间差
CURDATE() 函数:返回当前的日期
语法结构 TIMESTAMPDIFF (unit, datetime_expr1, datetime_expr2)
参数说明:
unit: 日期比较返回的时间差单位,常用可选值如下:
SECOND:秒 MINUTE:分钟 HOUR:小时
DAY:天 WEEK:星期 MONTH:月
QUARTER:季度
YEAR:年
datetime_expr1: 要比较的日期1 datetime_expr2: 要比较的日期2
TIMESTAMPDIFF函数
返回datetime_expr2 - datetime_expr1的结果,
其中datetime_expr1和datetime_expr2可以是DATE或DATETIME类型值
round函数:用于数据的四舍五入
datediff() 函数:返回两个日期之间的天数。
curdate() 返回:当前的日期
SELECT s_id, s_name, ROUND(DATEDIFF(CURDATE(), s_birth)/365.2422) FROM student
CURRENT_DATE:返回此时区的当前本地日期
select s_id, s_name, year(current_date()) - year(s_birth) as age from student;
原文链接:https://blog.csdn.net/Hudas/article/details/124351790
SELECT
COUNT( CASE WHEN `status` = '0' THEN 1 ELSE NULL END ) AS 创建,
COUNT( CASE WHEN `status` = '1' THEN 1 ELSE NULL END ) AS 待付款,
COUNT( CASE WHEN `status` = '2' THEN 1 ELSE NULL END ) AS 待发货,
COUNT( CASE WHEN `status` = '3' THEN 1 ELSE NULL END ) AS 待收货
FROM
`order`;
// 原文链接:https://blog.csdn.net/JonLoveJane/article/details/110672027
DISTINCT 去重
DISTINCT : 作用是对表中的单个字段或多个字段去重操作
// 对多个字段进行去重操作
SELECT distinct 字段, 字段 FROM 表名
运算符: between (…之…间) in (查找相同值) is not null (判空null)
-- between 查询某到某之间的数据
Select * from user where id Between 20 and 25
Select * from user where id>=20 and id<= 25;
IN
-- 12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息
/**
* 关键字 DISTINCT 去重
*/
SELECT DISTINCT stu.s_id, stu.s_name FROM student stu, score sc
WHERE stu.s_id = sc.s_id
AND sc.c_id IN (
SELECT c_id FROM score WHERE s_id = '1'
)
查找id=20 or id=22
SELECT *FROM user where id in(20,22)
SELECT *FROM user where id=20 OR id=22 两语句查询结果相同
-- is not null 判读有无空值
select * from user where pass is not null; 判断pass密码中有无空值
模糊查询 like
-- 查询姓刘的同学的学号及姓名
-- like结合使用的通配符 : % (代表0到任意个字符) _ (一个字符)
SELECT studentno,studentname FROM student
WHERE studentname LIKE '刘%';
-- 查询姓刘的同学,后面只有一个字的
WHERE studentname LIKE '刘_';
-- 查询姓刘的同学,后面只有两个字的
WHERE studentname LIKE '刘__';
-- 查询姓名中含有 嘉 字的
WHERE studentname LIKE '%嘉%';
-- 查询姓名中含有特殊字符的需要使用转义符号 '\'
-- 自定义转义符关键字: ESCAPE ':'
%(百分号) : 表示任意字符(任意类型 和 长度)。
N% : 查询以 N 开头的任意类型的值。
%N : 查询 以 N 为结尾的 任意类型的值。
%N% : 查询包含N的 任意类型的值
_ (下划线):查询一个任意字符,。(用于限制表达式中的字符长度)
N_ :查询以N开头,其它任意的两个字符。
_N :查询以N结尾 ,其它任意的两个字符。
_N :两条下划线,表示以N结尾的,其它任意的三个字符
N_M :查询第一位为N,第三位为M,其它任意的四个字符。
NULL
-- =============================================
-- 查询出生日期没有填写的同学
-- 不能直接写=NULL , 这是代表错误的 , 用 is null
SELECT studentname FROM student
WHERE BornDate IS NULL;
WHERE BornDate IS NOT NULL;
-- 查询没有写家庭住址的同学(空字符串不等于null)
SELECT studentname FROM student
WHERE Address='' OR Address IS NULL;
order by :排序。 升ASC / DESC
-- 按照id进行降序 asc (升) / desc (降)
SELECT * FROM user ORDER BY id DESC;
============== 分页 ================
语法 : SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
推导:
第一页 : limit 0,5
第二页 : limit 5,5
第三页 : limit 10,5
......
第N页 : limit (页数-1)*页面显示数 , 页面显示数
[ pageNo:页码,pageSize:单页面显示条数 ]
group by : 分组查询(一对多)
注意: group by必须在where之后,order by之前。
根据某一列分组,这一列应该在查询的列中一起查询出来;
做分组查询时,查询的列不要使用,应查询具体的列名
-- 统计每个学生的总分
select `name`, english+chinese+math AS '总分'
from student GROUP BY `name`;
HAVING 筛选查询
类似where关键字,分组之后的条件筛选查询。
-- 查询班级总分大于500的班级
select class, sum(chinese+math+english) AS '总分'
from student
group by class having 总分> 500;
Limit 分页查询
Limit m, n:从0号数据开始查询,共查询出n条数据。
例:查90-100中共10条数据:
select * from user Limit 89,10;
M: 从m+1行开始 (初始值0)N:要查询的行数
-- Limit 从0开始返回两条数据
select * from user limit Limit 2;
-- 从id=4开始返回三条数据
select * from user limit Limit 3,3;
【内连接】 A表 inner join B表 ON a.id = b.id
简写:select 字段 from A, B where A.id = B.id
特点:取两张表并集部分,以A表为基准,B表该字段没有值,用NULL值填充。
隐式内连接:
显示内连接:
外连接:左外连接 右外连接
左外连接:以左表为主,显示左表的全部信息,右表显示满足where条件的信息,如果右表没有左表对应的信息,会以NULL值填充。
MySQL不支持完全外连接。 outer join ( mysql不支持 )
外连接:左外连接 右外连接
例:SELECT a.id, a.name FROM A as a JOIN B ON a.id = b.id
【外连接】不支持这种查询,A表outer join B表 ON a.id = b.id (查询出两表并集)
【左外连接】 A表 Left join B表 ON a.id = b.id (左表 + 并集部分)
【右外连接】 A表 Right join B表 ON a.id = b.id (右表 + 并集部分)
前提条件:两表查询字段列数必须一样,列名可以不一致,显示以第一个查询语句列名为准。
联合查询 union
特点:两次查询结果合并起来,去掉重复行数据。
【联合查询】
select 字段 from A表 union select 字段 from B表
union 与 union All 区别?
union all:结果允许查询出两表重复数据,不排序,效率高于union。
自连接:不属于连接类型,只是一种用法;
/*
* 核心思想:把一张表看成两张一模一样的表,然后将这两张表连接查询(自连接)
*/
SELECT a.name AS '父栏目', b.name AS '子栏目'
FROM student AS a, student AS b
WHERE a.id =b.id
什么是子查询?
在查询语句中的WHERE条件子句中,又嵌套了另一个查询语句
子查询返回的结果一般都是集合,故而建议使用IN关键字;
/*============== 子查询 ================
*/
-- 使用子查询(执行顺序:由里及外)
SELECT * FROM 表名
WHERE subjectno=(
SELECT * FROM 表 WHERE 条件
)
ORDER BY 字段 DESC;
-- 子查询
SELECT * FROM 表名
WHERE 字段 >= 100 AND subjectno=(
SELECT * FROM 表 WHERE 条件
)
在细分的组内进行比较时,可以使用关联子查询。关联子查询起关键作用的是子查询语句中的where子句。
// 查找每个课程中大于对应课程平均成绩的学生
SELECT 学号,课程号,成绩
FROM score AS s1
WHERE 成绩 > ( SELECT AVG(成绩) FROM score AS s2
WHERE s1.课程号=s2.课程号 );
执行顺序:先执行外层查询,再查询内层子查询。
什么时候用标量子查询:当我们需要单一值的时候。
注意事项:不能返回多行结果。
标量子查询必须且只能返回一行一列的结果。返回单一的值。所以可以和比较运算符一起使用。
SELECT 学号, 成绩 FROM score
WHERE 成绩 > ( SELECT AVG(成绩) FROM score );
标量子查询:不局限在where查询语句中,通常任何可以使用单一值的位置都可以使用。
标量子查询用在select子句中
查询学号、成绩和平均成绩
SELECT 学号,成绩,
(SELECT AVG(成绩) FROM score) AS '平均成绩'
FROM score;
标量子查询用在having子句中
// 查询成绩大于平均成绩的学生
SELECT 学号,课程号,成绩 FROM score
GROUP BY 课程号
HAVING AVG(成绩) > (SELECT AVG(成绩) FROM score);
返回的结果是一列(一列多行);不能直接使用运算符
运算符和 any 、all 一起使用,或者使用 in 。
>any: 大于最小的
>all: 大于最大的 <>all=not in 返回的结果是一行(一行多列) 返回的结果是多行多列(多行多列) 返回的结果1或者0(类似布尔操作) AS 关键字 给表起别名建议:空格 + 别名。 注意: where子句中不能出现聚合函数 Avg():返回某一列的平均值 Sum():返回某一列的值,相加的结果 Count():返回某一列的总行数 Count(*):统计人数,不计入null值。 Count(列名):计入null值 某一列总行数 abs() :绝对值函数 SELECT ABS ( -5 ) == 5 ceil() :天花板函数 , 有小数 进1。 SELECT CELL(13.1) == 14; Floor() : 地板函数,有小数 向下取整。 SELECT CELL(13.9) == 13; Exp(e) :自然对数 e 为底的 X次方。 Mod():取余 SELECT MOD( 9 , 2 ) == 1; Round(x,y) :返回x 四舍五入 保留Y位小数 SELECT ROUND (3.1415) == 3 ; SELECT ROUND (3.1415 , 2) == 3.14 (保留两位小数) Truncate(x,y):截取x,保留y位小数 Sqrt(x): 返回x的根号3次方 group_concat:字段值在同一行打印出来,逗号分隔(默认) Concat(m,n):连接字符串 Trim():取出字符串两头的空格 Length():字符串长度 Replace(): 替换 Substr():截取字符串 Lower():将大写转化成小写 Upper():将小写转化成大写 current_timestamp: 获得当前时间戳函数: Now():返回当前日期+时间 Curdate():返回日期 Curtime():返回时间 Date_add(date,interval x unit) 返回date加上x后的日期 Date_sub(date,interval x unit) 返回date减去x后的日期 Datediff(d1,d2):计算两个日期之间的天数 Day() 获取指定日期的天(日) Week() 获取指定日期的多少周 Year()获取时间的年份 Month()获取时间的月份 Dayofweek():返回日期中一周中第几天 Dayofmonth():返回一月中第几天 Dayofyear():返回一年中第几天 Date_format(date,format):按照格式转化日期 日期格式: %a:缩写星期名 %b:缩写月名 %c:月(数值) %d:日,数值(00-31); %e:日,数值(0-31); %f:微妙 %H:小时(00-23) %h:小时(01-12) %i:分钟(00-59) %j:年的天(001-366) %k:小时(0-23) %M:月名 %m:月,数值(00-12) %p:AM或者PM %S:秒(00-59) %s:秒(00-59) %T:时间 24小时(hh:mm:ss) %W:星期名 %Y:年(4位) %y:年(2位)-- 一列多行
SELECT * FROM student WHERE sname in(
SELECT sname FROM student WHERE ssex='男'
);
(4) 行子查询: 一行多列
select YEAR(sbirthday), class from student where sno='101'
(5) 表子查询: 多行多列
select * from student where(YEAR(sbirthday),class) in (
select YEAR(sbirthday) , class From student where ssex='女'
)
(6) Exists子查询
Mysql 起别名
-- 使用as也可以为表取别名
SELECT studentno AS 学号 FROM student stu;
-- CONCAT():拼接字符串
SELECT CONCAT('姓名:',studentname) AS 新姓名 FROM student;
聚合函数 avg
原因:因为聚集函数要对全列数据时行计算,因而使用它的前提是:结果集已经确定!而where子句还处于“确定”结果集的过程中,因而不能使用聚集函数。数据函数(运算)
字符串函数
日期和时间函数
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s') -- 截取到当前年