DQL数据查询语句
一.排序
通过order by 子句,可以将查询出来的结果进行排序,排序只影响显示结果,不会影响数据库中数据的顺序
1.单列排序
语法:select * from 表名 [where 条件] order by 列名 排序方法
排序方法有DESC(降序)和ASC(升序,默认升序)
ps:查询chinese大于60分并将年龄进行降序排序
select *from students where chinese >=60 order by age desc;
2.组合排序
组合排序就是先按第一个字段进行排序,如果第一个字段相同,就按第二个字段进行排序,依次类推
语法:SELECT 字段名 FROM 表名 [WHERE 条件] ORDER BY 字段名1 [ASC|DESC],字段名2 [ASC|DESC];
ps:按math进行降序排序,如果成绩相同,则按english进行排序
select *from students order by math desc,english desc;
二.单行函数
单行函数是指对于每一行数据进行计算后得到一行输出结果,SQL单行函数根据数据类型分为数值函数,字符函数,日期函数,转换函数
1.数值函数
(1)abs(x) 返回x的绝对值 ps:select abs(-1) -- 返回1
(2)ceil(x) 向上取整 ps:select ceil(1.1) -- 返回2 select ceil(1.6) -- 返回2
(3)floor(x) 向下取整 ps:select floor(1.8) -- 返回1
(4)rand() 返回0-1的随机数 ps:select rand()
(5)round(x) 四舍五入 ps:select round(1.3) -- 返回1 select round(1.51) -- 返回2
2.字符串函数
(1)concat(s1,s2...sn) 合并字符串 ps:select concat('aa','bb','cc') -- 返回aabbcc
(2)locate(a,b) 获取a在b中第一个出现的位置 ps:select locate('str','mystringstruct') -- 返回3
(3)lower(s) 转小写 ps:select lower('ABC') -- 返回abc
(4)upper(s) 转大写 ps:select upper('abc') -- 返回ABC
(5)replace(s,a,b) 用b替换s中的a ps:select replace('abcc','cc','dd') -- 返回abdd
(6)substr(s,start,length) 从字符串s的start位置截取长度为length的字符串 ps:select substr('xiaodusrting',3,5) -- 返回aodus
(7)trim(s) 去掉字符串首尾的空格 ps:select trim(' as das ') -- 返回as das
(8)reverse(s) 反转字符串 ps:select reverse('abc') -- 返回cba
3.时间日期函数
(1)now() 返回系统当前时间(包括年月日时分秒) ps:select now() -- 返回 2021-07-26 09:18:29 注意:此函数获取时间后再次获取还是之前获取到时间
(2)sysdate() 返回系统当前时间(包括年月日时分秒) ps:select sysdate() -- 返回 2021-07-26 09:18:57
(3)curdate() 返回日期(年月日) ps:select curdate() -- 返回 2021-7-26
(4)curtime() 返回日期(时分秒) ps:select curtime() -- 返回 09:24:09
(5)month(date) 返回参数日期的值 ps:select month('2021-11-12') -- 返回11
(6)week(date) 返回一年中的第几个星期 ps:select week('2020-5-7') -- 返回18
(7)day(date) 返回日期的日值 ps:select day('2020-7-9') --返回9
(8)date_add(date,INTERVAL,expr type) 向日期添加指定的时间间隔。
date 参数是合法的日期表达式 expr 参数是您希望添加的时间间隔 type 参数可以是day hour week等(详细看文档)
ps:date_add('2021-6-8',interval 2 day)
4.流程控制函数
(1)if(条件,expr1,expr2) 条件对返回expr1,否则返回expr2
ps:select if(4>2,10,20)
(2)ifnull(expr1,expr2) expr1不为null时返回expr1 否则返回expr2
ps:统计students表中math,english和chinese的总成绩
select name,math,english,chinese,ifnull(math,0)+ifnull(english,0)+ifnull(chinese,0) 总成绩 from students;
ps:统计students表中math,english和chinese的总成并将总成绩降序排序
select name,math,english,chinese,ifnull(math,0)+ifnull(english,0)+ifnull(chinese,0) 总成绩 from students order by 总成绩 desc;
5.其他函数
(1)version() 查看数据库版本 ps:select version() --我的为8.0.26
(2)user() 查看数据库当前用户 ps:select user() -- 目前为root@localhost
(3)md5(expr) 返回参数expr的加密后的值 ps:select md5('aa') -- 返回 4124bc0a9335c27f086f24ba207a4912
三.聚合函数
在访问数据库时,经常需要对表中的某列数据进行统计分析,如求其最大值、最小值、平均值等。所有这些针对表中一列或者多列数据的分析就称为聚合分析
1.AVG() 函数返回数值列的平均值。
2.COUNT() 函数返回匹配指定条件的行数。注意:会忽略null值
3.MAX() 函数返回指定列的最大值。
4.MIN() 函数返回指定列的最小值。
5.SUM() 函数返回数值列的总数。
6.FIRST() - 返回第一个记录的值 注释:只有 MS Access 支持 LAST() 函数
7.LAST() - 返回最后一个记录的值 注释:只有 MS Access 支持 LAST() 函数
ps:计算math,english,chinese成绩的平均值
select avg(math) 数学平均成绩,avg(english) 英语平均成绩,avg(chinese) 语文平均成绩 from students;
ps:查询年龄大于30的总人数
select count(*) from students where age>30;
ps:查询math,english,chinese成绩的最大值和最小值
select max(math) 数学最高分,min(math) 数学最低分,max(english) 英语最高分,min(english) 英语最低分,max(chinese) 语文最高分,min(chinese) 语文最低分 from students;
ps:计算math,english,chinese总分和这三科总分的总和
select sum(math) 数学总分,sum(english) 英语总分,sum(chinese) 语文总分,sum(math)+sum(english)+sum(chinese) 三科总分总和 from students;
四.分组
分组查询是指使用group by 语句对查询的信息进行分组,相同数据作为一组
语法:select 字段1,字段2...from 表名 group by 分组字段 [having 条件]
1.分组查询
ps:按性别分组
如果使用select *from students group by sex;只能得到分组后的第一条数据
我们可以尝试使用select *from student order by sex;
ps:查询男女组分别的人数
select sex,count(*) from students group by sex;
2.分组时的条件过滤
ps:查询年龄大于30岁的人,按性别分组并统计人数
select sex ,count(*) from students where age>30 group by sex;
ps:查询年龄大于30岁的人,按性别分组并统计人数,只显示人数大于2的组
select sex ,count(*) from students where age>30 group by sex having count(*)>2;
3.where和having的对比
having是在分组后对数据进行过滤,where是在分组前对数据进行过滤
having语句中可以使用聚合函数,where后面不可以使用
五.limit
limit的作用就是限制查询记录的条数
语法:select * from 表名 limit 开始的位置 结束的位置
ps:查询students表中math成绩降序排序的前五条记录
select *from students order by math desc limit 0,5;
select *from students order by math desc limit 6,10;
六.select 语句总结
1.书写顺序
select 字段 from 表名 where 条件 group by 字段 having 条件 order by 字段 limit 开始的位置 结束的位置(其中select 字段,from 表名必写,其他根据情况而定)
2.执行顺序
(1)from 表名 (2)where 条件 (3)group by 字段 (4)having 条件 (5)select 字段 (6)order by 字段 (7)limit