03多表查询-子查询(一)

第1关:子查询

任务描述

本关任务:求年龄大于’刘东明’ 的所有学生的姓名与出生日期。

相关知识

为了完成本关任务,你需要掌握:
1.什么叫子查询,
2.比较运算符结合标量子查询的使用。

子查询
子查询是指出现在其他SQL语句内的SELECT子句。

例如:

SELECT * FROM t1 WHERE col1=(SELECT col2 FROM t2);
子查询指嵌套在查询内部,且必须始终出现在圆括号内,子查询可以分为四类:

标量子查询:返回单一值的标量,最简单的形式;

列子查询:返回的结果集是 N 行一列;

行子查询:返回的结果集是一行 N 列;

表子查询:返回的结果集是 N 行 N 列。

带比较运算符的子查询
运算符 说明

大于
= 大于或等于
= 等于
!= 或 <> 不等于
< 小于
<= 小于或等于
带有比较运算符的子查询是指父查询和子查询使用比较运算符连接的嵌套查询;

使用场景:当用户能够确切的知道内层查询返回的是单个值时,可以使用比较运算符。

举个例子,现在有一张employee表数据:

id name dept_id
1 Mary 101
2 Allen 102
3 kevin 101
4 Tom 102
5 Nancy 101
我们查询与Tom在同一个部门的同事id和姓名以及部门id。
1.首先,可以查询Tom所在部门id

2.然后查询dept_id=102的同事id和姓名

将上面两条简单的的SQL语句合并成一个嵌套查询:

编程要求
在右侧编辑器补充代码,求年龄大于’刘东明’ 的所有学生的姓名与出生日期。
–学生表student
学生表
####测试说明

答案

 use teachingdb;
 /****请在此编写代码,操作完毕之后点击评测******/
 
 /**********Begin**********/
 select sname, birthday 
 from student 
 where birthday < (select birthday from student where sname = '刘东明')
  
  
 /**********End**********/

第2关:子查询-练习

任务描述

本关任务:求未选修任何课程的学生的学号和姓名。

相关知识

见上一关

编程要求
根据提示,在右侧编辑器补充代码,求未选修任何课程的学生的学号和姓名。
–学生表student
学生表
–成绩表score
成绩表

答案

 use teachingdb;
 /****请在此编写代码,操作完毕之后点击评测******/
 
 /**********Begin**********/
 -- 未选修任何课程 ==> 他的学号不在成绩表中
  select sno, sname from student where sno not in
  (select sno from score);
  
 /**********End**********/

第3关:子查询-练习一

任务描述

本关任务:求比数学系中全体学生年龄大的学生的姓名和系

相关知识

见上一关

编程要求
根据提示,在右侧编辑器补充代码,求比数学系中全体学生年龄大的学生的姓名和系。
–学生表student
学生表

答案

 use teachingdb;
 /****请在此编写代码,操作完毕之后点击评测******/
 
 /**********Begin**********/
  select sname, sdept, birthday 
  from student 
  where birthday < (select min(birthday) from student where sdept = '数学');
  -- select min(birthday) from student where sdept = '数学系';
  -- select * from student;
 /**********End**********/

第4关:子查询-练习二

任务描述

本关任务:求选修了004课程的学生的姓名和系。

相关知识

见上一关

编程要求

根据提示,在右侧编辑器补充代码,求选修了004课程的学生的姓名和系。

答案

 use teachingdb;
 /****请在此编写代码,操作完毕之后点击评测******/
 
 /**********Begin**********/
  select sname,sdept 
  from student 
  where sno in (select sno from score where cno = '004')
  
  
 /**********End**********/

第5关:子查询-练习三

任务描述

本关任务:求选修了’刘东明’ 同学选修的全部课程的学生的学号。

相关知识

见上一关

编程要求

在右侧窗口补充代码,求选修了’刘东明’ 同学选修的全部课程的学生的学号。
–学生表student

答案

 use teachingdb;
 /****请在此编写代码,操作完毕之后点击评测******/
 
 /**********Begin**********/
--  select * from student;
--  select * from score;
  select sno from score where cno in (select cno from score where sno = (select sno from student where sname = '刘东明')) and score.sno!= (select sno from student where sname = '刘东明') group by sno having count(cno)>=2 ;

-- select sno from score where cno in(select cno from score,student where score.sno = student.sno and sname = '刘东明') and score.sno!= (select sno from student where sname = '刘东明') group by sno having count(cno)>=2 ;
  
 /**********End**********/

第6关:子查询-练习四

任务描述

本关任务:求选修了全部课程的学生的学号。

相关知识

见上一关

编程要求

根据提示,在右侧编辑器补充代码, 求选修了全部课程的学生的学号。

答案

 use teachingdb;
 /****请在此编写代码,操作完毕之后点击评测******/
 
 /**********Begin**********/
 /* select sno from student where not exists(select * from course where not exists(select * from score where score.sno = student.sno and score.cno = course.cno));*/
-- 从课程表中统计课程门数和从成绩表中根据学号分组统计课程门数
select sno from score group by sno having count(cno)=
(select count(*) from course);

 /**********End**********/
 
  • 22
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
假设有两个,一个是图书 books,另一个是学生 students,它们的结构和部分数据如下: ```mysql -- 图书 books CREATE TABLE books ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, title VARCHAR(100) NOT NULL, author VARCHAR(50) NOT NULL, price DECIMAL(8,2) NOT NULL, publish_date DATE NOT NULL ); INSERT INTO books (title, author, price, publish_date) VALUES ('MySQL入门与精通', '张三', 59.90, '2020-01-01'), ('Java编程思想', 'Bruce Eckel', 108.00, '2018-01-01'), ('Python数据分析与挖掘实战', '李四', 89.00, '2019-06-01'), ('深入浅出Node.js', '朱一凡', 59.00, '2017-03-01'), ('算法图解', 'Aditya Bhargava', 49.90, '2018-07-01'); -- 学生 students CREATE TABLE students ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, gender VARCHAR(10) NOT NULL, age INT NOT NULL, major VARCHAR(50) NOT NULL ); INSERT INTO students (name, gender, age, major) VALUES ('张三', '男', 20, '计算机科学与技术'), ('李四', '女', 19, '软件工程'), ('王五', '男', 21, '物联网工程'), ('赵六', '女', 20, '信息管理'), ('钱七', '男', 22, '计算机应用技术'); ``` 现在我们来进行一些查询的操作。 1. 查询图书中价格最高的图书的信息 ```mysql SELECT * FROM books WHERE price = (SELECT MAX(price) FROM books); ``` 2. 查询学生中年龄最大的学生的姓名和专业 ```mysql SELECT name, major FROM students WHERE age = (SELECT MAX(age) FROM students); ``` 3. 查询学生中专业为“计算机科学与技术”的学生的平均年龄 ```mysql SELECT AVG(age) FROM students WHERE major = '计算机科学与技术'; ``` 4. 查询学生中不在专业为“计算机科学与技术”和“软件工程”的学生的姓名和专业 ```mysql SELECT name, major FROM students WHERE major NOT IN ('计算机科学与技术', '软件工程'); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值