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 |
+--------+--------------+------------+--------+---------+
codechick

СodeСhick.io - простой и эффективный способ изучения программирования.

2024 ©