根据以上内容,刘晨选修了2,3课,李勇选修了1,2,3课,如果改为Sname = '李勇',为什么查询为空
时间: 2023-09-02 15:14:53 浏览: 77
如果将查询条件改为 Sname = '李勇',则子查询中的条件判断会变为:
```
SC.Sno = s.Sno AND s.Sname = '李勇'
```
这个条件判断会筛选出选了课程的学生中名字为“李勇”的学生。由于“李勇”选修了所有的课程,因此子查询返回的是一个空集合,即不包含任何课程号。这样,最终的查询中会排除掉所有选课信息,返回一个空集合。
因此,如果将查询条件改为 Sname = '李勇',则查询结果会为空。
相关问题
create table student( sno varchar(20), sname varchar(20), ssex varchar(4), sday date, sdept varchar(20)); insert into student(sno,sname,ssex,sday,sdept) values("202115121","李勇","男",'1992-01-12',"信息学院"), ("202115123","刘晨","女",'1993-06-04',"信息学院"), ("202115124","王敏","女",'1991-02-04',"理学院"), ("202115125","张立","男",'1995-06-08',"工学院" create table sc( sno varchar(20), cno int, score double); insert into sc(sno,cno,score) values("202115121",1,92), ("202115121",2,85), ("202115122",3,88), ("202115122",2,90), ("202115123",3,80); create table course( cno int, cname varchar(20)); insert into course(cno,cname) values(1,"数据库"), (2,"高等数学"), (3,"信息系统"), (4,"操作系统"); 查询同时选修了课程号为1和2的学生的学号和姓名
可以使用 `INNER JOIN` 和 `WHERE` 子句来查询同时选修了课程号为1和2的学生的学号和姓名,具体的 SQL 语句如下:
```
SELECT s.sno, s.sname
FROM student s
INNER JOIN sc s1 ON s.sno = s1.sno
INNER JOIN sc s2 ON s.sno = s2.sno
WHERE s1.cno = 1 AND s2.cno = 2;
```
解释一下这个 SQL 语句的每一部分:
- `SELECT s.sno, s.sname`:查询结果中只包含学号和姓名两个字段;
- `FROM student s`:从 `student` 表中查询学生信息;
- `INNER JOIN sc s1 ON s.sno = s1.sno`:将 `student` 表和 `sc` 表连接起来,查询学生选课信息,其中 `s1` 是 `sc` 表的别名;
- `INNER JOIN sc s2 ON s.sno = s2.sno`:再次将 `student` 表和 `sc` 表连接起来,查询学生选课信息,其中 `s2` 是 `sc` 表的别名;
- `WHERE s1.cno = 1 AND s2.cno = 2`:筛选出选修了课程号为1和2的学生,其中 `s1.cno = 1` 表示选修了课程号为1的学生,`s2.cno = 2` 表示选修了课程号为2的学生。
注意,这个 SQL 语句中选修了课程号为1和2的学生只有李勇(202115121)符合要求。
CREATE DATABASE if NOT EXISTS xskc CHARSET UTF8 COLLATE UTF8_GENERAL_CI; use xskc; CREATE TABLE STUDENT ( Sno char(9)primary key, Sname char(20), Ssex char(2)check(Ssex in('男','女')) , Sage smallint check(Sage>=10 and Sage<=60), Sdept char(20) ); insert into STUDENT(Sno,Sname,Ssex,Sage,Sdept)values(201215121,'李勇','男',20,'CS'); insert into STUDENT(Sno,Sname,Ssex,Sage,Sdept)values(201215122,'刘晨','女',19,'IS'); insert into STUDENT(Sno,Sname,Ssex,Sage,Sdept)values(201215123,'王敏','男',18,'MA'); insert into STUDENT(Sno,Sname,Ssex,Sage,Sdept)values(201215124,'张立','男',19,'CS'); select * from STUDENT; CREATE TABLE COURSE ( Cno char(4)primary key, Cname char(40), Cpno char(4), foreign key(Cpno)references COURSE(Cno), Ccredit smallint ); insert into COURSE(Cno,Cname,Cpno,Ccredit)values(1,'数据库',NULL,4); insert into COURSE(Cno,Cname,Cpno,Ccredit)values(2,'数学',NULL,2); insert into COURSE(Cno,Cname,Cpno,Ccredit)values(3,'信息系统',1,4); insert into COURSE(Cno,Cname,Cpno,Ccredit)values(4,'操作系统',2,3); insert into COURSE(Cno,Cname,Cpno,Ccredit)values(5,'数据结构',3,4); insert into COURSE(Cno,Cname,Cpno,Ccredit)values(6,'数据分析',NULL,4); insert into COURSE(Cno,Cname,Cpno,Ccredit)values(7,'PASCAL语言',6,4); select * from COURSE; CREATE TABLE SC ( Sno char(9), Cno char(4), Grade smallint check(Grade>=10 and Grade<=100), primary key(Sno,Cno), foreign key(Sno) references STUDENT(Sno), foreign key(Cno) references COURSE(Cno) ); insert into SC(Sno,Cno,Grade)values(201215121,1,92); insert into SC(Sno,Cno,Grade)values(201215121,2,85); insert into SC(Sno,Cno,Grade)values(201215121,3,88); insert into SC(Sno,Cno,Grade)values(201215122,2,90); insert into SC(Sno,Cno,Grade)values(201215122,3,80);
好的,我看到您创建了三张表:`STUDENT`、`COURSE` 和 `SC`,并向它们插入了一些数据。表 `STUDENT` 存储了学生的基本信息,表 `COURSE` 存储了课程的信息,表 `SC` 存储了学生选课的成绩信息。接下来,您可以使用 SQL 语句来查询学生的成绩信息,如下:
1. 查询学生 `201215121` 的选课情况和成绩:
```
SELECT c.Cname, sc.Grade
FROM SC sc
JOIN COURSE c ON sc.Cno = c.Cno
WHERE sc.Sno = 201215121;
```
执行该 SQL 语句后,将会返回学号为 `201215121` 的学生选课的课程名称和成绩信息。
2. 查询课程 `数据库` 的选课学生情况和成绩:
```
SELECT s.Sname, sc.Grade
FROM SC sc
JOIN STUDENT s ON sc.Sno = s.Sno
JOIN COURSE c ON sc.Cno = c.Cno
WHERE c.Cname = '数据库';
```
执行该 SQL 语句后,将会返回选修了 `数据库` 课程的学生的姓名和成绩信息。
3. 查询所有学生的选课情况和成绩:
```
SELECT s.Sno, s.Sname, c.Cname, sc.Grade
FROM SC sc
JOIN STUDENT s ON sc.Sno = s.Sno
JOIN COURSE c ON sc.Cno = c.Cno;
```
执行该 SQL 语句后,将会返回所有学生的选课情况和成绩信息。
阅读全文