首页 数据库 mysql教程 11、子查询_MySQL

11、子查询_MySQL

Jun 01, 2016 pm 01:30 PM

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
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
2 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何使用Alter Table语句在MySQL中更改表? 如何使用Alter Table语句在MySQL中更改表? Mar 19, 2025 pm 03:51 PM

本文讨论了使用MySQL的Alter Table语句修改表,包括添加/删除列,重命名表/列以及更改列数据类型。

如何为MySQL连接配置SSL/TLS加密? 如何为MySQL连接配置SSL/TLS加密? Mar 18, 2025 pm 12:01 PM

文章讨论了为MySQL配置SSL/TLS加密,包括证书生成和验证。主要问题是使用自签名证书的安全含义。[角色计数:159]

您如何处理MySQL中的大型数据集? 您如何处理MySQL中的大型数据集? Mar 21, 2025 pm 12:15 PM

文章讨论了处理MySQL中大型数据集的策略,包括分区,碎片,索引和查询优化。

哪些流行的MySQL GUI工具(例如MySQL Workbench,PhpMyAdmin)是什么? 哪些流行的MySQL GUI工具(例如MySQL Workbench,PhpMyAdmin)是什么? Mar 21, 2025 pm 06:28 PM

文章讨论了流行的MySQL GUI工具,例如MySQL Workbench和PhpMyAdmin,比较了它们对初学者和高级用户的功能和适合性。[159个字符]

如何使用Drop Table语句将表放入MySQL中? 如何使用Drop Table语句将表放入MySQL中? Mar 19, 2025 pm 03:52 PM

本文讨论了使用Drop Table语句在MySQL中放下表,并强调了预防措施和风险。它强调,没有备份,该动作是不可逆转的,详细介绍了恢复方法和潜在的生产环境危害。

您如何用外国钥匙代表关系? 您如何用外国钥匙代表关系? Mar 19, 2025 pm 03:48 PM

文章讨论了使用外国密钥来代表数据库中的关系,重点是最佳实践,数据完整性和避免的常见陷阱。

如何保护MySQL免受常见漏洞(SQL注入,蛮力攻击)? 如何保护MySQL免受常见漏洞(SQL注入,蛮力攻击)? Mar 18, 2025 pm 12:00 PM

文章讨论了使用准备好的语句,输入验证和强密码策略确保针对SQL注入和蛮力攻击的MySQL。(159个字符)

如何在JSON列上创建索引? 如何在JSON列上创建索引? Mar 21, 2025 pm 12:13 PM

本文讨论了在PostgreSQL,MySQL和MongoDB等各个数据库中的JSON列上创建索引,以增强查询性能。它解释了索引特定的JSON路径的语法和好处,并列出了支持的数据库系统。

See all articles