2022-1-3数据库概念与原理期末复习提纲(二)

使用查询语句的查询
[例5] 查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。

SELECT Sname,'Year of Birth: '2000-Sage,
                 ISLOWER(Sdept)
FROM Student; 

在这里插入图片描述
[例5.1] 使用列别名改变查询结果的列标题

SELECT Sname as name,'Year of Birth: ' as BirthYear,2000-Sage,ISLOWER(Sdept) as DEPT
FROM Student; 
#记住考试的时候不要加as

在这里插入图片描述
二、选择表中的若干元组
消除取值重复的行 —— 使用 distinct
在这里插入图片描述
[例6] 查询选修了课程的学生学号。

select distinct Sname
from SC;

在这里插入图片描述
有点不理解,对于所有的列都影响?
在这里插入图片描述
[例8] 查询所有年龄在20岁以下的学生姓名及其年龄。

select Sname,Sage
from Student
where Sage < 20;
#另外一种写法
where Not Sage >= 20;

在这里插入图片描述
[例10] 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。

select Sname ,Sdept,Sage
from Student
where Sage between 20 and 23;

[例11] 查询年龄不在20~23岁之间的学生姓名、系别和年龄.

select Sname ,Sdept,Sage
from Student
where Sage not between 20 and 23;

在这里插入图片描述

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

select Sname,Ssex
from Student
where Sdept in ('IS','MA','CS');

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

select Sname,Sage
from Student
where Sdept not in ('IS','MA','CS');

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 匹配模板为固定字符串
    [例14] 查询学号为95001的学生的详细情况。
SELECT *
FROM Student
where Sno = '95001';
# 或者写成
SELECT *
FROM Student
where Sno like '95001';
  1. 匹配模板为含通配符的字符串

[例15] 查询所有姓刘学生的姓名、学号和性别。

select Sname,Sno,Ssex
from Student
where Sname like '刘%';

[例16] 查询姓"欧阳"且全名为三个汉字的学生的姓名。

selcet Sname
from Student
where Sname like '欧阳_';

[例17] 查询名字中第2个字为"阳"字的学生的姓名和学号。

Select Sname,Sno
from Student
where Sname like '_阳%';

匹配模板为含通配符的字符串(续)

[例18] 查询所有不姓刘的学生姓名。

select Sname
from Student
where Sname not like '刘%';
  1. 使用换码字符将通配符转义为普通字符

[例19] 查询DB_Design课程的课程号和学分。

select Cno,Ccredit
from Course 
where Cname like 'DB\_Design' escape '\';

使用换码字符将通配符转义为普通字符(续)

[例20] 查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。

select *
from Course
where Cname like 'DB\_%i__' escape '\';

在这里插入图片描述
[例21] 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。

select Sname,Cno
from Student
where grade is null;
#要看具体的表格名
SELECT Sno,Cno
      FROM SC
      WHERE Grade IS NULL

[例22] 查所有有成绩的学生学号和课程号。
(这个时候就要考虑到有的成绩可能是空的啦)

Select Sno,Cno
from SC
where Grade is not null;

在这里插入图片描述
[例23] 查询计算机系年龄在20岁以下的学生姓名。

Select Sname
from Student
#where Sage < 20 and Sdept = '计算机';
where Sage < 20 and Sdept = 'CS';

原来上面的题目改写
[例12] 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。

select Sname,Sage
from Student
where Sdept in ('IS','MA','CS');
#也可以改成
where Sdept = 'IS' or Sdept = 'MA' or Sdept = 'CS';

[例10] 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。

select Sname,Sdept,Sage
from Student
where Sage between 20 and 23;
#改写成
where Sage >= 20 and Sage <= 23;

在这里插入图片描述
[例24] 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。

Select Sno ,Grade
from SC
where Cno = 3
#order by Grade dec;
order by Grade desc;

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

select *
From SC
order by Sdept asc,Sage desc;

在这里插入图片描述在这里插入图片描述

[例26] 查询学生总人数。

select count(*)
from Student;

[例27] 查询选修了课程的学生人数。

#select count(*)
select count(distinct Sno)
from SC;

[例28] 计算1号课程的学生平均成绩。

select AVG(Grade)
from SC
where Cno = 1;

[例29] 查询选修1号课程的学生最高分数。

select MAX(Grade)
from SC
where Cno = 1;

[例30] 求各个课程号及相应的选课人数。

select Cno,COUNT(Cno)
from SC
group by Cno;

[例31] 查询选修了3门以上课程的学生学号。

select Sno
from SC
#group by Cno
#having COUNT(Cno) > 3;
#后面的不对,如果是按照课程计数的话,计算的就不是学生选择多少门课,而是某门课程有多少人
#学生选了几节课,他的学号就会出现几次
group by Sno
having count(*);
#按照学号分组,数一数每个学号出现的次数是多少

[例32] 查询有3门以上课程是90分以上的
学生的学号及(90分以上的)课程数

select Sno,count(Cno)
from SC
#where Grade > 90
#group by Sno
#having count(*);
where Grade >= 90
group by Sno
having count(*) >= 3;

[例32] 查询每个学生及其选修课程的情况

select Student.*,SC.*
from Student,SC
where Student.Sno = SC.Sno;
#最后一定要加上等值连接的条件,不然很容易写成笛卡尔连接,但是哪个是没有意义的。
#由于上面的这种方法选择了全部的列,所以会出问题

[例33] 对[例32]用自然连接完成。

 SELECT  Student.Sno,Sname,Ssex,Sage,          	        Sdept,Cno,Grade
 FROM     Student,SC
 WHERE  Student.Sno = SC.Sno;

在这里插入图片描述
[例34] 查询每一门课的间接先修课(即先修课的先修课)
(自联结需要取别名)

