JavaRush /Курсы /Модуль 4. Работа с БД /Управление отображением данных

Управление отображением данных

Модуль 4. Работа с БД
1 уровень , 3 лекция
Открыта

4.1 LIMIT

Если ты ожидаешь, что твой SQL-запрос вернет слишком много данных, то можешь заранее ограничить их максимальное число. Ведь таблицы могут содержать тысячи или даже миллионы строк.

SQL позволяет очень легко ограничить количество строк в результате запроса с помощью ключевого слова LIMIT. Это ключевое слово используется в самом конце SQL-запроса и имеет вид:


LIMIT количество
        

Давай напишем запрос к таблице product, которая содержит список продуктов нашего магазина. Но так как у нас очень успешный магазин и продуктов мы продаем очень много, то хотим получить только первые 10 строк ответа. Вот как этот запрос будет выглядеть:


SELECT * FROM product 
LIMIT 10
        

И получим такой результат запроса:

id name brand price count
1 Стол IKEA 20.00 15
2 Стул IKEA 5.00 45
3 Диван IKEA 80.00 10
4 Кровать IKEA 75.00 10
5 Шкаф Bosch 125.00 15
6 Полка Полка 25.00 114
7 Телевизор LG 350.00 4
8 Лампа LG 15.00 100
9 Комод IKEA 99.00 10
10 Плита Bosch 199.00 10

Теперь запросим только первые 5 строк. Вот как этот запрос будет выглядеть:


SELECT * FROM product 
LIMIT 5
        

Получим такой результат запроса:

id name brand price count
1 Стол IKEA 20.00 15
2 Стул IKEA 5.00 45
3 Диван IKEA 80.00 10
4 Кровать IKEA 75.00 10
5 Шкаф Bosch 125.00 15

4.2 OFFSET

В предыдущий раз мы научились ограничивать количество строк в ответе сервера. И теперь вместо тысяч строк из таблицы product можем получить 10 первых строк и отобразить их пользователю. Это отлично. Но как нам отобразить вторые 10 строк? А третьи?

Если мы будем писать LIMIT 20, или LIMIT 30, разве сервер не вернет 20 и 30 строк соответственно?

Именно на этот случай у SQL есть специальное ключевое слово OFFSET с помощью которого можно попросить сервер пропустить N строк в его ответе. Это ключевое слово используется в самом конце SQL-запроса (после LIMIT) и имеет вид:


OFFSET количество
        

Давай напишем запрос к таблице product и попробуем получить записи с 11 по 15. Другими словами мы просим сервер вернуть нам 5 строк, но сначала пропустить первые 10 строк ответа. Вот как этот запрос будет выглядеть:


SELECT * FROM product 
LIMIT 5
OFFSET 10
        

Получим такой результат запроса:

id name brand price count
11 Кресло Bosch 44.00 8
12 Вазон SmartFlower 99.00 9
13 Подставка IKEA 100.00 10

Сервер вернул всего 3 строки, а значит в нашей таблице всего было 13 строк. Сервер пропустил первые 10 и вернул следующие 5.

4.3 SELECT DISTINCT

Есть еще одно полезное ключевое слов – это DISTINCT. Оно используется, когда в таблице есть дублирующиеся записи и мы хотим удалить дубликаты.

Откуда же взяться в нашей таблице дубликатам? В таблице дубликатов может и не быть, а вот в результате запроса – легко. Давай напишем запрос, который вернет бренды всех товаров, которые мы продаем. Вот как этот запрос будет выглядеть:


SELECT brand FROM product 
        

Получим такой результат запроса:

brand
IKEA
IKEA
IKEA
IKEA
Bosch
Bosch
LG
LG
IKEA
Bosch
Bosch
SmartFlower
IKEA

Несложно увидеть, что в этой таблице есть строки-дубликаты. Именно чтобы дубликатов не было и нужно использовать ключевое слово DISTINCT. Вот как будет выглядеть исправленные запрос:


SELECT DISTINCT brand 
FROM product 
        

Получим такой результат запроса:

brand
IKEA
Bosch
LG
SmartFlower

Так гораздо лучше. Неправда ли? ;)

4.4 ORDER BY

И наконец мы добрались до сортировки. Для того чтобы отсортировать результаты запроса нужно использовать ключевое слово ORDER BY. Технически – это два слова, но не суть важно. Слова два, а оператор один.

Писать его нужно после ключевого слова WHERE, но перед LIMIT и OFFSET. Если ты напишешь ORDER BY после LIMIT, то SQL-сервер просто вернет тебе ошибку.

В общем виде выглядит этот оператор так:


ORDER BY колонка порядок

