育红班是什么意思| 冥界是什么意思| vol是什么意思| 91年出生属什么生肖| 皮肤瘙痒用什么药好| 多管闲事是什么意思| lb是什么| 颈椎病看什么科| 神经性头疼是什么症状| 津液亏虚吃什么中成药| 血热吃什么药可以凉血| 宫腔灌注是治疗什么的| 手指发痒是什么原因| 96年属什么命| 清华大学校长什么级别| 无济于事的济是什么意思| 息风止痉是什么意思| 下午吃什么饭| 耳石症有什么症状| 甘少一横读什么| 脓毒血症是什么原因引起的| hpv有什么症状| 不安腿是什么症状| 8月7日是什么星座| 招待是什么意思| 8月24日是什么星座| 手为什么会脱皮| 吸顶灯什么牌子的好| 肠衣是什么做的| 冰箱什么牌子的好| 吃蓝莓有什么好处| 一月出生是什么星座| 补维生素吃什么好| 吃什么水果减肥最快| 芈月和秦始皇什么关系| 全性向是什么意思| 梳子什么材质的好| 什么能解酒| 当所有的人离开我的时候是什么歌| 肝掌是什么原因引起的| 大姨妈期间吃什么好| 黄色是什么颜色组成的| 50年婚姻是什么婚| 黑下打信是什么任务| 白细胞高是什么病| wtf什么意思| 抱大腿什么意思| 大舅哥是什么意思| 贩子是什么意思| rh阳性是什么意思| 庆生是什么意思| 茯苓什么味道| 为什么有的女人欲太强| 私人订制什么意思| 咽干是什么原因造成的| 碎石后要注意些什么| 眩晕是什么症状| 药流是吃什么药| 氟比洛芬是什么药| 水化是什么意思| 侧着睡觉有什么坏处| 马桶堵了用什么疏通| ido是什么意思| 孟母三迁的故事告诉我们什么道理| 两个人能玩什么游戏| 狗狗吃胡萝卜有什么好处| 小儿麻痹什么症状| 什么鸟没有翅膀| 婴儿流口水是什么原因引起的| 梦见红鞋子是什么意思| 打嗝什么原因| 分山念什么| 牒是什么意思| 肺结核吃什么食物好| 为什么会口臭| cpi指数上涨意味着什么| 吃什么降三高最快| 夏天什么花开| 巴卡是什么意思| 通草和什么炖最催奶了| 中指长痣代表什么| 六月初五是什么日子| 什么叫肺间质病变| 今日是什么日子| 沙中土是什么生肖| 卧室放什么花最好健康| 珍珠翡翠白玉汤是什么| 乙肝病毒核心抗体阳性是什么意思| 经期喝咖啡有什么影响| 抗hbc阳性是什么意思| 吃什么能治白头发| 牙齿出血是什么原因| 双肾实质回声增强是什么意思| 女攻男受是什么意思| 什么是磁共振检查| 手抖是什么原因| 心率低有什么危害| 透疹是什么意思| 肝多发囊肿是什么意思| 草字头下面一个高字读什么| 吃什么可以减肥肚子| 取环需要做什么检查| 市盈率和市净率是什么意思| 舌下腺囊肿挂什么科| 国粹是什么| 穿裙子搭配什么鞋子| 酸梅汤不适合什么人喝| 嗓子有点疼吃什么药| 肠胃炎吃什么药效果好| 木圣念什么| 耳鸣吃什么药比较好| 什么样的女人最旺夫| 有冬瓜西瓜南瓜为什么没有北瓜| juicy什么意思| 咳嗽有痰是什么原因| 吃西洋参有什么好处| 炝锅是什么意思| 尿毒症是什么原因引起的| 马牙是什么原因引起的| 旦上面加一横是什么字| 戏梦巴黎讲的是什么| 受害者是什么意思| 实蛋是什么| 热休克蛋白90a检查高是什么原因| 非典型腺细胞是什么意思| 国师是什么生肖| 台湾有什么特产| 盆腔积液是什么原因引起的| 舌头开裂是什么原因| 未时左眼跳是什么预兆| 盛是什么意思| 宫保鸡丁是什么菜系| 马车标志是什么品牌| 十二年义务教育什么时候实行| 黄皮适合什么颜色的衣服| 三个毛念什么字| 10.22是什么星座| 菊花有什么颜色| 水疱疹什么药最快能治好| 五行属土缺命里缺什么| 微波炉加热用什么容器| 直爽是什么意思| 六一年属什么生肖| 口腔溃疡要吃什么药| 女朋友生日送什么礼物好| 休止期脱发什么意思| 傲慢表情是什么意思| 空调多少匹什么意思| 午夜凶铃讲的是什么故事| 嗳气是什么症状| 白砂糖和冰糖有什么区别| 贫血吃什么最好| 怀孕了挂什么科| 后背出汗什么原因| 白色配什么颜色好看| 女人喝枸杞水有什么好处| 女人一般什么时候容易怀孕| 小资生活是什么意思| 立夏是什么意思| 六月十八是什么星座| 燃面为什么叫燃面| 男女双修什么意思| 凹陷性疤痕用什么药膏| 充气娃娃什么感觉| 员工体检费计入什么科目| 容易长口腔溃疡是什么原因| 软糯什么意思| 脑脊液是什么| 药流吃什么药| co2是什么| 小拇指有痣代表什么| 琅琊榜是什么意思| 会车什么意思| 为什么嘴巴会臭| 中央型肺ca是什么意思| 93年属于什么生肖| 胃炎吃什么药最有效| nfc果汁是什么意思| 大胯疼是什么原因引起| 紫菜和海带有什么区别| 勇气是什么意思| 肾阴虚的症状吃什么药| 同妻是什么意思| fl是什么意思| 为什么会有肾结石| 脚气是什么菌| 喝茉莉花茶有什么好处| 不撞南墙不回头是什么意思| 重阳节应该吃什么| 迷瞪是什么意思| 阴骘什么意思| 蒹葭苍苍是什么意思| 拉拉裤是什么| 蓝色加红色是什么颜色| 98年属什么的| 嗓子疼喝什么| 疮痈是什么意思| pigeon是什么意思| 胸痛一阵一阵的痛什么原因| 十一月十五号是什么星座| 赶集什么意思| 黄金果是什么水果| 更年期吃什么药| 夏天有什么水果| 小姨的女儿叫什么| 粉荷花的花语是什么| 年少轻狂下一句是什么| 闻鸡起舞是什么意思| 为什么突然有狐臭了| 绞丝旁一个奇念什么| edt是什么时间| 诗经又称什么| pb是什么意思| 冬至要注意什么| 甲病是什么病| 最好的大学是什么大学| 六级什么时候考| 了什么意思| 骨量减少是什么意思| 边缘性脐带入口是什么意思| 拔完智齿吃什么食物好| 绞股蓝和什么搭配喝减肥| 戌时属什么生肖| 大熊猫生活在什么地方| 尿隐血3十是什么病| c7是什么意思| 泸州老窖是什么香型| 什么情况下需要切除子宫| 什么酒好喝| 摆拍是什么意思| 28岁属相是什么生肖| 宝玑手表是什么档次| 饿了胃疼是什么原因| 贫血是什么原因造成的| 自戕是什么意思| 浪子回头是什么意思| 手指甲月牙代表什么| 苗子是什么意思| 什么是家庭| 公安和警察有什么区别| 花椰菜是什么菜| 2004是什么年| 投诉医生打什么电话| 1988年是什么生肖| gm什么意思| 海军蓝是什么颜色| 十月十五号是什么星座| 男性hpv检查挂什么科| 舌头什么颜色正常| 为什么一吃完饭就肚子疼| 宿醉是什么意思| 梦见种树是什么兆头| 姑姑叫我什么| 尾巴骨疼挂什么科| 乙肝是什么病严重吗| 晒太阳有什么好处| 胆囊壁增厚是什么意思| 梦见好多死人是什么征兆| 什么时候闰十月| 牙龈疼是什么原因| 急性胃肠炎用什么抗生素| 四维彩超主要检查什么| 雪花秀属于什么档次| 铁饱和度低什么原因| 百度Jump to content

