Сегодня, наверное, тема о самом популярном, что делаем в SQL 😏
Запросы
Для начала поставим перед собой такую задачу: выбрать все самолеты компании Airbus. В этом нам поможет оператор поиска шаблонов LIKE:
SELECT * FROM aircrafts WHERE model LIKE 'Airbus%';
Знак "%" соответствует любым символам (или их отсутствие). Его можно использовать и в начале маски для поиска.
aircraft_code |model | range
---------------+-----------------+-------
320 | Airbus A320-200 | 5700
321 | Airbus A321-200 | 5600
319 | Airbus A319-100 | 6700
(3 строки)
И обратное:
SELECT * FROM aircrafts
WHERE model NOT LIKE 'Airbus%'
AND model NOT LIKE 'Boeing%';
Знак "_" соответствует любому одному знаку.
SELECT airport_name FROM airports WHERE airport_name LIKE '___';
Вернет нам
UFA, которое соответствует 3 знакам.Существует ряд операторов для работы с регулярными выражениями POSIX. Эти операторы имеют больше возможностей, чем оператор LIKE. Для того чтобы выбрать, например, самолеты компаний Airbus и Boeing, можно сделать так:
SELECT * FROM aircrafts WHERE model ~ '^(A|Boe)';
aircraft_code |model | range
---------------+-----------------+-------
773 | Boeing 777-300 | 11100
763 | Boeing 767-300 | 7900
320 | Airbus A320-200 | 5700
321 | Airbus A321-200 | 5600
319 | Airbus A319-100 | 6700
733 | Boeing 737-300 | 4200
(6 строк)
Оператор ~ ищет совпадение с шаблоном с учетом регистра символов. Символ «^» в начале регулярного выражения означает, что поиск совпадения будет привязан к началу строки.
Ну и так далее, про регулярки тут не буду углубляться ✍️
В качестве замены традиционных операторов сравнения могут использоваться предикаты сравнения, которые ведут себя так же, как и операторы, но имеют другой синтаксис.
SELECT * FROM aircrafts WHERE range BETWEEN 3000 AND 6000;
aircraft_code |model | range
---------------+---------------------+-------
SU9 | Sukhoi SuperJet-100 | 3000
320 | Airbus A320-200 | 5700
321 | Airbus A321-200 | 5600
733 | Boeing 737-300 | 4200
(4 строки)
При выборке данных можно проводить вычисления и получать в результирующей таблице вычисляемые столбцы.
SELECT model, range, round( range / 1.609, 2 ) AS miles
FROM aircrafts;
Считаем значения дальности полета в милях и округляем до 2 знаков после запятой:
model | range | miles
--------------+-------+---------
Boeing 777-300| 11100 | 6898.69
Boeing 767-300| 7900 | 4909.88
...
Есть возможность с помощью условных операторов сделать дополнительный столбец со своими значениями:
SELECT model, range,
CASE WHEN range < 2000 THEN 'Ближнемагистральный'
WHEN range < 5000 THEN 'Среднемагистральный'
ELSE 'Дальнемагистральный'
END AS type
FROM aircrafts
ORDER BY model;
model | range | type
--------------------+-------+---------------------
Airbus A319-100 | 6700 | Дальнемагистральный
Boeing 737-300 | 4200 | Среднемагистральный
Boeing 767-300 | 7900 | Дальнемагистральный
Boeing 777-300 | 11100 | Дальнемагистральный
Bombardier CRJ-200 | 2700 | Среднемагистральный
(5 строк)
Сегодня, как мне кажется, ничего сложного. Ну или мне уже привычно этим пользоваться 😭