Где колонка – это имя колонки в таблице / результате сортировки. А порядок – это порядок сортировки.

Порядок сортировки может быть трех вариантов:

  • ASC (от Ascending) – по возрастанию;
  • DESC (от Descending) – по убыванию;
  • Не указан – будет использован ASC

Давай напишем запрос, который вернет нам список продуктов, отсортированных по возрастанию цены. Вот как этот запрос будет выглядеть:


SELECT * FROM product 
ORDER BY price ASC
LIMIT 10
        

Получим такой результат запроса:

id name brand price count
2 Стул IKEA 5.00 45
8 Лампа LG 15.00 100
1 Стол IKEA 20.00 15
6 Полка Bosch 25.00 114
11 Кресло Bosch 44.00 8
4 Кровать IKEA 75.00 10
3 Диван IKEA 80.00 10
12 Вазон SmartFlower 99.00 9
9 Комод IKEA 99.00 10
13 Подставка IKEA 100.00 10

Тот же результат мы получим, если не укажем порядок сортировки – пропустим слово ASC.

4.5 ORDER BY по нескольким колонкам

Оператор ORDER BY позволяет отсортировать результат по нескольким колонкам. Это бывает очень полезно, когда в первой колонке очень много повторяющихся элементов. Общий вид этого оператора такой:


ORDER BY колонка1 порядок1, колонка2 порядок2, колонка3 порядок3

        

Другими словами, если после сортировки по первой колонке у тебя рядом оказалось несколько одинаковых значений, то их сортируют по второй колонке и так далее.

Давай напишем запрос, с помощью которого отсортируем наши продукты по бренду, а для продуктов с одинаковым брендом – по убыванию их количества. Вот как этот запрос будет выглядеть:


SELECT * FROM product 
ORDER BY brand ASC, count
DESC
        

Получим такой результат запроса:

id name brand price count
6 Полка Bosch 25.00 114
5 Шкаф Bosch 125.00 15
10 Плита Bosch 199.00 10
11 Кресло Bosch 44.00 8
2 Стул IKEA 5.00 45
1 Стол IKEA 20.00 15
9 Комод IKEA 99.00 10
13 Подставка IKEA 100.00 10
4 Кровать IKEA 75.00 10
3 Диван IKEA 80.00 10
8 Лампа LG 15.00 100
7 Телевизор LG 350.00 4
12 Вазон SmartFlower 99.00 9

Посмотри внимательно на таблицу – ее строки отсортированы по названию бренда (алфавитный порядок), а строки с одинаковым названием бренда отсортированы по убыванию количества продуктов (последняя колонка).