这些都是假的!公安机关教你识破冒充“公检法”骗局

From Wikipedia, the free encyclopedia
百度 所以说儒者本心良知向外展开,还是要学习六经四书。

The SQL SELECT statement returns a result set of rows, from one or more tables.[1][2]

A SELECT statement retrieves zero or more rows from one or more database tables or database views. In most applications, SELECT is the most commonly used data manipulation language (DML) command. As SQL is a declarative programming language, SELECT queries specify a result set, but do not specify how to calculate it. The database translates the query into a "query plan" which may vary between executions, database versions and database software. This functionality is called the "query optimizer" as it is responsible for finding the best possible execution plan for the query, within applicable constraints.

The SELECT statement has many optional clauses:

  • SELECT list is the list of columns or SQL expressions to be returned by the query. This is approximately the relational algebra projection operation.
  • AS optionally provides an alias for each column or expression in the SELECT list. This is the relational algebra rename operation.
  • FROM specifies from which table to get the data.[3]
  • WHERE specifies which rows to retrieve. This is approximately the relational algebra selection operation.
  • GROUP BY groups rows sharing a property so that an aggregate function can be applied to each group.
  • HAVING selects among the groups defined by the GROUP BY clause.
  • ORDER BY specifies how to order the returned rows.

Overview

[edit]

