热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL子查询实例及用法详解

本文主要介绍了MySQL中子查询的基本用法和三种用法,包括生成参考值、内层查询与外层查询的比较操作以及使用事件号在成绩表中找到学生的分数记录。通过详细解析子查询的实例,帮助读者更好地理解和应用子查询。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了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。


推荐阅读
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了通过mysql命令查看mysql的安装路径的方法,提供了相应的sql语句,并希望对读者有参考价值。 ... [详细]
  • 本文介绍了在SQL中查询分组后每组行数的统计方法。通过使用count()函数和GROUP BY子句可以统计每组的行数,但是如何统计所有组的行数呢?本文提供了一种实现方法,并给出了相应的SQL查询语句。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 开发笔记:select from具体执行相关知识介绍及案例分析
    本文由编程笔记小编整理,主要介绍了select from具体执行相关的知识,包括数据插入、查询最小rowID、查询每个重复名字的最小rowID、删除重复数据等操作,并提供了案例分析。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
author-avatar
cindy蔡79
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有