Предложение where (transact-sql)where (transact-sql)
Содержание:
Примеры
Таблица «T» | Запрос | Результат | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
SELECT * FROM T; |
|
||||||||||||
|
SELECT C1 FROM T; |
|
||||||||||||
|
SELECT * FROM T WHERE C1 = 1; |
|
||||||||||||
|
SELECT * FROM T ORDER BY C1 DESC; |
|
Для таблицы T запрос
SELECT * FROM T;
вернёт все столбцы всех строк данной таблицы.
Для той же таблицы запрос
SELECT C1 FROM T;
вернёт значения столбца C1 всех строк таблицы— в терминах реляционной алгебры можно сказать, что была выполнена проекция.
Для той же таблицы запрос
SELECT * FROM T WHERE C1 = 1;
вернёт значения всех столбцов всех строк таблицы, у которых значение поля C1 равно ‘1’— в терминах реляционной алгебры можно сказать, что была выполнена выборка, так как присутствует ключевое слово WHERE.
Последний запрос
SELECT * FROM T ORDER BY C1 DESC;
вернёт те же строки, что и первый, однако результат будет отсортирован в обратном порядке (Z-A) из-за использования ключевого слова ORDER BY с полем C1 в качестве поля сортировки. Этот запрос не содержит ключевого слова WHERE, поэтому он вернёт всё, что есть в таблице. Несколько элементов ORDER BY могут быть указаны разделённые запятыми для более точной сортировки.
Отбирает все строки, где поле column_name равно одному из перечисленных значений value1,value2,…
SELECT * FROM table_name WHERE column_name IN (value1,value2,...)
Возвращает список идентификаторов отделов, продажи которых превысили 1000 долларов за 1 января 2000 года, вместе с суммами продаж за этот день:
SELECT DeptID, SUM(SaleAmount) FROM Sales WHERE SaleDate = '01-Jan-2000' GROUP BY DeptID HAVING SUM(SaleAmount) > 1000
Limit Data Selections From a MySQL Database
MySQL provides a LIMIT clause that is used to specify the number of records
to return.
The LIMIT clause makes it easy to code multi page results or pagination with
SQL, and is very useful on large tables. Returning a large number of records can
impact on performance.
Assume we wish to select all records from 1 — 30 (inclusive) from a table
called «Orders». The SQL query would then look like this:
$sql = «SELECT * FROM Orders LIMIT 30»;
When the SQL query above is run, it will return the first 30 records.
What if we want to select records 16 — 25 (inclusive)?
Mysql also provides a way to handle this: by using OFFSET.
The SQL query below says «return only 10 records, start on record 16 (OFFSET
15)»:
$sql = «SELECT * FROM Orders LIMIT 10 OFFSET 15»;
You could also use a shorter syntax to achieve the same result:
$sql = «SELECT * FROM Orders LIMIT 15, 10»;
Notice that the numbers are reversed when you use a comma.
Ограничение возвращаемых строк
Согласно ISO SQL:2003 возвращаемый набор данных может быть ограничен с помощью:
- курсоров, или
- введением оконных функций в оператор SELECT
Оконная функция ROW_NUMBER()
Существуют различные оконные функции. может быть использована для простого ограничения числа возвращаемых строк. Например, для возврата не более десяти строк:
SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY key ASC) AS rownumber, columns FROM tablename ) AS foo WHERE rownumber <= 10
ROW_NUMBER может быть недетерминированным: если key не уникален, каждый раз при выполнении запроса возможно присвоение разных номеров строкам, у которых key совпадает. Когда key уникален, каждая строка будет всегда получать уникальный номер строки.
Оконная функция RANK()
Функция работает почти так же, как ROW_NUMBER, но может вернуть более чем n строк при определённых условиях. Например, для получения top-10 самых молодых людей:
SELECT * FROM ( SELECT RANK() OVER (ORDER BY age ASC) AS ranking, person_id, person_name, age FROM person ) AS foo WHERE ranking <= 10
Данный код может вернуть более чем 10 строк. Например, если есть два человека с одинаковым возрастом, он вернёт 11 строк.
Нестандартный синтаксис
Не все СУБД поддерживают вышеуказанные оконные функции. При этом многие имеют нестандартный синтаксис для решения тех же задач. Ниже представлены варианты простого ограничения выборки для различных СУБД:
Производитель/СУБД | Синтаксис ограничения |
---|---|
DB2 | (Поддерживает стандарт, начиная с DB2 Version 6) |
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 | (Поддерживает стандарт, начиная с SQL Server 2005) |
Также
SELECT TOP 10 PERCENT * FROM T ORDER BY col |
|
MySQL |
SELECT * FROM T LIMIT 10 |
SQLite |
SELECT * FROM T LIMIT 10 |
PostgreSQL | (Поддерживает стандарт, начиная с PostgreSQL 8.4) |
SELECT * FROM T LIMIT 10 |
|
Oracle | (Поддерживает стандарт, начиная с Oracle8i) |
Также
SELECT * FROM T WHERE ROWNUM <= 10 |