Skip to content

1️⃣ Основы выборки

Базовый синтаксис SQL запроса

Одна из основных функций SQL — это получение выборок данных из СУБД. Для этого в SQL используется оператор SELECT. Давайте рассмотрим несколько простых запросов с его участием.

Вывод произвольных значений

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

MySQL
SELECT "Hello world"

Вывод всех данных из таблицы

Для вывода всех полей из определённой таблицы используется символ *. Давайте взглянем на схему базы данных и выведем данные одной из таблиц

SELECT * FROM FamilyMembers
member_id status member_name birthday
1 father Headley Quincey 1960-05-13T00:00:00.000Z
2 mother Flavia Quincey 1963-02-16T00:00:00.000Z
3 son Andie Quincey 1983-06-05T00:00:00.000Z
4 daughter Lela Quincey 1985-06-07T00:00:00.000Z
5 daughter Annie Quincey 1988-04-10T00:00:00.000Z
6 father Ernest Forrest 1961-09-11T00:00:00.000Z
7 mother Constance Forrest 1968-09-06T00:00:00.000Z

Вывод данных из определённых колонок таблицы

Если необходимо вывести информацию только по определённым столбцам таблицы, а не всю сразу, то это можно сделать, перечисляя названия столбцов через запятую:

SELECT member_id, member_name FROM FamilyMembers
member_id member_name
1 Headley Quincey
2 Flavia Quincey
3 Andie Quincey
4 Lela Quincey
5 Annie Quincey
6 Ernest Forrest
7 Constance Forrest

Псевдонимы

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

Их синтаксис достаточно простой, мы должны использовать оператор AS. Как в примере ниже:

SELECT member_id, member_name AS Name FROM FamilyMembers
member_id Name
1 Headley Quincey
2 Flavia Quincey
3 Andie Quincey
4 Lela Quincey
5 Annie Quincey
6 Ernest Forrest
7 Constance Forrest

Или же можно обойтись и без него, просто написав желаемое наименование поля через пробел.

SELECT member_id, member_name Name FROM FamilyMembers

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

Литералы в SQL

На прошлом уроке выводили строку, а если говорить более формальным языком, то так называемый строковый литерал.

MySQL
SELECT "Hello world"

Литерал — это указанное явным образом фиксированное значение, например, число 12 или строка "SQL".

Основными типами литералов в MySQL являются:

  • строковый
  • числовой
  • логический
  • NULL
  • литерал даты и времени

Строковые литералы

