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 ...
随机推荐
- List remove ConcurrentModificationException源码分析
代码块 Java Exception in thread "main" java.util.ConcurrentModificationException at j ...
- 用 jQuery 实现表单验证(摘抄)——选自《锋利的jQuery》(第2版)第5章的例题 5.1.5 表单验证
5.1.5 表单验证 表单(form)作为 HTML 最重要的一个组成部分,几乎在每个网页上都有体现,例如用户提交信息.用户反馈信息和用户查询信息等,因此它是网站管理者与浏览者之间沟通的桥梁.在表单中 ...
- mongo的聚合操作
对图7-1所示的数据集exampledata1,使用聚合操作实现以下功能: (1)不返回_id字段,只返回age和sex字段. (2)所有age大于28的记录,只返回age和sex. (3)在$mat ...
- Windows Server 2012 R2 域证书服务搭建
网管大叔说要给每个人颁发一个证书,这个证书很耗电 1.在服务器管理器中添加角色和功能 下一步 下一步 勾选Active Directory证书服务 下一步 下一步 勾选证书颁发机构,证书颁发机构Web ...
- kafka使用指南
快速开始 本教程假设您刚刚开始,并且没有现有的Kafka或ZooKeeper数据.由于Kafka控制台脚本对于基于Unix和Windows的平台是不同的,因此在Windows平台上使用bin\wind ...
- LeetCode--179场周赛题解
水题: class Solution { public: string generateTheString(int n) { string s; string a="a",b=&q ...
- 全文搜索技术--Solr7.1之配置中文分析器
前言:中国文化博大精深,但是solr只能一个一个的识别,而是更加符合中国人的习惯,所以加了中文分析器. 1.安装中文分词器 第一步:把中文分词器(ik-analyzer-solr7-7.x.jar)/ ...
- Cisco 综合配置(四)
MSTP+HSRP 模式 为实现路由的备用.冗余: VLAN10,20 流量在CO-SW1上为active状态,在CO-SW2 上为standby状态, VLAN30,40 流量在CO-SW1上为st ...
- python之路---协程
阅读目录 一 引子 二 协程介绍 三 Greenlet模块 四 Gevent模块 引子 之前我们学习了线程.进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位.按道理来 ...
- Dapper解析嵌套的多层实体类
在作项目的时候,我会将一些不涉及查询的字段,形成JSON统一存放在一个字段中,向下面这样的来建实体类, public class WechatModel { public string wechati ...