SELECT is the most common operation in SQL, called "the query". SELECT retrieves data from one or more tables, or expressions. Standard SELECT statements have no persistent effects on the database. Some non-standard implementations of SELECT can have persistent effects, such as the SELECT INTO syntax provided in some databases.[4]

Queries allow the user to describe desired data, leaving the database management system (DBMS) to carry out planning, optimizing, and performing the physical operations necessary to produce that result as it chooses.

A query includes a list of columns to include in the final result, normally immediately following the SELECT keyword. An asterisk ("*") can be used to specify that the query should return all columns of all the queried tables. SELECT is the most complex statement in SQL, with optional keywords and clauses that include:

  • The FROM clause, which indicates the tables to retrieve data from. The FROM clause can include optional JOIN subclauses to specify the rules for joining tables.
  • The WHERE clause includes a comparison predicate, which restricts the rows returned by the query. The WHERE clause eliminates all rows from the result set where the comparison predicate does not evaluate to True.
  • The GROUP BY clause projects rows having common values into a smaller set of rows. GROUP BY is often used in conjunction with SQL aggregation functions or to eliminate duplicate rows from a result set. The WHERE clause is applied before the GROUP BY clause.
  • The HAVING clause includes a predicate used to filter rows resulting from the GROUP BY clause. Because it acts on the results of the GROUP BY clause, aggregation functions can be used in the HAVING clause predicate.
  • The ORDER BY clause identifies which columns to use to sort the resulting data, and in which direction to sort them (ascending or descending). Without an ORDER BY clause, the order of rows returned by an SQL query is undefined.
  • The DISTINCT keyword[5] eliminates duplicate data.[6]

The following example of a SELECT query returns a list of expensive books. The query retrieves all rows from the Book table in which the price column contains a value greater than 100.00. The result is sorted in ascending order by title. The asterisk (*) in the select list indicates that all columns of the Book table should be included in the result set.

SELECT *
 FROM  Book
 WHERE price > 100.00
 ORDER BY title;

The example below demonstrates a query of multiple tables, grouping, and aggregation, by returning a list of books and the number of authors associated with each book.

    SELECT Book.title AS Title,
           count(*) AS Authors
     FROM  Book
     JOIN  Book_author
       ON  Book.isbn = Book_author.isbn
 GROUP BY Book.title;

Example output might resemble the following:

Title                  Authors
---------------------- -------
SQL Examples and Guide 4
The Joy of SQL         1
An Introduction to SQL 2
Pitfalls of SQL        1

Under the precondition that isbn is the only common column name of the two tables and that a column named title only exists in the Book table, one could re-write the query above in the following form:

SELECT title,
       count(*) AS Authors
 FROM  Book
 NATURAL JOIN Book_author
 GROUP BY title;

However, many[quantify] vendors either do not support this approach, or require certain column-naming conventions for natural joins to work effectively.

SQL includes operators and functions for calculating values on stored values. SQL allows the use of expressions in the select list to project data, as in the following example, which returns a list of books that cost more than 100.00 with an additional sales_tax column containing a sales tax figure calculated at 6% of the price.

SELECT isbn,
       title,
       price,
       price * 0.06 AS sales_tax
 FROM  Book
 WHERE price > 100.00
 ORDER BY title;

Subqueries

[edit]

Queries can be nested so that the results of one query can be used in another query via a relational operator or aggregation function. A nested query is also known as a subquery. While joins and other table operations provide computationally superior (i.e. faster) alternatives in many cases (all depending on implementation), the use of subqueries introduces a hierarchy in execution that can be useful or necessary. In the following example, the aggregation function AVG receives as input the result of a subquery:

SELECT isbn,
       title,
       price
 FROM  Book
 WHERE price < (SELECT AVG(price) FROM Book)
 ORDER BY title;

A subquery can use values from the outer query, in which case it is known as a correlated subquery.

Since 1999 the SQL standard allows WITH clauses, i.e. named subqueries often called common table expressions (named and designed after the IBM DB2 version 2 implementation; Oracle calls these subquery factoring). CTEs can also be recursive by referring to themselves; the resulting mechanism allows tree or graph traversals (when represented as relations), and more generally fixpoint computations.

Derived table

[edit]

A derived table is a subquery in a FROM clause. Essentially, the derived table is a subquery that can be selected from or joined to. Derived table functionality allows the user to reference the subquery as a table. The derived table also is referred to as an inline view or a select in from list.

In the following example, the SQL statement involves a join from the initial Books table to the derived table "Sales". This derived table captures associated book sales information using the ISBN to join to the Books table. As a result, the derived table provides the result set with additional columns (the number of items sold and the company that sold the books):

SELECT b.isbn, b.title, b.price, sales.items_sold, sales.company_nm
FROM Book b
  JOIN (SELECT SUM(Items_Sold) Items_Sold, Company_Nm, ISBN
        FROM Book_Sales
        GROUP BY Company_Nm, ISBN) sales
  ON sales.isbn = b.isbn

Examples

[edit]
Table "T" Query Result
C1 C2
1 a
2 b
SELECT * FROM T;
C1 C2
1 a
2 b
C1 C2
1 a
2 b
SELECT C1 FROM T;
C1
1
2
C1 C2
1 a
2 b
SELECT * FROM T WHERE C1 = 1;
C1 C2
1 a
C1 C2
1 a
2 b
SELECT * FROM T ORDER BY C1 DESC;
C1 C2
2 b
1 a
does not exist SELECT 1+1, 3*2;
`1+1` `3*2`
2 6

Given a table T, the query SELECT * FROM T will result in all the elements of all the rows of the table being shown.

With the same table, the query SELECT C1 FROM T will result in the elements from the column C1 of all the rows of the table being shown. This is similar to a projection in relational algebra, except that in the general case, the result may contain duplicate rows. This is also known as a Vertical Partition in some database terms, restricting query output to view only specified fields or columns.

With the same table, the query SELECT * FROM T WHERE C1 = 1 will result in all the elements of all the rows where the value of column C1 is '1' being shown – in relational algebra terms, a selection will be performed, because of the WHERE clause. This is also known as a Horizontal Partition, restricting rows output by a query according to specified conditions.

With more than one table, the result set will be every combination of rows. So if two tables are T1 and T2, SELECT * FROM T1, T2 will result in every combination of T1 rows with every T2 rows. E.g., if T1 has 3 rows and T2 has 5 rows, then 15 rows will result.

Although not in standard, most DBMS allows using a select clause without a table by pretending that an imaginary table with one row is used. This is mainly used to perform calculations where a table is not needed.

The SELECT clause specifies a list of properties (columns) by name, or the wildcard character (“*”) to mean “all properties”.

Limiting result rows

[edit]

Often it is convenient to indicate a maximum number of rows that are returned. This can be used for testing or to prevent consuming excessive resources if the query returns more information than expected. The approach to do this often varies per vendor.

In ISO SQL:2003, result sets may be limited by using

ISO SQL:2008 introduced the FETCH FIRST clause.

According to PostgreSQL v.9 documentation, an SQL window function "performs a calculation across a set of table rows that are somehow related to the current row", in a way similar to aggregate functions.[7] The name recalls signal processing window functions. A window function call always contains an OVER clause.

ROW_NUMBER() window function

[edit]

ROW_NUMBER() OVER may be used for a simple table on the returned rows, e.g. to return no more than ten rows:

SELECT * FROM
( SELECT
    ROW_NUMBER() OVER (ORDER BY sort_key ASC) AS row_number,
    columns
  FROM tablename
) AS foo
WHERE row_number <= 10

ROW_NUMBER can be non-deterministic: if sort_key is not unique, each time you run the query it is possible to get different row numbers assigned to any rows where sort_key is the same. When sort_key is unique, each row will always get a unique row number.

RANK() window function

[edit]

The RANK() OVER window function acts like ROW_NUMBER, but may return more or less than n rows in case of tie conditions, e.g. to return the top-10 youngest persons:

