数据库实验7"/>
数据库实验7
2021011203
针对stu数据库中的student、course和sc三个表实现以下查询:
1、查询’CS’系的学生的成绩信息,包括学号,课程号,成绩。
SELECT sno,cno,gradeFROM scfcyWHERE sno in(SELECT snoFROM studentfcyWHERE sdept='CS')
真的很奇怪,语句不有什么问题,但就是错误?
可能是复制过程中的奇怪符号?
SELECT Sno,Cno,Grade
FROM scfcy
WHERE Sno IN
(SELECT SnoFROM studentfcyWHERE Sdept='cs')
sql中所有字段都不区分大小写
select sno,cno,grade
from scfcy
WHERE sno IN
(SELECT snofrom studentfcywhere sdept='CS'
)
2、查询李勇所选修的课程的课程名。
select cname
from coursefcy //确定好是那个表from scfcy
where sno IN //只能找表中有的
(SELECT snoFROM studentfcyWHERE sname='李勇'
)
//SELECT DISTINCT Cname,加上DISTINCT,慢0.00002sselect cname
from coursefcy
where cno IN
(SELECT cnofrom scfcywhere sno IN(SELECT snoFROM studentfcyWHERE sname='李勇' )
)
嵌套查询时,上面的where 和下面的select 是对应相同的的
3、查询既选了1号课程又选了2号课程的学生学号。
SELECT Sno
FROM scfcy
WHERE Cno='1' AND Sno IN
(SELECT SnoFROM scfcyWHERE Cno='2')
错误实例:
SELECT sno
FROM scfcy
where cno="1" and cno="2"
SELECT snoFROM scfcyWHERE cno='1000' and sno in(SELECT snoFROM scfcy WHERE cno='1022')
代码相同:不报错,也没有结果
4、查询没有选修课程的学生的名单。 (提示:使用谓词NOT IN引导)
SELECT sname,sno
FROM studentfcy
WHERE sno not in
(SELECT DISTINCT snoFROM scfcy
)
没有选修课的情况:在studentfcy的表中,不在scfcy表中
exists:
5、查询选修“course {1}”课的全部学生的总成绩。
SELECT SUM(Grade) as 'course {1}总成绩'
FROM scfcy
WHERE cno IN
(SELECT CnoFROM coursefcyWHERE Cname='CoursE {1}')
6、统计学生选修表,显示学号为“200800003"的学生在其各科成绩中,最高分成绩所对应的课程号和成绩。
SELECT Cno,Grade
FROM scfcy
WHERE Sno='2008000003'
AND Grade=
(SELECT MAX(Grade)FROM scfcyWHERE Sno='2008000003')
思考:如果该学号学生有两个课程分数都为最高的100分,查询会有什么结果?如图
7、查询arrt系选修"course {1}"课的所有学生的成绩之和。
SELECT SUM(Grade) as 'Course {1}总成绩'
FROM scfcy
WHERE Cno IN
(SELECT CnoFROM coursefcyWHERE Cname='Course {1}')AND Sno IN(SELECT SnoFROM studentfcy WHERE Sdept='art')
8、查询IS系"王红梅"同学的"Course {1000}"成绩。
SELECT Grade
FROM scfcy
WHERE Cno IN
(SELECT CnoFROM coursefcyWHERE Cname='Course {1000}')AND Sno IN(SELECT SnoFROM studentfcyWHERE Sdept='IS'AND Sname='王红梅')
9、查询学号为’200800004’的学生没选的课程的课程号和课程名。
SELECT DISTINCT Cno,Cname
FROM coursefcy
WHERE Cno NOT IN
(SELECT CnoFROM scfcyWHERE Sno='2008000004')
10、检索至少选修了两门课程的学生的信息,包括学号,姓名和所在系。 (提示:having)
SELECT Sno,Sname,Sdept
FROM studentfcy
WHERE Sno IN
(SELECT SnoFROM scfcyGROUP BY SnoHAVING COUNT(Cno)>=2)
使用EXISTS实现以下查询:
- 查询选修了课程的学生的名单。
#共2003人
SELECT sno,sname
FROM studentfcy
WHERE EXISTS
(SELECT snoFROM scfcyWHERE sno=studentfcy.sno )#错误示范:这肯定是所有人啊
SELECT sno,sname
FROM studentfcy
WHERE EXISTS
(SELECT snoFROM scfcyWHERE sno=scfcy.sno )
2、查询学号为’2008000000’的学生没选的课程的课程号和课程名。
SELECT cno,cname
FROM coursefcy
WHERE NOT EXISTS
(SELECT 1FROM scfcyWHERE cno=coursefcyo AND sno='2008000000')
EXISTS 是 SQL 中的一种条件判断语句,用于判断一个子查询是否返回了结果。如果子查询返回了一条或多条记录,则 EXITS 条件返回 true,否则返回 false。
在 SQL 查询中,我们可以使用 EXISTS 关键字来测试一个结果集是否不为空。EXISTS 后面需要跟一个子查询,该子查询用于返回一个结果集。如果子查询中存在至少一行,则 EXISTS 返回 true。如果子查询中没有任何行,则 EXISTS 返回 false。
通常,EXISTS 关键字常常和子查询或关联子查询一起使用。在这种情况下,子查询通常返回选定行或行集的行数,而 EXISTS 通常用来测试这些行是否存在。
下面是一个使用 EXISTS 和子查询的例子:
假设我们有两个表,一个是名为 Employees 的表,另一个是名为 Orders 的表。我们想要找出所有至少完成了一次订单的员工。可以使用以下 SQL 查询语句实现:
```sql
SELECT LastName, FirstName
FROM Employees
WHERE EXISTS (
SELECT *
FROM Orders
WHERE Orders.EmployeeID = Employees.EmployeeID
)
```在上述语句中,主查询用于从 Employees 表中选择所有的员工。子查询用于从 Orders 表中选择所有至少有一条记录的订单。如果能够找到与主查询中的 EmployeeID 相关联的 EmployeeID,则返回 true。如果
找不到匹配的 EmployeeID,则返回 false。最后,仅返回在子查询中返回的任何记录。因此,查询返回了所有至少完成了一次订单的员工。
EXISTS 和嵌套查询都是 SQL 中用于检索数据的方法。它们之间的主要区别如下:
1. 返回结果集的方式不同:嵌套查询返回查询语句的结果集,而 EXISTS 返回一个布尔值(true 或 false)。
2. 效率不同:EXISTS 操作通常比嵌套查询更高效,尤其是在处理大量数据时。这是因为 EXISTS 可以在找到匹配记录后立即停止搜索,而嵌套查询需要执行完整的查询语句并返回结果集。
3. 语法不同:EXISTS 使用子查询来确定是否存在记录或满足特定条件的记录,而嵌套查询通常使用子查询来检索信息,并将其嵌套到另一个查询中,以进一步限制返回的结果。
下面是一个例子来比较嵌套查询和 EXISTS 的使用:
假设我们有两个表,一个是名为 Employee 的表,另一个是名为 Orders 的表。我们想要检索所有从未完成任何订单的员工信息。可以使用以下 SQL 查询语句实现:
- 使用 EXISTS:
```sql
SELECT EmployeeID, LastName, FirstName
FROM Employee E
WHERE NOT EXISTS (
SELECT O.EmployeeID
FROM Orders O
WHERE O.EmployeeID = E.EmployeeID
);
```只要有一个符号条件句会返回一个true,然后输出所有的true吗
在上述语句中,主查询用于从 Employee 表中选择所有的员工。子查询用于从 Orders 表中选择所有已经完成了订单的订单。如果能够找到与主查询中的 EmployeeID 相关联的 Empl
oyeeID,则返回 true,否则返回 false。在本例中,我们使用 NOT EXISTS 操作符来找到从未完成任何订单的员工。- 使用嵌套查询:
```sql
SELECT EmployeeID, LastName, FirstName
FROM Employee
WHERE EmployeeID NOT IN (
SELECT DISTINCT EmployeeID
FROM Orders
);
```在上述语句中,主查询用于从 Employee 表中选择所有的员工。子查询用于从 Orders 表中选择所有 EmployeeID。然后,主查询使用 NOT IN 操作符来查找不在子查询返回结果集中的 EmployeeID。与 EXISTS 不同的是,这个嵌套查询返回了一个结果集用于与 NOT IN 操作符进行比较,而不是返回一个布尔结果。
总之,虽然 EXISTS 和嵌套查询都可以用来检索数据,但它们的使用方式、效率和语法都有所不同。在实践中,根据实际情况选择合适的查询方式,以最大程度地提高检索效率。
更多推荐
数据库实验7
发布评论