Mysql分页和排序、子查询、聚集函数

分页和排序

排序:ORDER BY

  • 升序 :ASC
  • 降序 :DESC
-- 举例说明
SELECT `sno`,`sname`,`grade`
FROM student s
INNER JOIN `SC` g
ON s.sno = g.sno
WHERE g.grade>=60
ORDER BY grade ASC   -- 根据grade来升序排序

分页:limit

  • 当有100万条数据时

  • 缓解数据库压力,给人体验更好,(还有瀑布流)

-- 分页 每页只显示五条数据
SELECT `sno`,`sname`,`grade`
FROM student s
INNER JOIN `SC` g
ON s.sno = g.sno
WHERE g.grade>=60
ORDER BY grade ASC 
LIMIT 0,5   -- 一到五条数据 0是起始值

-- 第一页 limit 0,5    (1-1)*5
-- 第二页 limit 5,5    (2-1)*5
-- 第三页 limit 10,5   (3-1)*5
-- 第N页  limit 0,5    (n-1)*pageSize,n代表当前页
-- 其中pageSize代表页面大小,数据总数/页面大小 = 总页数

语法: limit (查询起始值,页面大小)

-- 查询JAVA第一学年的 课程成绩排名为前十的学生,并且分数大于80的学生信息(学号,姓名,课程名称,分数)

SELECT s.sno,sname,cno,grade
FROM student s
INNER JOIN SC g
ON s.sno = g.sno
INNER JOIN course c
ON c.cno = g.cno
WHERE cname = ‘JAVA第一学年‘ AND grade >= 80
ORDER BY grade DESC
LIMIT 0,10   -- 从第0个数据开始显示十条数据

4.6 子查询

where(这个值是计算出来的)

本质:在WHERE语句中再嵌套一个SELECT子查询

WHERE(SELECT ...FROM..WHERE...)

-- 1、查询数据库-1 的所有考试结果(学号,科目编号,成绩),降序查询
-- 方式一

SELECT `sno`,g.`cno`,`grade`
FROM sc g
INNER JOIN course c
ON sc.cno = course.cno
WHERE cname = ‘数据库-1‘
ORDER BY grade DESC

-- 方式二
SELECT `sno`,`cno`,`grade`
FROM sc
WHERE cno = (
    SELECT cno
    FROM course
    WHERE cname = ‘数据库-1‘
) -- 子查询内容 
ORDER BY grade DESC

-- 2、分数不小于80学生的学号,姓名,升序排序

SELECT sno,sname
FROM student
WHERE sno = (   -- 先写出查询的目的字段:学号,姓名
    SELECT sno
    FROM sc
    WHERE grade >= 80 -- 再在子查询体内写出筛选条件
)
ORDER BY sno ASC

-- 在此题的基础上再加一个条件 查询课程为 高等数学-2 
SELECT DISTINCT s.sno,sname
FROM student s
INNER JOIN sc g
ON s.sno = g.sno
WHERE  grade >= 80 AND cno = ( -- 根据双层信息来挑选合适的元组
    SELECT cno    -- 反馈上去的是高等数学-2的课程号
    FROM course 
    WHERE cname = ‘高等数学-2‘
)

-- 再改造----双层嵌套的查询----由里及外
SELECT sno,sname
FROM student 
WHERE sno IN (
    SELECT  sno FROM sc WHERE grade >= 80 AND cno = (
        SELECT cno FROM course WHERE cname = ‘高等数学-2‘
    )
)

-- 3、查询 C语言-1 前五名同学的成绩的信息(学号,姓名,分数)
SELECT s.sno,sname,grade
FROM student s
INNER JOIN sc g
ON s.sno = g.sno
WHERE g.cno IN (
    SELECT cno
    FROM course
    WHERE cname = ‘C语言-1‘
)
LIMIT 0,5  -- 只展示前五名同学的成绩的信息

WHERE子查询更快,不需要联表

5、Mysql函数

