分页和排序
排序: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条数据