Перейти к содержанию

Лекция 1

Лекция: Основы SQL — Введение, SELECT и фильтрация данных

Цель:

  • Понять, что такое SQL и реляционные базы данных.
  • Научиться извлекать и фильтровать данные из таблиц.

Темы:

1. Введение в SQL и реляционные базы данных

  • Что такое реляционная база данных? Основные элементы: таблицы, строки, столбцы.
  • Что такое SQL? Почему это важный инструмент для работы с данными.
  • Почему PostgreSQL: преимущества этой системы управления базами данных.

2. Основы извлечения данных — SELECT

  • Синтаксис SELECT: как извлекать данные из таблицы.
    • Выбор всех данных: SELECT *.
    • Выбор отдельных столбцов: извлечение только необходимых данных.
    • Использование псевдонимов: улучшение читаемости результатов с помощью AS.
    • Ограничение количества строк: использование LIMIT.
    • Сортировка данных: основы ORDER BY.

3. Фильтрация данных — WHERE

  • Фильтрация с помощью WHERE:
    • Основные операторы сравнения: =, <>, >, <, >=, <=.
    • Логические операторы:
    • Использование AND, OR и NOT для комбинирования условий.
    • Приоритет операций: порядок выполнения условий.
    • Работа с NULL:
    • Что такое NULL (отсутствие значения).
    • Проверка с помощью ISNULL и IS NOT NULL.

1. Введение в SQL и реляционные базы данных

Что такое реляционная база данных?

Реляционная база данных (РБД) — это система хранения данных, где информация организована в виде таблиц.

Каждая таблица состоит из:

  • Столбцов (полей) — определяют, какие данные хранятся (например, id, имя, дата рождения).

  • Строк (записей) — содержат конкретные данные (например, строка с информацией о пользователе).

Пример таблицы пассажиров в системе авиаперевозок:

passenger_id first_name last_name birth_date
1 Иван Иванов 1990-05-12
2 Мария Смирнова 1985-10-30
3 Алексей Петров 1992-07-25

Реляционные базы называют так, потому что данные в них связаны между таблицами. Например, у нас есть ещё таблица бронирования билетов, где passenger_id указывает, какой пассажир оформил бронирование:  

booking_id passenger_id flight_id status
101 1 2201 Paid
102 2 2203 Unpaid

Эти две таблицы связаны: по passenger_id можно определить, какой пассажир сделал бронь.


Что такое SQL? Почему это важный инструмент?

SQL (Structured Query Language) — язык запросов, который позволяет:

  • Извлекать данные (SELECT)
  • Фильтровать информацию (WHERE)
  • Добавлять (INSERT), обновлять (UPDATE) и удалять (DELETE) данные
  • Объединять таблицы и анализировать данные (JOIN, GROUP BY)

Почему SQL важен?

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

Пример простого SQL-запроса:

SELECT 
    first_name, 
    last_name 
FROM passengers 
WHERE birth_date > '1990-01-01';
Выбирает имена пассажиров, родившихся после 1990 года.


Почему PostgreSQL?

PostgreSQL — одна из самых популярных СУБД.

Преимущества PostgreSQL:

  • Бесплатный и открытый
  • Мощный: поддерживает сложные аналитические запросы
  • Гибкий: работает не только с таблицами, но и с JSON, геоданными
  • Надёжный: используется в крупных проектах (Reddit, Instagram, Booking.com)

Простыми словами, PostgreSQL — это мощная и удобная база данных, которая подходит как для бизнеса, так и для сложных аналитических задач.

2. Основы извлечения данных — SELECT

Извлечение всех данных из таблицы

SELECT * 
FROM bookings.flights;
Выведет все столбцы и строки из таблицы flights.

Выбор отдельных столбцов

SELECT 
    flight_no, 
    departure_airport, 
    arrival_airport 
FROM bookings.flights;
Выведет только номера рейсов и аэропорты отправления/прибытия.

Использование псевдонимов (AS)

SELECT 
    flight_no AS "Рейс", 
    departure_airport AS "Аэропорт вылета", 
    arrival_airport AS "Аэропорт прибытия"
FROM bookings.flights;
Позволяет дать столбцам более удобные названия.

Ограничение количества строк (LIMIT)

SELECT 
    flight_no, 
    departure_airport, 
    arrival_airport 
FROM bookings.flights
LIMIT 5;
Выведет только 5 строк.

Сортировка данных (ORDER BY)

SELECT 
    flight_no, 
    scheduled_departure 
FROM bookings.flights
ORDER BY scheduled_departure DESC;
Сортировка по времени вылета — сначала самые поздние рейсы.

  • ASC (от слова "Ascending") означает сортировку в возрастающем порядке. Например, числовые значения будут сортироваться от меньшего к большему, а строковые — от A до Z.
  • DESC (от слова "Descending") означает сортировку в убывающем порядке. В этом случае числовые значения будут сортироваться от большего к меньшему, а строковые — от Z до A.

3. Фильтрация данных — WHERE

Фильтрация с помощью WHERE

