TOP и LIMIT в SQL
В этой статье вы научитесь, как получить определенное количество записей из таблицы.
Данных в таблицах обычно очень много, но вы часто будете сталкиваться с ситуациями, когда нужны не все данные. Например, если вам нужно получить только 10 лучших сотрудников, недавно пришедших на работу, или получить 3 лучших студента по баллам.
Для таких ситуаций в SQL есть оператор TOP
. Но он поддерживается только в SQL Server и MS Access.
Для MySQL суеществует аналог LIMIT
. А в Oracle ту же функцию выполняет ROWNUM
.
Синтаксис TOP
TOP
используется для ограничения количества возвращаемых строк. Вот его синтаксис:
SELECT TOP число | процент список_столбцов FROM имя_таблицы;
Предположим, что в нашей базе данных есть таблица сотрудников employees
со следующими записями:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 1 | Ethan Hunt | 2001-05-01 | 5000 | 4 | | 2 | Tony Montana | 2002-07-15 | 6500 | 1 | | 3 | Sarah Connor | 2005-10-18 | 8000 | 5 | | 4 | Rick Deckard | 2007-01-03 | 7200 | 3 | | 5 | Martin Blank | 2008-06-24 | 5600 | NULL | +--------+--------------+------------+--------+---------+
Следующий запрос вернет три самых высокооплачиваемых сотрудника из таблицы employees
:
-- Синтаксис для SQL Server SELECT TOP 3 * FROM employees ORDER BY salary DESC;
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 3 | Sarah Connor | 2005-10-18 | 8000 | 5 | | 4 | Rick Deckard | 2007-01-03 | 7200 | 3 | | 2 | Tony Montana | 2002-07-15 | 6500 | 1 | +--------+--------------+------------+--------+---------+
Вы можете использовать ключевое слово PERCENT
после фиксированного значения в TOP
, если хотите получить определенный процент строк, а не фиксированное количество строк.
Примечание. Нецелеые значения округляются до следующего целого значения. Например, 1.5 округляется до 2.
Следующий запрос вернет 30% самых высокооплачиваемых сотрудников:
-- Синтаксис для SQL Server SELECT TOP 30 PERCENT * FROM employees ORDER BY salary DESC;
Результат такого запроса:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 3 | Sarah Connor | 2005-10-18 | 8000 | 5 | | 4 | Rick Deckard | 2007-01-03 | 7200 | 3 | +--------+--------------+------------+--------+---------+
Синтаксис LIMIT (для MySQL)
LIMIT
в MySQL — это аналог TOP
. Вот его синтаксис:
SELECT список_столбцов FROM имя_таблицы LIMIT число;
Следующий запрос вернет три самых высокооплачиваемых сотрудника из таблицы employees
.
-- Синтаксис для MySQL SELECT * FROM employees ORDER BY salary DESC LIMIT 3;
Результат запроса:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 3 | Sarah Connor | 2005-10-18 | 8000 | 5 | | 4 | Rick Deckard | 2007-01-03 | 7200 | 3 | | 2 | Tony Montana | 2002-07-15 | 6500 | 1 | +--------+--------------+------------+--------+---------+
Совет. В операторе
SELECT
всегда используйтеORDER BY
вместе сLIMIT
. В противном случае вы можете не получить желаемого результата.
Смещение строк через LIMIT
У LIMIT есть второй необязательный параметр.
При указании двух параметров первый параметр задает смещение первого возвращаемого ряда, т.е. начальную точку, а второй параметр задает максимальное количество возвращаемых рядов. Смещение начального ряда равно 0 (не 1).
То есть если вы хотите узнать третьего самого высокооплачиваемого сотрудника, вы можете написать такой запрос:
-- Синтаксис для MySQL SELECT * FROM employees ORDER BY salary DESC LIMIT 2, 1;
В результате вы получите только одну запись — как и ожидалось:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 2 | Tony Montana | 2002-07-15 | 6500 | 1 | +--------+--------------+------------+--------+---------+