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

Posted TY__F

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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分页和排序子查询聚集函数的主要内容,如果未能解决你的问题,请参考以下文章

带有分页和排序的 Spring Boot JPA 规范 API

Spring Data Cassandra 中的分页和排序查询

Mysql从入门到入魔——5. 聚集分组子查询

Oracle分页查询中排序与效率问题

解决Oracle分页查询中排序与效率问题

分页和排序