DQL 语句2

DQL 语句

排序

通过 ORDER BY 子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序)

SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 [ASC|DESC]; 
ASC: 升序, 默认是升序
DESC: 降序
-- ORDER BY 必须放在最后面
准备数据:
CREATE TABLE student(
id INT,NAME VARCHAR(30),age INT,sex CHAR(1),address VARCHAR(30),math INT,english INT
);
INSERT INTO student(id,NAME,age,sex,address,math,english) VALUES
(9,'唐僧',25,'男','长安',87,78),
(10,'孙悟空',18,'男','花果山',100,66),
(11,'猪八戒',22,'男','高老庄',58,78),
(12,'沙僧',50,'男','流沙河',77,88),
(13,'白骨精',22,'女','白虎岭',66,66),
(14,'蜘蛛精',23,'女','盘丝洞',88,NULL);

单列排序

单列排序就是使用一个字段排序

具体操作:
• 查询所有数据,使用年龄降序排序
SELECT * FROM student ORDER BY age DESC;

组合排序

组合排序就是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,依次类推。 

上面的例子中,年龄有相同的时。当年龄相同再使用 math 进行排序 
SELECT 字段名 FROM 表名 WHERE 字段=值ORDER BY 字段名 1 [ASC|DESC], 字段名 2 [ASC|DESC];

具体操作:
• 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序
SELECT * FROM student ORDER BY age DESC, math DESC;

聚合函数

之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,

而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。

另外聚合函数会忽略空值

五个聚合函数:

 count: 统计指定列记录数,记录为 NULL 的不统计 
 
 sum: 计算指定列的数值和,如果不是数值类型,那么计算结果为 0 
 
 max: 计算指定列的最大值 
 
 min: 计算指定列的最小值 
 
 avg: 计算指定列的平均值,如果不是数值类型,那么计算结果为 0

聚合函数的使用:

写在 SQL 语句 SELECT 后 字段名的地方 SELECT 字段名... FROM 表名; 
SELECT COUNT(age) FROM 表名;

具体操作:
查询学生总数
SELECT COUNT(english) FROM student;

我们发现对于NULL 的记录不会统计 IFNULL(expr1, expr2)的用法:
假如 expr1 不为 NULL,则 IFNULL() 的返回值为 expr1;否则其返回值为 expr2 


我们可以利用IFNULL()函数,如果记录为 NULL,给个默认值,这样统计的数据就不会遗漏
SELECT IFNULL(english,0) FROM student;
SELECT IFNULL(english,'没有分数') FROM student;

SELECT COUNT(*) FROM student;

SELECT COUNT(IFNULL(english,0)) 学生总数 FROM student;

查询年龄大于 40 的总数

SELECT COUNT(*) FROM student WHERE age>40;

查询数学成绩总分
SELECT SUM(math) FROM student;

查询数学成绩平均分
SELECT AVG(math) FROM student;

查询数学成绩最高分
SELECT MAX(math) FROM student;

查询数学成绩最低分
SELECT MIN(math) FROM student;

分组

分组查询是指使用 GROUP BY 语句对查询信息进行分组,相同数据作为一组 

SELECT 字段 1,字段 2... FROM 表名 GROUP BY 分组字段 [HAVING 条件];
GROUP BY 怎么分组的?
将分组字段结果中相同内容作为一组 
SELECT * FROM student GROUP BY sex;

这句话会将 sex 相同的数据作为一组GROUP BY 将分组字段结果中相同内容作为一组,
并且返回每组的第一条数据,所以单独分组没什么用处。

-- 分组的目的就是为了统计,一般分组会跟聚合函数一起使用。
分组后聚合函数的作用?
不是操作所有数据,而是操作一组数据。 

SELECT SUM(math), sex FROM student GROUP BY sex; 

效果如下:
实际上是将每组的 math 进行求和,返回每组统计的结果

-- 注意事项:当我们使用某个字段分组,在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪组的

具体步骤:

• 按性别分组
SELECT sex FROM student GROUP BY sex;

• 查询男女各多少人
1.查询所有数据,按性别分组。 
2.统计每组人数
SELECT sex, COUNT(*) FROM student GROUP BY sex;

• 查询年龄大于 22 岁的人,按性别分组,统计每组的人数
1.先过滤掉年龄小于 22 岁的人。
2.再分组。
3.最后统计每组的人数
SELECT sex, COUNT(*) FROM student WHERE age > 22 GROUP BY sex;

如果查询年龄大于 22 岁的人,按性别分组,统计每组的人数,并只显示性别人数大于 2 的数据 

-- 注意: 并只显示性别人数>2 的数据属于分组后的条件,对于分组后的条件需要使用 having 子句

SELECT sex, COUNT(*) FROM student WHERE age > 22 GROUP BY sex HAVING COUNT(*) >2;

只有分组后人数大于 2`男`这组数据显示出来

having 与 where 的区别

-- having 是在分组后对数据进行过滤.

-- where 是在分组前对数据进行过滤

-- having 后面可以使用聚合函数

-- where 后面不可以使用聚合函数

limit 语句

LIMIT 是限制的意思,所以 LIMIT 的作用就是限制查询记录的条数。 
SELECT *|字段列表 [as 别名]FROM 表名 [WHERE 子句][GROUP BY 子句][HAVING 子句][ORDER BY 子句][LIMIT 子句]; 

思考:limit 子句为什么排在最后? 
因为前面所有的限制条件都处理完了,只剩下显示多少条记录的问题了!


LIMIT 语法格式: 

LIMIT offset,length;    或者      
limit length; 

offset 是指偏移量,可以认为是跳过的记录数量,默认为 0 
length 是指需要显示的总记录数

具体步骤:

• 查询学生表中数据,从第三条开始显示,显示 6
我们可以认为跳过前面 2 条,取 6 条数据
SELECT * FROM student LIMIT 2,6;

LIMIT 的使用场景:

分页 比如我们登录京东,淘宝,返回的商品信息可能有几万条,不是一次全部显示出来。是一页显示固定的条数。 

假设我们一每页显示 5 条记录的方式来分页,SQL 语句如下:
-- 每页显示 5 条
-- 第一页: LIMIT 0,5; 跳过 0 条,显示 5 条
-- 第二页: LIMIT 5,5; 跳过 5 条,显示 5 条
-- 第三页: LIMIT 10,5; 跳过 10 条,显示 5 条

SELECT * FROM student LIMIT 0,5;
SELECT * FROM student LIMIT 5,5;
SELECT * FROM student LIMIT 10,5;

注意:
• 如果第一个参数是 0 可以简写:
SELECT * FROM student LIMIT 0,5; 
SELECT * FROM studentLIMIT 5;

LIMIT 10,5; -- 不够 5 条,有多少显示多少

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值