SELECT * FROM (
  SELECT
    RANK() OVER (ORDER BY age ASC) AS ranking,
    person_id,
    person_name,
    age
  FROM person
) AS foo
WHERE ranking <= 10

The above code could return more than ten rows, e.g. if there are two people of the same age, it could return eleven rows.

FETCH FIRST clause

[edit]

Since ISO SQL:2008 results limits can be specified as in the following example using the FETCH FIRST clause.

SELECT * FROM T 
FETCH FIRST 10 ROWS ONLY

This clause currently is supported by CA DATACOM/DB 11, IBM DB2, SAP SQL Anywhere, PostgreSQL, EffiProz, H2, HSQLDB version 2.0, Oracle 12c and Mimer SQL.

Microsoft SQL Server 2008 and higher supports FETCH FIRST, but it is considered part of the ORDER BY clause. The ORDER BY, OFFSET, and FETCH FIRST clauses are all required for this usage.

SELECT * FROM T 
ORDER BY acolumn DESC OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY

Non-standard syntax

[edit]

Some DBMSs offer non-standard syntax either instead of or in addition to SQL standard syntax. Below, variants of the simple limit query for different DBMSes are listed:

SET ROWCOUNT 10
SELECT * FROM T
MS SQL Server (This also works on Microsoft SQL Server 6.5 while the Select top 10 * from T does not)
SELECT * FROM T 
LIMIT 10 OFFSET 20
Netezza, MySQL, MariaDB (also supports the standard version, since version 10.6), SAP SQL Anywhere, PostgreSQL (also supports the standard, since version 8.4), SQLite, HSQLDB, H2, Vertica, Polyhedra, Couchbase Server, Snowflake Computing, OpenLink Virtuoso
SELECT * from T 
WHERE ROWNUM <= 10
Oracle
SELECT FIRST 10 * from T Ingres
SELECT FIRST 10 * FROM T order by a Informix
SELECT SKIP 20 FIRST 10 * FROM T order by c, d Informix (row numbers are filtered after order by is evaluated. SKIP clause was introduced in a v10.00.xC4 fixpack)
SELECT TOP 10 * FROM T MS SQL Server, SAP ASE, MS Access, SAP IQ, Teradata
SELECT * FROM T 
SAMPLE 10
Teradata
SELECT TOP 20, 10 * FROM T OpenLink Virtuoso (skips 20, delivers next 10)[8]
SELECT TOP 10 START AT 20 * FROM T SAP SQL Anywhere (also supports the standard, since version 9.0.1)
SELECT FIRST 10 SKIP 20 * FROM T Firebird
SELECT * FROM T
ROWS 20 TO 30
Firebird (since version 2.1)
SELECT * FROM T
WHERE ID_T > 10 FETCH FIRST 10 ROWS ONLY
IBM Db2
SELECT * FROM T
WHERE ID_T > 20 FETCH FIRST 10 ROWS ONLY
IBM Db2 (new rows are filtered after comparing with key column of table T)

Rows Pagination

[edit]

Rows Pagination[9] is an approach used to limit and display only a part of the total data of a query in the database. Instead of showing hundreds or thousands of rows at the same time, the server is requested only one page (a limited set of rows, per example only 10 rows), and the user starts navigating by requesting the next page, and then the next one, and so on. It is very useful, specially in web systems, where there is no dedicated connection between the client and the server, so the client does not have to wait to read and display all the rows of the server.

Data in Pagination approach

[edit]
  • {rows} = Number of rows in a page
  • {page_number} = Number of the current page
  • {begin_base_0} = Number of the row - 1 where the page starts = (page_number-1) * rows

Simplest method (but very inefficient)

[edit]
  1. Select all rows from the database
  2. Read all rows but send to display only when the row_number of the rows read is between {begin_base_0 + 1} and {begin_base_0 + rows}
Select * 
from {table} 
order by {unique_key}

Other simple method (a little more efficient than read all rows)

[edit]
  1. Select all the rows from the beginning of the table to the last row to display ({begin_base_0 + rows})
  2. Read the {begin_base_0 + rows} rows but send to display only when the row_number of the rows read is greater than {begin_base_0}