Строка — это последовательность символов, заключённых в одинарные (') или двойные (") кавычки. Например, 'это строка' и "это строка".

Строки могут содержать специальные последовательности символов, начинающиеся с "\" (экранирующий символ). Они нужны для того, чтобы СУБД придала обычным символам (буквам и другим знакам) новое особое значение. Например, последовательность "\n" буквально означает "перевод строки", а без предваряющего слеша это была бы обычная буква "n".

Числовые литералы

Пример
Включает в себя целые и дробные числа. Разделительный знак для дробного числа — «.» (точка). 1, 2.9, 0.01
Может иметь только целую, дробную часть или обе сразу. .2, 1.1, 10
Может быть положительным и отрицательным числом (для положительного числа совсем не обязательно указывать знак). +1, -10, -2.2
Могут быть представлены в экспоненциальном виде. 1e3 (=1000) 1e-3 (=0.001)

Арифметические операторы

Для числовых литералов в SQL есть все привычные нам арифметические операторы:

Литералы даты и времени

Значения даты и времени могут быть представлены в формате строки или числа.

Например, если мы хотим указать какую-то дату в запросе, то мы можем это сделать с помощью строки "1970-12-30", "19701230" или же числа 19701230. В обоих случаях эти значения будут интерпретироваться как дата «30 декабря 1970 года».

Логические литералы

Логический литерал - значения TRUE и FALSE, означающие истинность и ошибочность какого-либо утверждения. При интерпретации запроса, MySQL преобразует их в числа: TRUE и FALSE становятся 1 и 0 соответственно.

NULL

Значение NULL означает "нет данных", "нет значения". Оно нужно, чтобы отличать визуально пустые значения, такие как строка нулевой длины или "пробел", от того, когда значения вообще нет, даже пустого.

Применение функций

При составлении SQL запросов мы можем использовать встроенные функции. Например, если мы хотим вывести строку в верхнем регистре, то для этого мы можем использовать функцию UPPER.

Что такое встроенная функция?

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

Каждая функция принимает набор аргументов определённого типа, выполняет заложенные в неё операции и обязательно возвращает один из возможных литералов. Стоит отметить, что функции могут принимать как ноль аргументов, так и несколько.

Например, функция NOW() принимает ноль аргументов и возвращает литерал в формате даты, а LENGTH('sql-academy') принимает один строковый аргумент и возвращает числовой литерал «11».

Исключение дубликатов, DISTINCT

Чтобы при выборке избежать дублирования, есть оператор DISTINCT.

Синтаксис оператора

SELECT [DISTINCT] поля_таблиц FROM наименование_таблицы;

Условный оператор WHERE

Ситуация, когда требуется сделать выборку по определённому условию, встречается очень часто. Для этого в операторе SELECT существует оператор WHERE, после которого следуют условия для ограничения строк. Если запись удовлетворяет этому условию, то попадает в результат, иначе отбрасывается.

Общая структура запроса с оператором WHERE

SELECT [DISTINCT] поля_таблиц FROM наименование_таблицы
WHERE условие_на_ограничение_строк
[логический_оператор другое_условие_на_ограничение_строк];

Операторы IS NULL, BETWEEN, IN

Мы уже познакомились с синтаксисом оператора WHERE и операторами сравнения, но помимо них в условных запросах мы можем использовать следующие полезные операторы:

  • IS NULL
  • BETWEEN
  • IN

Давайте рассмотрим их применение.

IS NULL

Оператор IS NULL позволяет узнать, равно ли проверяемое значение NULL, т.е. пустое ли значение.

BETWEEN

Оператор BETWEEN min AND max позволяет узнать, расположено ли проверяемое значение столбца в интервале между min и max, включая сами значения min и max. Он идентичен условию:

... WHERE field >= min AND field <= max

IN

Оператор IN позволяет узнать, входит ли проверяемое значение столбца в список определённых значений.

Оператор LIKE

Оператор LIKE используется при условных запросах, когда мы хотим узнать, соответствует ли строка определённому шаблону.

ESCAPE-символ

ESCAPE-символ используется для экранирования специальных символов (% и \). В случае если вам нужно найти строки, вы можете использовать ESCAPE-символ.

Оператор REGEXP

Оператор REGEXP (или его синоним RLIKE) в SQL используется для поиска и обработки строковых данных с помощью регулярных выражений. Регулярные выражения предоставляют мощные возможности для сложных шаблонов поиска, которые трудно реализовать с помощью оператора LIKE.

Когда использовать REGEXP вместо LIKE?

Оператор LIKE удобен для простых шаблонов поиска, таких как поиск строк, начинающихся или заканчивающихся на определённый набор символов, или содержащих определённые подстроки. Однако, если требуется более сложный и гибкий поиск, например, поиск по нескольким условиям или использование специальных символов и диапазонов, оператор REGEXP станет незаменимым инструментом.

:::info Я бы рекомендовал просто выучить REGEXP. У нас нет таких задач, где бы потребовался прирост скорости от LIKE. Поэтому просто можно использовать REGEX. Его плюс в широте использования и применении

:::

Важные нюансы

  1. Регистронезависимость

По умолчанию регулярные выражения в MySQL не чувствительны к регистру. Например, выражение REGEXP 'abc' найдёт строку и abc, и Abc, и ABC. 2. Специальные символы

Некоторые символы имеют особое значение в регулярных выражениях и требуют экранирования (например, ., *, +, ?, [, ], (, ), {, }, |, \). Для экранирования используется обратная косая черта \.

Сортировка, оператор ORDER BY

При выполнении SELECT запроса, строки по умолчанию возвращаются в неопределённом порядке. Фактический порядок строк в этом случае зависит от плана соединения и сканирования, а также от порядка расположения данных на диске, поэтому полагаться на него нельзя. Для упорядочивания записей используется конструкция ORDER BY.

Общая структура запроса с оператором ORDER BY

SELECT поля_таблиц FROM наименование_таблицы
WHERE ...
ORDER BY столбец_1 [ASC | DESC][, столбец_n [ASC | DESC]]

Группировка, оператор GROUP BY

Общая структура запроса с GROUP BY

SELECT [литералы, агрегатные_функции, поля_группировки]
FROM имя_таблицы
GROUP BY поля_группировки;

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

:::warning Следует иметь в виду, что для GROUP BY все значения NULL трактуются как равные, т.е. при группировке по полю, содержащему NULL-значения, все такие строки попадут в одну группу

:::

Агрегатные функции

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

Агрегатная функция – это функция, которая выполняет вычисление на наборе значений и возвращает одиночное значение.

Общая структура запроса с агрегатной функцией

SELECT [литералы, агрегатные_функции, поля_группировки]
FROM имя_таблицы
GROUP BY поля_группировки;

Например, запрос с использованием агрегатной функции AVG может выглядеть так:

SELECT home_type, AVG(price) as avg_price FROM Rooms
GROUP BY home_type

Описание агрегатных функций

Функция Описание
SUM(поле_таблицы) Возвращает сумму значений
AVG(поле_таблицы) Возвращает среднее значение
COUNT(поле_таблицы) Возвращает количество записей
MIN(поле_таблицы) Возвращает минимальное значение
MAX(поле_таблицы) Возвращает максимальное значение

:::warning Агрегатные функции применяются для значений, не равных NULL. Исключением является функция COUNT(*).

:::

Оператор HAVING

Общая структура запроса с оператором HAVING

SELECT [константы, агрегатные_функции, поля_группировки]
FROM имя_таблицы
WHERE условия_на_ограничения_строк
GROUP BY поля_группировки
HAVING условие_на_ограничение_строк_после_группировки
ORDER BY условие_сортировки