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

VSole2022-08-31 14:29:42

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 不支持。其他数据库的支持情况因笔者没有测试环境,并未进行测试。

last
本作品采用《CC 协议》,转载必须注明作者和本文链接
想象一下:这是一个普通的在家办公的日子,但你没有意识到黑客坐在某个地下室里,当他们收到你在键盘上敲击的每一个按键时,他们高兴地搓着手。在您意识到之前,他们已经访问了您公司的数据并造成了大规模的数据泄露!但等等,情况会变得更糟。您发现,如果您只需更新笔记本电脑的软件,就可以防止违规行为。谈论工作中糟糕的一天!不幸的是,对于 LastPass 及其用户来说,这个噩梦在 2022 年 8 月成为现实,当
LastPass 的严重安全事故本可可以避免。攻击者利用了该公司一高级工程师家用电脑上安装的 Plex 软件的一个已知漏洞,而该漏洞早在 2020 年 5 月 7 日就修复了,但不知道出于什么原因,这位工程师从未更新软件打上补丁。该漏洞允许能访问服务器管理员 Plex 账号的人通过 Camera Upload 功能上传恶意文件,利用服务器数据目录位置与 Camera Upload 允许上传的库重叠,让 Plex 媒体服务器执行该恶意文件。
据安全内参了解,“二次协同攻击”事件,是指LastPass在2022年8月、12月先后披露的两起违规事件,这两起事件的攻击链有关联。LastPass公司只有4位DevOps工程师有权访问这些解密密钥,因此恶意黑客将矛头指向了其中一名工程师。LastPass日前发布的最新安全警告称。该数据库经过加密,但在第二次违规事件中,恶意黑客窃取了单独存储的解密密钥。
黑客针对DevOps工程师的个人电脑,利用易受攻击的第三方媒体软件包,在其设备上植入了键盘记录器,从而获取了对DevOps工程师的LastPass公司保险库的访问权限。
提供密码管理服务的 LastPass 更新了去年发生的严重安全事故的最新调查结果:它的一名高级工程师的家用电脑遭到黑客入侵,而这名员工拥有企业密码库的访问权限。LastPass 称,8 月 12 日到 26 日之间,未知黑客窃取到了一名高级 DevOps 工程师的有效凭证。该工程师是 LastPass 四名能访问企业密码库的工程师之一。在进入企业密码库之后,黑客导出了所有条目,其中包括 AWS S3 LastPass 产品备份的密钥。
LastPass 今年 11 月发生的安全事件持续发酵。在 LastPass 公告中表示破解用户主密码需要数百万年时间,此前安全专家质疑表示破解常规用户主密码只需要 2 个月时间。而现在友商 1Password 再次拆台,表示破解常规主密码只需要 100 美元。他说,大多数密码只需不到 100 亿次猜测就可以破解,而且只需大约 100 美元即可破解。
密码管理工具 LastPass 首席执行官卡里姆?更糟糕的是,在本次安全事件中用户的密码库也被黑客复制。需要提醒的一点是,LastPass 永远不会知道主密码,LastPass 也不会存储或维护这些密码。数据的加密和解密只在本地 LastPass 客户端进行。
上周五密码管理器厂商LastPass透露其云存储设施遭黑客入侵,大量客户保险库敏感数据疑遭泄露。
VSole
网络安全专家