DQL:查询表中的记录
案例数据库:学生,课程,选课(选自数据库系统概论第五版)
学生

课程

选课

语法
select字段列表from表名列表where条件列表group by分组字段having分组之后的条件order by排序limit分页限定
基础查询
多个字段的查询
select 字段名1,字段名2... from 表名;
去除重复:
select distinct 字段名1,字段名2... from 表名;
计算列
一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
表达式1:哪个字段需要判断是否为null
如果该字段为null后的替换值。
起别名:
as:as也可以省略例:
# 查询全体学生的学号与姓名。SELECT Sno, SnameFROM Student;# 查询共有多少专业SELECT distinct SdeptFROM Student;# 给查询的列起别名SELECT Sname 姓名FROM Student;
条件查询
where子句后跟条件
运算符
| 查询条件 | 谓词 |
|---|---|
| 比较 | = , > , < , >= , <= , != , <>(不等于) , !> ,!< |
| 确定范围 | between…and |
| 确定集合 | in |
| 字符匹配 | like(占位符:_单个字符,%多个字符) |
| 空值 | is null |
| 多重条件(逻辑运算) | and&& , or|| , not! |
例:
# 查询所有年龄在20岁以下的学生姓名及其年龄。SELECT Sname, SageFROM StudentWHERE Sage < 20;# 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、SELECT Sname, Sdept, SageFROM StudentWHERE Sage BETWEEN 20 AND 23;# 查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。SELECT Sname, SsexFROM StudentWHERE Sdept IN ('CS', 'MA', 'IS');# 查询名字中第二个字为"阳"的学生的姓名和学号。SELECT Sname, SnoFROM StudentWHERE Sname LIKE '阳%';# 查询缺少成绩的学生的学号和相应的课程号。SELECT Sno, CnoFROM SCWHERE Grade IS NULL;
排序查询
语法:order by 子句
order by 排序字段1 排序方式1 , 排序字段2 排序方式2...
排序方式:
ASC:升序,默认的。
DESC:降序。
例:
# 选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列SELECT Sno, GradeFROM SCWHERE Cno = '3'ORDER BY Grade DESC;# 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。SELECT*FROM StudentORDER BY Sdept, Sage DESC;
聚合函数
将一列数据作为一个整体,进行纵向的计算。
count:计算个数
一般选择非空的列:主键
count(*)
max:计算最大值
min:计算最小值
sum:计算和
avg:计算平均值
注意:聚合函数的计算,排除null值。
解决方案:
选择不包含非空的列进行计算
IFNULL函数
例:
# 查询学生总人数。SELECT COUNT(*)FROM student;# 查询选修了课程的学生人数。SELECT COUNT(DISTINCT Sno)FROM SC;# 计算选修1号课程的学生平均成绩,SELECT AVG(Grade)FROM SCWHERE Cno = '1';# 查询选修1号课程的学生最高分数。SELECT MAX(Grade)FROM SCWHERE Cno = '1';# 查询学生201215121选修课程的总学分数。SELECT SUM(Ccredit)FROM SC,CourseWHERE Sno = '201215121'AND SC.Cno = Course.Cno;
分组查询
语法:group by 分组字段;
注意:
分组之后查询的字段:分组字段、聚合函数
where 和 having 的区别?
where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
where 后不可以跟聚合函数,having可以进行聚合函数的判断。
例:
# 求各个课程号及相应的选课人数SELECT Cno, COUNT(Sno)FROM SCGROUP BY Cno;# 询选修了2门以上课程的学生学号。SELECT SnoFROM SCGROUP BY SnoHAVING COUNT(*) > 2;# 查询平均成绩大于等于80分的学生学号和平均成绩SELECT Sno, AVG(Grade)FROM SCGROUP BY SnoHAVING AVG(Grade) >= 80;
分页查询
语法:limit 开始的索引,每页查询的条数;
公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
-- 每页显示3条记录
例:
# 从0开始查,查询3条记录SELECT * FROM student LIMIT 0,3; -- 第1页SELECT * FROM student LIMIT 3,3; -- 第2页SELECT * FROM student LIMIT 6,3; -- 第3页
limit 是一个MySQL"方言"
文章转载自Hello 帅帅,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




