国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄 搜尋
前言 何為PostgreSQL? PostgreSQL簡(jiǎn)史 格式約定 更多信息 臭蟲匯報(bào)指導(dǎo) I. 教程 章1. 從頭開始 1.1. 安裝 1.2. 體系基本概念 1.3. 創(chuàng)建一個(gè)數(shù)據(jù)庫 1.4. 訪問數(shù)據(jù)庫 章2. SQL語言 2.1. 介紹 2.2. 概念 2.3. 創(chuàng)建新表 2.4. 向表中添加行 2.5. 查詢一個(gè)表 2.6. 表間鏈接 2.7. 聚集函數(shù) 2.8. 更新 2.9. 刪除 章3. 高級(jí)特性 3.1. 介紹 3.2. 視圖 3.3. 外鍵 3.4. 事務(wù) 3.5. 窗口函數(shù) 3.6. 繼承 3.7. 結(jié)論 II. SQL語言 章4. SQL語法 4.1. 詞法結(jié)構(gòu) 4.2. 值表達(dá)式 4.3. 調(diào)用函數(shù) 章5. 數(shù)據(jù)定義 5.1. 表的基本概念 5.2. 缺省值 5.3. 約束 5.4. 系統(tǒng)字段 5.5. 修改表 5.6. 權(quán)限 5.7. 模式 5.8. 繼承 5.9. 分區(qū) 5.10. 其它數(shù)據(jù)庫對(duì)象 5.11. 依賴性跟蹤 章 6. 數(shù)據(jù)操作 6.1. 插入數(shù)據(jù) 6.2. 更新數(shù)據(jù) 6.3. 刪除數(shù)據(jù) 章7. 查詢 7.1. 概述 7.2. 表表達(dá)式 7.3. 選擇列表 7.4. 組合查詢 7.5. 行排序 7.6. LIMIT和OFFSET 7.7. VALUES列表 7.8. WITH的查詢(公用表表達(dá)式) 章8. 數(shù)據(jù)類型 8.1. 數(shù)值類型 8.2. 貨幣類型 8.3. 字符類型 8.4. 二進(jìn)制數(shù)據(jù)類型 8.5. 日期/時(shí)間類型 8.6. 布爾類型 8.7. 枚舉類型 8.8. 幾何類型 8.9. 網(wǎng)絡(luò)地址類型 8.10. 位串類型 8.11. 文本搜索類型 8.12. UUID類型 8.13. XML類型 8.14. 數(shù)組 8.15. 復(fù)合類型 8.16. 對(duì)象標(biāo)識(shí)符類型 8.17. 偽類型 章 9. 函數(shù)和操作符 9.1. 邏輯操作符 9.2. 比較操作符 9.3. 數(shù)學(xué)函數(shù)和操作符 9.4. 字符串函數(shù)和操作符 9.5. 二進(jìn)制字符串函數(shù)和操作符 9.6. 位串函數(shù)和操作符 9.7. 模式匹配 9.8. 數(shù)據(jù)類型格式化函數(shù) 9.9. 時(shí)間/日期函數(shù)和操作符 9.10. 支持枚舉函數(shù) 9.11. 幾何函數(shù)和操作符 9.12. 網(wǎng)絡(luò)地址函數(shù)和操作符 9.13. 文本檢索函數(shù)和操作符 9.14. XML函數(shù) 9.15. 序列操作函數(shù) 9.16. 條件表達(dá)式 9.17. 數(shù)組函數(shù)和操作符 9.18. 聚合函數(shù) 9.19. 窗口函數(shù) 9.20. 子查詢表達(dá)式 9.21. 行和數(shù)組比較 9.22. 返回集合的函數(shù) 9.23. 系統(tǒng)信息函數(shù) 9.24. 系統(tǒng)管理函數(shù) 9.25. 觸發(fā)器函數(shù) 章10. 類型轉(zhuǎn)換 10.3. 函數(shù) 10.2. 操作符 10.1. 概述 10.4. 值存儲(chǔ) 10.5. UNION 章11. 索引 11.1. 介紹 11.2. 索引類型 11.3. 多字段索引 11.4. 索引和ORDER BY 11.5. 組合多個(gè)索引 11.6. 唯一索引 11.7. 表達(dá)式上的索引 11.8. 部分索引 11.9. 操作類和操作簇 11.10. 檢查索引的使用 章12. Full Text Search 12.1. Introduction 12.2. Tables and Indexes 12.3. Controlling Text Search 12.4. Additional Features 12.5. Parsers 12.6. Dictionaries 12.7. Configuration Example 12.8. Testing and Debugging Text Search 12.9. GiST and GIN Index Types 12.10. psql Support 12.11. Limitations 12.12. Migration from Pre-8.3 Text Search 章13. 并發(fā)控制 13.1. 介紹 13.2. 事務(wù)隔離 13.3. 明確鎖定 13.4. 應(yīng)用層數(shù)據(jù)完整性檢查 13.5. 鎖和索引 章14. 性能提升技巧 14.1. 使用EXPLAIN 14.2. 規(guī)劃器使用的統(tǒng)計(jì)信息 14.3. 用明確的JOIN語句控制規(guī)劃器 14.4. 向數(shù)據(jù)庫中添加記錄 14.5. 非持久性設(shè)置 III. 服務(wù)器管理 章15. 安裝指導(dǎo) 15.1. 簡(jiǎn)版 15.2. 要求 15.3. 獲取源碼 15.4. 升級(jí) 15.5. 安裝過程 15.6. 安裝后的設(shè)置 15.7. 支持的平臺(tái) 15.8. 特殊平臺(tái)的要求 章16. Installation from Source Code on Windows 16.1. Building with Visual C++ or the Platform SDK 16.2. Building libpq with Visual C++ or Borland C++ 章17. 服務(wù)器安裝和操作 17.1. PostgreSQL用戶帳戶 17.2. 創(chuàng)建數(shù)據(jù)庫集群 17.3. 啟動(dòng)數(shù)據(jù)庫服務(wù)器 17.4. 管理內(nèi)核資源 17.5. 關(guān)閉服務(wù) 17.6. 防止服務(wù)器欺騙 17.7. 加密選項(xiàng) 17.8. 用SSL進(jìn)行安全的TCP/IP連接 17.9. Secure TCP/IP Connections with SSH Tunnels 章18. 服務(wù)器配置 18.1. 設(shè)置參數(shù) 18.2. 文件位置 18.3. 連接和認(rèn)證 18.4. 資源消耗 18.5. 預(yù)寫式日志 18.6. 查詢規(guī)劃 18.7. 錯(cuò)誤報(bào)告和日志 18.8. 運(yùn)行時(shí)統(tǒng)計(jì) 18.9. 自動(dòng)清理 18.10. 客戶端連接缺省 18.12. 版本和平臺(tái)兼容性 18.11. 鎖管理 18.13. 預(yù)置選項(xiàng) 18.14. 自定義的選項(xiàng) 18.15. 開發(fā)人員選項(xiàng) 18.16. 短選項(xiàng) 章19. 用戶認(rèn)證 19.1. pg_hba.conf 文件 19.2. 用戶名映射 19.3. 認(rèn)證方法 19.4. 用戶認(rèn)證 章20. 數(shù)據(jù)庫角色和權(quán)限 20.1. 數(shù)據(jù)庫角色 20.2. 角色屬性 20.3. 權(quán)限 20.4. 角色成員 20.5. 函數(shù)和觸發(fā)器 章21. 管理數(shù)據(jù)庫 21.1. 概述 21.2. 創(chuàng)建一個(gè)數(shù)據(jù)庫 21.3. 臨時(shí)庫 21.4. 數(shù)據(jù)庫配置 21.5. 刪除數(shù)據(jù)庫 21.6. 表空間 章22. 本土化 22.1. 區(qū)域支持 22.2. 字符集支持 章23. 日常數(shù)據(jù)庫維護(hù)工作 23.1. Routine Vacuuming日常清理 23.2. 經(jīng)常重建索引 23.3. 日志文件維護(hù) 章24. 備份和恢復(fù) 24.1. SQL轉(zhuǎn)儲(chǔ) 24.2. 文件系統(tǒng)級(jí)別的備份 24.3. 在線備份以及即時(shí)恢復(fù)(PITR) 24.4. 版本間遷移 章25. 高可用性與負(fù)載均衡,復(fù)制 25.1. 不同解決方案的比較 25.2. 日志傳送備份服務(wù)器 25.3. 失效切換 25.4. 日志傳送的替代方法 25.5. 熱備 章26. 恢復(fù)配置 26.1. 歸檔恢復(fù)設(shè)置 26.2. 恢復(fù)目標(biāo)設(shè)置 26.3. 備服務(wù)器設(shè)置 章27. 監(jiān)控?cái)?shù)據(jù)庫的活動(dòng) 27.1. 標(biāo)準(zhǔn)Unix工具 27.2. 統(tǒng)計(jì)收集器 27.3. 查看鎖 27.4. 動(dòng)態(tài)跟蹤 章28. 監(jiān)控磁盤使用情況 28.1. 判斷磁盤的使用量 28.2. 磁盤滿導(dǎo)致的失效 章29. 可靠性和預(yù)寫式日志 29.1. 可靠性 29.2. 預(yù)寫式日志(WAL) 29.3. 異步提交 29.4. WAL配置 29.5. WAL內(nèi)部 章30. Regression Tests 30.1. Running the Tests 30.2. Test Evaluation 30.3. Variant Comparison Files 30.4. Test Coverage Examination IV. 客戶端接口 章31. libpq-C庫 31.1. 數(shù)據(jù)庫聯(lián)接函數(shù) 31.2. 連接狀態(tài)函數(shù) 31.3. 命令執(zhí)行函數(shù) 31.4. 異步命令處理 31.5. 取消正在處理的查詢 31.6. 捷徑接口 31.7. 異步通知 31.8. 與COPY命令相關(guān)的函數(shù) 31.9. Control Functions 控制函數(shù) 31.10. 其他函數(shù) 31.11. 注意信息處理 31.12. 事件系統(tǒng) 31.13. 環(huán)境變量 31.14. 口令文件 31.15. 連接服務(wù)的文件 31.16. LDAP查找連接參數(shù) 31.17. SSL支持 31.18. 在多線程程序里的行為 31.19. 制作libpq程序 31.20. 例子程序 章32. 大對(duì)象 32.1. 介紹 32.2. 實(shí)現(xiàn)特點(diǎn) 32.3. 客戶端接口 32.4. 服務(wù)器端函數(shù) 32.5. 例子程序 章33. ECPG - Embedded SQL in C 33.1. The Concept 33.2. Connecting to the Database Server 33.3. Closing a Connection 33.4. Running SQL Commands 33.5. Choosing a Connection 33.6. Using Host Variables 33.7. Dynamic SQL 33.8. pgtypes library 33.9. Using Descriptor Areas 33.10. Informix compatibility mode 33.11. Error Handling 33.12. Preprocessor directives 33.13. Processing Embedded SQL Programs 33.14. Library Functions 33.15. Internals 章34. 信息模式 34.1. 關(guān)于這個(gè)模式 34.2. 數(shù)據(jù)類型 34.3. information_schema_catalog_name 34.4. administrable_role_authorizations 34.5. applicable_roles 34.6. attributes 34.7. check_constraint_routine_usage 34.8. check_constraints 34.9. column_domain_usage 34.10. column_privileges 34.11. column_udt_usage 34.12. 字段 34.13. constraint_column_usage 34.14. constraint_table_usage 34.15. data_type_privileges 34.16. domain_constraints 34.18. domains 34.17. domain_udt_usage 34.19. element_types 34.20. enabled_roles 34.21. foreign_data_wrapper_options 34.22. foreign_data_wrappers 34.23. foreign_server_options 34.24. foreign_servers 34.25. key_column_usage 34.26. parameters 34.27. referential_constraints 34.28. role_column_grants 34.29. role_routine_grants 34.30. role_table_grants 34.31. role_usage_grants 34.32. routine_privileges 34.33. routines 34.34. schemata 34.35. sequences 34.36. sql_features 34.37. sql_implementation_info 34.38. sql_languages 34.39. sql_packages 34.40. sql_parts 34.41. sql_sizing 34.42. sql_sizing_profiles 34.43. table_constraints 34.44. table_privileges 34.45. tables 34.46. triggered_update_columns 34.47. 觸發(fā)器 34.48. usage_privileges 34.49. user_mapping_options 34.50. user_mappings 34.51. view_column_usage 34.52. view_routine_usage 34.53. view_table_usage 34.54. 視圖 V. 服務(wù)器端編程 章35. 擴(kuò)展SQL 35.1. 擴(kuò)展性是如何實(shí)現(xiàn)的 35.2. PostgreSQL類型系統(tǒng) 35.3. User-Defined Functions 35.4. Query Language (SQL) Functions 35.5. Function Overloading 35.6. Function Volatility Categories 35.7. Procedural Language Functions 35.8. Internal Functions 35.9. C-Language Functions 35.10. User-Defined Aggregates 35.11. User-Defined Types 35.12. User-Defined Operators 35.13. Operator Optimization Information 35.14. Interfacing Extensions To Indexes 35.15. 用C++擴(kuò)展 章36. 觸發(fā)器 36.1. 觸發(fā)器行為概述 36.3. 用 C 寫觸發(fā)器 36.2. 數(shù)據(jù)改變的可視性 36.4. 一個(gè)完整的例子 章37. 規(guī)則系統(tǒng) 37.1. The Query Tree 37.2. 視圖和規(guī)則系統(tǒng) 37.3. 在INSERT,UPDATE和DELETE上的規(guī)則 37.4. 規(guī)則和權(quán)限 37.5. 規(guī)則和命令狀態(tài) 37.6. 規(guī)則與觸發(fā)器得比較 章38. Procedural Languages 38.1. Installing Procedural Languages 章39. PL/pgSQL - SQL過程語言 39.1. 概述 39.2. PL/pgSQL的結(jié)構(gòu) 39.3. 聲明 39.4. 表達(dá)式 39.5. 基本語句 39.6. 控制結(jié)構(gòu) 39.7. 游標(biāo) 39.8. 錯(cuò)誤和消息 39.9. 觸發(fā)器過程 39.10. PL/pgSQL Under the Hood 39.11. 開發(fā)PL/pgSQL的一些提示 39.12. 從OraclePL/SQL 進(jìn)行移植 章40. PL/Tcl - Tcl Procedural Language 40.1. Overview 40.2. PL/Tcl Functions and Arguments 40.3. Data Values in PL/Tcl 40.4. Global Data in PL/Tcl 40.5. Database Access from PL/Tcl 40.6. Trigger Procedures in PL/Tcl 40.7. Modules and the unknown command 40.8. Tcl Procedure Names 章41. PL/Perl - Perl Procedural Language 41.1. PL/Perl Functions and Arguments 41.2. Data Values in PL/Perl 41.3. Built-in Functions 41.4. Global Values in PL/Perl 41.6. PL/Perl Triggers 41.5. Trusted and Untrusted PL/Perl 41.7. PL/Perl Under the Hood 章42. PL/Python - Python Procedural Language 42.1. Python 2 vs. Python 3 42.2. PL/Python Functions 42.3. Data Values 42.4. Sharing Data 42.5. Anonymous Code Blocks 42.6. Trigger Functions 42.7. Database Access 42.8. Utility Functions 42.9. Environment Variables 章43. Server Programming Interface 43.1. Interface Functions Spi-spi-connect Spi-spi-finish Spi-spi-push Spi-spi-pop Spi-spi-execute Spi-spi-exec Spi-spi-execute-with-args Spi-spi-prepare Spi-spi-prepare-cursor Spi-spi-prepare-params Spi-spi-getargcount Spi-spi-getargtypeid Spi-spi-is-cursor-plan Spi-spi-execute-plan Spi-spi-execute-plan-with-paramlist Spi-spi-execp Spi-spi-cursor-open Spi-spi-cursor-open-with-args Spi-spi-cursor-open-with-paramlist Spi-spi-cursor-find Spi-spi-cursor-fetch Spi-spi-cursor-move Spi-spi-scroll-cursor-fetch Spi-spi-scroll-cursor-move Spi-spi-cursor-close Spi-spi-saveplan 43.2. Interface Support Functions Spi-spi-fname Spi-spi-fnumber Spi-spi-getvalue Spi-spi-getbinval Spi-spi-gettype Spi-spi-gettypeid Spi-spi-getrelname Spi-spi-getnspname 43.3. Memory Management Spi-spi-palloc Spi-realloc Spi-spi-pfree Spi-spi-copytuple Spi-spi-returntuple Spi-spi-modifytuple Spi-spi-freetuple Spi-spi-freetupletable Spi-spi-freeplan 43.4. Visibility of Data Changes 43.5. Examples VI. 參考手冊(cè) I. SQL命令 Sql-abort Sql-alteraggregate Sql-alterconversion Sql-alterdatabase Sql-alterdefaultprivileges Sql-alterdomain Sql-alterforeigndatawrapper Sql-alterfunction Sql-altergroup Sql-alterindex Sql-alterlanguage Sql-alterlargeobject Sql-alteroperator Sql-alteropclass Sql-alteropfamily Sql-alterrole Sql-alterschema Sql-altersequence Sql-alterserver Sql-altertable Sql-altertablespace Sql-altertsconfig Sql-altertsdictionary Sql-altertsparser Sql-altertstemplate Sql-altertrigger Sql-altertype Sql-alteruser Sql-alterusermapping Sql-alterview Sql-analyze Sql-begin Sql-checkpoint Sql-close Sql-cluster Sql-comment Sql-commit Sql-commit-prepared Sql-copy Sql-createaggregate Sql-createcast Sql-createconstraint Sql-createconversion Sql-createdatabase Sql-createdomain Sql-createforeigndatawrapper Sql-createfunction Sql-creategroup Sql-createindex Sql-createlanguage Sql-createoperator Sql-createopclass Sql-createopfamily Sql-createrole Sql-createrule Sql-createschema Sql-createsequence Sql-createserver Sql-createtable Sql-createtableas Sql-createtablespace Sql-createtsconfig Sql-createtsdictionary Sql-createtsparser Sql-createtstemplate Sql-createtrigger Sql-createtype Sql-createuser Sql-createusermapping Sql-createview Sql-deallocate Sql-declare Sql-delete Sql-discard Sql-do Sql-dropaggregate Sql-dropcast Sql-dropconversion Sql-dropdatabase Sql-dropdomain Sql-dropforeigndatawrapper Sql-dropfunction Sql-dropgroup Sql-dropindex Sql-droplanguage Sql-dropoperator Sql-dropopclass Sql-dropopfamily Sql-drop-owned Sql-droprole Sql-droprule Sql-dropschema Sql-dropsequence Sql-dropserver Sql-droptable Sql-droptablespace Sql-droptsconfig Sql-droptsdictionary Sql-droptsparser Sql-droptstemplate Sql-droptrigger Sql-droptype Sql-dropuser Sql-dropusermapping Sql-dropview Sql-end Sql-execute Sql-explain Sql-fetch Sql-grant Sql-insert Sql-listen Sql-load Sql-lock Sql-move Sql-notify Sql-prepare Sql-prepare-transaction Sql-reassign-owned Sql-reindex Sql-release-savepoint Sql-reset Sql-revoke Sql-rollback Sql-rollback-prepared Sql-rollback-to Sql-savepoint Sql-select Sql-selectinto Sql-set Sql-set-constraints Sql-set-role Sql-set-session-authorization Sql-set-transaction Sql-show Sql-start-transaction Sql-truncate Sql-unlisten Sql-update Sql-vacuum Sql-values II. 客戶端應(yīng)用程序 App-clusterdb App-createdb App-createlang App-createuser App-dropdb App-droplang App-dropuser App-ecpg App-pgconfig App-pgdump App-pg-dumpall App-pgrestore App-psql App-reindexdb App-vacuumdb III. PostgreSQL服務(wù)器應(yīng)用程序 App-initdb App-pgcontroldata App-pg-ctl App-pgresetxlog App-postgres App-postmaster VII. 內(nèi)部 章44. PostgreSQL內(nèi)部概覽 44.1. 查詢路徑 44.2. 連接是如何建立起來的 44.3. 分析器階段 44.4. ThePostgreSQL規(guī)則系統(tǒng) 44.5. 規(guī)劃器/優(yōu)化器 44.6. 執(zhí)行器 章45. 系統(tǒng)表 45.1. 概述 45.2. pg_aggregate 45.3. pg_am 45.4. pg_amop 45.5. pg_amproc 45.6. pg_attrdef 45.7. pg_attribute 45.8. pg_authid 45.9. pg_auth_members 45.10. pg_cast 45.11. pg_class 45.12. pg_constraint 45.13. pg_conversion 45.14. pg_database 45.15. pg_db_role_setting 45.16. pg_default_acl 45.17. pg_depend 45.18. pg_description 45.19. pg_enum 45.20. pg_foreign_data_wrapper 45.21. pg_foreign_server 45.22. pg_index 45.23. pg_inherits 45.24. pg_language 45.25. pg_largeobject 45.26. pg_largeobject_metadata 45.27. pg_namespace 45.28. pg_opclass 45.29. pg_operator 45.30. pg_opfamily 45.31. pg_pltemplate 45.32. pg_proc 45.33. pg_rewrite 45.34. pg_shdepend 45.35. pg_shdescription 45.36. pg_statistic 45.37. pg_tablespace 45.38. pg_trigger 45.39. pg_ts_config 45.40. pg_ts_config_map 45.41. pg_ts_dict 45.42. pg_ts_parser 45.43. pg_ts_template 45.44. pg_type 45.45. pg_user_mapping 45.46. System Views 45.47. pg_cursors 45.48. pg_group 45.49. pg_indexes 45.50. pg_locks 45.51. pg_prepared_statements 45.52. pg_prepared_xacts 45.53. pg_roles 45.54. pg_rules 45.55. pg_settings 45.56. pg_shadow 45.57. pg_stats 45.58. pg_tables 45.59. pg_timezone_abbrevs 45.60. pg_timezone_names 45.61. pg_user 45.62. pg_user_mappings 45.63. pg_views 章46. Frontend/Backend Protocol 46.1. Overview 46.2. Message Flow 46.3. Streaming Replication Protocol 46.4. Message Data Types 46.5. Message Formats 46.6. Error and Notice Message Fields 46.7. Summary of Changes since Protocol 2.0 47. PostgreSQL Coding Conventions 47.1. Formatting 47.2. Reporting Errors Within the Server 47.3. Error Message Style Guide 章48. Native Language Support 48.1. For the Translator 48.2. For the Programmer 章49. Writing A Procedural Language Handler 章50. Genetic Query Optimizer 50.1. Query Handling as a Complex Optimization Problem 50.2. Genetic Algorithms 50.3. Genetic Query Optimization (GEQO) in PostgreSQL 50.4. Further Reading 章51. 索引訪問方法接口定義 51.1. 索引的系統(tǒng)表記錄 51.2. 索引訪問方法函數(shù) 51.3. 索引掃描 51.4. 索引鎖的考量 51.5. 索引唯一性檢查 51.6. 索引開銷估計(jì)函數(shù) 章52. GiST Indexes 52.1. Introduction 52.2. Extensibility 52.3. Implementation 52.4. Examples 52.5. Crash Recovery 章53. GIN Indexes 53.1. Introduction 53.2. Extensibility 53.3. Implementation 53.4. GIN tips and tricks 53.5. Limitations 53.6. Examples 章54. 數(shù)據(jù)庫物理存儲(chǔ) 54.1. 數(shù)據(jù)庫文件布局 54.2. TOAST 54.3. 自由空間映射 54.4. 可見映射 54.5. 數(shù)據(jù)庫分頁文件 章55. BKI后端接口 55.1. BKI 文件格式 55.2. BKI命令 55.3. 系統(tǒng)初始化的BKI文件的結(jié)構(gòu) 55.4. 例子 章56. 規(guī)劃器如何使用統(tǒng)計(jì)信息 56.1. 行預(yù)期的例子 VIII. 附錄 A. PostgreSQL錯(cuò)誤代碼 B. 日期/時(shí)間支持 B.1. 日期/時(shí)間輸入解析 B.2. 日期/時(shí)間關(guān)鍵字 B.3. 日期/時(shí)間配置文件 B.4. 日期單位的歷史 C. SQL關(guān)鍵字 D. SQL Conformance D.1. Supported Features D.2. Unsupported Features E. Release Notes Release-0-01 Release-0-02 Release-0-03 Release-1-0 Release-1-01 Release-1-02 Release-1-09 Release-6-0 Release-6-1 Release-6-1-1 Release-6-2 Release-6-2-1 Release-6-3 Release-6-3-1 Release-6-3-2 Release-6-4 Release-6-4-1 Release-6-4-2 Release-6-5 Release-6-5-1 Release-6-5-2 Release-6-5-3 Release-7-0 Release-7-0-1 Release-7-0-2 Release-7-0-3 Release-7-1 Release-7-1-1 Release-7-1-2 Release-7-1-3 Release-7-2 Release-7-2-1 Release-7-2-2 Release-7-2-3 Release-7-2-4 Release-7-2-5 Release-7-2-6 Release-7-2-7 Release-7-2-8 Release-7-3 Release-7-3-1 Release-7-3-10 Release-7-3-11 Release-7-3-12 Release-7-3-13 Release-7-3-14 Release-7-3-15 Release-7-3-16 Release-7-3-17 Release-7-3-18 Release-7-3-19 Release-7-3-2 Release-7-3-20 Release-7-3-21 Release-7-3-3 Release-7-3-4 Release-7-3-5 Release-7-3-6 Release-7-3-7 Release-7-3-8 Release-7-3-9 Release-7-4 Release-7-4-1 Release-7-4-10 Release-7-4-11 Release-7-4-12 Release-7-4-13 Release-7-4-14 Release-7-4-15 Release-7-4-16 Release-7-4-17 Release-7-4-18 Release-7-4-19 Release-7-4-2 Release-7-4-20 Release-7-4-21 Release-7-4-22 Release-7-4-23 Release-7-4-24 Release-7-4-25 Release-7-4-26 Release-7-4-27 Release-7-4-28 Release-7-4-29 Release-7-4-3 Release-7-4-30 Release-7-4-4 Release-7-4-5 Release-7-4-6 Release-7-4-7 Release-7-4-8 Release-7-4-9 Release-8-0 Release-8-0-1 Release-8-0-10 Release-8-0-11 Release-8-0-12 Release-8-0-13 Release-8-0-14 Release-8-0-15 Release-8-0-16 Release-8-0-17 Release-8-0-18 Release-8-0-19 Release-8-0-2 Release-8-0-20 Release-8-0-21 Release-8-0-22 Release-8-0-23 Release-8-0-24 Release-8-0-25 Release-8-0-26 Release-8-0-3 Release-8-0-4 Release-8-0-5 Release-8-0-6 Release-8-0-7 Release-8-0-8 Release-8-0-9 Release-8-1 Release-8-1-1 Release-8-1-10 Release-8-1-11 Release-8-1-12 Release-8-1-13 Release-8-1-14 Release-8-1-15 Release-8-1-16 Release-8-1-17 Release-8-1-18 Release-8-1-19 Release-8-1-2 Release-8-1-20 Release-8-1-21 Release-8-1-22 Release-8-1-23 Release-8-1-3 Release-8-1-4 Release-8-1-5 Release-8-1-6 Release-8-1-7 Release-8-1-8 Release-8-1-9 Release-8-2 Release-8-2-1 Release-8-2-10 Release-8-2-11 Release-8-2-12 Release-8-2-13 Release-8-2-14 Release-8-2-15 Release-8-2-16 Release-8-2-17 Release-8-2-18 Release-8-2-19 Release-8-2-2 Release-8-2-20 Release-8-2-21 Release-8-2-3 Release-8-2-4 Release-8-2-5 Release-8-2-6 Release-8-2-7 Release-8-2-8 Release-8-2-9 Release-8-3 Release-8-3-1 Release-8-3-10 Release-8-3-11 Release-8-3-12 Release-8-3-13 Release-8-3-14 Release-8-3-15 Release-8-3-2 Release-8-3-3 Release-8-3-4 Release-8-3-5 Release-8-3-6 Release-8-3-7 Release-8-3-8 Release-8-3-9 Release-8-4 Release-8-4-1 Release-8-4-2 Release-8-4-3 Release-8-4-4 Release-8-4-5 Release-8-4-6 Release-8-4-7 Release-8-4-8 Release-9-0 Release-9-0-1 Release-9-0-2 Release-9-0-3 Release-9-0-4 F. 額外提供的模塊 F.1. adminpack F.2. auto_explain F.3. btree_gin F.4. btree_gist F.5. chkpass F.6. citext F.7. cube F.8. dblink Contrib-dblink-connect Contrib-dblink-connect-u Contrib-dblink-disconnect Contrib-dblink Contrib-dblink-exec Contrib-dblink-open Contrib-dblink-fetch Contrib-dblink-close Contrib-dblink-get-connections Contrib-dblink-error-message Contrib-dblink-send-query Contrib-dblink-is-busy Contrib-dblink-get-notify Contrib-dblink-get-result Contrib-dblink-cancel-query Contrib-dblink-get-pkey Contrib-dblink-build-sql-insert Contrib-dblink-build-sql-delete Contrib-dblink-build-sql-update F.9. dict_int F.10. dict_xsyn F.11. earthdistance F.12. fuzzystrmatch F.13. hstore F.14. intagg F.15. intarray F.16. isn F.17. lo F.18. ltree F.19. oid2name F.20. pageinspect F.21. passwordcheck F.22. pg_archivecleanup F.23. pgbench F.24. pg_buffercache F.25. pgcrypto F.26. pg_freespacemap F.27. pgrowlocks F.28. pg_standby F.29. pg_stat_statements F.30. pgstattuple F.31. pg_trgm F.32. pg_upgrade F.33. seg F.34. spi F.35. sslinfo F.36. tablefunc F.37. test_parser F.38. tsearch2 F.39. unaccent F.40. uuid-ossp F.41. vacuumlo F.42. xml2 G. 外部項(xiàng)目 G.1. 客戶端接口 G.2. 過程語言 G.3. 擴(kuò)展 H. The Source Code Repository H.1. Getting The Source Via Git I. 文檔 I.1. DocBook I.2. 工具集 I.3. 制作文檔 I.4. 文檔寫作 I.5. 風(fēng)格指導(dǎo) J. 首字母縮略詞 參考書目 Bookindex Index
文字