select a.Cno ,b.Cpno
from Course a,Course b
where a.Cpno = b.Cno;

在这里插入图片描述
[例 33] 查询每个学生及其选修课程的情况包括没有选修课程的学生----用外连接操作

select Student.*,SC.*
from Student,SC
where Student.Sno = SC.Sno;
//但是这样没有选课的同学咋办?

在这里插入图片描述
在这里插入图片描述

WHERE子句中含多个连接条件时,称为复合条件连接

[例35]查询选修2号课程且成绩在90分以上的所有学生的
学号、姓名

#select Sno,Sname
#from Student
#where Cno = 2 and Crade >= 90;
#我完全错了,这本来是两个表复合查询
select Student.Sno,Student.Sname
from Student,SC
where Student.Sno = SC.Sno and Cno = 2 and Crade >= 90;

[例36] 查询每个学生的学号、姓名、选修的课程名及成绩。

select Student.Sno,Student.Sname,Cname,Grade
from Student,SC,Course
where Student.Sno = SC.Sno and SC.Cno = Course.Cno;

在这里插入图片描述
在这里插入图片描述
简单的理解为,先挑选出一张子表,然后再从子表中挑出自己想要的数据。

一般嵌套查询用于多表查询。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
[例37] 查询与“刘晨”在同一个系学习的学生。
此查询要求可以分步来完成

#采用嵌套查询
select *
from Student
where Sdept 
in (select Sdept from Student where Sname = '刘晨');
#采用自联结查询
select a.Sname,a.Sno,a.Sdept
from Student a,Student b
where b.Sname = '刘晨' and a.Sdept = b.Sdept;

在这里插入图片描述
[例38]查询选修了课程名为“信息系统”的学生学号和姓名

#使用嵌套查询
select Sno,Sname
from Student
where Sno in
(select Sno
from SC
where Cno in
(select Cno 
from Course
where Cname = '信息系统'));
#使用连接查询
select Sno,Sname
from Student,SC,Course
where Student.Sno = SC.Sno and SC.Cno = Course.Cno
and Course.Cname = '信息系统';

在这里插入图片描述
例:假设一个学生只可能在一个系学习,并且必须属于一个系,则在[例37]可以用 = 代替IN :

select *
from Student
where Sdept 
= select Sdept from Student where Sname = '刘晨';

在这里插入图片描述
在这里插入图片描述
[例39] 查询其他系中比信息系任意一个(其中某一个)学生年龄小的学生姓名和年龄

select Sname,Sage
from Student
where Sage < all(select Sage from Student where Sdept = 'IS';

我做错的原因:其中某一个应该使用 any
<>和!= 都有不等于的意思
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

[例39’]:用集函数实现[例39]

select Sname,Sage
from Student 
where Sage < ( select MAX(Sage) from Student where Sdept = 'IS') and Sdept <> 'IS';

[例40] 查询其他系中比信息系所有学生年龄都小的学生姓名及年龄。

#使用谓词
select Sname,Sage
from Student 
where Sage < ANY(select Sage from Student where Sdept = 'IS') and Sdept <> 'IS';
#使用集函数
select Sname,Sage
from Student 
where Sage < (select MAX(Sage) from Student where Sdept = 'IS') and Sdept <> 'IS';

在这里插入图片描述
在这里插入图片描述
[例41] 查询所有选修了1号课程的学生姓名。
用嵌套查询

Select Sname
from Student
where Sno in 
(Select Sno
from SC
where Cno = 1);

原来子查询可以使用父亲查询里面的表格名。
在这里插入图片描述
[例42] 查询没有选修1号课程的学生姓名。

select Sname
from Student
where not EXists
(select *
from SC
where Sno = Student.Sno and Cno = 1);

在这里插入图片描述
例:[例37]查询与“刘晨”在同一个系学习的学生。可以用带EXISTS谓词的子查询替换:

select *
from Student
where exists
(select *
from Student
where Sname = '刘晨';

还是需要像起自连接一样给不同的表格起别名。
在这里插入图片描述
在这里插入图片描述
[例43] 查询选修了全部课程的学生姓名。
在这里插入图片描述
首先把所有的课程挑出来,否定一次,然后再否定一次。
在这里插入图片描述
这下面的不太会,脑子不够用了

在这里插入图片描述
在这里插入图片描述
[例45] 查询计算机科学系的学生及年龄不大于19岁的学生。

#使用集合查询
select *
from Student
where Sage <= 19
union
Select *
from Student
where Sdept = 'CS';
#普通查询
 SELECT  DISTINCT  *
  #SELECT *
        FROM Student
        WHERE Sdept= 'CS'  OR  Sage<=19

[例46] 查询选修了课程1或者选修了课程2的学生。

#使用联合查询
select Sno
from SC
where Cno = '1'
union
select Sno
from SC
where Cno = '2';
#普通查询
#select Sno
 SELECT  DISTINCT  Sno
from SC
where Cno = '2' or Cno = '1';

[例47] 设数据库中有一教师表Teacher(Tno, Tname,…)。查询学校中所有师生的姓名。

select Sname
from Student
union
select Tname
from Teacher;

在这里插入图片描述
这里的其他方式指的是同义转换
[例48] 查询计算机科学系的学生与年龄不大于19岁的学生的交集

本例实际上就是查询计算机科学系中年龄不大于19岁的学生

select *
from Student
where Sdept = 'CS' AND Sage <= 19;

[例49] 查询选修课程1的学生集合与选修课程2的学生集合的交集
本例实际上是查询既选修了课程1又选修了课程2的学生

select Sno
from SC
where Cno = '1' and Cno = '2';
这个条件肯定不对
所以需要查两次,第一次找到所有选择了选修课程2的学生的学号,再从里面挑选选修了选修课一的学生的学号。
##########################################z
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值