Select (SQL)
From Wikipedia, the free encyclopedia
A SELECT statement in SQL returns a result set of records from one or more tables.
It is used to retrieve zero or more rows from one or more base tables, temporary tables, or views in a database. In most applications, SELECT
is the most commonly used Data Manipulation Language (DML) command. In specifying a SELECT
query, the user specifies a description of the desired result set, but they do not specify what physical operations must be executed to produce that result set. Translating the query into an optimal "query plan" is left to the database system, more specifically to the query optimiser.
Commonly available clauses related to SELECT include:
WHERE
– used to identify which rows to be retrieved, or applied to GROUP BY.GROUP BY
– used to combine rows with related values into elements of a smaller set of rows.HAVING
– used to identify which rows, following a GROUP BY, are to be retrieved.ORDER BY
– used to identify which columns are used to sort the resulting data.
Contents |
[edit] Examples
Table "T" | Query | Result | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
SELECT * FROM T; |
|
||||||||||||
|
SELECT C1 FROM T; |
|
||||||||||||
|
SELECT * FROM T WHERE C1 = 1; |
|
||||||||||||
|
SELECT * FROM T ORDER BY C1 DESC; |
|
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 — in Relational algebra terms, a projection will be performed.
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.
The last query SELECT * FROM T ORDER BY C1 DESC
will output the same rows as the first query, however the results will be sorted in reverse order of the values in column C1 (Z-A) because of the ORDER BY clause. This query doesn't have a WHERE clause, so anything and everything will be returned. Multiple expressions can be specified in the ORDER BY clause (separated by comma [eg. ORDER BY C1 ASC, C2 DESC]) to further refine sorting.
[edit] Limiting result rows
In ISO SQL:2003, result sets may be limited by using
- cursors, or
- By introducing window functions to the SELECT-statement
[edit] ROW_NUMBER() window function
Several window functions exist. ROW_NUMBER() OVER
may be used for a simple limit on the returned rows. E.g., to return no more than ten rows:
SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY key ASC) AS rownumber, columns FROM tablename ) AS foo WHERE rownumber <= 10
ROW_NUMBER can be non-deterministic: if key is not unique, each time you run the query it is possible to get different row numbers assigned to any rows where key is the same. When key is unique, each row will always get a unique row number.
[edit] RANK() window function
The RANK() OVER
window function acts like ROW_NUMBER, but may return more 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.
[edit] Non-standard syntax
Not all DBMSes support the mentioned window functions, and non-standard syntax has to be used. Below, variants of the simple limit query for different DBMSes are listed:
Vendor | Limit Syntax |
---|---|
DB2 | SELECT * FROM T FETCH FIRST 10 ROWS ONLY |
Firebird | SELECT FIRST 10 * FROM T |
Informix | SELECT FIRST 10 * FROM T |
Interbase | SELECT * FROM T ROWS 10 |
Microsoft | (Supports the standard, since SQL Server 2005) |
Also SELECT TOP 10 [PERCENT] * FROM T ORDER BY col |
|
MySQL | SELECT * FROM T LIMIT 10 |
SQLite | SELECT * FROM T LIMIT 10 |
PostgreSQL | SELECT * FROM T LIMIT 10 |
Oracle | (Supports the standard, since Oracle8i) |
Also SELECT * from T WHERE ROWNUM <= 10 |