SELECT

Name

SELECT, TABLE, WITH?--?從表或視圖中取出若干行

Synopsis

[ WITH [ RECURSIVE ] with_query [, ...] ]
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
    * | expression [ [ AS ] output_name ] [, ...]
    [ FROM from_item [, ...] ]
    [ WHERE condition ]
    [ GROUP BY expression [, ...] ]
    [ HAVING condition [, ...] ]
    [ WINDOW window_name AS ( window_definition ) [, ...] ]
    [ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]
    [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]
    [ LIMIT { count | ALL } ]
    [ OFFSET start [ ROW | ROWS ] ]
    [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]
    [ FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ] [...] ]

where from_item can be one of:

    [ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
    ( select ) [ AS ] alias [ ( column_alias [, ...] ) ]
    with_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
    function_name ( [ argument [, ...] ] ) [ AS ] alias [ ( column_alias [, ...] | column_definition [, ...] ) ]
    function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] )
    from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]

and with_query is:

    with_query_name [ ( column_name [, ...] ) ] AS ( select )

TABLE { [ ONLY ] table_name [ * ] | with_query_name }

描述

SELECT將從零個(gè)或更多表中返回記錄行。SELECT通常的處理如下:

  1. (See WITH Clause below.) 在WITH列表中的所有查詢都被計(jì)算。這些可以有效地充當(dāng)在 FROM列表中可以被參照的臨時(shí)表。在FROM 中的一個(gè)引用多于一次的WITH查詢僅計(jì)算一次。

  2. 計(jì)算列出在FROM中的所有元素(FROM列表中 的每個(gè)元素都是一個(gè)實(shí)際的或虛擬的表)。 如果在FROM列表里聲明了多個(gè)元素,那么他們就交叉連接在一起 (參見下面的FROM子句子句)。

  3. 如果聲明了WHERE子句,那么在輸出中消除所有不滿足條件的行。 參見下面的 WHERE子句子句。

  4. 如果聲明了GROUP BY子句,輸出就分成匹配一個(gè)或多個(gè)數(shù)值的不同組里。 如果出現(xiàn)了HAVING子句,那么它消除那些不滿足給出條件的組。 參見下面的GROUP BY子句子句和 HAVING子句子句。

  5. 實(shí)際輸出行將使用SELECT輸出表達(dá)式針對(duì)每一個(gè)選中的行進(jìn)行計(jì)算。 參見下面的SELECT列表列表。

  6. 使用UNION, INTERSECTEXCEPT可以把多個(gè)SELECT語句的輸出合并成一個(gè)結(jié)果集。 UNION操作符返回兩個(gè)結(jié)果集的并集。INTERSECT操作符返回兩個(gè)結(jié)果集的交集。 EXCEPT操作符返回在第一個(gè)結(jié)果集對(duì)第二個(gè)結(jié)果集的差集。不管哪種情況,重復(fù)的行都被刪除, 除非聲明了ALL。參閱下面的UNION 子句子句、INTERSECT子句子句、EXCEPT子句子句。

  7. 如果聲明了ORDER BY子句,那么返回的行將按照指定的順序排序。 如果沒有給出ORDER BY,那么數(shù)據(jù)行是按照系統(tǒng)認(rèn)為可以最快生成的順序給出的。 參閱下面的ORDER BY子句子句。

  8. DISTINCT從結(jié)果中刪除那些重復(fù)的行。DISTINCT ON刪除那些匹配所有指定表達(dá)式的行。 ALL(缺省)將返回所有候選行,包括重復(fù)的。參閱下面的DISTINCT子句子句。

  9. 如果給出了LIMITFETCH FIRST)或 OFFSET子句,那么SELECT語句只返回結(jié)果行的一個(gè)子集。 參閱下面的LIMIT子句子句。

  10. 如果聲明了FOR UPDATEFOR SHARE子句, 那么SELECT語句對(duì)并發(fā)的更新鎖住選定的行。參閱下面的FOR UPDATE/FOR SHARE子句子句。

