热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

11、子查询_MySQL

11、子查询
bitsCN.com

在SQL语句中,子查询需要放在圆括号中,在执行子查询时,其执行的过程是先查询出来子查询的结果,然后将子查询返回的结果作为其外层查询的查询条件。子查询根据返回的结果,可以分为单行子查询,多行子查询和多列子查询;根据返回的数据与外层查询之间的关系,可以分为相关子查询和不相关子查询。应该说,子查询在实际开发过程中有着非常广泛的应用。

单行子查询

在实际应用中,如果开发人员或者是用户明确知道其SQL语句中使用的子查询返回的结果是一行数据时,即子查询中返回的结果是一个值时,就可以使用算术比较运算符进行子查询的操作。其中,比较运算符包括=(等于)、>=(大于等于)、<=(小于等于)、>(大于)、<(小于)、!=(不等于)、 <>(不等于)、!>(不大于)、!<(不小于)。

多行子查询

所谓多行子查询是指子查询中返回的结果集中含有多行数据。当子查询返回的是多行数据时,需要使用多行运算符。多行运算符包括IN、ANY、ALL等运算符。
使用IN运算符,可以将满足列表中满足指定表达式的任何一个值都查询出来。在子查询中使用IN 运算符,则与子查询中查询出来的结果集中的任何一个值匹配的结果都会被查询出来。
ANY运算符也用于多行子查询中。ANY运算符的含义是只要与子查询中的任何一个结果值匹配,其值都会被返回。ANY运算符在使用时需要和比较运算符(=(等于)、>=(大于等于)、<=(小于等于)、>(大于)、<(小于)、!=(不等于)、 <>(不等于))放在一起使用。SOME是ANY的一个同义词。
图片1
ALL运算符也用于多行子查询中。ALL运算符的含义是与子查询中的所有的结果值匹配时,其值才会被返回。ALL运算符在使用时需要和比较运算符(=(等于)、>=(大于等于)、<=(小于等于)、>(大于)、<(小于)、!=(不等于)、 <>(不等于))放在一起使用。
图片2

多列子查询

所谓多列子查询,是指子查询的语句会返回多个数据列的子查询语句。在WHERE子句中也可以使用将多个属性值用括号括起来的方式实现多列子查询。在多列子查询中,WHERE子句中需要使用括号将多个属性括在一起,多个属性之间需要用逗号分开。
外层查询的WHERE子句中根据多列子查询返回的行数不同,可以选择使用不同的运算符。如果多列子查询中返回的数据行是单行的,即返回的结果值只有一个,则可以使用算术比较运算符;如果子查询中返回的数据行是多行的,即返回的结果值不只一个,则可以使用IN、ANY、ALL运算符。

SELECT teaID,teaName,age,sex,dept,profession FROM T_teacherWHERE (dept,profession) =(SELECT dept,professionFROM T_teacherWHERE teaID = 't103265')

相关子查询

在前面介绍的SQL语句子查询中,都是首先执行内层子查询的语句,然后将子查询返回的结果作为外层查询的查询条件检索数据的。这时的子查询只执行一次。与主查询相关的子查询需要引用主查询里的值,所以必须依赖于主查询,因为这种联系,与主查询相关的子查询不能脱离主查询作为一条独立的查询命令执行。

SELECT j FROM t2 where j IN (SELECT i FROM t1); -- 与主查询无关的子查询SELECT j FROM t2 where  (SELECT i FROM t1 WHERE i = j); -- 与主查询相关的子查询

而相关子查询中,子查询需要重复执行。每处理一行外部的查询语句,子查询都会被执行一次。也就是说,相关子查询需要依赖与外层查询,外层查询和子查询之间是存在联系的。与主查询相关的子查询的工作情况是:把值从主查询传递到子查询,看她们是否满足在自查询中给出的条件。通常用EXISTS关键字或者NOT EXISTS关键字实现相关子查询。带有EXISTS关键字的子查询在执行时只会返回逻辑值TRUE或者TALSE,而不会返回任何数据。也就是说,带有EXISTS关键字的子查询不关心返回的是什么数据,而只关心返回的数据“有还是没有”。(测试某个子查询是否返回了数据行)。
使用NOT EXISTS关键字实行相关子查询的查询方法和使用 EXISTS关键字实行相关子查询的查询方法正好相反。如果NOT EXISTS子句的子查询中没有返回的结果,则外层查询的WHERE子句就返回TRUE,则此最终查询的结果集显示出来;如果NOT EXISTS子句的子查询中有返回的结果,则外层查询的WHERE子句就返回FALSE。

在SQL语句中使用子查询

子查询语句除了可以应用在WHERE子句中,也可以应用在SELECT子句、FROM子句、ORDER BY子句、HAVING子句、CREATE TABLE 语句、CREATE VIEW 语句、INSERT 语句、UPDATE语句、 DELETE等语句中。
在SELECT子句中使用子查询,查询学生编号为s102203的成绩信息

SELECT R.stuID,(SELECT stuNameFROM T_studentWHERE stuID  = R.stuID) AS stuName, R.result,R.curIDFROM T_result RWHERE R.stuID = 's102203'ORDER BY R.result ASC

在FROM子句中使用子查询,该子查询查询出来的结果集组成一个临时的数据表。查询学生编号为s102203学生的选课成绩信息

