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

directory search
前言 何為PostgreSQL? PostgreSQL簡史 格式約定 更多信息 臭蟲匯報指導 I. 教程 章1. 從頭開始 1.1. 安裝 1.2. 體系基本概念 1.3. 創(chuàng)建一個數(shù)據(jù)庫 1.4. 訪問數(shù)據(jù)庫 章2. SQL語言 2.1. 介紹 2.2. 概念 2.3. 創(chuàng)建新表 2.4. 向表中添加行 2.5. 查詢一個表 2.6. 表間鏈接 2.7. 聚集函數(shù) 2.8. 更新 2.9. 刪除 章3. 高級特性 3.1. 介紹 3.2. 視圖 3.3. 外鍵 3.4. 事務 3.5. 窗口函數(shù) 3.6. 繼承 3.7. 結(jié)論 II. SQL語言 章4. SQL語法 4.1. 詞法結(jié)構(gòu) 4.2. 值表達式 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ù)庫對象 5.11. 依賴性跟蹤 章 6. 數(shù)據(jù)操作 6.1. 插入數(shù)據(jù) 6.2. 更新數(shù)據(jù) 6.3. 刪除數(shù)據(jù) 章7. 查詢 7.1. 概述 7.2. 表表達式 7.3. 選擇列表 7.4. 組合查詢 7.5. 行排序 7.6. LIMIT和OFFSET 7.7. VALUES列表 7.8. WITH的查詢(公用表表達式) 章8. 數(shù)據(jù)類型 8.1. 數(shù)值類型 8.2. 貨幣類型 8.3. 字符類型 8.4. 二進制數(shù)據(jù)類型 8.5. 日期/時間類型 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. 復合類型 8.16. 對象標識符類型 8.17. 偽類型 章 9. 函數(shù)和操作符 9.1. 邏輯操作符 9.2. 比較操作符 9.3. 數(shù)學函數(shù)和操作符 9.4. 字符串函數(shù)和操作符 9.5. 二進制字符串函數(shù)和操作符 9.6. 位串函數(shù)和操作符 9.7. 模式匹配 9.8. 數(shù)據(jù)類型格式化函數(shù) 9.9. 時間/日期函數(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. 條件表達式 9.17. 數(shù)組函數(shù)和操作符 9.18. 聚合函數(shù) 9.19. 窗口函數(shù) 9.20. 子查詢表達式 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. 值存儲 10.5. UNION 章11. 索引 11.1. 介紹 11.2. 索引類型 11.3. 多字段索引 11.4. 索引和ORDER BY 11.5. 組合多個索引 11.6. 唯一索引 11.7. 表達式上的索引 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. 事務隔離 13.3. 明確鎖定 13.4. 應用層數(shù)據(jù)完整性檢查 13.5. 鎖和索引 章14. 性能提升技巧 14.1. 使用EXPLAIN 14.2. 規(guī)劃器使用的統(tǒng)計信息 14.3. 用明確的JOIN語句控制規(guī)劃器 14.4. 向數(shù)據(jù)庫中添加記錄 14.5. 非持久性設(shè)置 III. 服務器管理 章15. 安裝指導 15.1. 簡版 15.2. 要求 15.3. 獲取源碼 15.4. 升級 15.5. 安裝過程 15.6. 安裝后的設(shè)置 15.7. 支持的平臺 15.8. 特殊平臺的要求 章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. 服務器安裝和操作 17.1. PostgreSQL用戶帳戶 17.2. 創(chuàng)建數(shù)據(jù)庫集群 17.3. 啟動數(shù)據(jù)庫服務器 17.4. 管理內(nèi)核資源 17.5. 關(guān)閉服務 17.6. 防止服務器欺騙 17.7. 加密選項 17.8. 用SSL進行安全的TCP/IP連接 17.9. Secure TCP/IP Connections with SSH Tunnels 章18. 服務器配置 18.1. 設(shè)置參數(shù) 18.2. 文件位置 18.3. 連接和認證 18.4. 資源消耗 18.5. 預寫式日志 18.6. 查詢規(guī)劃 18.7. 錯誤報告和日志 18.8. 運行時統(tǒng)計 18.9. 自動清理 18.10. 客戶端連接缺省 18.12. 版本和平臺兼容性 18.11. 鎖管理 18.13. 預置選項 18.14. 自定義的選項 18.15. 開發(fā)人員選項 18.16. 短選項 章19. 用戶認證 19.1. pg_hba.conf 文件 19.2. 用戶名映射 19.3. 認證方法 19.4. 用戶認證 章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)建一個數(shù)據(jù)庫 21.3. 臨時庫 21.4. 數(shù)據(jù)庫配置 21.5. 刪除數(shù)據(jù)庫 21.6. 表空間 章22. 本土化 22.1. 區(qū)域支持 22.2. 字符集支持 章23. 日常數(shù)據(jù)庫維護工作 23.1. Routine Vacuuming日常清理 23.2. 經(jīng)常重建索引 23.3. 日志文件維護 章24. 備份和恢復 24.1. SQL轉(zhuǎn)儲 24.2. 文件系統(tǒng)級別的備份 24.3. 在線備份以及即時恢復(PITR) 24.4. 版本間遷移 章25. 高可用性與負載均衡,復制 25.1. 不同解決方案的比較 25.2. 日志傳送備份服務器 25.3. 失效切換 25.4. 日志傳送的替代方法 25.5. 熱備 章26. 恢復配置 26.1. 歸檔恢復設(shè)置 26.2. 恢復目標設(shè)置 26.3. 備服務器設(shè)置 章27. 監(jiān)控數(shù)據(jù)庫的活動 27.1. 標準Unix工具 27.2. 統(tǒng)計收集器 27.3. 查看鎖 27.4. 動態(tài)跟蹤 章28. 監(jiān)控磁盤使用情況 28.1. 判斷磁盤的使用量 28.2. 磁盤滿導致的失效 章29. 可靠性和預寫式日志 29.1. 可靠性 29.2. 預寫式日志(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. 連接服務的文件 31.16. LDAP查找連接參數(shù) 31.17. SSL支持 31.18. 在多線程程序里的行為 31.19. 制作libpq程序 31.20. 例子程序 章32. 大對象 32.1. 介紹 32.2. 實現(xiàn)特點 32.3. 客戶端接口 32.4. 服務器端函數(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)于這個模式 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. 服務器端編程 章35. 擴展SQL 35.1. 擴展性是如何實現(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++擴展 章36. 觸發(fā)器 36.1. 觸發(fā)器行為概述 36.3. 用 C 寫觸發(fā)器 36.2. 數(shù)據(jù)改變的可視性 36.4. 一個完整的例子 章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. 表達式 39.5. 基本語句 39.6. 控制結(jié)構(gòu) 39.7. 游標 39.8. 錯誤和消息 39.9. 觸發(fā)器過程 39.10. PL/pgSQL Under the Hood 39.11. 開發(fā)PL/pgSQL的一些提示 39.12. 從OraclePL/SQL 進行移植 章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. 參考手冊 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. 客戶端應用程序 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服務器應用程序 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. 索引開銷估計函數(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ù)庫物理存儲 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)計信息 56.1. 行預期的例子 VIII. 附錄 A. PostgreSQL錯誤代碼 B. 日期/時間支持 B.1. 日期/時間輸入解析 B.2. 日期/時間關(guān)鍵字 B.3. 日期/時間配置文件 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. 外部項目 G.1. 客戶端接口 G.2. 過程語言 G.3. 擴展 H. The Source Code Repository H.1. Getting The Source Via Git I. 文檔 I.1. DocBook I.2. 工具集 I.3. 制作文檔 I.4. 文檔寫作 I.5. 風格指導 J. 首字母縮略詞 參考書目 Bookindex Index
characters

7.2. 表表達式

一個表表達式計算一個表,它包含一個FROM子句,該子句可以根據(jù)需要選用WHERE,GROUP BYHAVING子句。大部分表表達式只是指向磁盤上的一個所謂的基本表,但是我們可以用更復雜的表表達式以各種方法修改或組合基本表。

表表達式里的WHERE,GROUP BYHAVING子句聲明一系列對源自FROM子句的表的轉(zhuǎn)換操作。所有這些轉(zhuǎn)換最后生成一個虛擬表,傳遞給選擇列表計算輸出行。

7.2.1. FROM子句

FROM Clause從一個逗號分隔的表引用列表中生成一個虛擬表

FROM table_reference [table_reference [, ...]]

表引用可以是一個表名字(可能有模式修飾)或者是一個生成的表,比如子查詢、表連接,或它們的復雜組合。如果在FROM子句中列出了多于一個表,那么它們被交叉連接(見下文)形成一個派生表,該表可以進行WHERE,GROUP BYHAVING子句的轉(zhuǎn)換處理,并最后生成表表達式的結(jié)果。

如果一個表引用的是一個簡單的父表的名字,那么將包括其所有子表的行,除非你在該表名字前面加ONLY關(guān)鍵字(這樣任何子表都會被忽略)。

7.2.1.1. 連接表

一個連接表是根據(jù)特定的連接規(guī)則從兩個其它表(真實表或生成表)中派生的表。我們支持內(nèi)連接、外連接、交叉連接。

連接類型

交叉連接
T1 CROSS JOIN T2

對每個來自T1T2的行進行組合(即笛卡爾積),生成的表將包含這樣的行:所有T1里面的字段后面跟著所有T2里面的字段。如果兩表分別有N和M行,連接成的表將有N*M行。

FROM T1 CROSS JOIN T2 等效于FROM T1 ,T2 。它還等效于FROM T1 INNER JOIN T2 ON TRUE(見下文)。

條件連接
T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 ON boolean_expression
T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 USING ( join column list )
T1 NATURAL { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2

INNEROUTER對所有連接類型都是可選的。INNER為缺省。LEFT,RIGHTFULL隱含外連接。

連接條件ONUSING子句里聲明,或者用關(guān)鍵字NATURAL隱含地聲明。 連接條件判斷來自兩個源表中的那些行是"匹配"的,這些我們將在下面詳細解釋。

ON子句是最常見的連接條件的類型:它接收一個和WHERE子句相同的布爾表達式。 如果兩個分別來自T1T2的行在ON表達式上運算的結(jié)果為真,那么它們就算是匹配的行。

USING是個一個連接條件的縮寫語法:它接收一個用逗號分隔的字段名列表, 這些字段必須是連接表共有的并且其值必須相同。最后,JOIN USING會將每 一對相等的輸入字段輸出為一個字段,其后跟著所有其它字段。因此,USING (a, b, c)等效 于ON (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c),只不過 是如果使用了ON,那么在結(jié)果里a,bc字段都會有兩個, 而用USING的時候就只會有一個。(如果SELECT *被用的話他們會首先出現(xiàn))。

最后,NATURALUSING的一種縮寫形式:它自動形成一個由兩個表中 同名的字段組成的USING列表(同名字段只出現(xiàn)一次)。

條件連接可能的類型是:

INNER JOIN

內(nèi)連接。對于T1中的每一行R1,如果能在T2中找到一個或多個滿 足連接條件的行,那么這些滿足條件的每一行都在連接表中生成一行。

LEFT OUTER JOIN

左外連接。首先執(zhí)行一次內(nèi)連接。然后為每一個T1中無法在T2中找 到匹配的行生成一行,該行中對應T2的列用NULL補齊。因此,生成的連接表里無條件地包含來自T1里的每一行至少一個副本。

RIGHT OUTER JOIN

右外連接。首先執(zhí)行一次內(nèi)連接。然后為每一個T2中無法在T1中找到匹配的行生成一行,該行中對應T1的列用NULL補齊。因此, 生成的連接表里無條件地包含來自T2里的每一行至少一個副本。

FULL OUTER JOIN

全連接。首先執(zhí)行一次內(nèi)連接。然后為每一個T1與T2中找不到匹配的 行生成一行,該行中無法匹配的列用NULL補齊。因此,生成的連接表里無條 件地包含T1和T2里的每一行至少一個副本。

如果T1T2之一或全部是可以連接的表,那么所有類型的連接都可以串連或嵌套在一起。 你可以在JOIN子句周圍使用圓括弧來控制連接順序, 如果沒有圓括弧,那么JOIN子句從左向右嵌套。

為了解釋這些問題,假設(shè)我們有一個表t1

 num | name
-----+------
   1 | a
   2 | b
   3 | c

t2:

 num | value
-----+-------
   1 | xxx
   3 | yyy
   5 | zzz

然后我們用不同的連接方式可以獲得各種結(jié)果:

=> SELECT * FROM t1 CROSS JOIN t2;
 num | name | num | value
-----+------+-----+-------
   1 | a    |   1 | xxx
   1 | a    |   3 | yyy
   1 | a    |   5 | zzz
   2 | b    |   1 | xxx
   2 | b    |   3 | yyy
   2 | b    |   5 | zzz
   3 | c    |   1 | xxx
   3 | c    |   3 | yyy
   3 | c    |   5 | zzz
(9 rows)

=> SELECT * FROM t1 INNER JOIN t2 ON t1.num = t2.num;
 num | name | num | value
-----+------+-----+-------
   1 | a    |   1 | xxx
   3 | c    |   3 | yyy
(2 rows)

=> SELECT * FROM t1 INNER JOIN t2 USING (num);
 num | name | value
-----+------+-------
   1 | a    | xxx
   3 | c    | yyy
(2 rows)

=> SELECT * FROM t1 NATURAL INNER JOIN t2;
 num | name | value
-----+------+-------
   1 | a    | xxx
   3 | c    | yyy
(2 rows)

=> SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num;
 num | name | num | value
-----+------+-----+-------
   1 | a    |   1 | xxx
   2 | b    |     |
   3 | c    |   3 | yyy
(3 rows)

=> SELECT * FROM t1 LEFT JOIN t2 USING (num);
 num | name | value
-----+------+-------
   1 | a    | xxx
   2 | b    |
   3 | c    | yyy
(3 rows)

=> SELECT * FROM t1 RIGHT JOIN t2 ON t1.num = t2.num;
 num | name | num | value
-----+------+-----+-------
   1 | a    |   1 | xxx
   3 | c    |   3 | yyy
     |      |   5 | zzz
(3 rows)

=> SELECT * FROM t1 FULL JOIN t2 ON t1.num = t2.num;
 num | name | num | value
-----+------+-----+-------
   1 | a    |   1 | xxx
   2 | b    |     |
   3 | c    |   3 | yyy
     |      |   5 | zzz
(4 rows)

ON聲明的連接條件也可以包含與連接不直接相關(guān)的條件。這種功能 可能對某些查詢很有用,但是需要我們仔細想清楚。比如:

=> SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num AND t2.value = 'xxx';
 num | name | num | value
-----+------+-----+-------
   1 | a    |   1 | xxx
   2 | b    |     |
   3 | c    |     |
(3 rows)

請注意,放置在WHERE條款的限制 產(chǎn)生不同的結(jié)果:

=> SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num WHERE t2.value = 'xxx';
 num | name | num | value
-----+------+-----+-------
   1 | a    |   1 | xxx
(1 row)

這是因為在ON子句連接之處理,而WHERE子句在連接之處理。

7.2.1.2. 表和列別名

你可以給表或復雜的表引用起一個臨時的表別名,以便被其余的查詢引用,稱為tablealias.

要創(chuàng)建一個表別名,可以這樣:

FROM table_reference AS alias

FROM table_reference alias

AS關(guān)鍵字沒有特別的含義。alias可以是任意標識符。

表別名的典型應用是給長表名賦予比較短的標識,好讓連接子句更易讀一些。比如:

SELECT * FROM some_very_long_table_name s JOIN another_fairly_long_name a ON s.id = a.num;

別名變成了與當前查詢有關(guān)的表的名字,之后就不允許再用最初的名字了。因此這是無效的

SELECT * FROM my_table AS m WHERE my_table.a > 5;    -- wrong

表別名主要是為了方便標記,但對于自連接卻是必須的。比如:

SELECT * FROM people AS mother JOIN people AS child ON mother.id = child.mother_id;

另外,要引用子查詢的結(jié)果也必須使用別名(參見節(jié)Section 7.2.1.3)。

圓括弧用于解決歧義。下面的第一個語句把別名b賦予第二個my_table表; 而第二個語句則把別名b賦予了連接的結(jié)果。

SELECT * FROM my_table AS a CROSS JOIN my_table AS b ...
SELECT * FROM (my_table AS a CROSS JOIN my_table) AS b ...

另外一種形式的表別名除了給表賦予別名外,還給該表的字段也賦予了別名:

FROM table_reference [AS] alias ( column1 [, column2 [, ...]] )

如果聲明的字段別名比表里實際的字段少,那么后面的字段就沒有別名。這個語法對于自連接或子查詢特別有用。

如果用這些形式中的任何一種給一個JOIN子句的輸出結(jié)果附加一個別名, 那么該別名就在JOIN里隱藏了其原始的名字。比如

SELECT a.* FROM my_table AS a JOIN your_table AS b ON ...

是合法SQL,但是

SELECT a.* FROM (my_table AS a JOIN your_table AS b ON ...) AS c

是不合法的:別名a在別名c的外面是看不到的。

7.2.1.3. 子查詢

子查詢的結(jié)果(派生表)必須包圍在圓括弧里并 且必須賦予一個別名(參閱Section 7.2.1.2)。比如:

FROM (SELECT * FROM table1) AS alias_name

這個例子等效于FROM table1 AS alias_name。更有趣的例子是在子 查詢里面有分組或聚集的時候,這個時候子查詢不能歸納成一個簡單的連接。

子查詢也可以是一個VALUES列表:

FROM (VALUES ('anne', 'smith'), ('bob', 'jones'), ('joe', 'blow'))
     AS names(first, last)

這種情況同樣也必須要取一個別名。還可以為VALUES列表中的字段取別名, 并且被認為是一個好習慣。更多信息參見Section 7.7。

7.2.1.4. 表函數(shù)

表函數(shù)是那些生成一個行集合的函數(shù),這個集合可以是由基本數(shù)據(jù)類型(標量類型)組成, 也可以是由復合數(shù)據(jù)類型(表的行)組成。他們的用法類似一個表、視圖或FROM子 句里的子查詢。表函數(shù)返回的字段可以像一個表、視圖、或者子查詢字段那 樣包含在SELECT,JOIN或者WHERE子句里。

如果表函數(shù)返回基本數(shù)據(jù)類型,那么單一結(jié)果字段的名字與函數(shù)名相同。如果表函數(shù)返回復合 數(shù)據(jù)類型,那么多個結(jié)果字段的名字和該類型的每個屬性的名字相同。

可以在FROM子句中為表函數(shù)取一個別名,也可以不取別名。如果一個 函數(shù)在FROM子句中沒有別名,那么將使用函數(shù)名作為結(jié)果表的名字。

一些例子:

CREATE TABLE foo (fooid int, foosubid int, fooname text);

CREATE FUNCTION getfoo(int) RETURNS SETOF foo AS $$
    SELECT * FROM foo WHERE fooid = $1;
$$ LANGUAGE SQL;

SELECT * FROM getfoo(1) AS t1;

SELECT * FROM foo
    WHERE foosubid IN (
                        SELECT foosubid
                        FROM getfoo(foo.fooid) z
                        WHERE z.fooid = foo.fooid
                      );

CREATE VIEW vw_getfoo AS SELECT * FROM getfoo(1);

SELECT * FROM vw_getfoo;

有時侯,把一個函數(shù)定義成根據(jù)不同的調(diào)用方法可以返回不同的字段是很有用的。 為了支持這個,表函數(shù)可以聲明為返回偽類型record。如果在查詢里使用這樣 的函數(shù),那么我們必須在查詢中聲明預期的行結(jié)構(gòu),這樣系統(tǒng)才知道如何分析和 規(guī)劃該查詢。讓我們看看下面的例子:

SELECT *
    FROM dblink('dbname=mydb', 'SELECT proname, prosrc FROM pg_proc')
      AS t1(proname name, prosrc text)
    WHERE proname LIKE 'bytea%';

dblink函數(shù)執(zhí)行一個遠程的查詢(參閱contrib/dblink)。它聲明 為返回record,因為它可能會被用于任何類型的查詢。實際的字段集必 須在調(diào)用它的查詢中聲明,這樣分析器才知道類似*這樣的東西應該擴展成什么樣子。

7.2.2. WHERE子句

WHERE Clause子句的語法是

WHERE search_condition

這里的search_condition是一個返 回類型為boolean的值表達式(參閱Section 4.2)。

在完成對FROM子句的處理之后,生成的每一行都會按照search_condition進行檢查。 如果結(jié)果是真,那么該行保留在輸出表中,否則(結(jié)果是假或NULL)就把它拋棄。 搜索條件通常至少要引用一列在FROM子句里生成的列,這不是必須的, 但如果不這樣的話,WHERE子句就沒什么意義了。

Note: 內(nèi)連接的連接條件既可以寫在WHERE子句里也可以寫在JOIN子句里。比如,下面的表表達式是等效的:

FROM a, b WHERE a.id = b.id AND b.val > 5

和:

FROM a INNER JOIN b ON (a.id = b.id) WHERE b.val > 5

或者可能還有:

FROM a NATURAL JOIN b WHERE b.val > 5

你想用哪個只是風格問題。FROM子句里的JOIN語法可能不那么容易移植到其它產(chǎn)品中。即使它是在SQL標準 對于外連接而言,我們在任何情況下都沒有選擇:連接條件必須在FROM子句中完成。 外連接的ONUSING子句不等于WHERE條件,因為它判斷最終 結(jié)果中行的增(那些不匹配的輸入行)和刪。

這里是一些WHERE子句的例子:

SELECT ... FROM fdt WHERE c1 > 5

SELECT ... FROM fdt WHERE c1 IN (1, 2, 3)

SELECT ... FROM fdt WHERE c1 IN (SELECT c1 FROM t2)

SELECT ... FROM fdt WHERE c1 IN (SELECT c3 FROM t2 WHERE c2 = fdt.c1 + 10)

SELECT ... FROM fdt WHERE c1 BETWEEN (SELECT c3 FROM t2 WHERE c2 = fdt.c1 + 10) AND 100

SELECT ... FROM fdt WHERE EXISTS (SELECT c1 FROM t2 WHERE c2 > fdt.c1)

在上面的例子里,fdt是從FROM子句中派生的表。那些不符合WHERE子句的搜 索條件的行將從fdt中刪除。請注意我們把標量子查詢當做一個值表達式來用。 就像其它查詢一樣,子查詢里也可以使用復雜的表表達式。同時還請注意fdt是 如何引用子查詢的。把c1修飾成fdt.c1只有在c1是該子查詢生成的列名字時才是必須的, 但修飾列名字可以增加語句的準確性(即使有時不是必須的)。這個例子就演示了字段名字 范圍如何從外層查詢擴展到它的內(nèi)層查詢。

7.2.3. GROUP BYHAVING子句

在通過了WHERE過濾器之后,生成的輸出表可以繼續(xù)用GROUP BY子句進行 分組,然后用HAVING子句選取一些分組行

SELECT select_list
    FROM ...
    [WHERE ...]
    GROUP BY grouping_column_reference [, grouping_column_reference]...

GROUP BY Clause子句用于把那些所有列出的grouping_column_reference值都相 同的行聚集在一起,縮減為一行,這樣就可以刪除輸出里的重復和/或計算應用 于這些組的聚集。這些字段的列出順序無關(guān)緊要。比如:

=> SELECT * FROM test1;
 x | y
---+---
 a | 3
 c | 2
 b | 5
 a | 1
(4 rows)

=> SELECT x FROM test1 GROUP BY x;
 x
---
 a
 b
 c
(3 rows)

在第二個查詢里,我們不能寫成SELECT * FROM test1 GROUP BY x,因為字段y里 沒有哪個值可以和每個組關(guān)聯(lián)起來。被分組的字段可以在選擇列表中引 用是因為它們每個組都有單一的數(shù)值。

如果一個表被分了組,不在GROUP BY列中除了在總表達式不能被引用,那么就只能引用聚集表達式中的字段和分組中的字段。一個帶聚集表達式的例子是:

=> SELECT x, sum(y) FROM test1 GROUP BY x;
 x | sum
---+-----
 a |   4
 b |   5
 c |   2
(3 rows)

這里的sum是一個聚集函數(shù),它在組上計算總和。 有關(guān)可用的聚集函數(shù)的更多信息可以在節(jié)Section 9.18中找到。

Tip: 沒有有效的聚合表達式分組可以計算一列中不同值的設(shè)置。 這個可以通過DISTINCT子句來實現(xiàn)(參考Section 7.3.3).

這里是另外一個例子:它計算每種產(chǎn)品的總銷售額(而不是所有產(chǎn)品的總銷售額)。

SELECT product_id, p.name, (sum(s.units) * p.price) AS sales
    FROM products p LEFT JOIN sales s USING (product_id)
    GROUP BY product_id, p.name, p.price;

在這個例子里,字段product_idp.namep.price必須在GROUP BY子句里, 因為它們都在查詢選擇列表里被引用了。根據(jù)產(chǎn)品表具體設(shè)置的不同, 名字和價格可能和產(chǎn)品ID完全無關(guān),因此理論上額外的分組可能是不必要的, 但是這些尚未實現(xiàn)。s.units字段不必在GROUP BY列表里,因為它只是在一個聚集表達式(sum(...))里使用,它代表一組產(chǎn)品的銷售總額。 對于每種產(chǎn)品,這個查詢都返回一個該產(chǎn)品的總銷售額。

在嚴格的SQL里,GROUP BY只能對源表的列進行分組,但PostgreSQL把這 個擴展為既允許GROUP BY對選擇列表中的字段進行分組,也允許對值表達式進行分組,而不僅僅是簡單的字段。

如果一個表已經(jīng)用GROUP BY子句分了組,然后你又只對其中的某些組感興趣, 那么就可以用HAVING子句篩選分組。必須像WHERE子句,從結(jié)果中消除組,語法是

SELECT select_list FROM ... [WHERE ...] GROUP BY ... HAVING boolean_expression

HAVING子句中的表達式可以引用分組的表達式和未分組的表達式(后者必須涉及一個聚集函數(shù))。

例子:

=> SELECT x, sum(y) FROM test1 GROUP BY x HAVING sum(y) > 3;
 x | sum
---+-----
 a |   4
 b |   5
(2 rows)

=> SELECT x, sum(y) FROM test1 GROUP BY x HAVING x < 'c';
 x | sum
---+-----
 a |   4
 b |   5
(2 rows)

然后是一個更現(xiàn)實的例子:

SELECT product_id, p.name, (sum(s.units) * (p.price - p.cost)) AS profit
    FROM products p LEFT JOIN sales s USING (product_id)
    WHERE s.date > CURRENT_DATE - INTERVAL '4 weeks'
    GROUP BY product_id, p.name, p.price, p.cost
    HAVING sum(p.price * s.units) > 5000;

在上面的例子里,WHERE子句在尚未分組之前根據(jù)s.date字段選擇數(shù)據(jù)行 (表達式只是對那些最近四周發(fā)生的銷售為真)。而HAVING子句在分組之后 選擇那些銷售總額超過5000的組。請注意聚集表達式不需要在查詢中的所有地方都一樣。

如果一個查詢調(diào)用了聚合函數(shù),但沒有GROUP BY子句,分組仍然發(fā)生: 結(jié)果是單一組行(或者如果單一行被HAVING所淘汰,那么也許沒有行)。 同樣,它包含一個HAVING子句,甚至沒有任何聚合函數(shù)的調(diào)用或GROUP BY子句。

7.2.4. 窗口函數(shù)處理

如果查詢包含窗口函數(shù)(參考Section 3.5,Section 9.19和Section 4.2.8), 這些函數(shù)在執(zhí)行了分組、聚合和HAVING過濾之后被評估。 也就是說,如果查詢使用任何的聚合、GROUP BYHAVING,那么 由窗口函數(shù)發(fā)現(xiàn)的行是該組行而不是從FROM/WHERE得到的原始表行。

當多個窗口函數(shù)被使用的時候,所有的窗口函數(shù)依照語法地等效于在它們的窗口定義被單一數(shù)據(jù) 所評估的PARTITION BYORDER BY子句中。 因此它們將看到同樣的排序,即使ORDER BY不唯一確定一個排序。 然而,不確保所做出的關(guān)于評價的功能有不同的PARTITION BYORDER BY 規(guī)范。(在這種情況下,一個排序步驟通常需要在窗口函數(shù)評價和排序不被保證保存看似跟ORDER BY等效的行命令。)

目前,窗口函數(shù)總是需要分類數(shù)據(jù),所以查詢輸出將按照一個或另一個窗口函數(shù)PARTITION BY/ORDER BY子句。它不是說依賴于此。 如果你想要確保結(jié)果是按特定的方式分類那么使用顯式的頂級ORDER BY子句。

Previous article: Next article: