《空间数据库原理与方法》笔记/期末复习资料(2. 单表查询)

单表查询:

1.选择表中的若干列:

(1)查询指定列:

例题:查询全体学生的学号和姓名。

SELECT Sno,Sname
FROM Student;

例题:查询全体学生的姓名、学号、所在系。

SELECT Sname,Sno,Sdept
FROM Student;

(2)查询全部列:

例题:查询全体学生的详细记录。

SELECT *
FROM Student;

上述代码等价于下列代码:

SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;

(3)查询经过计算的值:

例题:查询全体学生的姓名及其出生年份。

SELECT Sname,2014-Sage /*假设当时的年份是2014年*/
FROM Student;

例题:查询全体学生的姓名、出生年份和所在院系,要求用小写字母表示系名。

SELECT Sname,'Year of Birth:',2014-Sage,LOWER(Sdept)
/*LOWER(Sdept) 的作用是把 Sdept 转换为小写字母的形式*/
FROM Student;

用户可以通过制定别名来改变查询结果的列标题,这对于含算术表达式、常量、函数名的目标列表达式尤为有用。例如本例可以定义如下的列别名。

SELECT Sname NAME,'Year of Birth:' BIRTH,2014-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT
/*LOWER(Sdept) 的作用是把 Sdept 转换为小写字母的形式*/
FROM Student;

2.选择表中的若干元组:

(1)消除取值重复的行:

例题:查询选修了课程的学生学号。

SELECT DISTINCT Sno
FROM SC;

(2)查询满足条件的元组:

①比较大小:

查询满足指定条件的元组可以通过 WHERE 子句实现,WHERE 子句常用的查询条件如下。

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

②确定范围:

例题:查询年龄在 20-23 岁(包括 20 岁和 23 岁)之间的学生的姓名、系别和年龄。

SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 30;

例题:查询年龄不在 20-23 岁之间的学生的姓名、系别和年龄。

SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 30;

③确定集合:

 例题:查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。

SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('CS','MA','IS');

IN 相对的谓词是 NOT IN ,用于查找属性值不属于指定集合的元组。

例题:查询既不是计算机科学系、数学系,也不是信息系的学生的姓名和性别。

SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN('CS','MA','IS');

④字符匹配:

谓词 LIKE 可以用来进行字符串的匹配,其一般语法格式如下:

[NOT] LIKE '<匹配串>' [ESCAPE '<换码字符>']

其含义是查找指定的属性列值与 <匹配串> 相匹配的元组,<匹配串> 可以是一个完整的字符串,也可以含有通配符 % 和 _ 。其中:

%(百分号)代表任意长度(长度可以为0)的字符串。例如 a%b 表示以 a 开头,以 b 结尾的任意长度的字符串,如 acb、ab、addcb 等都满足该匹配串。

_(下横线)代表任意单个字符。例如 a_b 表示以 a 开头,以 b 结尾的长度为 3 的任意字符串,如 acb、afb 等都满足该匹配串。

例题:查询学号为 201215121 的学生的详细情况。

SELECT*
FROM Student
WHERE Sno LIKE '201215121';

等价于:

SELECT*
FROM Student
WHERE Sno = '201215121';

如果 LIKE 后面的匹配串中不含通配符,则可以用 =(等于)运算符取代 LIKE 谓词,用 <> 或 !=(不等于)运算符取代 NOT LIKE 谓词。

例题:查询所有姓刘的学生的姓名、学号和性别。

SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE '刘%';

例题:查询姓“欧阳”且全名为三个汉字的学生的姓名。

SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳_';

例题:查询名字中的第二个字为“阳”的学生的姓名和学号。

SELECT Sname,Sno
FROM Student
WHERE Sname LIKE '_阳%';

例题: 查询所有不姓刘的学生的姓名、学号和性别。

SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE '刘%';

如果用户查询的字符串本身就含有通配符 % 或 _ ,这时就要使用 ESCAPE '<换码字符>' 短语对通配符进行转义了。

例题:查询 DB_Design 课程的课程号和学分。

SELECT Cno,Credit
FROM Course
WHERE Cname LIKE 'DB\_Design' ESCAPE '\';

