SQL单表查询
基本语法
SELECT [ALL|DISTINCT] < 目标列表达式 > [ , < 目标列表达式 >] …
FROM < 表名或视图名 >[ , < 表名或视图名 > ] …
[ WHERE < 条件表达式 > ]
[ GROUP BY < 列名 1> [ HAVING < 条件表达式 > ] ]
[ ORDER BY < 列名 2> [ ASC|DESC ] ];
选择表中若干列
查询指定列
查询全体学生的学号和姓名
SELECT Sno, Sname
FROM student;
查询全部列
查询全体学生详细记录
SELECT *
FROM student;
查询经过计算的值
查询所有学生的出生年份
SELECT Sname, 2022-Sage /*当前年份为2022*/
FROM student;
查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名
SELECT Sname, 'Year of Birth:', 2022-Sage, LOWER(Sdept)
FROM student;
使用别名改变查询结果的列标题
SELECT Sname NAME, 'Year of Birth:', 2022-Sage BirthYear, LOWER(Sdept) DEPARTMENT
FROM student;
选择表中若干元组
消除取值重复的行
如果没有指定DISTINCT
关键字,则缺省为ALL
查询选修了课程的学生的学号
SELECT Sno FROM sc;
/*等价于*/
SELECT ALL Sno FROM sc;
指定DISTINCT
关键字,去掉查询结果中重复的行
SELECT DISTINCT Sno FROM sc;
查询满足条件的元组
常用查询条件
查询条件 | 谓词 |
---|---|
比较 | =, >, <, >=, <=, !=, <>, !>, !<, NOT+比较运算符 |
确定范围 | BETWEEN AND, NOT BETWEEN AND |
确定集合 | IN, NOT IN |
字符匹配 | LIKE, NOT LIKE |
空值 | IS NULL, IS NOT NULL |
逻辑运算 | AND, OR, NOT |
查询年龄20岁一下学生的姓名和年龄
SELECT Sname, Sage
FROM `student`
WHERE Sage < 20;
查询所有成绩>=90学生的学号
SELECT Sno
FROM sc
WHERE Grade >= 90;
查询年龄在 20~23 岁(包括 20 岁和 23 岁)之间的学生的姓名、系别和年龄
SELECT Sname, Sdept, Sage
FROM student
WHERE Sage BETWEEN 20 AND 23;
查询信息系( IS )和数学系( MA )学生的姓名和性别
SELECT Sname, Ssex
FROM student
WHERE Sdept IN ('IS', 'MA');
查询所有姓张学生的姓名、学号和性别
SELECT Sname, Sno, Ssex
FROM student
WHERE Sname LIKE '张%';
查询所有不姓张的学生姓名
SELECT Sname, Sno, Ssex
FROM student
WHERE Sname NOT LIKE '张%';
某些学生选修课程后没有参加考试,所以有选课记录,但没 有考试成绩。查询缺少成绩的学生的学号和相应的课程号
注意'IS'不能用'='替换
SELECT Sno
FROM sc
WHERE Grade IS NULL;
查询计算机系年龄在 20 岁以下的学生姓名
SELECT Sname
FROM student
WHERE Sdept='CS' AND Sage <= 20;
ORDER BY子句
升序:ASC,降序:DESC,缺省值为升序
ASC:排列为空值的元素最后显示
DESC:排列为空值的元素最先显示
查询选修了 3 号课程的学生的学号及其成绩,查询结果 按分数降序排列
SELECT Sno, Grade
FROM sc
WHERE Cno='3'
ORDER BY Grade DESC;
查询全体学生情况,查询结果按所在系的系名字典序升序排列,同一系中的学生按年龄降序排列
SELECT *
FROM student
ORDER BY Sdept, Sage DESC;
聚集函数
COUNT, SUM, AVG, MAX, MIN
遇到空值跳过,只处理非空值
- DISTINCT
取消指定列中重复值 - ALL
不取消重复值,缺省为ALL
查询学生总人数。
SELECT COUNT(*)
FROM student;
查询选修了课程的学生人数
SELECT COUNT(DISTINCT Sno)
FROM sc;
计算 1 号课程的学生平均成绩
SELECT AVG(Grade)
FROM sc
WHERE Cno='1';
查询选修 3 号课程的学生最高分数
SELECT MAX(Grade)
FROM sc
WHERE Cno='3';
查询学生 200215121 选修课程的总学分数
SELECT SUM(Ccredit)
FROM sc, course
WHERE Sno='200215121' AND sc.`Cno`=course.`Cno`;
GROUP BY子句
细化聚集函数的作用对象
求各个课程号及相应的选课人数
SELECT Cno, COUNT(Sno)
FROM sc
GROUP BY Cno;
查询选修了 3 门以上课程的学生学号
SELECT Sno, COUNT(*)
FROM sc
GROUP BY Sno
HAVING COUNT(*)>=3;
WHERE与HAVING语句的区别:
- WHERE作用于基本表或视图,从中选择满足条件的元组
- HAVING作用于组,从中选择满足条件的组