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

145 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详情

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

语句格式

	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;

image-20220430210452869

使用列别名改变查询结果的列标题:

	SELECT Sname NAME,'Year of Birth:' BIRTH,2020-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT
	FROM Student;

image-20220430210411384

消除取值重复的行

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

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

	SELECT Sno FROM SC;

image-20220430210715758

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

	SELECT DISTINCT Sno
	FROM SC;

image-20220430210831178

常用查询条件

查询条件谓词
比较=,>,<,>=,<=,!=,<>,!>,!<;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;