10個SQL技巧之一:一切都是表
這是最瑣碎的技巧,甚至不是真正的技巧,但它是徹底理解SQL的基礎:一切都是一張表!當您看到如下的SQL語句時:
SELECT * FROM person |
一張表person處於From後面,但你是否意識到整個宣告也是一張表?例如,你可以寫:
SELECT * FROM ( SELECT * FROM person ) t |
現在,您已經建立了所謂的“派生表” - 即子句中的巢狀SELECT FROM語句。
這很平常,且相當優雅。您還可以在某些資料庫(例如PostgreSQL,SQL Server)中使用VALUES()構造器建立特殊的記憶體表:
SELECT * FROM ( VALUES(1),(2),(3) ) t(a) |
這簡單地產生:
a — 1 2 3 |
如果不支援該子句,則可以恢復為派生表,例如在Oracle中:
SELECT * FROM ( SELECT 1 AS a FROM DUAL UNION ALL SELECT 2 AS a FROM DUAL UNION ALL SELECT 3 AS a FROM DUAL ) t |
現在您已經看到了這些VALUES()並且派生表實際上是相同的,從概念上講,讓我們回顧一下INSERT這兩種風格的語句:
-- SQL Server, PostgreSQL, some others: INSERT INTO my_table(a) VALUES(1),(2),(3); -- Oracle, many others: INSERT INTO my_table(a) SELECT 1 AS a FROM DUAL UNION ALL SELECT 2 AS a FROM DUAL UNION ALL SELECT 3 AS a FROM DUAL |
在SQL中,一切都是表。當您將行插入表中時,您實際上並未插入單個行。你真的插入整個表。大多數人恰好在大多數時間碰巧插入單行表,因此沒有意識到INSERT真正做到了什麼。
一切都是一張表。在PostgreSQL中,甚至函式都是表:
SELECT * FROM substring('abcde', 2, 3) |
輸出:
substring ——— bcd |
如果您使用Java進行程式設計,則可以使用Java 8 Stream API的類比來更進一步。請考慮以下等效概念:
TABLE : Stream<Tuple<..>> SELECT : map() DISTINCT : distinct() JOIN : flatMap() WHERE / HAVING : filter() GROUP BY : collect() ORDER BY : sorted() UNION ALL : concat() |
使用Java 8,“一切都是流”(至少你開始使用Streams)。無論您如何變換流,例如使用map()或filter(),結果型別始終是Stream。
相關文章
- 10個SQL技巧之二:使用遞迴SQL生成資料SQL遞迴
- 10個SQL技巧之三:進行總計算SQL
- 幾個SQL查詢小技巧SQL
- SQL經典練習題48道之一(1-10)SQL
- Android原生繪圖之一起畫個表Android繪圖
- SQL 兩個表組合查詢SQL
- 使用 Python Pip 的 10 個技巧Python
- Windows 10優化7個技巧Windows優化
- 10個很棒的 JavaScript 字串技巧JavaScript字串
- 分享:SQL中 LEFT JOIN 左表合併去重實用技巧SQL
- hirolau/SQL:金融領域的SQL技巧SQL
- SQL Server升級和遷移的三個技巧GZSQLServer
- win10個人收集小技巧Win10
- 10個HTML檔案上傳技巧HTML
- 10個SQL技巧之四:找到連續的沒有間隙的最大系列的日期SQL
- SQL SERVER實用技巧SQLServer
- sql最佳化技巧SQL
- SQL效能優化技巧SQL優化
- 10 個使用 SQL 的 AWS 服務SQL
- 10 個超棒的 JavaScript 簡寫技巧JavaScript
- 【線上報表設計】提升報表外觀的15個技巧
- MySQL之SQL優化技巧MySql優化
- 支付寶“圈子”事件就是個套路,一切都是為了芝麻信用事件
- 10個需要注意的SQL問題SQL
- 一個小技巧,讓您的ABAP OPEN SQL具有自描述效果SQL
- SQL Server 批量生成資料庫內多個表的表結構SQLServer資料庫
- mySql刪除多個表 刪除多個欄位的SQLMySql
- 10個大大提升MySQL效率的使用技巧MySql
- Linux編寫Bash指令碼的10個技巧Linux指令碼
- 構建Vue.js元件的10個技巧Vue.js元件
- 業務流程對映的10個技巧 - modernanalystNaN
- Linux 系統中 sudo 命令的 10 個技巧Linux
- JavaScript 中 try...catch 的 10 個使用技巧JavaScript
- 技術更新!10個MySQL效能調優技巧MySql
- 手機拍照小技巧:手機拍照10個逆光風景拍攝技巧
- MySQL系列之一條更新SQL的生命歷程MySql
- 【Python入門教程】五個常見的最佳化SQL的技巧!PythonSQL
- 商品SKU表SQLSQL