这是最琐碎的技巧,甚至不是真正的技巧,但它是彻底理解SQL的基础:一切都是一张表!当您看到如下的SQL语句时:
SELECT * FROM person |
一张表person处于From后面,但你是否意识到整个声明也是一张表?例如,你可以写:
SELECT * |
现在,您已经创建了所谓的“派生表” - 即子句中的嵌套SELECT FROM语句。
这很平常,且相当优雅。您还可以在某些数据库(例如PostgreSQL,SQL Server)中使用VALUES()构造器创建特殊的内存表:
SELECT * |
这简单地产生:
a |
如果不支持该子句,则可以恢复为派生表,例如在Oracle中:
SELECT * |
现在您已经看到了这些VALUES()并且派生表实际上是相同的,从概念上讲,让我们回顾一下INSERT这两种风格的语句:
-- SQL Server, PostgreSQL, some others: |
在SQL中,一切都是表。当您将行插入表中时,您实际上并未插入单个行。你真的插入整个表。大多数人恰好在大多数时间碰巧插入单行表,因此没有意识到INSERT真正做到了什么。
一切都是一张表。在PostgreSQL中,甚至函数都是表:
SELECT * |
输出:
substring |
如果您使用Java进行编程,则可以使用Java 8 Stream API的类比来更进一步。请考虑以下等效概念:
TABLE : Stream<Tuple<..>> |
使用Java 8,“一切都是流”(至少你开始使用Streams)。无论您如何变换流,例如使用map()或filter(),结果类型始终是Stream。