首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql中not in使用方法

基础概念

NOT IN 是 MySQL 中的一个子查询操作符,用于筛选出不在某个指定集合中的记录。它通常与 SELECT 语句一起使用,用于过滤掉满足特定条件的记录。

语法

代码语言:txt
复制
SELECT column_name(s)
FROM table_name
WHERE column_name NOT IN (value1, value2, ..., valuen);

或者使用子查询:

代码语言:txt
复制
SELECT column_name(s)
FROM table_name
WHERE column_name NOT IN (SELECT column_name FROM another_table WHERE condition);

优势

  1. 灵活性NOT IN 可以与子查询结合使用,能够处理更复杂的查询需求。
  2. 简洁性:相比于使用多个 OR 条件,NOT IN 可以使查询语句更加简洁易读。

类型

  • 简单 NOT IN:直接指定一组值。
  • 子查询 NOT IN:通过子查询获取一组值。

应用场景

假设我们有一个 employees 表和一个 departments 表,我们想要查询所有不在某个特定部门工作的员工:

代码语言:txt
复制
SELECT *
FROM employees
WHERE department_id NOT IN (1, 2, 3);

或者使用子查询:

代码语言:txt
复制
SELECT *
FROM employees
WHERE department_id NOT IN (SELECT department_id FROM departments WHERE location = 'New York');

常见问题及解决方法

1. 性能问题

问题:当 NOT IN 子查询返回大量数据时,查询性能可能会下降。

原因:MySQL 在处理 NOT IN 子查询时,可能会执行全表扫描,导致性能下降。

解决方法

  • 尽量减少子查询返回的数据量。
  • 使用 NOT EXISTS 替代 NOT IN,因为 NOT EXISTS 在某些情况下性能更好。
代码语言:txt
复制
SELECT *
FROM employees e
WHERE NOT EXISTS (SELECT 1 FROM departments d WHERE d.department_id = e.department_id AND d.location = 'New York');

2. 空值问题

问题:如果子查询返回包含 NULL 值的记录,NOT IN 可能不会按预期工作。

原因:在 SQL 中,NULL 表示未知值,因此 NOT IN 在处理 NULL 值时可能会出现意外结果。

解决方法

  • 使用 IS NOT NULL 过滤掉 NULL 值。
代码语言:txt
复制
SELECT *
FROM employees
WHERE department_id NOT IN (SELECT department_id FROM departments WHERE location = 'New York' AND department_id IS NOT NULL);

参考链接

希望这些信息对你有所帮助!如果你有其他问题,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

mysql中FIND_IN_SET的使用方法

在mysql中,有时我们在做数据库查询时,需要得到某字段中包含某个值的记录,但是它也不是用like能解决的,使用like可能查到我们不想要的记录,它比like更精准,这时候mysql的FIND_IN_SET...FIND_IN_SET(str,strlist)函数 str 要查询的字符串 strlist 字段名 参数以”,”分隔 如 (1,2,6,8) 查询字段(strlist)中包含(str)的结果,返回结果为...下面查询btype字段中包含”15″这个参数的值 SELECT * from test where FIND_IN_SET('15',btype) 返回值 下面查询btype字段中包含”5″这个参数的值...接下面查询btype字段中包含”20″这个参数的值 SELECT * from test where FIND_IN_SET('20',btype) 当然它的返回值为null,因为字段中没有这个值 FIND_IN_SET...和like的区别 like是广泛的模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文”,”分隔,Find_IN_SET查询的结果要小于like查询的结果。