您必須有SELECT權(quán)限用于SELECT命令中每一列。 使用FOR UPDATEFOR SHARE還要求UPDATE權(quán)限。 (至少在如此選定的每表的一個(gè)列上。)

參數(shù)

WITH Clause

WITH子句允許您指定一個(gè)或者多個(gè)可以通過主查詢中的名稱參照的子句。 子查詢?cè)谡麄€(gè)主查詢期間有效地充當(dāng)臨時(shí)表或者視圖。

一個(gè)名稱(有模式修飾)必須對(duì)每個(gè)WITH查詢指定。根據(jù)需要, 可以指定一個(gè)列名列表;若省略了這些,列名可從主查詢省略。

如果RECURSIVE已指定,它允許一個(gè)子查詢通過名稱引用自身。 這樣一個(gè)子查詢必須按如下格式

non_recursive_term UNION [ ALL ] recursive_term

此時(shí)遞歸的自我參照必須出現(xiàn)在UNION的左邊一側(cè)。每個(gè)查詢中僅允許 一個(gè)遞歸的自我查詢。

RECURSIVE的另一個(gè)作用是WITH不需要配需: 一個(gè)查詢可以參照在列表后的另一個(gè)。(然而,循環(huán)引用,或者互遞歸,在這里沒有實(shí)現(xiàn)。) 沒有RECURSIVEWITH查詢只能參照早些時(shí)候 在WITH中的同類的WITH查詢,

