MySQL入门,第八部分,多表查询(二)
嵌套查询
嵌套查询是指一个SELECT—FROM—WHERE查询块嵌入在另一个SELECT—FROM—WHERE查询块的WHERE子句中的查询
注意:
只有当连接查询投影列的属性来自于一个关系表时才能用嵌套查询等效实现。若连接查询投影列的属性来自于多个关系表,则不能用嵌套查询实现
一、简单子查询(非相关子查询)
简单子查询:
简单子查询独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询,效率相对更高
当子查询返回的结果是一个集合时,外查询可能需要用到以下的一些关键字
| 表达式 | 含义 |
|---|---|
| > ANY | 只要大于其中一个即可 |
| > ALL | 必须大于所有结果 |
| < ANY | 只要小于其中一个即可 |
| < ALL | 必须小于所有结果 |
| >= ANY | 只要大于或等于其中一个即可 |
| >= ALL | 必须大于或等于所有结果 |
| <= ANY | 只要小于或等于其中一个即可 |
| <= ALL | 必须小于或等于所有结果 |
| = ANY | 只要等于其中一个即可 |
| <> ANY | 只要于其中一个不等即可 |
| <> ALL | 必须于所有结果都不等 |
查询成绩及格的学生的学号
SELECT sname AS 姓名
FROM student
WHERE sno IN
(
SELECT sno
FROM study
WHERE grade >= 60
)
查询成绩最高分学生的学号
SELECT sno AS 学号
FROM study
WHERE grade >= ALL
(
SELECT grade
FROM study
)
查询选修了C语言课程的学生的姓名
子查询实现方式:
SELECT sname
FROM student
WHERE sno IN
(
SELECT sno
FROM study
WHERE cno IN
(
SELECT cno
FROM course
WHERE cname='C语言'
)
)
笛卡尔积实现方式:
SELECT sname
FROM student, study, course
WHERE student.sno = study.sno AND study.cno = course.cno AND course.cname = 'C语言'
二、相关子查询
相关子查询:
相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次,效率相对较低
用到相关子查询时可能用到以下两个关键字;注意,相关子查询不一定用到它们,即它们并不是相关子查询的标志
| 关键字 | 含义 |
| EXISTS | 依次取出外查询得到的每一个元组,代入子查询中计算。若该元组满足子查询的条件,则子查询返回一个布尔值 TRUE,并将该元组作为结果集的一个成员;否则返回布尔值 FALSE ,不作为结果集的一员 |
| NOT EXISTS | 依次取出外查询得到的每一个元组,代入子查询中计算。若该元组不满足子查询的条件,则子查询返回一个布尔值 TRUE,并将该元组作为结果集的一个成员;否则返回布尔值 FALSE ,不作为结果集的一员 |
将选修 操作系统 并且得分 超过85分 的学生的姓名显示出来
select sname
FROM student
WHERE EXISTS
(
SELECT *
FROM study
WHERE student.sno = study.sno AND grade >= 85 AND EXISTS
(
SELECT *
FROM course
WHERE study.cno = course.cno AND cname = '操作系统'
)
)
将没有选修操作系统的学生姓名显示出来
=======================================================================================================
分析:没有选修操作系统的学生 :(TRUE(学生(没有选择操作系统))) ===等价于===> (FALSE(学生(选修了操作系统)))
(TRUE(学生(没有选择操作系统)))虽然从思维上很好理解,但是如何证明一个学生没有选择操作系统?这似乎不是一件简单的事情,因为元组是一条一条验证的,假如一个学生选修了操作系统和C语言,当遍历该学生选修了操作系统时确实可以排除该学生的姓名,但是当遍历到该学生选修了C语言的这条记录时该何去何从呢?在记录中,该记录中该学生确实没有选修操作系统!因此代码上第一种方法是极其难以实现的,因此我们选择第二种
=======================================================================================================
select sname
FROM student
WHERE NOT EXISTS
(
SELECT *
FROM study
WHERE student.sno = study.sno AND EXISTS
(
SELECT *
FROM course
WHERE study.cno = course.cno AND cname = '操作系统'
)
)
将选修了全部课程的学生的姓名显示出来
=======================================================================================================
(TRUE(学生(选修了全部课程)))===等价于===>(学生(FALSE(课程(该学生没有选修))))
用自然语言描述即为:
对于任意一门课程,该学生都选修了 ===等价于===>不存在这样一门课程,这个课程没有被该学生选修
存在于这样一个学生,他选修的课包含了学校开的所有课 ===等价于===>不存在这样一个学生,学校开的所有课不被他选修的课所包含
=======================================================================================================
SELECT sname
FROM student
WHERE NOT EXISTS
(
SELECT *
FROM course
WHERE NOT EXISTS
(
SELECT *
FROM study
WHERE sno = student.sno AND cno = course.cno
)
)
或
SELECT sname
FROM student
WHERE NOT EXISTS
(
SELECT *
FROM course
WHERE cno NOT IN
(
SELECT cno
FROM study
WHERE student.sno = study.sno
)
)
查询一个学生y,该学生至少选修了另外一个学生x选修的全部课程
=======================================================================================================
分析:
不存在这样的一门课程,该课程被x选修了,而没有被y选修
=======================================================================================================
SELECT DISTINCT sno
FROM study X
WHERE NOT EXISTS
(
SELECT *
FROM study Y
WHERE y.sno = '03061' AND NOT EXISTS
(
SELECT *
FROM study z
WHERE z.sno = x.sno AND z.cno = y.cno
)
)
MySQL入门,第八部分,多表查询(二)的更多相关文章
- MySQL入门(4)——操作数据表
MySQL入门(4)--操作数据表 创建数据库 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] 数据库名 [(create_definition,...)] [tab ...
- 数据库SQL语言从入门到精通--Part 6--单表查询(快来PICK)
数据库从入门到精通合集(超详细,学习数据库必看) 查询操作是SQL语言中很重要的操作,我们今天就来详细的学习一下. 一.数据查询的语句格式 SELECT [ALL|DISTINCT] <目标列表 ...
- mysql学习(十)多表查询
多表查询时,要给表名起别名,给字段名其别名(当两个表含有重复字段时) select p.name, c.name, pid from products p, cats c;//得到的结果为笛卡尔乘积 ...
- MySql语句常用命令整理---多表查询
首先第一张表还是我们单表查询之前用到t_employee,我们在另外新建一个表t_dept(部门表)建表命令如下: drop table if exists t_dept; CREATE TABLE ...
- MYSQL 外键 on语句 多表查询
外键约束 创建外键 --- 每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任 ----主表 CREATE TABLE ClassCharger( id TINYINT PRIMARY KE ...
- mysql增删改查、连表查询、常用操作
一.建表 1.最简单的建表CREATE TABLE user(id int,name char(20),age int); 2.带主键带注释和默认值创建表CREATE TABLE user(id I ...
- MySQL数据库(4)- 多表查询、可视化工具Navicat的使用、设计模式MVC
一.多表查询 准备工作:创建两张表,部门表(department).员工表(employee),代码和表格如下: # 创建表 create table department( id int, name ...
- 黑马MySQL数据库学习day03 级联 多表查询 连接和子查询 表约束
/* 存在外键的表 删表限制: 1.先删除从表,再删除主表.(不能直接删除主表,主表被从表引用,尽管实际可能还没有记录引用) 建表限制: 1.必须先建主表,再建从表(没有主表,从表无法建立外键关系) ...
- MySQL基础(三)多表查询(各种join连接详解)
Mysql 多表查询详解 一.前言 二.示例 三.注意事项 一.前言 上篇讲到Mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有哪些 ...
- MySQL优化:如何避免回表查询?什么是索引覆盖? (转)
数据库表结构: create table user ( id int primary key, name varchar(20), sex varchar(5), index(name) )engin ...
随机推荐
- (转)C++中的new
转载自:http://blog.csdn.net/sparkliang/article/details/3650324 C++中的new其实是一个很糊弄人的术语,它有两种不同的含义,new运算符(ne ...
- LSTM + linear-CRF序列标注笔记
CRF 许多随机变量组成一个无向图G = {V, E},V代表顶点,E代表顶点间相连的边, 每个顶点代表一个随机变量,边代表两个随机变量间存在相互影响关系(变量非独立), 如果随机变量根据图的结构而具 ...
- Deep Protein Methylation Profiling by Combined Chemical and Immunoaffinity Approaches Reveals Novel PRMT1 Targets (结合层析法和免疫沉淀法的蛋白甲基化的深度检测技术发现了PRMT1新的靶标蛋白)
题目:Deep Protein Methylation Profiling by Combined Chemical and Immunoaffinity Approaches Reveals Nov ...
- Java容器的常见问题
记录Java容器中的常见概念和原理 参考: https://github.com/wangzhiwubigdata/God-Of-BigData#三Java并发容器 https://blog.csdn ...
- P5663 加工零件 题解
原题链接 简要题意: 给定一个图,每次询问从 \(x\) 节点开始,\(y\) 步能不能达到 \(1\) 号节点. 算法一 这也是我本人考场算法.就是 深搜 . 因为你会发现,如果 \(x\) 用 \ ...
- CF1324F Maximum White Subtree 题解
原题链接 简要题意: 给定一棵树,每个点有黑白两种颜色:对每个节点,求出包含当前节点的连通图,使得白点数与黑点数差最小.输出这些值. F题也这么简单,咳咳,要是我也熬夜打上那么一场...可惜没时间打啊 ...
- 动态规划-Distinct Subsequences
2020-01-03 13:29:04 问题描述: 问题求解: 经典的动态规划题目,一般来说dp题目是递推关系公式难想,但是实际代码量还是比较少的. 有尝试过dfs来做,但是由于时间复杂度是指数级别的 ...
- [最短路,floyd] Codeforces 1202B You Are Given a Decimal String...
题目:http://codeforces.com/contest/1202/problem/B B. You Are Given a Decimal String... time limit per ...
- Codeforces Add on a Tree
Add on a Tree time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- 高效code review指南
大多数程序员都知道并且相信code review(代码审查)的重要性,但并一定都能很好的执行这一过程,做好code review也需要遵循一定的原则.流程和规范. 我们团队的code review实践 ...