SELECT R.stuID,C.curID, C.curName,R.resultFROM   T_curriculum C,(SELECT curID,stuID,resultFROM T_result)RWHERE R.curID=C.curIDAND R.stuID = 's102203'ORDER BY R.result ASC

在HAVING子句中可以使用子查询,该子查询查询出来的结果集组成一个临时的数据表。查询以学生编号s2开头的学生的平均成绩。

SELECT R.stuID, AVG(R.result)FROM T_result R,T_curriculum CWHERE R.curID=C.curIDGROUP BY R.stuIDHAVING R.stuID IN(SELECT stuIDFROM T_studentWHERE stuID LIKE 's2%')ORDER BY R.stuID

多重子查询允许查询条件中有多个子查询语句。查询教师信息表中职称与教师编号为t181585教师相同但工资比该教师高的教师信息。

SELECT teaID,teaName,age,sex,dept,profession,salaryFROM T_teacherWHERE profession =(SELECT professionFROM T_teacherWHERE teaID = 't181585')ANDsalary>(SELECT salaryFROM T_teacherWHERE teaID = 't181585')

在CREATE TABLE语句中使用子查询实现数据表的复制,通过在CREATE TABLE语句中使用子查询可以在建立一张新的数据表的同时将原有表中的数据插入到新建的数据表中,即实现数据表中数据的复制功能。语法格式如下:

CREATE TABLE 表名AS SELECT语句
bitsCN.com
推荐阅读
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • 如何在 PostgreSQL 中查询表创建语句:PostgreSQL 操作指南
    首先,启动 pgAdmin 并连接到目标数据库服务器。接着,在左侧导航栏中展开“架构”节点,找到并选择需要查询的表。最后,切换到“SQL”标签页,即可查看该表的创建语句。此外,你还可以通过执行 `SELECT pg_get_ddl_command('表名'::regclass);` 命令来直接获取表的 DDL 语句。 ... [详细]
  • SQL Server开发技巧:修改表结构后的视图批量更新方法与实践 ... [详细]
  • SQLSharper 2014 是一款专为 SQL Server Management Studio (SSMS) 设计的功能增强插件,旨在提升 T-SQL 开发者的效率。该插件提供了多种实用工具,包括快速查询数据库对象、详细查看表结构、优化查询结果导出以及自动生成代码等。适用于需要高效管理和开发 SQL 数据库的专业人士。 ... [详细]
  • 如何在Oracle ASM_Diskgroup中重命名现有磁盘
    如何在Oracle ASM_Diskgroup中重命名现有磁盘 ... [详细]
  • 基于Java和JSP的电子医疗记录管理平台
    随着信息技术的快速发展,各类管理系统已在各行各业得到广泛应用。传统的人工管理模式已逐渐无法满足现代需求。本文介绍了一种基于Java和JSP技术开发的电子医疗记录管理平台,旨在提高医疗行业的信息化水平和管理效率。该平台通过整合先进的数据库技术和Web开发框架,实现了医疗记录的高效存储、查询和管理,为医护人员提供了便捷的操作界面和强大的数据支持。 ... [详细]
  • 在数据库管理中,计算字段(也称为计算列)是一种重要的技术手段。计算字段通过在表定义中使用表达式或函数,自动生成并存储计算结果,从而提高查询效率和数据一致性。本文将详细介绍计算字段的创建方法、优化技巧及其在实际应用中的案例,帮助读者更好地理解和运用这一功能。 ... [详细]
  • 在探讨如何高效处理大规模数据报表的分页展示之前,首先需要明确导致报表加载缓慢的主要原因。通常情况下,这主要是由于两个方面:一是查询条件过于宽泛,使得数据库返回的结果集包含数百万甚至更多的记录;二是前端渲染性能不足,无法高效处理大量数据。为了优化这一过程,可以从以下几个方面入手:优化查询条件,减少不必要的数据返回;采用分页查询技术,每次仅加载所需的数据;利用缓存机制,减少对数据库的频繁访问;提升前端渲染效率,使用虚拟滚动等技术提高用户体验。 ... [详细]
  • 最近,我在CentOS 5服务器上成功部署了GForge 5.7 Community Edition。与Advanced Server版本相比,虽然功能略有简化,但仍然能够满足大多数开源项目管理的需求。为了确保数据安全,我开发了一套全自动备份脚本,该脚本能够定期备份GForge的数据和配置文件,并将其存储在远程服务器上,以防止数据丢失。此外,该脚本还具备错误检测和日志记录功能,便于故障排查和维护。 ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • Issue with the Reserved Term HOSTS in System Configuration ... [详细]
  • 在开发系统查询搜索功能时,需注意以下几点以提高信息检索效率:首先,在SQL语句中,每个参数占位符“?”后必须紧跟相应的参数赋值,确保参数与赋值一一对应,避免因参数不匹配导致的错误。其次,进行模糊搜索时,若用户输入通配符“%”,可能会导致全表扫描,因此需要对输入的“%”进行特殊处理或限制,以防止不必要的性能开销。此外,建议使用索引优化查询速度,并合理设计搜索逻辑,以提升用户体验。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用
    开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用 ... [详细]
  • 深入解析:Explain命令的应用与字段详解
    深入解析:Explain命令的应用与字段详解 ... [详细]
author-avatar
小白也坚强_177
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有