WITH查詢的一個(gè)有效性能是:每次執(zhí)行主查詢時(shí)他們僅評(píng)估一次, 即使主查詢引用過他們不止一次。

請(qǐng)參閱Section 7.8獲取其他信息。

FROM子句

FROM子句為SELECT聲明一個(gè)或者多個(gè)源表。 如果聲明了多個(gè)源表,那么結(jié)果就是所有源表的笛卡兒積(交叉連接)。 但是通常會(huì)添加一些條件,把返回行限制成笛卡兒積的一個(gè)小的子集。

The FROM子句可以包括下列元素:

table_name

一個(gè)現(xiàn)存的表或視圖的名字(可以有模式修飾)。如果聲明了ONLY,則只掃描該表; 否則,該表和所有其派生表(如果沒有聲明ONLY)都被掃描。

alias

為那些包含別名的FROM項(xiàng)目取的別名。別名用于縮寫或者在自連接中消除歧義 (自連接中同一個(gè)表將掃描多次)。如果提供了別名,那么它就會(huì)完全隱藏表或者函數(shù)的實(shí)際名字; 比如,如果給出FROM foo AS f,那么SELECT剩下的東西必須把這個(gè)FROM項(xiàng)按照 f而不是foo引用。 如果寫了別名,也可以提供一個(gè)字段別名列表,這樣可以替換表中一個(gè)或者多個(gè)字段的名字。

select

可以在FROM子句里出現(xiàn)一個(gè)子SELECT。 它的輸出作用好像是為這條SELECT命令在其生存期里創(chuàng)建一個(gè)臨時(shí)表。 請(qǐng)注意這個(gè)子SELECT必須用園括弧包圍。并且必須給它一個(gè)別名。 當(dāng)然,VALUES同樣也可以在這里使用。

with_query_name

名可以提供與對(duì)一個(gè)表相同的方式。 一個(gè)WITH查詢通過寫其名稱來引用,正如查詢的名字是一個(gè)表名。 實(shí)際上WITH查詢?yōu)橹鞑樵冸[藏相同名稱的任何實(shí)際表。必要時(shí), 您可以通過模式修飾的表的名稱引用一個(gè)相同名稱的真實(shí)表。

function_name

函數(shù)(特別是那些返回結(jié)果集的函數(shù))調(diào)用可以出現(xiàn)在FROM子句里。 這么做就好像在這個(gè)SELECT命令的生命期中,把函數(shù)的輸出創(chuàng)建為一個(gè)臨時(shí)表一樣。 當(dāng)然也可以使用別名。如果寫了別名,還可以寫一個(gè)字段別名列表, 為函數(shù)返回的復(fù)合類型的一個(gè)或多個(gè)屬性提供名字替換。如果函數(shù)定義為返回record類型, 那么必須出現(xiàn)一個(gè)AS關(guān)鍵字或者別名, 后面跟著一個(gè)形如( column_name data_type [, ... ] )的字段定義列表。 這個(gè)字段定義列表必須匹配函數(shù)返回的字段的實(shí)際數(shù)目和類型。

join_type

下列之一

  • [ INNER ] JOIN

  • LEFT [ OUTER ] JOIN

  • RIGHT [ OUTER ] JOIN

  • FULL [ OUTER ] JOIN

  • CROSS JOIN

必須為INNEROUTER連接類型聲明一個(gè)連接條件, 也就是NATURAL,ON join_conditionUSING (join_column [, ...])之一。 它們的含義見下文,對(duì)于CROSS JOIN而言,這些子句都不能出現(xiàn)。

一個(gè)JOIN子句組合兩個(gè)FROM項(xiàng)。 必要時(shí)使用圓括弧以決定嵌套的順序。 如果沒有圓括弧,JOIN從左向右嵌套。在任何情況下, JOIN都比逗號(hào)分隔的FROM項(xiàng)綁定得更緊。

CROSS JOININNER JOIN生成一個(gè)簡(jiǎn)單的笛卡兒積, 和您在FROM的頂層列出兩個(gè)項(xiàng)的結(jié)果相同。 CROSS JOIN等效于INNER JOIN ON (TRUE),也就是說,沒有被條件刪除的行。 這種連接類型只是符號(hào)上的方便,因?yàn)樗鼈兒湍煤?jiǎn)單的FROMWHERE的效果一樣。

