强大的多列 IN 查询语句,及数据库支持情况

本文介绍了如何在SQL查询中使用多列IN语法来简化条件,对比了MySQL、SQLite和PostgreSQL在多列IN查询上的支持,并提醒读者不同数据库间的差异。通过实例展示,提升查询效率并降低复杂度。
摘要由CSDN通过智能技术生成

SQL 中最强大的也是最复杂的就是查询部分。在需要查询多条记录时我们一般会采用 in 关键字来指定要查询的条件:

SELECT * FROM t_user WHERE uid IN (1,2,3,4,5,6,7,8,9);

但如果对应的数据需要两个或更多字段才能确定,可能会写出以下的 SQL 语句:


SELECT * FROM t_user WHERE
(first_name = 'first_name_1' AND last_name = 'last_name_1') OR
(first_name = 'first_name_2' AND last_name = 'last_name_2') OR
(first_name = 'first_name_3' AND last_name = 'last_name_3') OR
(first_name = 'first_name_4' AND last_name = 'last_name_4') OR
(first_name = 'first_name_5' AND last_name = 'last_name_5') OR
(first_name = 'first_name_6' AND last_name = 'last_name_6') OR
(first_name = 'first_name_7' AND last_name = 'last_name_7');

以上代码当然能用,但拼接出来的语句过于复杂。有一个方法可以改善这个问题,就是使用多列 IN 的语法。

MySQL 中的多列 IN 查询

MySQL 是支持多列 IN 查询的。以上的 SQL 可以改写为:​​​​​​​

SELECT * FROM t_user WHERE (first_name,last_name) IN (
    ('first_name_1','last_name_1'),
    ('first_name_2','last_name_2'),
    ('first_name_3','last_name_3'),
    ('first_name_4','last_name_4'),
    ('first_name_5','last_name_5'),
    ('first_name_6','last_name_6'),
    ('first_name_7','last_name_7')
);

SQLite 中的多列 IN 查询

SQLite 也支持多列 IN 查询,只是语法上和 MySQL 有所不同,需要多加一个 VALUES 关键字:​​​​​​​


SELECT * FROM t_user WHERE (first_name,last_name) IN ( 
    VALUES
    ('first_name_1','last_name_1'),
    ('first_name_2','last_name_2'),
    ('first_name_3','last_name_3'),
    ('first_name_4','last_name_4'),
    ('first_name_5','last_name_5'),
    ('first_name_6','last_name_6'),
    ('first_name_7','last_name_7')
);

PostgreSQL 中的多列 IN 查询

PostgreSQL 也支持队列 IN 查询,在官方文档中,这种形式被称为“行构造器”,参见:PostgreSQL 子查询表达式 。其多列查询的语法和 MySQL 相同:​​​​​​​

SELECT * FROM t_user WHERE (first_name,last_name) IN ( 
    ('first_name_1','last_name_1'),
    ('first_name_2','last_name_2'),
    ('first_name_3','last_name_3'),
    ('first_name_4','last_name_4'),
    ('first_name_5','last_name_5'),
    ('first_name_6','last_name_6'),
    ('first_name_7','last_name_7')
);

其他数据库对多列 IN 查询的支持情况

多列 IN 并非受所有数据库支持。根据网上的资料,Oracel 是支持该操作的,但 SQL Server 不支持。其他数据库的支持情况因笔者没有测试环境,并未进行测试。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值