数据库原理-数据查询 单表查询【一】

语句格式

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;

数据库原理-数据查询 单表查询【一】_计算机科学_02

消除取值重复的行

如果没有指定DISTINCT关键词,则缺省为ALL

查询选修了课程的学生学号

SELECT Sno FROM SC;

数据库原理-数据查询 单表查询【一】_字符串_03

指定DISTINCT关键词,去掉表中重复的行

SELECT DISTINCT Sno
FROM SC;

数据库原理-数据查询 单表查询【一】_sql_04

常用查询条件

查询条件

谓词

比较

=,>,<,>=,<=,!=,<>,!>,!<;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;