Выберем только рейсы с определённым номером:

SELECT * 
FROM bookings.flights 
WHERE flight_no = 'PG1234';

Выберем рейсы, которые уже вылетели:

SELECT * 
FROM bookings.flights 
WHERE status = 'Departed';

Операторы сравнения

  • = — равно
  • <> — не равно
  • > / < — больше / меньше
  • >= / <= — больше или равно / меньше или равно

Пример: выберем рейсы, запланированные после 1 января 2025 года:

SELECT * 
FROM bookings.flights 
WHERE scheduled_departure > '2025-01-01';

Логические операторы: AND, OR, NOT

Выберем все задержанные рейсы из аэропорта SVO:

SELECT * 
FROM bookings.flights 
WHERE departure_airport = 'SVO' AND status = 'Delayed';

Выберем рейсы из SVO или DME:

SELECT * 
FROM bookings.flights 
WHERE departure_airport = 'SVO' OR departure_airport = 'DME';

Исключим рейсы с неизвестным статусом:

SELECT * 
FROM bookings.flights 
WHERE NOT status = 'Cancelled';

Приоритет операций: порядок выполнения условий в WHERE

Когда в SQL-запросе используются AND, OR и NOT, важно понимать, в каком порядке они выполняются.

Приоритет логических операторов:

  1. NOT – выполняется первым
  2. AND – выполняется вторым
  3. OR – выполняется последним

1. Что произойдёт без скобок?

Допустим, у нас есть таблица bookings.flights с рейсами:

flight_id departure_airport arrival_airport actual_departure status
101 SVO JFK 2024-01-29 10:00 Departed
102 DME CDG NULL Scheduled
103 LED SVO 2024-01-30 12:00 Departed
104 DME LHR NULL Canceled
Запрос без скобок:

SELECT * 
FROM bookings.flights 
WHERE departure_airport = 'DME' OR arrival_airport = 'JFK' AND actual_departure IS NOT NULL;
Как SQL его понимает:
SELECT * 
FROM bookings.flights 
WHERE departure_airport = 'DME' OR (arrival_airport = 'JFK' AND actual_departure IS NOT NULL);
Что произойдёт?
В выборку попадут все рейсы из DME (102 и 104)
Рейсы в JFK, которые уже вылетели (101)

Результат: рейсы 101, 102, 104.


2. Используем скобки, чтобы изменить логику

Если мы хотим выбрать рейсы, которые:
- Либо вылетают из DME, либо прилетают в JFK,
- Но при этом уже вылетели (actual_departure IS NOT NULL)

Исправленный запрос:

SELECT * 
FROM bookings.flights 
WHERE (departure_airport = 'DME' OR arrival_airport = 'JFK') 
AND actual_departure IS NOT NULL;
Как SQL его понимает:
SELECT * 
FROM bookings.flights 
WHERE (departure_airport = 'DME' OR arrival_airport = 'JFK') 
AND actual_departure IS NOT NULL;
Что теперь произойдёт?
Будут выбраны вылетевшие рейсы (actual_departure IS NOT NULL)
Среди них — только те, которые либо из DME, либо в JFK

Результат: рейс 101.


Вывод:

  • AND выполняется раньше OR, поэтому без скобок логика может быть не такой, как ожидалось.
  • Скобки помогают задать точный порядок выполнения условий.
  • При сложных запросах всегда проверяйте логику!

Работа с NULL

Что такое NULL на простом примере?

Представьте, что у вас есть книга контактов с номерами телефонов.

id name phone
1 Анна +7 900 123 45 67
2 Иван NULL
3 Ольга +7 901 987 65 43

У Анны и Ольги есть номера телефонов, а у Ивана — NULL.

  • NULL ≠ пустая строка
  • NULL ≠ 0
  • NULL = «Мы не знаем, есть у Ивана номер или нет»

Как работать с NULL в SQL?

Хотим найти всех, у кого нет номера:

SELECT * FROM contacts WHERE phone ISNULL;
Результат: Иван (у него нет номера).

Хотим найти всех, у кого номер указан:

SELECT * FROM contacts WHERE phone IS NOT NULL;
Результат: Анна и Ольга.

Почему важно понимать NULL?

  • Если сделать phone = NULL, то ничего не найдётся!
  • NULL означает отсутствие информации, а не пустое поле.
  • Ошибки в анализе данных: например, при подсчёте среднего (AVG(phone)) NULL-значения игнорируются.

Вернемся к нашей БД

Некоторые рейсы могут не иметь фактического времени вылета (actual_departure = NULL). Выберем такие рейсы:

SELECT * 
FROM bookings.flights 
WHERE actual_departure ISNULL;

Выберем рейсы, которые уже вылетели:

SELECT * 
FROM bookings.flights 
WHERE actual_departure IS NOT NULL;


Вывод

  • SELECT позволяет извлекать данные
  • ORDER BY сортирует их
  • LIMIT ограничивает количество строк
  • WHERE фильтрует данные
  • NULL требует особых проверок (ISNULL, IS NOT NULL)