官网参考手册:https://dev.mysql.com/doc/refman/5.7/en/functions.html


5.1、常用函数

  • 数学运算
    • ABS() -------绝对值
    • CELLING() -------向上取整
    • FLOOR() -------向下取整
    • RAND() --------返回0~1之间的随机数
    • SIGN() --------返回参数的符号 (正负数)
  • 字符串函数
    • CHAR_LENGTH(‘字符串‘) -----------返回字符串长度
    • CONCAT(‘132‘,‘456‘,‘789‘) -----------拼接字符串
    • INSERT(‘我热爱编程HELLO WORLD‘,1,2,‘超级热爱‘) -------查询,从某个位置开始替换字符串
    • LOWER(‘ERRRRR‘) -----------转大写字母
    • UPPER(‘ ‘) -----------转小写字母
    • INSTR(‘kuangshen‘,‘h‘) -----------返回第一次出现的字符串的索引
    • REPLACE(‘狂神说坚持就可以成功‘,‘坚持‘,‘努力‘) ---------替换出现的指定字符串
  • 时间和日期函数
    • CURRENT_DATE() ----------获取当前日期
    • CURDATE() ----------获取当前日期
    • NOW() -----------获取当前的时间
    • SYSDATE() -----------系统时间
    • LOCALTIME() ----------获取本地时间
  • 系统
    • SYSTEM_USER() ----------当前用户
    • VERSION() -----------版本号

建议闲暇或需要使用的时候去官网查查用法,自己去测试

-- 测试1:替换函数
-- 查询所有姓周的同学,名字

SELECT REPLACE(sname,‘周‘,‘邹‘) 
FROM student
WHERE sname LIKE ‘周%‘;   -- 只要有姓周的同学,就去改他的姓

聚合函数

函数名称 描述
COUNT() 计算元组数目
SUM() 求和
AVG() 平均值
MAX() 最大值
MIN() 最小值
-- ==================聚合函数=======================
-- 以下三个都可以用作统计

SELECT COUNT(sno) FROM student   -- COUNT(指定列):会忽略列中所有的null值
-- 以下两种不会忽略
SELECT COUNT(*) FROM student     -- 所有元组的个数  本质:计算行数
SELECT COUNT(1) FROM student     -- 本质:计算行数

-- ===============================================
-- 1、
SELECT  SUM(grade) AS 总和
FROM sc

-- 查询不同课程的平均分,最高分,最低分
SELECT cname,AVG(grade),MAX(grade),MIN(grade)
FROM sc g
INNER JOIN `course` c
ON g.cno = c.cno
GROUP BY g.cno      -- 通过不同的课程cno来分组,根据组来选择出成绩

-- 查询不同课程的平均分,最高分,最低分,并且要求平均分大于80的课目
SELECT cname,AVG(grade),MAX(grade),MIN(grade)
FROM sc g
INNER JOIN `course` c
ON g.cno = c.cno
GROUP BY g.cno      -- 通过不同的课程cno来分组,根据组来选择出成绩
HAVING AVG(grade) >= 80

注意:自己一点要了解SELECT查询语句的总结构

SELECT语法:
SELECT [ALL|DISTINCT]
{* | table.* | [table.field1[as alias1]][......]}
FROM  table_name[as table_alias]
    [lift | right | inner JOIN table_name2]  -- 联表查询
    [WHERE ... ]   -- 指定结果须满足的条件
    [GROUP BY ... ] -- 指定结果必须按照那几个字段分组
    [HAVING ... ]  -- 过滤分组的记录必须满足的次要条件
    [ORDER BY ... ]  -- 指定查询记录按一个或多个字段的值来排序
    [limit A,B]  -- 分页显示,从第A条数据开始显示,共显示B条数据

Mysql分页和排序、子查询、聚集函数

上一篇:mysql 语法


下一篇:ubuntu21.04(linux):用apt安装nginx/php/mysql/phpmyadmin(开发环境)