使用 SELECT 可以做的酷事
我在工作中经常使用 SQL。有些查询相当庞大(多达数百行),而且运行时间很长。如果查询有问题,就很难对其进行分解和调试。
有一种方法一直很有用,那就是使用 SELECT
本身。
操作
例如,如果我想了解为什么我的 [0-9]+-[0-9]+
SIMILAR TO
正则表达式没有捕捉到字符串 "10-20"
,我可以使用 SELECT
进行尝试,而无需运行整个查询:
SELECT '10–20' SIMILAR TO '[0-9]+-[0-9]+'; -- FALSE
它可以让我立即发现分隔符是 em 破折号–
而不是 en 破折号-
,并调整正则表达式以包含其中任何一个:
SELECT '10–20' SIMILAR TO '[0-9]+[-–][0-9]+'; -- TRUE
连接测试
不确定是否仍连接到远程数据库?SELECT 1
可以告诉你,它比 SELECT * FROM users
输入更快,运行也更快。
函数
SELECT
还会返回函数的结果。例如当前时间戳 current_timestamp
、数据库版本version()
或特定日期的星期:
SELECT current_timestamp;
SELECT version();
SELECT EXTRACT(DOW FROM TIMESTAMP '1999-01-01'); -- 5, Friday
注:我不明白为什么 current_timestamp
不需要括号,而 version()
却需要,因此不想深入研究。如果你想,请告诉我!
静态数据
最后,SELECT
可以为你创建数据。诚然,这不是我经常遇到的用例。但我可以想象,在某些情况下,你需要将两个查询联合起来UNION ALL
,而且列必须匹配。在这种情况下,你可以创建一些假列:
SELECT NULL AS user_id, 'guest' as username;
user_id | username |
---|---|
NULL | guest |
或者,您可能需要几行数据进行 JOIN:
SELECT 1 AS user_id
UNION ALL
SELECT 2 AS user_id;
user_id |
---|
1 |
2 |
对 FROM
的深入探讨超出了本篇文章的范围,但我也要提一下,如果你确实需要大量这样的数据,你可以用 FROM
创建虚假行:
SELECT
*
FROM (
VALUES
(1, 'chicken'),
(2, 'bacon'),
(3, 'ranch')
) AS users (id, username)
id | username |
---|---|
1 | chicken |
2 | bacon |
3 | ranch |
总之,不要忘记 SELECT
。它不仅仅是一个指定要从表中获取哪些记录的工具。
阅读余下内容