SQL Dialect
select *
from {table}
order by {unique_key}
FETCH FIRST {begin_base_0 + rows} ROWS ONLY
SQL ANSI 2008
PostgreSQL
SQL Server 2012
Derby
Oracle 12c
DB2 12
Mimer SQL
Select *
from {table}
order by {unique_key}
LIMIT {begin_base_0 + rows}
MySQL
SQLite
Select TOP {begin_base_0 + rows} * 
from {table} 
order by {unique_key}
SQL Server 2005
Select *
from {table}
order by {unique_key}
ROWS LIMIT {begin_base_0 + rows}
Sybase, ASE 16 SP2
SET ROWCOUNT {begin_base_0 + rows}
Select * 
from {table} 
order by {unique_key}
SET ROWCOUNT 0
Sybase, SQL Server 2000
Select *
    FROM (
        SELECT * 
        FROM {table} 
        ORDER BY {unique_key}
    ) a 
where rownum <= {begin_base_0 + rows}
Oracle 11


Method with positioning

[edit]
  1. Select only {rows} rows starting from the next row to display ({begin_base_0 + 1})
  2. Read and send to display all the rows read from the database
SQL Dialect
Select *
from {table}
order by {unique_key}
OFFSET {begin_base_0} ROWS
FETCH NEXT {rows} ROWS ONLY
SQL ANSI 2008
PostgreSQL
SQL Server 2012
Derby
Oracle 12c
DB2 12
Mimer SQL
Select *
from {table}
order by {unique_key}
LIMIT {rows} OFFSET {begin_base_0}
MySQL
MariaDB
PostgreSQL
SQLite
Select * 
from {table} 
order by {unique_key}
LIMIT {begin_base_0}, {rows}
MySQL
MariaDB
SQLite
Select *
from {table}
order by {unique_key}
ROWS LIMIT {rows} OFFSET {begin_base_0}
Sybase, ASE 16 SP2
Select TOP {begin_base_0 + rows}
       *,  _offset=identity(10) 
into #temp
from {table}
ORDER BY {unique_key} 
select * from #temp where _offset > {begin_base_0}
DROP TABLE #temp
Sybase 12.5.3:
SET ROWCOUNT {begin_base_0 + rows}
select *,  _offset=identity(10) 
into #temp
from {table}
ORDER BY {unique_key} 
select * from #temp where _offset > {begin_base_0}
DROP TABLE #temp
SET ROWCOUNT 0
Sybase 12.5.2:
select TOP {rows} * 
from (
      select *, ROW_NUMBER() over (order by {unique_key}) as _offset
      from {table}
) xx 
where _offset > {begin_base_0}


SQL Server 2005
SET ROWCOUNT {begin_base_0 + rows}
select *,  _offset=identity(int,1,1) 
into #temp
from {table}
ORDER BY {unique-key}
select * from #temp where _offset > {begin_base_0}
DROP TABLE #temp
SET ROWCOUNT 0
SQL Server 2000
SELECT * FROM (
    SELECT rownum-1 as _offset, a.* 
    FROM(
        SELECT * 
        FROM {table} 
        ORDER BY {unique_key}
    ) a 
    WHERE rownum <= {begin_base_0 + cant_regs}
)
WHERE _offset >= {begin_base_0}
Oracle 11


Method with filter (it is more sophisticated but necessary for very big dataset)

[edit]
  1. Select only then {rows} rows with filter:
    1. First Page: select only the first {rows} rows, depending on the type of database
    2. Next Page: select only the first {rows} rows, depending on the type of database, where the {unique_key} is greater than {last_val} (the value of the {unique_key} of the last row in the current page)
    3. Previous Page: sort the data in the reverse order, select only the first {rows} rows, where the {unique_key} is less than {first_val} (the value of the {unique_key} of the first row in the current page), and sort the result in the correct order
  2. Read and send to display all the rows read from the database
First Page Next Page Previous Page Dialect
select *
from {table} 
order by {unique_key}
FETCH FIRST {rows} ROWS ONLY
select * 
from {table} 
where {unique_key} > {last_val}
order by {unique_key}
FETCH FIRST {rows} ROWS ONLY
select * 
 from (
   select * 
   from {table} 
   where {unique_key} < {first_val}
   order by {unique_key} DESC
   FETCH FIRST {rows} ROWS ONLY
 ) a
 order by {unique_key}
SQL ANSI 2008
PostgreSQL
SQL Server 2012
Derby
Oracle 12c
DB2 12
Mimer SQL
select *
from {table}
order by {unique_key}
LIMIT {rows}
select * 
from {table} 
where {unique_key} > {last_val}
order by {unique_key}
LIMIT {rows}
select * 
 from (
   select * 
   from {table} 
   where {unique_key} < {first_val}
   order by {unique_key} DESC
   LIMIT {rows}
 ) a
 order by {unique_key}
