数据库SQL语言实战(二)

简介: 数据库SQL语言实战(二)



检索查询

按照要求查找数据库中的数据

题目一

找出没有选修任何课程的学生的学号、姓名(即没有选课记录的学生)

select sid,name
from pub.student
where sid in (
    (
        select sid 
        from pub.student
    )
    minus
    (
        select distinct sid
        from pub.student_course
    )
)

关键点:

1、没有选修任何课的学生=所有学生-选了课的学生

所有学生:select sid from pub.student

选了课的学生:select distinct sid  from pub.student_course

2、减号就是minus关键字

题目二

找出至少选修了学号为“200900130417”的学生所选修的一门课的学生的学号、姓名(不包含这名同学)。

select sid,name
from pub.student
where sid in(
    (
        select distinct sid
        from pub.student_course
        where cid in (
            select cid
            from pub.student_course
            where sid='200900130417'
        )
    )
    minus
    (
        select sid
        from pub.student
        where sid='200900130417'
    )
)

关键点:

找“200900130417”学号的学生选修的全部课程——》找pub.student_course中cid在全部课程中的选课记录——》拿出sid在pub.student中进一步获取name

题目三

找出至少选修了一门其先行课程号为“300002”号课程的学生的学号、姓名。

select sid, name
 from  pub.student
 where sid in(
    select sid
    from pub.student_course
    where cid in ( 
        select cid
        from pub.student_course
        where pcid='300002'
    )
)

关键点:

1、找先行课程号为“300002”号的课程——》找pub.student_course中cid在前面课程中的选课记录——》拿出sid在pub.student中进一步获取name

2、题目二和题目三的思路是相似的

题目四

找出选修了“操作系统”并且也选修了“数据结构”,但是没有选修“程序设计语言”的学生的学号、姓名。

select sid,name
  from pub.student
  where sid in
  (
    (
      select sid
      from pub.student_course
      where cid=(
        select cid
        from pub.course
        where name='操作系统'
      )
    )
    intersect
    (
      select sid
      from pub.student_course
      where cid=(
        select cid
        from pub.course
        where name='数据结构'
      )
    )
    minus
    (
      select sid
      from pub.student_course
      where cid=(
        select cid
        from pub.course
        where name='程序设计语言'
      )
    )
  )

关键点:

1、干了A,并且干了B,但没有干C=A的结果 交 B的结果 减 C的结果

2、intersect关键字:取交集

题目五

找出姓名叫“李龙”的学生的学号及其选修全部课程的课程号、课程名和成绩。

create view test3 as
select sid,cid,pub.course_name,score
from pub.student natural join pub.student_course natural join pub.course
where pub.student_name='李龙'
create view test2_05 as
  select sid,cid,name,score
  from pub.student_course natural join pub.course
  where sid in
  (
    select sid
    from pub.student
    where name='李龙'
  )

关键点

1、 第一个代码是错误的。因为pub.student和pub.course中都有name属性,而这两者自然连接显然是不合理的

2、将三个自然连接拆为:两个自然连接+一个嵌套select语句

题目六

查询2010级、计算机科学与技术学院、操作系统的学生成绩表,内容有学号、姓名、成绩。

select sid,name,score
  from pub.student_course natural join pub.student
  where class='2010' and dname='计算机科学与技术学院' and cid=(
    select cid
    from pub.course
    where name='操作系统'
  )

关键点:

1、同样考察自然连接的应用

题目七

查询所有不姓张、不姓李、也不姓王的学生的学号sid、姓名name

select sid,name
from pub.student
where name not like '张%'
and name not like '李%'
and name not like '王%'

关键点:

1、 不姓A=not like ‘A%'

2、 名字不叫B=not like ‘%B’

题目八

找出有间接先行课的所有课程的课程号、课程名称。

select cid ,name
from pub.course
where fcid in (
  select cid
  from pub.course
  where fcid is not NULL
)

关键点:

1、 不为空=is not NULL

2、间接关系的处理(例:祖孙关系)

题目九(本篇最难的题目)

找出选修了所有课程的学生的学号、姓名。

分析

第一想法:拿出所有课程——》令pub.student_course(选用sid,cid)除取所有课程(cid)——》得到sid,这个sid'所选用的课程就是全部课程

问题是:SQL语言不提供直接可以用的除运算

实现(两种方式)

方法一、

select sid,name
from pub.student
where not exists(
  select cid
  from pub.course
  where not exists(
    select * 
    from pub.student_course
    where pub.student_course.cid=pub.course.cid and 
    pub.student_course.sid=pub.student.sid
  )
)

方法二、

select sid,name
from pub.student
where not exists(
  (
    select cid
    from pub.course
  )
  minus
  (
    select cid
    from pub.student_course
    where pub.student_course.sid=pub.student.sid
  )
)

模板

查询做了所有(至少)A的B

SELECT * FROM S
WHERE NOT EXISTS(
  SELECT * FROM C WHERE C.`cno` IN ('C001','C002')
  AND NOT EXISTS(
    SELECT * FROM SC
    WHERE SC.`cno` = C.`cno` AND SC.`sno` = S.`sno` 
    
  )
)

总结

本文的所有题目均来自《数据库系统概念》(黑宝书)、山东大学数据库实验二。不可用于商业用途转发。

如果能帮助到大家,大家可以点点赞、收收藏呀~

相关文章
|
15天前
|
SQL 数据库
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面、断电或者文件系统问题导致页面丢失。
82 12
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
|
2天前
|
SQL 存储 移动开发
HTML5 Web SQL 数据库详解
Web SQL 数据库是 HTML5 中的一种本地存储技术,允许在浏览器中使用 SQL 语言操作本地数据,支持离线访问和事务处理,适用于缓存数据和小型应用。然而,其存储容量有限且仅部分现代浏览器支持,标准已不再积极维护,未来可能被 IndexedDB 和 localStorage 等技术取代。使用时需谨慎考虑兼容性和发展前景。
|
24天前
|
SQL 存储 数据管理
SQL Server数据库
SQL Server数据库
41 11
|
19天前
|
SQL 监控 关系型数据库
MySQL数据库中如何检查一条SQL语句是否被回滚
检查MySQL中的SQL语句是否被回滚需要综合使用日志分析、事务状态监控和事务控制语句。理解和应用这些工具和命令,可以有效地管理和验证数据库事务的执行情况,确保数据的一致性和系统的稳定性。此外,熟悉事务的ACID属性和正确设置事务隔离级别对于预防数据问题和解决事务冲突同样重要。
30 2
|
1月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
59 0
|
2月前
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
58 0
|
2月前
|
SQL 数据处理 数据库
|
2月前
|
SQL 存储 调度
|
18天前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
20天前
|
存储 SQL 关系型数据库
使用MySQL Workbench进行数据库备份
【9月更文挑战第13天】以下是使用MySQL Workbench进行数据库备份的步骤:启动软件后,通过“Database”菜单中的“管理连接”选项配置并选择要备份的数据库。随后,选择“数据导出”,确认导出的数据库及格式(推荐SQL格式),设置存储路径,点击“开始导出”。完成后,可在指定路径找到备份文件,建议定期备份并存储于安全位置。
160 11
下一篇
无影云桌面