mysql中not in怎么使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql中not in怎么使用相关的知识,希望对你有一定的参考价值。

not In 相当于 <> all,如果 Not In 后面跟的是子查询的话,子查询中只要包含一个 null 的返回值,则会造成整个 Not in 字句返回空值,结果就是查询不会返回任何结果。而 in 相当于 =any 的意思,可以有效处理子查询中返回空值的情况,返回正确的结果。

mysql中not in和not exists两种查询到底哪种快?

因为in会使用你的子查询字段去到主表匹配你需要的行,而exists是根据匹配项去判断是或者否,然后根据是否决定结果,子查询的表大,用exists判断,效率就会高,而当子查询很小的时候,直接匹配你需要的值则更快。比如主表4万行,子查询里面有5条数据,那么exists会把4万行在子查询里面进行匹配,匹配上了就显示,匹配不上就不显示,所以需要判断4万次,而in则会在主表4万行里面去检索这5条记录,由于索引等等的存在,in的效率通常会更高,但是如果反过来,主表5条记录,子查询里面有4万行,exists只进行5次判断,而in会用4万个数据去匹配这5条记录,当然exists更快。

参考技术A not In 相当于 <> all,如果 Not In 后面跟的是子查询的话,子查询中只要包含一个 null 的返回值,则会造成
整个 Not in 字句返回空值,结果就是查询不会返回任何结果。
而 in 相当于 =any 的意思,可以有效处理子查询中返回空值的情况,返回正确的结果。
-------------------------------------------------------------------------------------------
not in 示例:--该例子想要返回没有下属的职员的姓名,如果子查询中有空值返回的话,则整个查询将没有结果返回
SELECT emp.last_name
FROM employees emp
WHERE emp.employee_id NOT IN (SELECT mgr.manager_id FROM employees mgr)
说明:
Null Values in a Subquery
The SQL statement in the slide attempts to display all the employees who do not have any
subordinates. Logically, this SQL statement should have returned 12 rows. However, the SQL
statement does not return any rows. One of the values returned by the inner query is a null value and,
therefore, the entire query returns no rows
The reason is that all conditions that compare a null value result in a null. So whenever null values
are likely to be part of the resultsset of a subquery, do not use the NOT INoperator. The NOT IN
operator is equivalent to <> ALL.
-------------------------------------------------------------------------------------------
in 的示例:
Notice that the null value as part of the results set of a subquery is not a problem if you use the IN
operator. The IN operator is equivalent to =ANY. For example, to display the employees who have
subordinates(下属), use the following SQL statement:
SELECT emp.last_name
FROM employees emp
WHERE emp.employee_id IN (SELECT mgr.manager_id FROM employees mgr);
-------------------------------------------------------------------------------------------
Alternatively, a WHERE clause can be included in the subquery to display all employees who do not
have any subordinates:
--使用 Not In 的话,要注意除掉子查询中将要返回的空值
SELECT last_name
FROM employees
WHERE employee_id NOT IN
(SELECT manager_id FROM employees WHERE manager_id IS NOT NULL);

在 MYSQL 中使用 NOT IN 和 GROUP CONCAT

【中文标题】在 MYSQL 中使用 NOT IN 和 GROUP CONCAT【英文标题】:Using NOT IN with GROUP CONCAT in MYSQL 【发布时间】:2013-03-10 16:16:23 【问题描述】:

我在我的 mysql 查询中使用带有“NOT IN”语句的“GROUP_CONCAT”函数。但是由于未知原因,它没有返回正确的值:

这是我的查询不起作用:

select firstname, lastname
from t_user
where (status_Id NOT IN(Select GROUP_CONCAT(id) from t_status where code = 'ACT'
or code = 'WACT'))

Returns 46 rows

这是我的查询工作:

select firstname, lastname
from t_user
where (status_Id NOT IN(1,4))

Returns 397 rows

GROUP_CONCAT子查询的结果

 (Select GROUP_CONCAT(id) from t_status where code = 'ACT' or code = 'WACT') = 1,4.

查询似乎只处理 GROUP_CONCAT 子查询返回的第一项。

所以我不明白发生了什么以及为什么我在两种情况下都没有相同的结果。

提前感谢盖尔

【问题讨论】:

【参考方案1】:

根据您的问题,可以利用从 GROUP_CONCAT 生成的列表。因此,一般情况下,您可以使用 GROUP_CONCAT 中的列表,如下所示:

根据specification,您可以简单地使用 FIND_IN_SET 而不是 NOT IN 来通过子查询过滤字段

select firstname, lastname
from t_user
where NOT FIND_IN_SET(status_Id, 
    (Select GROUP_CONCAT(id) from t_status where code = 'ACT' or code = 'WACT')
);

【讨论】:

【参考方案2】:

在这种情况下,您不需要使用GROUP_CONCAT 函数,因为它返回一个字符串值。并且 1, 414 非常不同。

select  firstname, lastname
from    t_user
where   status_Id NOT IN 
        ( Select id 
          from t_status 
          where code = 'ACT' or code = 'WACT'
        )

正确查询的更好方法是使用LEFT JOIN

SELECT  a.firstname, a.lastname
FROM    t_user a
        LEFT JOIN t_status b
            ON a.t_status = b.id AND
                b.code IN ('ACT', 'WACT')
WHERE   b.id IS NULL

【讨论】:

'还有一个更好的方法'......嗯,这些天我不太确定。不存在是 PDQ! (虽然在纯粹的审美层面上,我完全同意) @Strawberry 这就是我使用better 的原因,没有说best:D

以上是关于mysql中not in怎么使用的主要内容,如果未能解决你的问题,请参考以下文章

mysql 或oracle的sql中not in 使用的注意

在 MYSQL 中使用 NOT IN 和 GROUP CONCAT

使用“NOT IN”优化 MySQL 查询

踩坑记录Mysql查询使用not in会出现意外返回空的情况

踩坑记录Mysql查询使用not in会出现意外返回空的情况

踩坑记录Mysql查询使用not in会出现意外返回空的情况