ИТ.03 - 03 - Введение в SQL. Основные возможности языка структурированных запросов
Введение
Реляционные базы данных — это мощный инструмент для хранения и обработки информации. Но сами по себе таблицы с данными мало полезны, если у нас нет способа их удобно использовать. Для общения с базой данных существует специальный язык — SQL (Structured Query Language).
SQL — это международный стандарт, поддерживаемый почти всеми реляционными СУБД (MySQL, PostgreSQL, Oracle, Microsoft SQL Server и др.). Он позволяет формулировать запросы к данным на понятном и относительно простом синтаксисе.
Что такое SQL?
SQL (Structured Query Language) — это язык структурированных запросов, предназначенный для создания, изменения и извлечения данных из реляционных баз данных.
SQL нужен для:
- Создания таблиц и баз данных.
- Заполнения таблиц данными.
- Поиска и анализа информации.
- Управления доступом к данным.
Пример простого запроса:
SELECT name, age
FROM students
WHERE age > 18;
Такой запрос выберет имена и возраст всех студентов старше 18 лет.
Особенности SQL
Декларативный характер.
В SQL мы описываем, что хотим получить, а не как это сделать. Все технические детали берёт на себя СУБД.Универсальность.
Основные конструкции SQL одинаковы в разных СУБД. Выучив их, можно работать с любыми системами.Стандартизация.
SQL закреплён международными стандартами (ANSI, ISO).
Историческая справка
Развитие языка SQL связано с появлением реляционной модели данных, предложенной Эдгаром Коддом в 1970 году.
- В 1974 году специалисты IBM разработали первый вариант языка — SEQUEL (Structured English Query Language). Позже его название было изменено на SQL.
- В 1986 году SQL стал стандартом ANSI, а в 1987 — международным стандартом ISO.
- В 1990-2000-е годы каждая крупная СУБД стала развивать собственные расширения SQL, чтобы удовлетворять новые потребности пользователей.
Сегодня SQL остаётся универсальным инструментом для работы с реляционными базами данных, а его расширения позволяют решать всё более сложные задачи.
Стандарты SQL
Как и языки программирования, SQL развивается и обновляется. В разные годы выходили новые версии стандарта:
- SQL-86, SQL-89 — первые версии стандарта.
- SQL-92 — наиболее важная версия, заложившая основу современного SQL.
- SQL:1999 — добавлены триггеры, рекурсивные запросы и объектные возможности.
- SQL:2003 — появление оконных функций и работы с XML.
- SQL:2011 — поддержка временных данных.
- SQL:2016 — работа с JSON.
Знание стандартов помогает понимать, какие возможности SQL являются базовыми, а какие — зависят от конкретной СУБД.
Диалекты SQL
Хотя SQL стандартизирован, у разных СУБД есть свои особенности. Эти вариации называют диалектами SQL.
Примеры диалектов:
- PL/SQL — диалект Oracle, добавляющий процедурное программирование, пакеты и функции.
- T-SQL (Transact-SQL) — расширение Microsoft SQL Server. Поддерживает собственные функции и тесно интегрирован с .NET.
- PL/pgSQL — расширение PostgreSQL, известное поддержкой пользовательских типов данных и JSON.
- MySQL SQL — относительно близок к стандарту, но имеет свои особенности в работе с типами данных и ограничениями.
- SQLite SQL — довольно сильно ограничен по количеству возможностей, нацелен на автономную работу небольших встраиваемых БД.
Сравнение диалектов SQL в разных СУБД
СУБД | Диалект | Особенности |
---|---|---|
Oracle | PL/SQL | Поддержка процедурного программирования, пакетов, функций; высокая надёжность |
MS SQL Server | T-SQL | Расширенные операторы, встроенные функции; интеграция с экосистемой Microsoft |
PostgreSQL | PL/pgSQL | Поддержка JSON, пользовательских типов данных и расширенной аналитики |
MySQL | SQL (вариация) | Простота, популярность в веб-разработке; некоторые ограничения стандарта |
SQLite | SQL (урезанный) | Лёгкость и автономность; не поддерживает все возможности стандарта |
Пример различий в диалектах
MySQL
SELECT NOW();
Возвращает текущие дату и время.
Если нужна только дата:
SELECT CURDATE();
PostgreSQL
SELECT NOW();
Возвращает текущие дату и время в формате timestamp
с указанием временной зоны.
Для текущей даты:
SELECT CURRENT_DATE;
Oracle (PL/SQL)
SELECT SYSDATE FROM dual;
Возвращает текущие дату и время.
Для большей точности (до микросекунд):
SELECT SYSTIMESTAMP FROM dual;
MS SQL Server (T-SQL)
SELECT GETDATE();
Возвращает текущие дату и время.
Более современный вариант:
SELECT SYSDATETIME();
SQLite
SELECT datetime('now');
Возвращает дату и время в формате YYYY-MM-DD HH:MM:SS
.
Только дата:
SELECT date('now');
Как видно:
- MySQL и PostgreSQL поддерживают схожую конструкцию
NOW()
, - Oracle традиционно использует
SYSDATE
(через псевдотаблицуdual
), - SQL Server —
GETDATE()
илиSYSDATETIME()
, - SQLite — функции
date()
иdatetime()
с параметром'now'
.
Таким образом, базовые конструкции SQL остаются общими, но детали могут отличаться в зависимости от конкретной СУБД.
Основные разделы SQL
SQL состоит из нескольких групп команд, каждая из которых отвечает за свой набор действий.
1. DDL (Data Definition Language) — язык определения данных
Работает со структурой базы данных: создаёт, изменяет или удаляет таблицы.
Команды:
CREATE
— создание объектов (баз, таблиц).ALTER
— изменение структуры.DROP
— удаление объектов.
2. DML (Data Manipulation Language) — язык манипулирования данными
Позволяет добавлять и изменять сами данные в таблицах.
Команды:
INSERT
— добавить данные.UPDATE
— изменить данные.DELETE
— удалить данные.SELECT
— выбрать данные.
3. DCL (Data Control Language) — язык управления доступом
Задаёт права пользователей.
Команды:
GRANT
— предоставить права.REVOKE
— отозвать права.
4. TCL (Transaction Control Language) — язык управления транзакциями
Отвечает за группировку действий и сохранение результатов.
Команды:
COMMIT
— зафиксировать изменения.ROLLBACK
— отменить изменения.SAVEPOINT
— поставить точку сохранения.
Базовая структура SQL-запроса
Минимальная схема SQL-запроса выглядит так:
SELECT <столбцы>
FROM <таблица>
WHERE <условие>;
SELECT
— какие столбцы выбрать.FROM
— из какой таблицы.WHERE
— при каком условии.
Например
Допустим, у нас есть таблица со списком студентов:
id | name | age | gender |
---|---|---|---|
1 | Иванов Иван | 19 | male |
2 | Петрова Мария | 20 | female |
3 | Сидоров Алексей | 18 | male |
4 | Смирнова Екатерина | 21 | female |
5 | Кузнецов Даниил | 22 | male |
6 | Новикова Анна | 19 | female |
7 | Фёдоров Михаил | 20 | male |
Код создания данной таблицы на языке SQL в диалекте SQLite
CREATE TABLE IF NOT EXISTS students (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER CHECK (age >= 0),
gender TEXT CHECK (gender IN ('male', 'female')) NOT NULL
);
INSERT INTO students (id, name, age, gender) VALUES
(1, 'Иванов Иван', 19, 'male'),
(2, 'Петрова Мария', 20, 'female'),
(3, 'Сидоров Алексей', 18, 'male'),
(4, 'Смирнова Екатерина', 21, 'female'),
(5, 'Кузнецов Даниил', 22, 'male'),
(6, 'Новикова Анна', 19, 'female'),
(7, 'Фёдоров Михаил', 20, 'male');
Тогда, мы можем выполнить следующий запрос:
SELECT name, gender
FROM students
WHERE gender = 'male';
Этот запрос выберет список всех студентов мужского пола.
┌─────────────────┬────────┐
│ name │ gender │
├─────────────────┼────────┤
│ Иванов Иван │ male │
│ Сидоров Алексей │ male │
│ Кузнецов Даниил │ male │
│ Фёдоров Михаил │ male │
└─────────────────┴────────┘
Примеры простых запросов
Выбор всех данных
SELECT *
FROM students;
┌────┬────────────────────┬─────┬────────┐
│ id │ name │ age │ gender │
├────┼────────────────────┼─────┼────────┤
│ 1 │ Иванов Иван │ 19 │ male │
│ 2 │ Петрова Мария │ 20 │ female │
│ 3 │ Сидоров Алексей │ 18 │ male │
│ 4 │ Смирнова Екатерина │ 21 │ female │
│ 5 │ Кузнецов Даниил │ 22 │ male │
│ 6 │ Новикова Анна │ 19 │ female │
│ 7 │ Фёдоров Михаил │ 20 │ male │
└────┴────────────────────┴─────┴────────┘
Выбор только конкретных столбцов
SELECT name, gender
FROM students;
┌────────────────────┬────────┐
│ name │ gender │
├────────────────────┼────────┤
│ Иванов Иван │ male │
│ Петрова Мария │ female │
│ Сидоров Алексей │ male │
│ Смирнова Екатерина │ female │
│ Кузнецов Даниил │ male │
│ Новикова Анна │ female │
│ Фёдоров Михаил │ male │
└────────────────────┴────────┘
Отбор по условию
SELECT name
FROM students
WHERE age < 21;
┌─────────────────┐
│ name │
├─────────────────┤
│ Иванов Иван │
│ Петрова Мария │
│ Сидоров Алексей │
│ Новикова Анна │
│ Фёдоров Михаил │
└─────────────────┘
Почему важно изучать SQL?
- SQL универсален: освоив его, можно работать с любой реляционной СУБД.
- Это базовый инструмент программиста, аналитика данных и администратора БД.
- Он позволяет работать не с одной таблицей, а с большими взаимосвязанными структурами.
Практические задания
Разберите, к каким разделам SQL относятся следующие команды:
CREATE TABLE Students (...)
SELECT * FROM Students
INSERT INTO Students ...
GRANT ALL ON Students TO User1
Вам дан запрос:
SELECT item, price FROM warehouse WHERE price > 1500;
Объясните своими словами, что он делает.
Составьте три задачи на русском языке, которые можно решить SQL-запросами в различных предметных областях:
- Продаже потребительских товаров
- Организации грузоперевозок
- Научно-исследовательской деятельности