MySQL里面的子查询实例

一,子选择基本用法 
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 


3        A

C                2 

4        C


先找两个表内都存在的数据 
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。

原文地址:https://www.cnblogs.com/yszr/p/10660308.html

时间: 2024-10-09 15:36:36

MySQL里面的子查询实例的相关文章

MySQL中IN子查询会导致无法使用索引

原文:MySQL中IN子查询会导致无法使用索引 今天看到一个博客园的一篇关于MySQL的IN子查询优化的案例,一开始感觉有点半信半疑(如果是换做在SQL Server中,这种情况是绝对不可能的,后面会做一个简单的测试.)随后动手按照他说的做了一个表来测试验证,发现MySQL的IN子查询做的不好,确实会导致无法使用索引的情况(IN子查询无法使用所以,场景是MySQL,截止的版本是5.7.18) MySQL的测试环境 测试表如下 create table test_table2 ( id int a

MySQL学习笔记-子查询和连接

MySQL学习笔记-子查询和连接 使客户端进入gbk编码方式显示: mysql> SET NAMES gbk; 1.子查询 子查询的定义: 子查询(Subquery)是指出现在其他SQL语句内的SELECT子句. 例如:  SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2); 其中SELECT * FROM t1 称为Outer Query / Outer Statement (外部查询) SELECT col2 FROM t2 , 被称为Su

MySQL里面的子查询

一.子查询定义 定义: 子查询允许把一个查询嵌套在另一个查询当中. 子查询,又叫内部查询,相对于内部查询,包含内部查询的就称为外部查询. 子查询可以包含普通select可以包括的任何子句,比如:distinct. group by.order by.limit.join和union等:但是对应的外部查询必须是以下语句之一:select.insert.update.delete.set或 者do. 子查询的位置: select 中.from 后.where 中.group by 和order by

mysql update from 子查询

mssql 子查询更新 update log set uin= b.uinfrom log a,logs bwhere a.accountuin = b.accountuin mysql 不支持 update 子查询更新 找了半天资料 终于搞定了... update `log` a inner join `logs` b on a.`accountuin` = b.`accountuin`set a.`uin` = b.`uin` where a.`accountuin` = b.`accoun

详细讲述MySQL中的子查询操作 (来自脚本之家)

继续做以下的前期准备工作: 新建一个测试数据库TestDB: ? 1 create database TestDB; 创建测试表table1和table2: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE TABLE table1 (   customer_id VARCHAR(10) NOT NULL,   city VARCHAR(10) NOT NULL,   PRIMARY KEY(customer_id) )ENGINE=INNODB DEFAULT CH

Mysql中的子查询等操作

1.delete和truncate 区别? 1.1 delete慢 ,Truncate快 1.20delete记录日志,所以慢 truncate不记录日志 1.31 删除所有记录后,主键值delete 不是从1编号,Truncate会从1开始编号 1.43 truncate不能删除有外键的主表 1.5 delete 可以 加where ,删除部分记录 2.两种引擎 InnoDB:支持事务 MyISAM: 3.添加 insert into grade(字段名称) values(对应) 修改 upd

MySql学习(三) —— 子查询(where、from、exists) 及 连接查询(left join、right join、inner join、union join)

同样的,使用goods表来练习子查询,表结构如下: 所有数据(cat_id与category.cat_id关联): 类别表: mingoods(连接查询时作测试) 一.子查询 1.where型子查询:把内层查询的结果作为外层查询的比较条件 1.1 查询id最大的一件商品(使用排序+分页实现) :mysql> SELECT goods_id,goods_name,shop_price FROM goods ORDER BY goods_id DESC LIMIT 1; 1.2 查询id最大的一件商

mysql数据类型和子查询

电脑的一个字节等于8位,也就是1Byte=8bit.字节(Byte /bait/ n. [C])是计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符.bit中文名称是位,音译"比特",是用以描述电脑数据量的最小单位.计算机容量单位的换算关系是:1Byte=8bit,1KB=1024B,1MB=1024KB,1GB=1024MB,1TB=1024GB,1PB=1024TB,1EB=1024PB,1ZB=1024EB,1YB=1024ZB 二进制转

mysql 数据操作 子查询 带比较运算符的子查询

带比较运算符的子查询 #比较运算符:=.!=.>.>=.<.<=.<> #查询大于所有人平均年龄的员工名与年龄 思路 先拿到所有人的平均年龄然后 再用另外一条sql语句 进行比较 拿所有员工的年龄 > 所有人的平均年龄 做比较 mysql> select name,age from employee where age >(select avg(age) from employee) ; +------+------+ | name | age | +