数据库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` 
    
  )
)

总结

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

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

相关文章
|
2月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
305 7
|
3月前
|
SQL 数据管理 关系型数据库
SQL 语言入门:开启数据管理的大门
在数字化时代,数据已成为核心资产,而 SQL 作为操作关系型数据库的标准语言,是数据从业者、程序员及办公人员必备技能。本文从基础概念讲起,详解 SQL 的核心用法,包括数据查询、插入、修改、删除及表结构操作,并通过实例演示帮助读者快速上手。掌握 SQL,不仅能提升数据处理效率,更为深入理解数据管理打下坚实基础。
|
3月前
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
368 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
2月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
189 6
|
3月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
3月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
2月前
|
SQL Oracle 关系型数据库
SQL语言小结
针对数据库、表单和数据行的增删改,没有涉及到sql真正的用途也就是查询,sql提供的查询语句的关键字占 sql 语言的一半之多,查询语句还是得单拿出来讲,不然太多了。 因为没有涉及到查询,所以sql的新增和修改都是很笼统的做法,drop、alter drop、delete这些很容易,逻辑性也不强,再次说明sql的真正精髓在于查询,不然为啥叫做结构化查询语言
276 0
|
2月前
|
SQL 关系型数据库 MySQL
(SQL)SQL语言中的查询语句整理
查询语句在sql中占了挺大一部分篇幅,因为在数据库中使用查询语句的次数远多于更新与删除命令。而查询语句比起其他语句要更加的复杂,可因为sql是数据库不可或缺的一部分,所以即使不懂,也必须得弄懂,以上。
222 0
|
3月前
|
存储 数据库 开发者
Python SQLite模块:轻量级数据库的实战指南
本文深入讲解Python内置sqlite3模块的实战应用,涵盖数据库连接、CRUD操作、事务管理、性能优化及高级特性,结合完整案例,助你快速掌握SQLite在小型项目中的高效使用,是Python开发者必备的轻量级数据库指南。
285 0
|
3月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。

热门文章

最新文章