Базовый курс SQL. Извлечение данных. LIMIT OFFSET

Forums:

[к оглавлению]

Внимание! Для дальнейшего изучения необходимо развернуть тестовую базу данных на своём компьютере, на которой Вы сможете запускать все примеры, рассматриваемые в курсе. Как это сделать, смотрите здесь. Обязательно сделайте это, прежде чем продолжите чтение!

Оператор SELECT

SELECT - это оператор, позволяющий достать конкретные данные из определённой таблицы.

Вместо термина "оператор" также могут использовать "ключевое слово", "служебное слово", "зарезервированное слово". В любом случае это часть языка SQL. Название таблицы или столбца такими словами приведёт к ошибке!

Извлечение данных

Итак, перейдём к практике. Извлечём столбец под названием student_surname из таблицы Students:

SELECT student_surname
FROM Students;

FROM также является ключевым словом SQL.

Результат выполнения будет таким:

student_surname
-----------------
Петрашевский                                      
Сейдинай                                          
Егорова                                           
Адамченко                                         
Легран                                            
Распопов                                          
Колобков                                          
Шульгина                                          
Римский                                           
Грошев                                            

Мы получили значения ТОЛЬКО столбца name, но для ВСЕХ строк таблицы.

Обратите внимание:

  • Все запросы обязательно заканчиваются "точкой с запятой" (символом ;). Иначе запрос не будет отправлен или возникнет ошибка.
  • Регистр ключевых слов может быть любой, т.е. select и SELECT отработают одинаково. А вот при названии столбцов и таблиц обязательно соблюдать точность: Students и students - это две разные таблицы.
  • Дополнительные пробелы и переносы строк в SQL игнорируются, т.е. Вы можете использовать переносы для увеличения читаемости кода, но это не обязательно.
  • Данные могут возвращаться в произвольном порядке. Как сортировать ответ SQL запроса, мы рассмотрим позже.

Извлечение нескольких или всех столбцов

Чтобы извлечь несколько столбцов, но не все, перечисляйте их после оператора SELECT через запятую. После завершающего столбца запятая не требуется:

SELECT student_surname, student_name
FROM Students;

Вывод будет такой:

student_surname     |   student_name
---------------------------+-------------------
Петрашевский        |    Аркадий                                           
Сейдинай           |   Эра                                               
Егорова            |    Зинаида                                           
Адамченко           |   	Пётр                                              
Легран              |    Базиль                                            
Распопов           |  	Еагений                                           
Колобков           |    Дмитрий                                           
Шульгина           |     Ольга                                             
Римский            |     Гриорий                                           
Грошев              |     Вадим  

Для извлечения всех столбцов используйте звёздочку (символ *):

SELECT *
FROM Students;

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

Извлечение уникальных строк. DISTINCT

Используя ключевое слово SELECT, мы получим все строки, соответствующие установленным нами условиям. Например, нам требуется получить список групп, в которых учатся студенты:

SELECT group_id
FROM Students;

Получим group_id всех строк таблицы Students:

group_id
----------------
31548
31548
30913
31548
30913
31548
31548
31548
30913
33018

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

SELECT DISTINCT group_id
FROM Students;

Получим:

speaker_id
----------------
33018
30913
31548

Внимание!
Если производится выборка нескольких столбцов с использованием DISTINCT, уникальность будет проверяться по КАЖДОМУ из них. Например, SELECT DISTINCT group_id, student_age: если в разных группах учатся студенты одного возраста, в выборку попадёт только один из них.

Операторы LIMIT и OFFSET

Итак, мы научились доставать все строки, соответствующие неким критериям отбора. Зачастую это огромный объём данных. Поэтому иногда требуется ограничить число получаемых строк в рамках одного запроса.

Например, напишем запрос получения одного столбца данных, name, но ограничим выборку пятью строками ключевым словом LIMIT:
PostgreSQL, MySQL, MariaDB, SQLite:

-- Достанет только первые пять строк
SELECT student_surname
FROM Students
LIMIT 5;

Следующим запросом можно достать следующие 5 строк - дополнительно нужно задать точку начала отсчёта ключевым словом OFFSET:

-- Достанет c 5 по 9 строки
SELECT student_surname
FROM Students
LIMIT 5 OFFSET 5;

Ответ будет такой:

student_surname
--------------------
Распопов                                          
Колобков                                          
Шульгина                                          
Грошев                                            
Римский                                           

Также MySQL, MariaDB и SQLite поддерживают сокращённую форму записи:

-- Достанет c 5 по 9 строки
SELECT student_surname
FROM Students
LIMIT 5, 5;

Внимание!
Нумерация строк в БД всегда начинается с 0. Т.е. LIMIT 1 OFFSET 1 обращается не к первой, а ко второй строке по порядку.

Логика построения запросов всегда едина, но синтаксис в разных СУБД может отличаться. При разработке в новой для Вас СУБД всегда уточняйте, какие ключевые слова нужно использовать. К примеру:

  • Microsoft SQL Server и MicrosoftAccess:
    -- Достанет первые пять строк выборки
    SELECT TOP 5 student_surname
    FROM Students;
  • DB2:
    -- Достанет первые пять строк выборки
    SELECT student_surname
    FROM Students
    FETCH FIRST 5 ROWS ONLY;
  • Oracle:
    -- Опирается на встроенный счётчик ROWNUM
    SELECT student_surname
    FROM Students
    WHERE ROWNUM <= 5;

Комментарии в запросе

Комментарии - текст, который не должен восприниматься СУБД, как часть запроса, но необходимый разработчику.

Это может быть описание смысла запроса, значения столбца таблицы, любое примечание, пометка todo. Также это может быть часть кода, которая временно не должна выполняться (в процессе отладки, например).

В зависимости от СУБД могут использоваться разные символы для комментирования:

  • --
    SELECT student_surname -- это комментарий
    FROM Students;
  • #
    # Это комментарий, может находиться только в начале строки
    SELECT student_surname
    FROM Students;
  • /* */
    /* Это комментарий. Эта часть запроса не выполнится
    SELECT student_surname, group_id
    FROM Students; Конец комментария */
    SELECT student_surname
    FROM Students;

Итак, мы рассмотрели оператор SELECT и научились извлекать данные. Далее узнаем, как упорядочить нашу выборку.

Следующая страница. Сортировка данных.
Оглавление.