MySQL
SQLite
select TOP {rows} * 
from {table} 
order by {unique_key}
select TOP {rows} * 
from {table} 
where {unique_key} > {last_val}
order by {unique_key}
select * 
 from (
   select TOP {rows} * 
   from {table} 
   where {unique_key} < {first_val}
   order by {unique_key} DESC
 ) a
 order by {unique_key}
SQL Server 2005
SET ROWCOUNT {rows}
select *
from {table} 
order by {unique_key}
SET ROWCOUNT 0
SET ROWCOUNT {rows}
select *
from {table} 
where {unique_key} > {last_val}
order by {unique_key}
SET ROWCOUNT 0
SET ROWCOUNT {rows}
 select *
 from (
   select * 
   from {table} 
   where {unique_key} < {first_val}
   order by {unique_key} DESC
 ) a
 order by {unique_key}
 SET ROWCOUNT 0
Sybase, SQL Server 2000
select *
from (
    select * 
    from {table} 
    order by {unique_key}
  ) a 
where rownum <= {rows}
select *
from (
  select * 
  from {table} 
  where {unique_key} > {last_val}
  order by {unique_key}
) a 
where rownum <= {rows}
select * 
 from (
   select *
   from (
     select * 
     from {table} 
     where {unique_key} < {first_val}
     order by {unique_key} DESC
   ) a1
   where rownum <= {rows}
 ) a2
 order by {unique_key}
Oracle 11

Hierarchical query

[edit]

Some databases provide specialised syntax for hierarchical data.

A window function in SQL:2003 is an aggregate function applied to a partition of the result set.

For example,

 sum(population) OVER( PARTITION BY city )

calculates the sum of the populations of all rows having the same city value as the current row.

Partitions are specified using the OVER clause which modifies the aggregate. Syntax:

<OVER_CLAUSE> :: =
    OVER ( [ PARTITION BY <expr>, ... ]
           [ ORDER BY <expression> ] )

The OVER clause can partition and order the result set. Ordering is used for order-relative functions such as row_number.

Query evaluation ANSI

[edit]

The processing of a SELECT statement according to ANSI SQL would be the following:[10]

  1. select g.*
    from users u inner join groups g on g.Userid = u.Userid
    where u.LastName = 'Smith'
    and u.FirstName = 'John'
    
  2. the FROM clause is evaluated, a cross join or Cartesian product is produced for the first two tables in the FROM clause resulting in a virtual table as Vtable1
  3. the ON clause is evaluated for vtable1; only records which meet the join condition g.Userid = u.Userid are inserted into Vtable2
  4. If an outer join is specified, records which were dropped from vTable2 are added into VTable 3, for instance if the above query were:
    select u.*
    from users u left join groups g on g.Userid = u.Userid
    where u.LastName = 'Smith'
    and u.FirstName = 'John'
    
    all users who did not belong to any groups would be added back into Vtable3
  5. the WHERE clause is evaluated, in this case only group information for user John Smith would be added to vTable4
  6. the GROUP BY is evaluated; if the above query were:
    select g.GroupName, count(g.*) as NumberOfMembers
    from users u inner join groups g on g.Userid = u.Userid
    group by GroupName
    
    vTable5 would consist of members returned from vTable4 arranged by the grouping, in this case the GroupName
  7. the HAVING clause is evaluated for groups for which the HAVING clause is true and inserted into vTable6. For example:
    select g.GroupName, count(g.*) as NumberOfMembers
    from users u inner join groups g on g.Userid = u.Userid
    group by GroupName
    having count(g.*) > 5
    
  8. the SELECT list is evaluated and returned as Vtable 7
  9. the DISTINCT clause is evaluated; duplicate rows are removed and returned as Vtable 8
  10. the ORDER BY clause is evaluated, ordering the rows and returning VCursor9. This is a cursor and not a table because ANSI defines a cursor as an ordered set of rows (not relational).

Window function support by RDBMS vendors

[edit]