LEFT OUTER JOIN返回笛卡兒積中所有符合連接條件的行, 再加上左表中通過連接條件沒有匹配右表行的那些行。這樣,左邊的行將擴(kuò)展成生成表的全長, 方法是在那些右表對(duì)應(yīng)的字段位置填上NULL 。請(qǐng)注意,只在計(jì)算匹配的時(shí)候, 才使用JOIN子句的條件,外層的條件是在計(jì)算完畢之后施加的。

相應(yīng)的,RIGHT OUTER JOIN返回所有內(nèi)連接的結(jié)果行, 加上每個(gè)不匹配的右邊行(左邊用NULL擴(kuò)展)。這只是一個(gè)符號(hào)上的便利, 因?yàn)榭偸强梢园阉D(zhuǎn)換成一個(gè)LEFT OUTER JOIN,只要把左邊和右邊的輸入對(duì)掉一下即可。

FULL OUTER JOIN返回所有內(nèi)連接的結(jié)果行, 加上每個(gè)不匹配的左邊行(右邊用NULL擴(kuò)展), 再加上每個(gè)不匹配的右邊行(左邊用NULL擴(kuò)展)。

ON join_condition

join_condition是一個(gè)導(dǎo)致boolean 類型值的表達(dá)式(類似于一個(gè)WHERE子句)這指定在連接中哪些行認(rèn)為是匹配的。

一個(gè)生成boolean類型結(jié)果的表達(dá)式(類似WHERE子句),限定連接中那些行是匹配的。

USING ( join_column [, ...] )

一個(gè)形如USING ( a, b, ... )的子句, 是ON left_table.a = right_table.a AND left_table.b = right_table.b ...的縮寫。 同樣,USING蘊(yùn)涵著每對(duì)等效字段中只有一個(gè)包含在連接輸出中,而不是兩個(gè)都輸出的意思。

NATURAL

NATURAL是一個(gè)USING列表的縮寫, 這個(gè)列表說的是兩個(gè)表中同名的字段。

WHERE子句

可選的WHERE條件有如下常見的形式:

WHERE condition

這里condition可以是任意生成類型為boolean的表達(dá)式。 任何不滿足這個(gè)條件的行都會(huì)從輸出中刪除。如果一個(gè)行的數(shù)值代入到條件中計(jì)算出來的結(jié)果為真, 那么該行就算滿足條件。

GROUP BY子句

可選的GROUP BY子句的一般形式

GROUP BY expression [, ...]

GROUP BY將把所有在組合表達(dá)式上擁有相同值的行壓縮成一行。expression可以是一個(gè)輸入字段名字, 或者是一個(gè)輸出字段(SELECT列表項(xiàng))的名字或序號(hào),或者也可以是任意輸入字 段組成的表達(dá)式。在有歧義的情況下,一個(gè)GROUP BY的名字將被解釋成輸入字 段的名字,而不是輸出字段的名字。

如果使用了聚集函數(shù),那么就會(huì)對(duì)每組中的所有行進(jìn)行計(jì)算并生成一個(gè)單獨(dú)的值 (而如果沒有GROUP BY,那么聚集將對(duì)選出來的所有行計(jì)算 出一個(gè)單獨(dú)的值)。如果出現(xiàn)了GROUP BY,那么 SELECT列表表達(dá)式中再引用那些沒有分組的字段就是非法的, 除非放在聚集函數(shù)里,因?yàn)閷?duì)于未分組的字段,可能會(huì)返回多個(gè)數(shù)值。

HAVING子句

可選的HAVING子句有如下形式:

HAVING condition

這里condition與為WHERE 子句里聲明的相同。

HAVING去除了一些不滿足條件的組行。它與WHERE不同: WHERE在使用GROUP BY之前過濾出單獨(dú)的行, 而HAVING過濾由GROUP BY創(chuàng)建的行。在 condition里引用的每個(gè)字段都必須無歧義地引用 一個(gè)分組的行,除非引用出現(xiàn)在一個(gè)聚集函數(shù)里。

HAVING的出現(xiàn)把查詢變成一個(gè)分組的查詢,即使沒有GROUP BY子句也這樣。 這一點(diǎn)和那些包含聚集函數(shù)但沒有GROUP BY子句的查詢里發(fā)生的事情是一樣的。 所有選取的行都被認(rèn)為會(huì)形成一個(gè)單一的組,而SELECT列表和HAVING子句只能從聚集函數(shù)里面引用表的字段。 這樣的查詢?cè)?tt class="LITERAL">HAVING條件為真的時(shí)候?qū)l(fā)出一個(gè)行,如果為非真,則返回零行。

WINDOW Clause

可選的WINDOW子句有一般形式

WINDOW window_name AS ( window_definition ) [, ...]

此時(shí)window_name是一個(gè) 可以從隨后的窗口定義或者OVER子句引用的名稱,并且 window_definition

[ existing_window_name ]
[ PARTITION BY expression [, ...] ]
[ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]
[ frame_clause ]

如果指定一個(gè)existing_window_name, 那么必須引用WINDOW列表中的一個(gè)更早的條目;如存在,新窗口從這個(gè)條目復(fù)制其分區(qū)子句, 及其排序子句。在這種情況下,新的窗口不能聲明其自身PARTITION BY子句, 并且它可以僅在復(fù)制窗口沒有一個(gè)ORDER BY子句時(shí)指定該子句,新窗口總是使用其自身的框 架條款;復(fù)制窗口不能指定一個(gè)框架條款。

PARTITION BY列表的元素以與GROUP BY子句 元素相同的形式來解譯,除了他們總是簡(jiǎn)單的表達(dá)式并且從不是一個(gè)輸出列的名稱或者編號(hào)。 另一個(gè)不同是這些表達(dá)式包含聚集函數(shù)調(diào)用,這些在常規(guī)GROUP BY子句中都是不允許的。 他們?cè)诖颂幵试S是因?yàn)殚_窗在分組和聚集之后發(fā)生。

同樣地,ORDER BY列表的元素以與ORDER BY子句 的元素相同的形式來解譯,除了這個(gè)表達(dá)式總是作為簡(jiǎn)單的表達(dá)式并且從不是一個(gè)輸出列的名稱或者編號(hào)。

可選的frame_clause為基于框架(并非全都基于此)的窗口函數(shù)定義 window frame。窗口框架是面向查詢的每一行的一組相關(guān)行(稱作current row)。 frame_clause可以作為下面中的一個(gè)

[ RANGE | ROWS ] frame_start
[ RANGE | ROWS ] BETWEEN frame_start AND frame_end

此時(shí)frame_startframe_end是以下其一

UNBOUNDED PRECEDING
value PRECEDING
CURRENT ROW
value FOLLOWING
UNBOUNDED FOLLOWING

frame_end被省略,其默認(rèn)值為CURRENT ROW。 限制條件是frame_start不能是UNBOUNDED FOLLOWING, frame_end不能是UNBOUNDED PRECEDING, 并且frame_end選擇不能比frame_start選擇更早出現(xiàn)在 以上列表中—例如:不允許RANGE BETWEEN CURRENT ROW AND value PRECEDING。

默認(rèn)框架選項(xiàng)是RANGE UNBOUNDED PRECEDING,這與 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW相同; 它將框架設(shè)置為分區(qū)中的所有行,在ORDER BY序列中是從當(dāng)前行的最后一個(gè)元素開始 (這意味著若無從則是所有行)。通常,UNBOUNDED PRECEDING表示框架從分區(qū)的第一 行開始,類似地UNBOUNDED FOLLOWING表示框架已分區(qū)的最后一行結(jié)束(不管是 RANGE或者ROWS模式)。在ROWS模式,CURRENT ROW 意味著框架以當(dāng)前行在ORDER BY序列中的首個(gè)獲最后一個(gè)元素開始或者結(jié)束。 value PRECEDINGvalueFOLLOWING 目前僅允許在ROWS模式。他們表明框架以當(dāng)前行之前或者之后許多航開始或者結(jié)束。 value必須是一個(gè)不包含任何變量、聚集函數(shù)或者窗口函數(shù)的整型表達(dá)式。 該值不能為空或者負(fù)值;但可以為0,并且這時(shí)選擇當(dāng)前行本身。

注意ROWS選項(xiàng)可以產(chǎn)生不可預(yù)測(cè)的結(jié)果,如果ORDER BY序列 若ORDER BY序列不能唯一地排列行。RANGE選項(xiàng)是為了確保是 ORDER BY序列中的peers的行能得到同等對(duì)待;任何兩個(gè)對(duì)等行將會(huì)都在或 者都不在框架中。

一個(gè)WINDOW語句的目的是指定出現(xiàn)在 SELECT列表或者 ORDER BY子句中的 window functions的性能。這些函數(shù)可以通過在其OVER子句中的名稱 參照WINDOW子句條目。一個(gè)WINDOW子句條目任何地方都 不需要參照;若它不在查詢中使用,它將被忽略??梢允褂么翱诔绦蚨静恍枰魏?tt class="LITERAL">WINDOW, 盡管一個(gè)窗口函數(shù)調(diào)用可以直接在其OVER子句中指定其窗口定義。然而, WINDOW子句會(huì)在多于一個(gè)窗口函數(shù)需要相同窗口定義時(shí)保存輸入。

窗口函數(shù)在Section 3.5, Section 4.2.8和 Section 7.2.4中有詳細(xì)描述。

SELECT列表

SELECT列表(在SELECTFROM關(guān)鍵字之間的部分)聲明組成 SELECT語句的輸出行的表達(dá)式。這些表達(dá)式可以(并且通常也會(huì))引用在 FROM子句里面計(jì)算出來的字段。

