使用 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。它不仅仅是一个指定要从表中获取哪些记录的工具。