1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0128
Выбрать все колонки (используй *) из таблицы car. Выбрать нужно только первых три записи. Нужно использовать: LIMIT
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0129
Выбрать все колонки (используй *) из таблицы car. Выбрать нужно только первых одиннадцать записей. Нужно использовать: LIMIT
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0130
Выбрать колонки brand, model, quantity (в указанном порядке) из таблицы car. Выбрать нужно только первых 115 записей. Нужно использовать: LIMIT
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0131
Выбрать все колонки (используй *) из таблицы ip2country. При выборе пропустить первых 50 строк. Нужно использовать: OFFSET
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0132
Выбрать колонки country_code, ip_from, ip_to (в указанном порядке) из таблицы ip2country. При выборе пропустить первых 78 строк. Нужно использовать: OFFSET
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0133
Выбрать колонки country_code, ip_from, ip_to (в указанном порядке) из таблицы ip2country. При выборе пропустить первых 33 строки. Выбрать нужно только 12 строк. Нужно использовать: LIMIT и OFFSET
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0134
Выбрать все колонки (используй *) из таблицы ip2country. При выборе пропустить первых 62 строки. Выбрать нужно только 7 строк. Нужно использовать: LIMIT и OFFSET
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0135
Выбрать колонки country_code, ip_from, ip_to (в указанном порядке) из таблицы ip2country у которых country_code равен DE При выборе пропустить первых 3 строки. Выбрать нужно только 5 строк. Нужно использовать: WHERE, LIMIT и OFFSET
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0136
Выбрать все уникальные значения колонки country_code из таблицы ip2country Нужно использовать: DISTINCT
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0137
Выбрать все уникальные значения колонки country_name из таблицы ip2country, у которых в названии (колонка country_name) нет символа пробел. Нужно использовать: DISTINCT, WHERE и NOT LIKE
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0138
Выбрать все колонки (используй *) из таблицы ip2country. Результат отсортируй по колонке ip_from. Нужно использовать: ORDER BY
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0139
Выбрать колонки country_code, ip_from, ip_to (в указанном порядке) из таблицы ip2country. Результат отсортируй по колонке ip_from в возрастающем порядке. Выбрать нужно только 17 строк. Нужно использовать: ORDER BY, ASC, LIMIT
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0140
Выбрать колонки ip_from, ip_to, country_name (в указанном порядке) из таблицы ip2country. Результат отсортируй по колонке ip_to в убывающем порядке. При выборе пропустить первых 74 строки. Нужно использовать: ORDER BY, DESC, OFFSET
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0141
Выбрать все колонки (используй *) из таблицы parts. Результат отсортируй по полю required по убыванию, и по полю id по возрастанию. Нужно использовать: ORDER BY, DESC, ASC
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0142
Выбрать колонки id, identifier, description (в указанном порядке) из таблицы parts. Результат отсортируй по полю identifier по убыванию, по полю required по убыванию и по полю description по возрастанию. Нужно использовать: ORDER BY, DESC, ASC
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0143
Выбрать колонки id, identifier, description (в указанном порядке) из таблицы parts. Результат отсортируй по полю identifier по возрастанию, по полю required по убыванию и по полю description по убыванию. Выбрать только первых 7 строк. Нужно использовать: ORDER BY, DESC, ASC, LIMIT
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0144
Выбрать колонку description из таблицы parts. Результат отсортируй по полю required по убыванию, по полю identifier по убыванию и по полю description по убыванию. Пропусти первых 23 строки. Нужно использовать: ORDER BY, DESC, OFFSET
Комментарии (24)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Андрей Уровень 74
28 января 2026
Кто-то может подскажет почему idea через время начинает подлагивать? Увеличил размер хипа до 4 гб, но не спасло, микрофризы через время проявляются (видимо работа GC), может есть какой-то лайфхак?
Дмитрий/MrJonson Уровень 93
27 июля 2025
Задача task0137 какой то косяк select DISTINCT country_name from ip2country WHERE country_name NOT LIKE '% %' типо правильно SELECT DISTINCT country_name FROM ip2country WHERE country_name NOT LIKE '% %'; а это не правильно почему ?
Артём Уровень 112
24 мая 2025
Зачем вы делаете задачи на применение OFFSET без LIMIT? В обычной жизни так не делают, IDEA такое пропускать не хочет, а валидатор считает решение правильным.
Артём Васенин Уровень 93
26 мая 2025
Почему? В жизни никогда не понадобиться взять записи с 51 до финальной? Ну-ну
CodeMashine Уровень 33
25 января 2025
а где задачки?
JavaRusher853 Уровень 36
18 сентября 2024
всё это невероятно сложно запоминать и усваивать, лучше записывать.
Олег Уровень 106 Expert
15 сентября 2024
Всё щёлкнул с первого раза
Andre Уровень 97
23 августа 2024
Почему валидатор тупит? Если в order by не указывть порядок сортировки, то по умолчанию считается ASC, а у вас надо явно указывать
Sans Уровень 3
26 июля 2024
прив
Kosenkov Уровень 26
14 марта 2024

-- SQL & Hibernate
-- 1 уровень, 3 лекцияsaws
CREATE DATABASE javaRushTest;

create table furniture (
  id serial PRIMARY KEY ,
  name text,
  brand text,
  price numeric,
  count int
);

INSERT INTO furniture
(name, brand, price, count)
VALUES
('Стол', 'IKEA', '20.00', '15'),
('Стул', 'IKEA', '5.00', '45'),
('Диван', 'IKEA', '80.00', '10'),
('Кровать', 'IKEA', '75.00', '10'),
('Шкаф', 'Bosh', '125.00', '15'),
('Полка', 'OBI', '25.00', '114'),
('Телевизор', 'LG', '350.00', '4'),
('Лампа', 'LG', '15.00', '100'),
('Комод', 'LG', '350.00', '5'),
('Телевизор', 'IKEA', '99.00', '10'),
('Плита', 'Bosh', '199.00', '10');

SELECT * FROM furniture;

-- 4.2 OFFSET
SELECT * FROM furniture
LIMIT 3
OFFSET 2;

-- 4.3 SELECT DISTINCT
select brand from furniture;
select distinct brand from furniture;

-- 4.4 ORDER BY
-- ASC (от Ascending) – по возрастанию;
-- DESC (от Descending) – по убыванию;
-- Не указан – будет использован ASC

-- 5 самых дорогих товаров
select * from furniture
order by price desc
limit 5;

select * from furniture
order by price desc , count asc
limit 5;





Fanil Magdiew Уровень 31 Expert
21 января 2024
правильно писать Bosch