就像在一個(gè)表中,一個(gè)SELECT的每個(gè)輸出列都有一個(gè)名稱。 在一個(gè)簡(jiǎn)單的SELECT中,該名稱僅用于標(biāo)記顯示的列,但當(dāng) SELECT是一個(gè)較大查詢的子查詢時(shí),名稱被較大查詢視為子查詢產(chǎn)生的 虛表的列名。為了指定用于輸出列的名稱,要在列表達(dá)式后寫 AS output_name。 (您可以省略AS,但只有當(dāng)所需的輸出名稱不匹配任何 PostgreSQL 關(guān)鍵字時(shí)(請(qǐng)參閱Appendix C)。)為了防止將來可能的關(guān)鍵字添加, 建議您要么寫AS要么用雙引號(hào)引起輸出名稱。) 如果你不指定一個(gè)列名稱,PostgreSQL會(huì)自動(dòng)選擇 一個(gè)名稱。如果列的表達(dá)式是一個(gè)簡(jiǎn)單的列參照,那么選擇的名稱與列名相同; 在更復(fù)雜的情況下,同?columnN?的生成名 通常會(huì)被選擇。

一個(gè)輸出列的名稱可以用來參考ORDER BYGROUP BY子句中的 列的值,而不是在WHERE或者HAVING子句中的;反而您必須在 那里寫出表達(dá)式。

除了表達(dá)式,也可以在輸出列表中使用*表示所有字段。 還可以用table_name.* 作為來自該表的所有字段的縮寫。 在這西情況下用AS指定新名稱是不可能的;輸出列的名稱將會(huì)與表列的名稱 相同。

UNION 子句

UNION子句的一般形式是:

select_statement UNION [ ALL ] select_statement

這里的select_statement是任意沒有 ORDER BYLIMIT,FOR UPDATEFOR SHARE子句的SELECT語句。 如果用圓括弧包圍,ORDER BYLIMIT可以附著在子表達(dá)式里。 如果沒有圓括弧,這些子句將交給UNION的結(jié)果使用,而不是給它們右邊的輸入表達(dá)式。

UNION操作符計(jì)算那些涉及到的所有SELECT語句返回的行的結(jié)果聯(lián)合。 一個(gè)行如果至少在兩個(gè)結(jié)果集中的一個(gè)里面出現(xiàn),那么它就會(huì)在這兩個(gè)結(jié)果集的集合聯(lián)合中。 兩個(gè)作為UNION直接操作數(shù)的SELECT必須生成相同數(shù)目的字段, 并且對(duì)應(yīng)的字段必須有兼容的數(shù)據(jù)類型。

缺省的UNION結(jié)果不包含任何重復(fù)的行,除非聲明了ALL子句。ALL 制止了消除重復(fù)的動(dòng)作。 因此,UNION ALL通常比UNION明顯要快,可能的情況下盡量使用ALL。

同一個(gè)SELECT語句中的多個(gè)UNION操作符是從左向右計(jì)算的, 除非用圓括弧進(jìn)行了標(biāo)識(shí)。

目前,FOR UPDATEFOR SHARE不能在UNION的結(jié)果或輸入中聲明。

INTERSECT子句

INTERSECT子句的一般形式是:

select_statement INTERSECT [ ALL ] select_statement

select_statement是任何不帶ORDER BY,LIMITFOR UPDATEFOR SHARE子句的SELECT語句。

INTERSECT計(jì)算涉及的SELECT語句返回的行集合的交集。 如果一個(gè)行在兩個(gè)結(jié)果集中都出現(xiàn),那么它就在兩個(gè)結(jié)果集的交集中。

INTERSECT 的結(jié)果不包含任何重復(fù)行,除非您聲明了ALL選項(xiàng)。用了ALL以后, 一個(gè)在左邊的表里有m個(gè)重復(fù)而在右邊表里有n個(gè)重復(fù)的 行將出現(xiàn)min(m,n)次。

除非用圓括號(hào)指明順序,同一個(gè)SELECT語句中的多個(gè) INTERSECT操作符是從左向右計(jì)算的。 INTERSECTUNION綁定得更緊, 也就是說A UNION B INTERSECT C將理解成A UNION (B INTERSECT C),除非您用圓括弧聲明。

目前,不能給INTERSECT的結(jié)果或者任何INTERSECT 的輸入聲明FOR UPDATEFOR SHARE。

EXCEPT子句

EXCEPT子句有如下的通用形式:

select_statement EXCEPT [ ALL ] select_statement

select_statement是任何沒有ORDER BY,LIMITFOR UPDATE或者 FOR SHARE子句的SELECT表達(dá)式。

EXCEPT操作符計(jì)算存在于左邊SELECT語句的輸出而不存在于 右邊SELECT語句輸出的行。

EXCEPT的結(jié)果不包含任何重復(fù)的行, 除非聲明了ALL選項(xiàng)。使用ALL時(shí), 一個(gè)在左邊表中有m個(gè)重復(fù)而在右邊表中有n個(gè)重復(fù)的行將在結(jié)果中出現(xiàn) max(m-n,0)次。

除非用圓括弧指明順序,否則同一個(gè)SELECT語句中的多個(gè)EXCEPT操作符是從左向右計(jì)算的。 EXCEPTUNION的綁定級(jí)別相同。

目前,不能給EXCEPT的結(jié)果或者任何EXCEPT的輸入聲明FOR UPDATEFOR SHARE子句。

ORDER BY子句

可選的ORDER BY子句有下面的一般形式:

ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...]

ORDER BY子句導(dǎo)致結(jié)果行根據(jù)指定的表達(dá)式進(jìn)行排序。 如果根據(jù)最左邊的表達(dá)式,兩行的結(jié)果相同,那么就根據(jù)下一個(gè)表達(dá)式進(jìn)行比較, 依此類推。如果對(duì)于所有聲明的表達(dá)式他們都相同,那么按隨機(jī)順序返回。

expression可以是一個(gè)輸出字段(SELECT列表項(xiàng))的名字或者序號(hào), 或者也可以是用輸入字段的數(shù)值組成的任意表達(dá)式。

序數(shù)指的是輸出字段按順序(從左到右)的位置。這個(gè)特性可以對(duì)沒有唯一名稱的字段進(jìn)行排序。 這不是必須的,因?yàn)榭偸强梢酝ㄟ^AS子句給一個(gè)要輸出的字段賦予一個(gè)名稱。

ORDER BY里還可以使用任意表達(dá)式, 包括那些沒有出現(xiàn)在SELECT輸出列表里面的字段。因此下面的語句現(xiàn)在是合法的:

SELECT name FROM distributors ORDER BY code;

這個(gè)特性的一個(gè)局限就是應(yīng)用于UNION, INTERSECTEXCEPT查詢的ORDER BY子句 只能在一個(gè)輸出字段名或者數(shù)字上聲明,而不能在一個(gè)表達(dá)式上聲明。

請(qǐng)注意如果一個(gè)ORDER BY表達(dá)式是一個(gè)簡(jiǎn)單名稱, 同時(shí)匹配輸出字段和輸入字段,ORDER BY將把它解釋成輸出字段名稱。 這和GROUP BY在同樣情況下做的選擇正相反。這樣的不一致是由SQL標(biāo)準(zhǔn)強(qiáng)制的。

可以給ORDER BY子句里每個(gè)字段加一個(gè)可選的ASC(升序,缺省) 或DESC(降序)關(guān)鍵字。 還可以在USING子句里聲明一個(gè)排序操作符來實(shí)現(xiàn)排序。 一個(gè)排序操作符必須是一個(gè)小于或者大于一些B-tree操作符的數(shù)量。 ASC等效于使用USING <DESC等效于使用USING >。 但是一個(gè)用戶定義類型的創(chuàng)建者可以明確定義缺省的排序順序, 并且可以使用其他名稱的操作符。

如果指定NULLS LAT,空值會(huì)在所有非空值之后排序;如果指定 NULLS FIRST,空值會(huì)在所有非空值之前排序。如果兩者均為指定, 當(dāng)指定ASC時(shí),默認(rèn)反應(yīng)時(shí)是NULLS LAST,并且 當(dāng)指定DESC時(shí),默認(rèn)反應(yīng)時(shí)是NULLS FIRST(然而, 默認(rèn)地認(rèn)為空是大于非空的)。當(dāng)指定USING,默認(rèn)空排序時(shí)依賴 操作符是否是一個(gè)更小或者更大的操作符。

請(qǐng)注意排序選項(xiàng)僅適用于他們遵循的表達(dá)式;例如ORDER BY x, y DESC 不意味著與ORDER BY x DESC, y DESC相同。

字符類型的數(shù)據(jù)是按照區(qū)域相關(guān)的字符集順序排序的,這個(gè)區(qū)域是在數(shù)據(jù)庫創(chuàng)建的時(shí)候建立的。

DISTINCT子句

如果聲明了DISTINCT,那么就從結(jié)果集中刪除所有重復(fù)的行 (每個(gè)有重復(fù)的組都保留一行)。 ALL聲明相反的作用:所有行都被保留(這是缺省)。

DISTINCT ON ( expression [, ...] )只 保留那些在給出的表達(dá)式上運(yùn)算出相同結(jié)果的行集合中的第一行。 DISTINCT ON表達(dá)式是使用與ORDER BY 相同的規(guī)則進(jìn)行解釋的。 請(qǐng)注意,除非使用了ORDER BY來保證需要的行首先出現(xiàn),否則, "第一行"是不可預(yù)測(cè)的。比如,

SELECT DISTINCT ON (location) location, time, report
    FROM weather_reports
    ORDER BY location, time DESC;

為每個(gè)地點(diǎn)檢索最近的天氣報(bào)告。但是如果沒有使用ORDER BY來強(qiáng)制對(duì)每個(gè)地點(diǎn)的時(shí)間值進(jìn)行降序排序, 那么就會(huì)得到每個(gè)地點(diǎn)的不知道什么時(shí)候的報(bào)告。

