mysql中in嵌套select只能查询出一个结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql中in嵌套select只能查询出一个结果相关的知识,希望对你有一定的参考价值。

使用SELECT knowledge FROM `fk_lesson` WHERE lessonname='离散数学'的查询结果是:19,20,21,22,23,24,25,26,27
将结果带入SELECT * FROM `fk_knowledge` WHERE id in (19,20,21,22,23,24,25,26,27);
可以正确的查出
但是如果
SELECT * FROM `fk_knowledge` WHERE id in (SELECT knowledge FROM `fk_lesson` WHERE lessonname='离散数学');
将两句合成一句,这样就只能查出IN里边第一个结果的值。。这是为什么呢?求解

没见过这么不严谨的写法……
好吧,你每次执行WHERE id in (SELECT knowledge……)里面的数据的时候,括号里面都要执行一次。
可能就是因为这个原因导致的错误。具体不明。追问

对呀,,就是要每次查询的时候,括号里边的要执行啊。。。求纠正

追答

可能……或许。如果括号内是一个变量,可能会遍历一遍。(这次第一个下次第二个)
如果是个函数,那么执行以后先审核第一个,然后下次又是第一个。(因为查询出来的总会被认为是新的。)

追问

那应该怎么修改呢

追答

把括号内查询赋值给一个数组变量。

参考技术A

这时一个很简单的子查询应用. 是可以这样写的.

这种子查询效率 要比 from a,b  这种效率高很多.

楼主一定是在某步搞错了, 我刚在本地执行了一下. 也是可以的

不知道楼主是不是在命令行里执行的.

如果是程序执行的,最好在命令行里执行一遍.

人格担保,楼主这种sql是没问题的.

见下图

追问

其实我的里边那个数据是都保存到一个字段了,没有一每条记录的形式保存

追答

呵呵, 这种是肯定不行的.
对于mysql来说
他不知道你的子查询出来了多少条结果,子查询有多少条记录,外围的in里 mysql就会去判断几次
select * from table where id in(1,2,3);
对于这条sql
mysql会转换为3条sql, 分别为 where id=1; where id=2; where id=3
所以你的sql 最终被解释成了
SELECT * FROM `fk_knowledge` WHERE id '19,20,21,22,23,24,25,26,27';
所以只能出来一条结果.

本回答被提问者和网友采纳
参考技术B 貌似不可能吧追问

哈哈,千真万确~。。。尝试过很多次

追答

你把这句话放你数据库里先执行in后面的语句,结果是多条?

追问

必须是啊

MySQL 之子查询

定义:

子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从 MySQL4.1 开始引入,在 SELECT 子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。

子查询中常用的操作符有 ANY(SOME)、ALL、IN 和 EXISTS。

子查询可以添加到 SELECT、UPDATE 和 DELETE 语句中,而且可以进行多层嵌套。子查询也可以使用比较运算符,如“<”、“<=”、“>”、“>=”、“!=”等。

子查询常用的运算符:

1) IN子查询

结合关键字 IN 所使用的子查询主要用于判断一个给定值是否存在于子查询的结果集中。其语法格式为:

<表达式> [NOT] IN <子查询>

语法说明如下。

  • <表达式>:用于指定表达式。当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE;若使用关键字 NOT,则返回的值正好相反。
  • <子查询>:用于指定子查询。这里的子查询只能返回一列数据。对于比较复杂的查询要求,可以使用 SELECT 语句实现子查询的多层嵌套。

2) 比较运算符子查询

比较运算符所使用的子查询主要用于对表达式的值和子查询返回的值进行比较运算。其语法格式为:

<表达式> {= | < | > | >= | <= | <=> | < > | != }
{ ALL | SOME | ANY} <子查询>

语法说明如下。

  • <子查询>:用于指定子查询。
  • <表达式>:用于指定要进行比较的表达式。
  • ALLSOME 和 ANY:可选项。用于指定对比较运算的限制。其中,关键字 ALL 用于指定表达式需要与子查询结果集中的每个值都进行比较,当表达式与每个值都满足比较关系时,会返回 TRUE,否则返回 FALSE;关键字 SOME 和 ANY 是同义词,表示表达式只要与子查询结果集中的某个值满足比较关系,就返回 TRUE,否则返回 FALSE。

3) EXIST子查询

关键字 EXIST 所使用的子查询主要用于判断子查询的结果集是否为空。其语法格式为:

EXIST <子查询>

若子查询的结果集不为空,则返回 TRUE;否则返回 FALSE。

应用举例说明

【实例 1】在 tb_departments 表中查询 dept_type 为 D 的学院 ID,并根据学院 ID 查询该学院学生的名字,输入的 SQL 语句和执行结果如下所示。

tb_students_info数据表内容查询如下:

 

 tb_departments表内容查询如下:

 

 实例1条件查询结果如下:

 

 上述查询过程可以分步执行,首先内层子查询查出 tb_departments 表中符合条件的学院 ID,单独执行内查询,查询结果如下所示。

 

 可以看到,符合条件的 dept_id 列的值有四个:4、5、6、7。然后执行外层查询,在 tb_students_info 表中查询 dept_id 等于 4 或 5或6或7 的学生的名字。嵌套子查询语句还可以写为如下形式,可以实现相同的效果。

 

上例说明在处理 SELECT 语句时,MySQL 实际上执行了两个操作过程,即先执行内层子查询,再执行外层查询,内层子查询的结果作为外部查询的比较条件。

 【实例 2】与前一个例子类似,但是在 SELECT 语句中使用 NOT IN 关键字,输入的 SQL 语句和执行结果如下所示。

 

提示:子查询的功能也可以通过连接查询完成,但是子查询使得 MySQL 代码更容易阅读和编写。

【实例 3】在 tb_departments 表中查询 dept_name 等于“Computer”的学院 id,然后在 tb_students_info 表中查询所有该学院的学生的姓名,输入的 SQL 语句和执行过程如下所示。

 

 实例 4】在 tb_departments 表中查询 dept_name 不等于“Computer”的学院 id,然后在 tb_students_info 表中查询所有该学院的学生的姓名,输入的 SQL 语句和执行过程如下所示。

 

 【实例 5】查询 tb_departments 表中是否存在 dept_id=1 的供应商,如果存在,就查询 tb_students_info 表中的记录,输入的 SQL 语句和执行结果如下所示。

 

 由结果可以看到,内层查询结果表明 tb_departments 表中存在 dept_id=1 的记录,因此 EXSTS 表达式返回 TRUE,外层查询语句接收 TRUE 之后对表 tb_students_info 进行查询,返回所有的记录。

EXISTS 关键字可以和条件表达式一起使用。

【实例 6】查询 tb_departments 表中是否存在 dept_id=10 的供应商,如果存在,就查询 tb_students_info 表中的记录,输入的 SQL 语句和执行结果如下所示。

 

 由结果可以看到,内层查询结果表明 tb_departments 表中不存在 dept_id=10的记录,因此 EXSTS 表达式返回 FALSE,外层查询语句接收 FALSE之后对表 tb_students_info 进行查询,返回空。

以上是关于mysql中in嵌套select只能查询出一个结果的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 之子查询

MYSQL中in的用法

子查询(嵌套子查询)

mysql 中 in 的用法

Mysql 子查询怎么写?

MYSQL 存储过程如何取得一个表的查询结果?