一,子选择基本用法
1,子选择的定义
子迭择允许把一个查询嵌套在另一个查询当中。比如说:一个考试记分项目把考试事件分为考试(T)和测验(Q)两种情形。下面这个查询就能只找出学生们的考试成绩
select * from score where event_id in (select event_id from event where type='T');
2,子选择的用法(3种)
用子选择来生成一个参考值
在这种情况下,用内层的查询语句来检索出一个数据值,然后把这个数据值用在外层查询语句的比较操作中。比如说,如果要查询表中学生们在某一天的测验成绩,就应该使用一个内层查询先找到这一天的测验的事件号,然后在外层查询语句中用这个事件号在成绩表里面找到学生们的分数记录。具体语句为:
select * from score where
id=(select event_id from event where date='2002-03-21' and type='Q');
需要注意的是:在应用这种内层查询的结果主要是用来进行比较操作的分法时,内层查询应该只有一个输出结果才对。看例子,如果想知道哪个美国总统的生日最小,构造下列查询
select * from president where birth=min(birth)
这个查询是错的!因为MySQL不允许在子句里面使用统计函数!min()函数应该有一个确定的参数才能工作!所以我们改用子选择:
select * from president where birht=(select min(birth) from presidnet);
exists 和 not exists 子选择
上一种用法是把查间结果由内层传向外层、本类用法则相反,把外层查询的结果传递给内层。看外部查询的结果是否满足内部查间的匹配径件。这种“由外到内”的子迭择用法非常适合用来检索某个数据表在另外一个数据表里面有设有匹配的记录
数据表t1 数据表t2
I1 C1 I2 C2
1
2
3 A
C 2
3
4 C
A
先找两个表内都存在的数据
select i1 from t1 where exists(select * from t2 where t1.i1=t2.i2);
再找t1表内存在,t2表内不存在的数据
select i1 form t1 where not exists(select * from t2 where t1.i1=t2.i2);
需要注意:在这两种形式的子选择里,内层查询中的星号代表的是外层查询的输出结果。内层查询没有必要列出有关数据列的名字,田为内层查询关心的是外层查询的结果有多少行。希望大家能够理解这一点
in 和not in 子选择
在这种子选择里面,内层查询语句应该仅仅返回一个数据列,这个数据列里的值将由外层查询语句中的比较操作来进行求值。还是以上题为例
先找两个表内都存在的数据
select i1 from t1 where i1 in (select i2 from t2);
再找t1表内存在,t2表内不存在的数据
select i1 form t1 where i1 not in (select i2 from t2);
好象这种语句更容易让人理解,再来个例子
比如你想找到所有居住在A和B的学生。
select * from student where state in(‘A','B')
二, 把子选择查询改写为关联查询的方法。
1,匹配型子选择查询的改写
下例从score数据表里面把学生们在考试事件(T)中的成绩(不包括测验成绩!)查询出来。
Select * from score where event_id in (select event_id from event where type='T');
可见,内层查询找出所有的考试事件,外层查询再利用这些考试事件搞到学生们的成绩。
这个子查询可以被改写为一个简单的关联查询:
Select score.* from score, event where score.event_id=event.event_id and event.event_id='T';
下例可以用来找出所有女学生的成绩。
Select * from score where student_id in (select student_id form student where sex = ‘f');
可以把它转换成一个如下所示的关联查询:
Select * from score
Where student _id =student.student_id and student.sex ='f';
把匹配型子选择查询改写为一个关联查询是有规律可循的。下面这种形式的子选择查询:
Select * from tablel
Where column1 in (select column2a from table2 where column2b = value);
可以转换为一个如下所示的关联查询:
Select tablel. * from tablel,table2
Where table.column1 = table2.column2a and table2.column2b = value;
(2)非匹配(即缺失)型子选择查询的改写
子选择查询的另一种常见用途是查找在某个数据表里有、但在另一个数据表里却没有的东西。正如前面看到的那样,这种“在某个数据表里有、在另一个数据表里没有”的说法通常都暗示着可以用一个left join 来解决这个问题。请看下面这个子选择查询,它可以把没有出现在absence数据表里的学生(也就是那些从未缺过勤的学生)给查出来:
Select * from student
Where student_id not in (select student_id from absence);
这个子选择查询可以改写如下所示的left join 查询:
Select student. *
From student left join absence on student.student_id =absence.student_id
Where absence.student_id is null;
把非匹配型子选择查询改写为关联查询是有规律可循的。下面这种形式的子选择查询:
Select * from tablel
Where column1 not in (select column2 from table2);
可以转换为一个如下所示的关联查询:
Select tablel . *
From tablel left join table2 on tablel.column1=table2.column2
Where table2.column2 is null;
注意:这种改写要求数据列table2.column2声明为not null。
MySQL里面的子查询实例
2019-10-21 15:04mysql技术网 Mysql
最近学习php+mysql执行操作,发现了这一篇实例代码
延伸 · 阅读
- 2022-06-24实战搭建MySQL高可用架构(手残党表示都会了!)
- 2022-06-24MySQL 数据库查询慢(除了索引问题还可能是什么原
- 2022-06-24面试官:线上MySQL的自增id用尽怎么办?
- 2022-04-29手残又删库了,binlog救了我的命……
- 2022-04-26MySQL优化的五个维度,你学会了吗?
- 2022-04-26MySQL到底支不支持哈希索引?
- Mysql
mysql 5.6.17 绿色版(免安装)安装配置教程
这篇文章主要为大家详细介绍了mysql 5.6.17 绿色版(免安装)安装配置教程,感兴趣的小伙伴们可以参考一下...
- Mysql
清理Mysql general_log的方法总结
在本篇文章里小编给大家分享的是一篇关于清理Mysql general_log的相关知识点,需要的朋友们学习下。...
- Mysql
MySQL教程彻底学懂存储过程
这篇文章主要为大家介绍了MySQL系列的存储过程,文中详细的为大家解释存储过程的相关概念及用法语法,以及对存储过程的理解解析,有需要的朋友可以...
- Mysql
幻读为什么会被 MySQL 单独拎出来解决?
所谓幻读,即一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行,这个回答估计大伙儿已经背烂了,但是它具体有什...
- Mysql
数据库管理,不能没有这5个MySQL GUI工具
MySQL的数据库管理工具非常多,有哪些优秀的GUI工具可以帮助提高工作效率?不妨看一看这5个MySQL GUI工具...
- Mysql
mysql数据库备份及恢复命令 mysqldump,source的用法
mysql数据库备份及恢复命令 mysqldump,source的用法,需要的朋友可以参考下。 ...
- Mysql
MySQL启动报错问题InnoDB:Unable to lock/ibdata1 error
这篇文章主要介绍了MySQL启动报错问题InnoDB:Unable to lock/ibdata1 error,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...
- Mysql
win10 64位 MySQL8.0下载和安装教程图解
这篇文章主要介绍了MySQL下载和安装 win10 64位 MySQL8.0的教程图解,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...