DISTINCT ON表達(dá)式必須匹配最左邊的ORDER BY表達(dá)式。 ORDER BY子句將通常包含額外的表達(dá)式來判斷每個(gè)DISTINCT ON 組里面需要的行的優(yōu)先級(jí)。

LIMIT子句

LIMIT子句由兩個(gè)獨(dú)立的子句組成:

LIMIT { count | ALL }
OFFSET start

count聲明返回的最大行數(shù), 而start聲明開始返回行之前忽略的行數(shù)。 如果兩個(gè)都指定了,那么在開始計(jì)算count個(gè)返回行之前將先跳過 start行。

如果count表達(dá)式職位NULL, 它被當(dāng)做LIMIT ALL,也就是,沒有限制。如果 start 評(píng)估為空,他與 OFFSET 0相同對(duì)待。

SQL:2008引入了一個(gè)不同的語法來達(dá)到相同的效果,這也是PostgreSQL 支持的。這是:

OFFSET start { ROW | ROWS }
FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY

根據(jù)該標(biāo)準(zhǔn),OFFSET子句必須在FETCH子句之前 出現(xiàn),若兩個(gè)都存在;但是PostgreSQL的要求更為寬松并且允許兩種順序 中的任意一種。ROWROWS以及 FIRSTNEXT是不影響這些子句的效果的干擾詞, 在這個(gè)語法中。在該語法中,當(dāng)使用表達(dá)式而非start 或者count的簡(jiǎn)單常量,圓括號(hào)在大多數(shù) 情況下是有必要的。如果countFETCH中 省略了,它默認(rèn)為1.

使用LIMIT的一個(gè)好習(xí)慣是使用一個(gè)ORDER BY子句把結(jié)果行限制成一個(gè)唯一的順序。 否則您會(huì)得到無法預(yù)料的結(jié)果子集,您可能想要第十行到第二十行,除非您聲明ORDER BY, 否則您不知道什么順序。

查詢優(yōu)化器在生成查詢規(guī)劃時(shí)會(huì)把LIMIT考慮進(jìn)去, 所以您很有可能因給出的LIMITOFFSET值不同而得到不同的規(guī)劃(生成不同的行序)。 因此用不同的LIMIT/OFFSET值選擇不同的查詢結(jié)果的子集將不會(huì)產(chǎn)生一致的結(jié)果, 除非您用ORDER BY強(qiáng)制生成一個(gè)可預(yù)計(jì)的結(jié)果順序。這可不是bug;這是SQL生來的特點(diǎn) ,因?yàn)槌怯昧?tt class="LITERAL">ORDER BY約束順序,SQL不保證查詢生成的結(jié)果有任何特定的順序。

對(duì)于返回表行不同子集的相同LIMIT查詢的重復(fù)執(zhí)行甚至都是可能的, 如果沒有一個(gè)ORDER BY來強(qiáng)制選擇一個(gè)確定性子集。此外,這不是一個(gè) 漏洞;結(jié)果的決定論在這種情況下沒法保證。

FOR UPDATE/FOR SHARE子句

FOR UPDATE子句的形式如下:

FOR UPDATE [ OF table_name [, ...] ] [ NOWAIT ]

很相近的FOR SHARE子句的形式如下:

FOR SHARE [ OF table_name [, ...] ] [ NOWAIT ]

FOR UPDATE令那些被SELECT檢索出來的行被鎖住, 就像要更新一樣。這樣就避免它們?cè)诋?dāng)前事務(wù)結(jié)束前被其它事務(wù)修改或者刪除; 也就是說,其它企圖UPDATE, DELETESELECT FOR UPDATE這些行的事務(wù)將被阻塞, 直到當(dāng)前事務(wù)結(jié)束。同樣,如果一個(gè)來自其它事務(wù)的UPDATE,DELETE, 或SELECT FOR UPDATE 已經(jīng)鎖住了某個(gè)或某些選定的行,SELECT FOR UPDATE將等到那些事務(wù)結(jié)束,并且將隨后鎖住并返回更新的行(或者不返回行, 如果行已經(jīng)被刪除)。 在一個(gè)SERIALIZABLE事務(wù)內(nèi),然而,若要鎖定的一行已經(jīng)被改變, 一個(gè)錯(cuò)誤將會(huì)在事務(wù)啟動(dòng)后拋出,更多的討論參閱Chapter 13。

FOR SHARE的行為類似,只是它在每個(gè)檢索出來的行上要求一個(gè)共享鎖, 而不是一個(gè)排它鎖。一個(gè)共享鎖阻塞其它事務(wù)在這些行上執(zhí)行 UPDATE,DELETESELECT FOR UPDATE卻不阻止他們執(zhí)行SELECT FOR SHARE。

為了避免操作等待其它事務(wù)提交,使用NOWAIT選項(xiàng)。 那么NOWAIT將會(huì)立即匯報(bào)一個(gè)錯(cuò)誤,而不是等待。如果被選擇的行不能立即被鎖住,請(qǐng)注意, NOWAIT只適用于行級(jí)別的鎖,要求的表級(jí)鎖ROW SHARE仍然以通常的方法進(jìn)行 (參閱Chapter 13)。 如果需要申請(qǐng)表級(jí)別的鎖同時(shí)又不等待,那么您可以使用LOCK的 NOWAIT選項(xiàng)。

如果在FOR UPDATEFOR SHARE中明確指定了表名字, 那么將只有這些指定的表被鎖定,其他在SELECT中使用的表將不會(huì)被鎖定。 一個(gè)其后不帶表列表的FOR UPDATEFOR SHARE子句將鎖定該命令中所有使用的表。 如果FOR UPDATEFOR SHARE應(yīng)用于一個(gè)視圖或者子查詢, 它同樣將鎖定所有該視圖或子查詢中使用到的表。 然而,FOR UPDATE/FOR SHARE不適用于 主查詢引用的WITH查詢。如果你想行鎖在一個(gè)WITH查詢內(nèi)發(fā)生, 在WITH查詢內(nèi),指定FOR UPDATE或者 FOR SHARE

多個(gè)FOR UPDATEFOR SHARE子句可以用于為不同的表指定不同的鎖定模式。 如果一個(gè)表出同時(shí)出現(xiàn)(或隱含同時(shí)出現(xiàn))在FOR UPDATEFOR SHARE子句中,那么將按照FOR UPDATE處理。類似的, 如果影響一個(gè)表的任意子句中出現(xiàn)了NOWAIT,那么該表將按照NOWAIT處理。

FOR UPDATEFOR SHARE不能在那些無法使用獨(dú)立的表行清晰標(biāo)識(shí)返回行的環(huán)境里; 比如,它不能和聚集一起使用。

當(dāng)FOR UPDATE或者FOR SHARE 出現(xiàn)在SELECT查詢的頂層,鎖住的行通常都是那些查詢返回的; 對(duì)于連接查詢,鎖住的行是那些導(dǎo)致返回連接行的。此外,那些滿足查詢快照中的 查詢條件的行將被鎖住,盡管如果他們?cè)诳煺蘸蟊桓虏⑶也辉贊M足查詢條件, 就不會(huì)再被返回。 如果使用一個(gè)LIMIT,加鎖停止一次就足夠行返回滿足限制(但請(qǐng)注意 通過OFFSET跳過的行將會(huì)加鎖)。如果FOR UPDATE 或者FOR SHARE用于一個(gè)游標(biāo)的查詢,只有通過游標(biāo)實(shí)際讀取或 逐步執(zhí)行的行將會(huì)被鎖住。

當(dāng)FOR UPDATE或者FOR SHARE出現(xiàn)在 SELECT下面,鎖定的行是那些通過子查詢返回到外部查詢的。 這可能涉及到比檢查子查詢時(shí)顯示的更少的行,因?yàn)橥獠坎樵兊臈l件可能會(huì)用來 優(yōu)化子查詢的執(zhí)行。例如:

SELECT * FROM (SELECT * FROM mytable FOR UPDATE) ss WHERE col1 = 5;

將會(huì)鎖定僅擁有col1 = 5的行,即使那個(gè)條件在子查詢中不是 原文的。

Caution

不要先鎖定一個(gè)行然后在隨后的保存點(diǎn)或PL/pgSQL異常 塊中修改它。因?yàn)槿绻髞砘貪L的話將導(dǎo)致這個(gè)快丟失。例如:

BEGIN;
SELECT * FROM mytable WHERE key = 1 FOR UPDATE;
SAVEPOINT s;
UPDATE mytable SET ... WHERE key = 1;
ROLLBACK TO s;

ROLLBACK之后,該行將被解鎖,而不是返回其上一個(gè)保存點(diǎn)狀態(tài)(被鎖定但未被修改)。 如果一個(gè)在當(dāng)前事務(wù)中鎖定的行被更新或刪除,或者一個(gè)共享鎖被升級(jí)為排它鎖,這種情況就可能會(huì)出現(xiàn)。 在這兩種情況下,先前的鎖狀態(tài)將被遺忘。如果事務(wù)后來回滾到一個(gè)介于最初鎖命令和后來變更了鎖狀態(tài)之間的某個(gè)點(diǎn), 那么該行將表現(xiàn)得好像根本沒有被鎖定一樣。這個(gè)實(shí)現(xiàn)上的缺陷可能在將來的PostgreSQL版本中得到修補(bǔ)。

Caution

一個(gè)SELECT命令可以同時(shí)使用ORDER BYFOR UPDATE/SHARE返回行的順序。 這是因?yàn)?tt class="LITERAL">ORDER BY先生效。命令排序結(jié)果,但是可能會(huì)在其中一行 或多行上獲取鎖的時(shí)候被阻塞。但SELECT的阻塞被解除, 一些排序的列值可能已經(jīng)被修改,導(dǎo)致這些行不按順序出現(xiàn)(盡管它們是按初始 列值的順序的)。這個(gè)可以通過必要時(shí)在子查詢中配置 FOR UPDATE/SHARE來進(jìn)行,例如:

SELECT * FROM (SELECT * FROM mytable FOR UPDATE) ss ORDER BY column1;

