排序
通过 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 条,有多少显示多少