ESCAPE '\' 表示 “\” 为换码字符。这样匹配串中紧跟在 “\” 后面的字符 “_” 不再具有通配符的含义,转义为普通的 “_”字符。

例题:查询以“DB_”开头,且倒数第三个字符为 i 的课程的详细情况。

SELECT*
FROM Course
WHERE Cname LIKE 'DB\_%i_ _' ESCAPE '\';

这里的匹配串为 “DB\_%i_ _” ,第一个 _ 前面有换码字符 \ ,所以它被转义为普通的 _ 字符,而 i 后面的两个 _ 的前面均没有换码字符 \ ,所以它们仍然作为通配符。

⑤涉及空值的查询:

例题:某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩,查询缺少成绩的学生的学号和相应的课程号。

SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;  /*分数 Grade 是空值*/

注意这里的 “IS” 不能用等号 “=” 代替。

例题:查询所有有成绩的学生学号和课程号。

SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;

⑥多重条件查询:

逻辑运算符 AND 和 OR 可以用来连接多个查询条件,AND 的优先级高于 OR,但是用户可以用括号改变优先级。

例题:查询计算机科学系年龄在 20 岁以下的学生姓名。

SELECT Sname
FROM Student
WHERE Sdept='CS' AND Sage<20;

3.ORDER BY 子句:

用户可以用 ORDER BY 子句对查询结果按照一个或多个属性列的升序(ASC)降序(DESC)排列,默认值为升序。

例题:查询选修了 3 号课程的学生学号和成绩,并且查询结果按成绩降序排列。

SELECT Sno,Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC;

例题:查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。

SELECT*
FROM Student
ORDER BY Sdept ASC,Sage DESC;

4.聚集函数:

SQL 聚集函数
函数功能
COUNT(*)统计元组个数
COUNT ( [DISTINCT|ALL] <列名> )统计一列中值的个数
SUM ( [DISTINCT|ALL] <列名> )计算一列值的总和(此列必须是数值型)
AVG ( [DISTINCT|ALL] <列名> )计算一列值的平均值(此列必须是数值型)
MAX ( [DISTINCT|ALL] <列名> )求一列值中的最大值
MIN ( [DISTINCT|ALL] <列名> )求一列值中的最小值

如果指定 DISTINCT 短语,则表示在计算时要取消指定列中的重复值。如果不指定 DISTINCT 短语或指定 ALL 短语(ALL 为默认值),则表示不取消重复值。

例题:查询学生总人数。

SELECT COUNT(*)
FROM Student;

例题:查询选了课程的学生的人数。

SELECT COUNT(DISTINCT Sno)
FROM SC;

例题:计算选修 1 号课程的学生平均成绩。

SELECT AVG(Grade)
FROM SC
WHERE Cno='1';

例题:查询选修 1 号课程的学生最高分数。

SELECT MAX(Grade)
FROM SC
WHERE Cno='1';

例题:查询学生 201215012 选修课程的总学分数。

SELECT SUM(Credit)
FROM SC,Course
WHERE Sno='201215012' AND SC.Cno=Course.Cno;

注意: WHERE 子句不能用聚集函数作为条件表达式,聚集函数只能用于 SELECT 子句和 GROUP BY 中的 HAVING 子句。

5.GROUP BY 子句:

GROUP BY 子句将查询结果按某一列或多列的值分组,值相等的为一组。

例题:求各个课程号及相应的选课人数。

SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;

如果分组后还要求按一定的条件对这些分组进行筛选,最终只输出满足指定条件的组,则可以使用 HAVING 短语指定筛选条件。

例题:查询选修了三门以上课程的学生学号。

SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>3;

WHERE 子句和 HAVING 短语的区别在于作用对象不同。WHERE 子句作用于基本表或视图,从中选择满足条件的元组。HAVING 短语作用于组,从中选择满足条件的组。

例题:查询平均成绩大于等于 90 分的学生学号和平均成绩。

下面的语句是不对的

SELECT Sno,AVG(Grade)
FROM SC
WHERE AVG(Grade)>=90
GROUP BY Sno;

因为 WHERE 子句是不能作用于聚集函数作为条件表达式的,正确的查询语句应该是:

SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90;
  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值