The implementation of window function features by vendors of relational databases and SQL engines differs wildly. Most databases support at least some flavour of window functions. However, when we take a closer look it becomes clear that most vendors only implement a subset of the standard. Let's take the powerful RANGE clause as an example. Only Oracle, DB2, Spark/Hive, and Google Big Query fully implement this feature. More recently, vendors have added new extensions to the standard, e.g. array aggregation functions. These are particularly useful in the context of running SQL against a distributed file system (Hadoop, Spark, Google BigQuery) where we have weaker data co-locality guarantees than on a distributed relational database (MPP). Rather than evenly distributing the data across all nodes, SQL engines running queries against a distributed filesystem can achieve data co-locality guarantees by nesting data and thus avoiding potentially expensive joins involving heavy shuffling across the network. User-defined aggregate functions that can be used in window functions are another extremely powerful feature.

Generating data in T-SQL

[edit]

Method to generate data based on the union all

select 1 a, 1 b union all
select 1, 2 union all
select 1, 3 union all
select 2, 1 union all
select 5, 1

SQL Server 2008 supports the "row constructor" feature, specified in the SQL:1999 standard

select *
from (values (1, 1), (1, 2), (1, 3), (2, 1), (5, 1)) as x(a, b)

References

[edit]
  1. ^ Microsoft (23 May 2023). "Transact-SQL Syntax Conventions".
  2. ^ MySQL. "SQL SELECT Syntax".
  3. ^ Omitting FROM clause is not standard, but allowed by most major DBMSes.
  4. ^ "Transact-SQL Reference". SQL Server Language Reference. SQL Server 2005 Books Online. Microsoft. 2025-08-05. Retrieved 2025-08-05.
  5. ^ SAS 9.4 SQL Procedure User's Guide. SAS Institute (published 2013). 10 July 2013. p. 248. ISBN 9781612905686. Retrieved 2025-08-05. Although the UNIQUE argument is identical to DISTINCT, it is not an ANSI standard.
  6. ^ Leon, Alexis; Leon, Mathews (1999). "Eliminating duplicates - SELECT using DISTINCT". SQL: A Complete Reference. New Delhi: Tata McGraw-Hill Education (published 2008). p. 143. ISBN 9780074637081. Retrieved 2025-08-05. [...] the keyword DISTINCT [...] eliminates the duplicates from the result set.
  7. ^ PostgreSQL 9.1.24 Documentation - Chapter 3. Advanced Features
  8. ^ OpenLink Software. "9.19.10. The TOP SELECT Option". docs.openlinksw.com. Retrieved 1 October 2019.
  9. ^ Ing. óscar Bonilla, MBA
  10. ^ Inside Microsoft SQL Server 2005: T-SQL Querying by Itzik Ben-Gan, Lubor Kollar, and Dejan Sarka

Sources

[edit]
  • Horizontal & Vertical Partitioning, Microsoft SQL Server 2000 Books Online.
[edit]
为什么会得甲亢 景字属于五行属什么 什么克风 流鼻涕感冒吃什么药 泛性恋是什么意思
脚气长什么样 栽赃是什么意思 手机壳为什么会发黄 排卵期有什么明显症状 va是什么车牌
痄腮是什么意思 高大的动物是什么生肖 梦见把老鼠打死是什么意思 蛇形分班是什么意思 眦是什么意思
蚂蚁为什么会咬人 火烈鸟吃什么 绿茶女什么意思啊 砷对人体有什么危害 2003年五行属什么
知进退明得失什么意思hcv8jop7ns4r.cn 宇宙的尽头是什么creativexi.com 减肥头晕是什么原因hcv9jop5ns8r.cn 右眼皮一直跳是什么预兆hcv9jop0ns0r.cn 世界上最大的蛇是什么蛇hcv8jop7ns9r.cn
青筋明显是什么原因hcv9jop4ns4r.cn 经常拉屎是什么原因hcv9jop3ns4r.cn 隋炀帝叫什么名字hcv9jop4ns3r.cn 喷昔洛韦乳膏治什么hcv8jop1ns7r.cn 一什么故事hcv9jop3ns1r.cn
sakura是什么牌子hcv9jop4ns5r.cn 牛油果不能和什么一起吃hcv8jop6ns8r.cn 胎盘低置状态是什么意思hcv8jop2ns0r.cn 膝盖窝疼是什么原因chuanglingweilai.com 小孩子晚上睡觉磨牙是什么原因hcv7jop9ns4r.cn
墨鱼干和什么煲汤最好hcv8jop7ns8r.cn 什么是素质yanzhenzixun.com 嘴唇没有血色是什么原因travellingsim.com 活字印刷术是什么时候发明的hcv9jop0ns4r.cn 痔疮吃什么药好得快hcv7jop6ns2r.cn
百度