請(qǐng)注意這將導(dǎo)致鎖定mytable的所有行,而頂層的FOR UPDATE 將會(huì)實(shí)際上僅鎖住返回行。這可能會(huì)產(chǎn)生一個(gè)顯著的性能差異,尤其是如果ORDER BYLIMIT或者其他限制結(jié)合。僅當(dāng)順序咧的并發(fā)更新是預(yù)期的并且一個(gè)嚴(yán)格的排序結(jié)果 是必須的時(shí),該技術(shù)才是建議使用的。

TABLE Command

命令

TABLE name

完全等價(jià)于

SELECT * FROM name

它可以用作復(fù)雜查詢中的一部分的一個(gè)頂級(jí)的命令或者一個(gè)節(jié)省空間的語法變體

例子

將表films和表distributors連接在一起:

SELECT f.title, f.did, d.name, f.date_prod, f.kind
    FROM distributors d, films f
    WHERE f.did = d.did

       title       | did |     name     | date_prod  |   kind
-------------------+-----+--------------+------------+----------
 The Third Man     | 101 | British Lion | 1949-12-23 | Drama
 The African Queen | 101 | British Lion | 1951-08-11 | Romantic
 ...

統(tǒng)計(jì)用kind分組的每組電影的長度(len)總和:

SELECT kind, sum(len) AS total FROM films GROUP BY kind;

   kind   | total
----------+-------
 Action   | 07:34
 Comedy   | 02:58
 Drama    | 14:28
 Musical  | 06:42
 Romantic | 04:38

統(tǒng)計(jì)用kind分組的每組電影的長度(len )總 和不足五小時(shí)的組:

SELECT kind, sum(len) AS total
    FROM films
    GROUP BY kind
    HAVING sum(len) < interval '5 hours';

   kind   | total
----------+-------
 Comedy   | 02:58
 Romantic | 04:38

下面兩個(gè)例子是根據(jù)第二列(name)的內(nèi)容對(duì)單獨(dú)的結(jié)果排序的經(jīng)典的方法:

SELECT * FROM distributors ORDER BY name;
SELECT * FROM distributors ORDER BY 2;

 did |       name
-----+------------------
 109 | 20th Century Fox
 110 | Bavaria Atelier
 101 | British Lion
 107 | Columbia
 102 | Jean Luc Godard
 113 | Luso films
 104 | Mosfilm
 103 | Paramount
 106 | Toho
 105 | United Artists
 111 | Walt Disney
 112 | Warner Bros.
 108 | Westward

下面這個(gè)例子演示如何獲得表distributorsactors 的連接,只將每個(gè)表中以字母W開頭的取出來。因?yàn)橹蝗×瞬恢貜?fù)的行,所以關(guān)鍵字 ALL被省略了:

distributors:               actors:
 did |     name              id |     name
-----+--------------        ----+----------------
 108 | Westward               1 | Woody Allen
 111 | Walt Disney            2 | Warren Beatty
 112 | Warner Bros.           3 | Walter Matthau
 ...                         ...

SELECT distributors.name
    FROM distributors
    WHERE distributors.name LIKE 'W%'
UNION
SELECT actors.name
    FROM actors
    WHERE actors.name LIKE 'W%';

      name
----------------
 Walt Disney
 Walter Matthau
 Warner Bros.
 Warren Beatty
 Westward
 Woody Allen

這個(gè)例子顯示了如何在FROM子句中使用函數(shù),包括帶有和不帶字段定義列表的。

CREATE FUNCTION distributors(int) RETURNS SETOF distributors AS $$
    SELECT * FROM distributors WHERE did = $1;
$$ LANGUAGE SQL;

SELECT * FROM distributors(111);
 did |    name
-----+-------------
 111 | Walt Disney

CREATE FUNCTION distributors_2(int) RETURNS SETOF record AS $$
    SELECT * FROM distributors WHERE did = $1;
$$ LANGUAGE SQL;

SELECT * FROM distributors_2(111) AS (f1 int, f2 text);
 f1  |     f2
-----+-------------
 111 | Walt Disney

這個(gè)例子展示了如何使用一個(gè)簡(jiǎn)單的WITH子句:

WITH t AS (
    SELECT random() as x FROM generate_series(1, 3)
  )
SELECT * FROM t
UNION ALL
SELECT * FROM t

         x          
--------------------
  0.534150459803641
  0.520092216785997
 0.0735620250925422
  0.534150459803641
  0.520092216785997
 0.0735620250925422

請(qǐng)注意WITH查詢僅評(píng)估一次,所以我們得到相同的三個(gè)隨機(jī)值的 兩個(gè)集合。

該示例使用WITH RECURSIVE來找到雇主Mary的所有下屬 (直接或者間接),以及他們的間接級(jí)別,從一個(gè)僅顯示直接下屬的表:

WITH RECURSIVE employee_recursive(distance, employee_name, manager_name) AS (
    SELECT 1, employee_name, manager_name
    FROM employee
    WHERE manager_name = 'Mary'
  UNION ALL
    SELECT er.distance + 1, e.employee_name, e.manager_name
    FROM employee_recursive er, employee e
    WHERE er.employee_name = e.manager_name
  )
SELECT distance, employee_name FROM employee_recursive;

注意遞歸查詢的典型形式:一個(gè)初始條件,緊接著是UNION, 然后是查詢的遞歸部分。確定查詢的遞歸部分最終將不會(huì)返回元組,否則 查詢將循環(huán)下去。(請(qǐng)參閱Section 7.8獲取更多示例)

兼容性

SELECT語句和SQL標(biāo)準(zhǔn)兼容。但是還有一些擴(kuò)展和一些缺少的特性。

省略FROM子句

PostgreSQL允許在一個(gè)查詢里省略FROM子句。 它的最直接用途就是計(jì)算簡(jiǎn)單的常量表達(dá)式的結(jié)果:

SELECT 2+2;

 ?column?
----------
        4

其它有些SQL數(shù)據(jù)庫不能這么做,除非引入一個(gè)單行的偽表做為 SELECT的數(shù)據(jù)源。

請(qǐng)注意,如果沒有聲明FROM子句,那么查詢不能引用任何數(shù)據(jù)庫表。 比如,下面的查詢是非法的:

SELECT distributors.* WHERE distributors.name = 'Westward';

PostgreSQL8.1之前的版本支持這種形式的查詢, 為查詢里引用的每個(gè)表都增加一個(gè)隱含的條目到FROM子句中?,F(xiàn)在這個(gè)不再是缺省的了。

省略AS關(guān)鍵字

在SQL標(biāo)準(zhǔn)中,每當(dāng)新列名稱是一個(gè)有效的列名時(shí),可選的關(guān)鍵字 AS可以在輸出列名之前省略(也即,不是跟任何保留關(guān)鍵字都相同的)。 PostgreSQL限制略多一些:不管是保留還是不保留, 如果新列名匹配任何關(guān)鍵字,AS是必要的。建議的做法是使用AS 或者雙括號(hào)括起輸出列名稱,以阻止對(duì)將來的關(guān)鍵字補(bǔ)充的任何可能的沖突。

FROM項(xiàng)中,標(biāo)準(zhǔn)和 PostgreSQL 都允許AS在一個(gè)無限制關(guān)鍵字別名之前省略。但是這對(duì)輸出列名 是不切實(shí)際的, 因?yàn)檎Z法的含糊不清。

ONLY和圓括號(hào)

SQL標(biāo)準(zhǔn)需要括號(hào)括起ONLY之后的表名,如同與SELECT * FROM ONLY (tab1), ONLY (tab2) WHERE ...。PostgreSQL也支持哪些,但是括號(hào)是可選的。 (該點(diǎn)同樣適用于所有支持ONLY選項(xiàng)的SQL命令。)

GROUP BYORDER BY里可用的名字空間

在SQL-92標(biāo)準(zhǔn)里,ORDER BY子句只能使用輸出字段名或者編號(hào), 而GROUP BY子句只能用基于輸入字段名的表達(dá)式。PostgreSQL對(duì)這兩個(gè)子句都進(jìn)行了擴(kuò)展, 允許另外一種選擇(但是如果存在歧義,則使用標(biāo)準(zhǔn)的解釋)。PostgreSQL還允許兩個(gè)子句聲明任意的表達(dá)式。 請(qǐng)注意在表達(dá)式中出現(xiàn)的名字總是被當(dāng)作輸入字段名,而不是輸出字段名。

SQL:1999以及之后的一個(gè)略微不同的定義并不能和SQL-92完全向前兼容。 不過,在大多數(shù)情況下,PostgreSQL將把 一個(gè)ORDER BYGROUP BY表達(dá)式解析成為SQL:1999制定的那樣。

WINDOW Clause Restrictions

SQL標(biāo)準(zhǔn)提供了窗口frame_clause的 附加選項(xiàng)。 PostgreSQL目前僅支持上面列出的選項(xiàng)。

LIMITOFFSET

語句LIMITOFFSET是特定的 PostgreSQL語法,也是MySQL 使用的。SQL:2008標(biāo)準(zhǔn)引入了OFFSET ... FETCH {FIRST|NEXT} ...獲取相同的功能性,如上面LIMIT子句 所示。該語法也被IBM DB2使用。(為Oracle 所寫的應(yīng)用程序通常使用一個(gè)涉及自動(dòng)生成的rownum列的工作區(qū), 要實(shí)現(xiàn)這些子句的效果,這在PostgreSQL中是不可用的。)

FOR UPDATE and FOR SHARE

盡管FOR UPDATE出現(xiàn)在SQL標(biāo)準(zhǔn)中,該標(biāo)準(zhǔn)允許它只是作為 DECLARE CURSOR的一個(gè)選項(xiàng)。PostgreSQL 允許它在人惡化SELECT查詢以及SELECT子查詢中, 但這是一個(gè)擴(kuò)展。FOR SHARE變體以及NOWAIT選項(xiàng), 不出現(xiàn)在標(biāo)準(zhǔn)中。

非標(biāo)準(zhǔn)子句

DISTINCT ON子句都沒有在SQL標(biāo)準(zhǔn)中定義。

上一篇: 下一篇: