学生数据库中有三个基本表(关系)如下:

学生表S(Sno,Sname,Age,Sex,SD)

课程表C(Cno,Cname, Teacher)

选课表SC(Sno,Cno,Grade)

请用SQL语言完成以下操作:

(1)检索选修课程名为“数据库系统原理”的学生号和学生姓名。

(2)检索至少选修了课程号为“C1”和“C3”的学生号。

(3)检索选修了“操作系统”或“自动控制原理”课程的学号和成绩。

(4)检索年龄在18到20之间(含18和20)的女生的学号、姓名及年龄。

(5)检索选修了“高博”老师所讲课程的学生的学号、姓名。

(6)检索选修了全部课程的学生姓名。

(7)检索至少选修了学号“S002”的学生选修的全部课程的学生学号。

(8)检索所有姓“蒋”的学生姓名、年龄和所在系。

(9)检索选修了三门课以上的学生姓名、年龄和所在系。

解:以下都是参考代码,仅供参考

--(1)检索选修课程名为“数据库系统原理”的学生号和学生姓名--
--方法1:--
SELECT S.Sno,Sname FROM S,SC,C
WHERE S.Sno=SC.Sno AND SC.Cno=C.Cno AND C.Cname=‘数据库系统原理’ --方法2:--
SELECT Sno,Sname FROM S
WHERE Sno IN (SELECT Sno FROM SC
WHERE Cno IN (SELECT Cno FROM C
WHERE Cname=‘数据库系统原理’))

方法1与方法2就是连接查询和嵌套查询的区别。在方法2中 IN 作为 WHERE 的一个筛选条件,与 = 有一定的区别,两者都是等于的意思,但 IN 可以定义多个值的范围,我们查询的结果只要存在于 IN 的范围中就可被视为符合条件

--(2)检索至少选修了课程号为“C1”和“C3”的学生号--
SELECT Sno FROM SC SCX,SC SCY
WHERE SCX.Sno=SCY.Sno AND SCX.Cno=‘C1’ AND SCY.Cno=‘C3’

根据题意,我们需要在一张表里进行互相的查询,所以为了防止出现 Sno = Sno 这样容易混淆的情况,我们通过 SC SCX,SC SCY ,给选课表SC定义两个别名,利于区分。实际上还是 SC 数据表自己和自己的比较。

--(3)检索选修了“操作系统”或“自动控制原理”课程的学号和成绩--
--方法1:--
SELECT Sno,Grade FROM SC,C
WHERE SC.Cno=C.Cno AND (C.Cname=‘操作系统’OR C.Cname=‘自动控制原理’) --方法2:--
SELECT Sno,Grade FROM SC
WHERE Cno IN (SELECT Cno FROM C
WHERE C.Cname=‘操作系统’OR C.Cname=‘自动控制原理’)

第 (3) 题的思路与第 (1) 题相似,只是把其中一个条件改变为 OR 运算符

--(4)检索年龄在18到20之间(含18和20)的女生的学号、姓名及年龄--
--方法1:--
SELECT Sno,Sname,Age FROM S
WHERE Age>=18 AND Age<=20 AND Sex=‘女’ --方法2:--
SELECT Sno,Sname,Age
FROM S WHERE Age BETWEEN 18 AND 20 AND Sex=‘女’

这道题主要是对于范围的练习,但更推荐使用方法1,因为这样比较清晰地查看查询地范围是否包含边界。BETWEEN …AND 在确定范围中是包含边界的,方法2比较巧妙地利用了这一性质,但如果记忆不清特性,在某些范围查询语句中滥用,就会获得错误的查询结果,因此笔者更推荐方法1的思路。

--(5)检索选修了“高博”老师所讲课程的学生的学号、姓名。--
--方法1:--
SELECT S.Sno,Sname FROM S,SC,C
WHERE S.Sno=SC.Sno AND SC.Cno=C.Cno AND C.Teacher=‘高博’ --方法2:--
SELECT Sno,Sname FROM S
WHERE Sno IN (SELECT Sno FROM SC
WHERE Cno IN (SELECT Cno FROM C
WHERE Teacher=‘高博’))

这道题的思路与第 (1) 题类似,便不赘述了。

--(6)检索选修了全部课程的学生姓名--
SELECT Sname FROM S
WHERE NOT EXISTS (SELECT * FROM C
WHERE NOT EXISTS (SELECT * FROM SC
WHERE Sno=S.Sno AND Cno=C.Cno))

这道题是运用了 EXIST 的嵌套查询,对于查询结果返回 True 或 False,同时在一条语句中使用两个 NOT EXIST 即表示程序的双重否定,第 (6) 题的语意,笔者大致理解为,查找某些学生,对于他们来说,不存在这样一门课,它对应的选课表里面的学号不存在这个学生的学号。

意思可能还是很难理解,但是我们已经可以理出双重否定的语句,双重肯定表否定,且根据逻辑, ┐∃ ≡ ∀ ┐

即:查找某些学生,对于他们来说,任意一门课,它对应的任意的一张选课表里面的学号都存在这个学生的学号

--(7)检索至少选修了学号“S002”的学生选修的全部课程的学生学号--
SELECT Sno FROM SC SCX
WHERE NOT EXISTS (SELECT * FROM SC SCY
WHERE SCY.Sno=‘S002’ AND NOT EXISTS (SELECT * FROM SC SCZ
WHERE SCZ.Sno=SCX.Sno
AND SCZ.Cno=SCY.Cno))

第 (6) 题和第 (2) 题的思路

--(8)检索所有姓“蒋”的学生姓名、年龄和所在系--
SELECT Sname,Age,SD FROM S
WHERE Sname LIKE ‘蒋%’

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。

--(9)检索选修了三门课以上的学生姓名、年龄和所在系--
SELECT Sname,Age,SD FROM S
WHERE Sno IN (SELECT Sno FROM SC
GROUP BY Sno HAVING COUNT(*)>3)

WHERE 关键字无法与聚合函数一起使用,HAVING 子句可以让我们筛选分组后的各组数据

分享一下常见的聚合函数: :

以上这些就是此次SQL语句的进阶版,希望你看完能有所收获。

SQL语句练习(进阶版)的更多相关文章

  1. sql 语句-初级进阶(一)

    以下所有的sql语句是根据个人资料进行操作,为方便大家操作联系,附上链接:: 链接:https://pan.baidu.com/s/14LmWyhJPQRzpjURQBKM4mA 提取码:wu1q  ...

  2. sql 语句-初级进阶(二)

    1.insert插入数据时注意事项: 每次插入一整行,不能半行或者是几列数据. 值与列数必须相同,包括数据类型也必须匹配. 不能为标识列指定值(就是最前面的那一序号列),它是自动增长的 列的数据类型为 ...

  3. 2019.3.26 SQL语句(进阶3)

    表的联查 员工表与部门表 员工表:id,姓名,年龄,部门id 部门表:部门id,部门名,部门成立时间,部门领导,部门职责.... 表和表之间的关系 一对一 一对多 多对多 创建联查 创建表 先创建被依 ...

  4. 能写数据后台,需要掌握哪些进阶的sql语句?

    国庆假期花了一些时间,首次尝试并玩转 grafana,这几天继续不断优化和完善,如今看着自己的成果,相当满意.--逐步接近我想要的理想后台啦. 需求是不停歇的.今天我又给自己发掘了一些新需求,比如变量 ...

  5. SQL语句学习手册实例版

    SQL语句学习手册实例版 表操作 例1  对于表的教学管理数据库中的表 STUDENTS ,可以定义如下: CREATE  TABLE  STUDENTS (SNO      NUMERIC (6, ...

  6. 常用Oracle SQL语句(汇总版)

    Oracle数据库常用sql语句 ORACLE 常用的SQL语法和数据对象 一.数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, ...

  7. oracle常用SQL语句(汇总版)

    Oracle数据库常用sql语句 ORACLE 常用的SQL语法和数据对象一.数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, ...

  8. 全国省市级联数据sql语句 mysql版

    全国省市级联数据sql语句 mysql版 --省级 provincial create table provincial ( provincialID int, provincialName ), p ...

  9. 一个项目涉及到的50个Sql语句(整理版)

    /* 标题:一个项目涉及到的50个Sql语句(整理版) 说明:以下五十个语句都按照测试数据进行过测试,最好每次只单独运行一个语句. */ --1.学生表Student(S,Sname,Sage,Sse ...

随机推荐

  1. Typescript & classes & public shorthand

    classes & public shorthand Also of note, the use of public on arguments to the constructor is a ...

  2. puppeteer & screenshot

    puppeteer & screenshot http://localhost:9812/screenshot?url=https://cdn.xgqfrms.xyz/

  3. ElasticSearch DSL 查询

    公号:码农充电站pro 主页:https://codeshellme.github.io DSL(Domain Specific Language)查询也叫做 Request Body 查询,它比 U ...

  4. Python处理不平衡数据

    参考文献 所谓的不平衡数据集指的是数据集各个类别的样本量极不均衡.以二分类问题为例,假设正类的样本数量远大于负类的样本数量,通常情况下通常情况下把多数类样本的比例接近100:1这种情况下的数据称为不平 ...

  5. Redis持久化机制 RDB和AOF的区别

    一.简单介绍 Redis中的持久化机制是一种当数据库发生宕机.断电.软件崩溃等,数据库中的数据无法再使用或者被破坏的情况下,如何恢复数据的方法. Redis中共有两种持久化机制 RDB(Redis D ...

  6. Youcans 的第一篇博客

    这是我的第一篇博客. 今后我会将我的学习心得和总结在这里发布,与大家共享,共勉.

  7. 华硕主板开机无法进入BIOS

    先说下本人情况,自己组装的台式机,华硕TUF B550M-Plus (wifi)的主板,CPU是锐龙 4650G(带核显),其他配件不涉及问题就不提了. 原来用独显的时候,没啥问题,开机有品牌logo ...

  8. MySQL注入 前端int型参数插入SQL语句

    类似PHP语言的 mysql_real_escape_string() 的函数,在用来防范SQL注入的时候,可能会遇到int型注入成功的情况. mysql_real_escape_string()用法 ...

  9. macOS下Chrome和Safari导入证实抓包HTTPS

    目录 下载证书 mac OS导入证书 Chrome设置代理 Safari设置代理 下面的操作基于Mac OS Catalina(v10.15.3),抓包拦截工具基于Burp Suite v2.1.05 ...

  10. 这是你没见过的不一样的redis

    转: 这是你没见过的不一样的redis 提到Redis,大家一定会想到的几个点是什么呢? 高并发,KV存储,内存数据库,丰富的数据结构,单线程(6版本之前) 那么,接下来,上面提到的这些,都会一一给大 ...