25010
  • sqrt mysql_MySQL中的SQRT函数的使用方法「建议收藏」

    推荐:MySQL中的SUM函数使用教程这篇文章主要介绍了MySQL中的SUM函数使用教程,是MySQL入门学习中的基础知识,需要的朋友可以参考下 MySQL的SUM函数是用来找出记录中各种的字段的总和。...现在,假设根据上面的表想来计算所有的dialy_typing_pages的总数 这篇文章主要介绍了详解MySQL中的SQRT函数的使用方法,是MySQL入门学习中的基础知识,需要的朋友可以参考下 MySQL...所看到的浮点值,因为内部MySQL将处理浮点数据类型的平方根。 可以使用SQRT函数,计算出记录的平方根。了解SQRT函数更详细用法,考虑EMPLOYEE_TBL的表具有以下记录: ?...分享:101个MySQL调试和优化技巧副标题#e# MySQL是一个功能强大的开源数据库。随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限。...这里是101条调节和优化MySQL安装的技巧。一些技巧是针对特定的安装环境的,但这些思路是通用的。

    66120

    MySQL 使用方法简单教程

    创建一个数据库表 首先看现在你的数据库中存在什么表: mysql> SHOW TABLES; Empty set (0.00 sec) 说明刚才建立的数据库中还没有数据库表。...在一个数据库中,可能存在多个表,这些表都是相互关联的。我们继续使用前面的例子。前面建立的表中包含了员工的一些基本信息,如姓名、性别、出生日期、出生地。...必须要指定一个表中的记录如何与其它表中的记录进行匹配。...: mysql> delete from mytable where name=‘abc‘; DELETE从表中删除满足由where给出的条件的一条记录。...如果想看结果,而输出结果很多,则可以用这样的命令: mysql < mytest.sql | more 我们还可以将结果输出到一个文件中: mysql mytest.out

    1.5K40

    mysql insert into as_mysql insert into select使用方法详解

    mysql insert into select使用方法详解2017-11-22 15:47 我们先来看看mysql insert into select的语法规则。...但是,不能插入到表中并从子查询中的同一个表中进行选择。 在从同一个表中选择并插入时,MySQL创建一个内部临时表来存放来自这些表的行SELECT,然后将这些行插入到目标表中。...为确保二进制日志可用于重新创建原始表,MySQL不允许并发插入INSERT … SELECT语句。...为避免SELECT在INSERT引用同一个表时引用不明确的列引用问题 , 请为该SELECT部分中使用的每个表提供唯一的别名,并使用适当的别名限定该部分中的列名。...由于这个问题,在MySQL 5.5.18中, INSERT…SELECT ON DUPLICATE KEY UPDATE和INSERT IGNORE… SELECT语句被标记为不安全的基于语句的复制。

    1.9K30

    Mysql SSH隧道连接使用方法

    为了安全,mysql的root用户只本机登录,不对外网进行授权访问,此时可通过SSH隧道连接mysql数据库。以下为配置Mysql SSH隧道连接的基本步骤。...删除远程登录 登录mysql: mysql -uroot -p 查看用户开放的访问权限: select user, host from mysql.user; 删除不需要的访问权限,比如: delete...建立隧道 服务器的登录可通过用户名密码和RSA秘钥两种方式,建议使用RAS秘钥形式,将本机的id_rsa.pub内容放置于服务器的~/.ssh/authorized_keys中,具体怎么生成RSA秘钥,...其中127.0.0.1也可以是mysql所在服务器的内网ip或外网ip。 然后,通过mysql工具,输入对应的用户名密码,即可登录。...同时,在mysql数据库中开放对应ip的访问权限。

    6K30

    pycharm中pyqt5使用方法_对中仪使用方法视频

    PyCharm中PyQt的使用方法 简单说明 本文范例软件 安装PyQt及相关软件 PyCharm中设定:QtDesigner PyCharm中设定: PyUIC (模块方式) PyCharm中设定:...PyUIC (直接使用) PyCharm中设定: PyRCC 在Qt Designer中新增资源文件 总结一下 配置完PyCharm Tools中已经有快捷方式 打开Qt Designer则可以创建窗口...,拖拽各种需要的控件 保存的地址便是上面加ui的文件夹 Qt Desinger中创建一个简单的界面 保存为test.ui选中并且点选PyUIC、生成test_designed.py A.如何使用这个生成的...继承方式 引用中错误的处理方式 选择Suppress for statement也可消除提示 题外话、修正自动生成的代码 简单说明 PyQt是Python与Qt的融合,做为Python的一个模块使用,有很多工具包...:QtDesigner 完成后在PyCharm中设定QtDesigner以及PyUIC QtDesigner Name、Program、Working directory分别填入 #名称方便调用

    1.1K20

    SQL中 WITH AS 的使用方法

    对于UNION ALL,使用WITH AS定义了一个UNION ALL语句,当该片断被调用2次以上,优化器会自动将该WITH AS短语所获取的数据放入一个Temp表中。...而提示meterialize则是强制将WITH AS短语的数据放入一个全局临时表中。很多查询通过该方式都可以提高速度。...二.使用方法 先看下面一个嵌套的查询语句: select * from person.StateProvince where CountryRegionCode in (select CountryRegionCode...person.StateProvince where CountryRegionCode in (select * from @t) 虽然上面的SQL语句要比第一种方式更复杂,但却将子查询放在了表变量@t中,...为此,在SQL Server 2005中提供了另外一种解决方案,这就是公用表表达式(CTE),使用CTE,可以使SQL语句的可维护性,同时,CTE要比表变量的效率高得多。

    45210

    java中synchronized使用方法

    System.out.println(Thread.currentThread().getName()+ “this is “+ num–);    }    }   }  } } 上面的样例中为了制造一个时间差...接着来讨论synchronized用到不同地方对代码产生的影响: 如果P1、P2是同一个类的不同对象,这个类中定义了下面几种情况的同步块或同步方法,P1、P2就都能够调用它们。 1....也就是说,当一个对象P1在不同的线程中运行这个同步方法时,它们之间会形成相互排斥,达到同步的效果。...static 函数 { //…. } public void methodBBB() { synchronized(Foo.class) // class literal(类名称字面常量) } } 代码中的...能够判断:假设一个类中定义了一个synchronized的static函数A,也定义了一个synchronized 的instance函数B,那么这个类的同一对象Obj在多线程中分别訪问A和B两个方法时

    32530

    (3) MySQL分区表使用方法

    确认MySQL服务器是否支持分区表 命令: show plugins; 2....MySQL分区表的特点 在逻辑上为一个表,在物理上存储在多个文件中 HASH分区(HASH) HASH分区的特点 根据MOD(分区键,分区数)的值把数据行存储到表的不同分区中 数据可以平均的分布在各个分区中...TABLE customer_login_log DROP PARTITION p0; 可以发现p0分区已被删除,且2016年的日志全部被清除了 归档分区历史数据 我们可能有另一种需求对数据进行归档 Mysql...版本>=5.7,归档分区历史数据非常方便,提供了一个交换分区的方法 分区数据归档迁移条件: MySQL>=5.7 结构相同 归档到的数据表一定要是非分区表 非临时表;不能有外键约束 归档引擎要是:archive...(sphinx 是一个开源软件,提供多种语言的API接口,可以优化mysql的各种查询) 5.delete from table 使用这条命令时,innodb不会从新建立表,而是一条一条的删除数据,

    1.3K10

    Nginx中location、rewrite使用方法

    configuration E 匹配到C,往下正则匹配到E /documents/Abc.jpg -> config CC 最长匹配到C,往下正则顺序匹配到CC,不会往下到E 3、实际使用建议 所以实际使用中,...rewrite只能放在 server{}, location{}, if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用。...很多情况下rewrite也会写在location里,它们的执行顺序是: 1 执行server块的rewrite指令 2 执行location匹配 3 执行选定的location中的rewrite指令 如果其中某步...这里 last 和 break 区别有点难以理解: last一般写在server和if中,而break一般使用在location中 last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程...break也是停止rewrite检查 if ($args ~ post=140){ rewrite ^ http://example.com/ permanent; } //如果query string中包含

    1.1K20
    领券