数据库原理-数据查询 单表查询【一】
语句格式
SELECT [ALL|DISTINCT]<目标列表表达式>[,<目标列表表达式>]...
FROM<表名或视图名>[,<表名或视图名>]...|(SELECT语句)
[AS]<别名>
[WHERE<条件表达式>]
[GROUP BY<列名1>[HAVING<条件表达式>]]
[ORDER BY<列名2>[ASC|DESC]];
- SELECT子句:指定要显示的属性列
- FROM子句:指定查询对象(基本表或视图)
- WHERE子句:指定查询条件
- GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一组。通常会在每组中作用聚集函数
- HAVING短语:只有满足指定条件的组才予以输出
- ORDER BY子句:对查询结果表按指定列值的升序或降序排序
查询全体学生的学号与姓名
SELECT Sno,Sname
FROM Student;
查询全部列
选出所有属性列:
- 在SELECT关键字后面列出所有列名
- 将<目标列表达式>指定为*
查询全体学生的详细记录
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
或
SELECT *
FROM Student;
"虚"列
SELECT子句的<目标列表达式>不仅可以为表中的属性列,也可以是表达式
查询全体学生的姓名及其出生年份
SELECT Sname,2022-Sage
FROM Student;
查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示系名
SELECT Sname,'Year of Birth:',2020-Sage,LOWER(Sdept)
FROM Student;
使用列别名改变查询结果的列标题:
SELECT Sname NAME,'Year of Birth:' BIRTH,2020-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT
FROM Student;
消除取值重复的行
如果没有指定DISTINCT关键词,则缺省为ALL
查询选修了课程的学生学号
SELECT 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 |
查询计算机科学系全体学生的名单
SELECT Sname
FROM Student
WHERE Sdept='CS';
查询所有年龄在20岁以下的学生姓名及其年龄
SELECT Sname,Sage
FROM Student
WHERE Sage<20;
查询考试成绩有不及格的学生的学号
SELECT DISTINCT Sno
FROM SC
WHERE Grade<60;
确定范围
谓词:BETWEEM … AND …
NOT BETWEEN … AND …
查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sgae BETWEEN 20 AND 23;
查询年龄不在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sgae NOT BETWEEN 20 AND 23;
确定集合
谓词:IN ,NOT IN
查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ('CS','MA','IS');
查询不是计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别
SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN ('CS','MA','IS');
字符匹配
谓词:[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘<换码字符>’]
<匹配串>可以是一个完整的字符串,也可以含有通配符%和_
- %(百分号)代表任意长度(长度可以为0)的字符串
例如a%b表示以a开头,以b结尾的任意长度的字符串 - _ (下划线) 代表任意单个字符
例如a_b表示以a开头,以b结尾的长度为3的任意字符串
匹配串为固定字符串
查询学号为201215121的学生的详细情况
SELECT *
FROM Student
WHERE Sno LIKE '201215121';
等价于:
SELECT *
FROM Student
WHERE Sno = '201215121';
匹配串为含通配符的字符串
查询所有姓刘学生的姓名、学号和性别
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE '刘%'
查询姓“欧阳”且全名为三个汉字的学生的姓名
SELECT Sname
FROM Student
WHERE Sname LIKE "欧阳_";
查询名字中第2个字为"阳"字的学生的姓名和学号
SELECT Sname,Son
FROM Student
WHERE Sname LIKE '_阳%';
查询所有不姓刘的学生姓名、学号和性别
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE '刘%';
使用换码字符将通配符转义为普通字符
查询DB_Design课程的课程号和学分
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design' ESCAPE'\';
查询以"DB_"开头,且倒数第3个字符为i的课程的详细情况
SELECT *
FROM Course
WHERE Cname LIKE 'DB\_%i__' ESCAPE'\'
涉及空值的查询
谓词:IS NULL 或 IS NOT NULL
某些学生选课程后没有参加考试,所有有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL
多重条件查询
逻辑运算符: AND 和 OR来连接多个查询条件
- AND的优先级高于OR
- 可以用括号改变优先级
查询计算机系年龄在20岁以下的学生姓名
SELECT Sname
FROM Student
WHERE Sdept='CS' AND Sage<20;
查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ('CS','MA','IS')
可改写为:
SELECT Sname,Ssex
FROM Student
WHERE Sdept='CS' OR Sdept='MA' OR Sdept='IS';
ORDER BY子句
- 可以按一个或多个属性列排序
- 升序:ASC;降序:DESC;缺省值为升序
对于空值,排序时显示的次序由具体系统实现来决定
查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列
SELECT Sno,Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC;
查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列
SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;