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

Основы и SELECT

SQL для новичков: основы и SELECT

Понятный старт по SQL: как читать данные, фильтровать, сортировать и ограничивать выдачу.

Кому подойдет

  • Если вы никогда не писали SQL или писали пару SELECT.
  • Если хотите понимать запросы на работе и не бояться JOIN и GROUP BY.
  • Если используете PostgreSQL / MySQL / SQLite / SQL Server: база везде одинаковая.

Что такое SQL простыми словами

SQL (Structured Query Language) — язык, с помощью которого мы просим базу данных:

  • показать данные (SELECT),
  • добавить/изменить/удалить (INSERT, UPDATE, DELETE),
  • создать структуру (CREATE TABLE),
  • настроить доступы (GRANT) и т.д.

SQL — декларативный: вы говорите что хотите получить, а не как это делать пошагово.


Мини-набор данных (будем использовать в примерах)

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

Таблицы

SQL
CREATE TABLE users (
  id         INT PRIMARY KEY,
  name       VARCHAR(50) NOT NULL,
  email      VARCHAR(100) NOT NULL,
  created_at TIMESTAMP NOT NULL
);

CREATE TABLE products (
  id    INT PRIMARY KEY,
  name  VARCHAR(80) NOT NULL,
  price DECIMAL(10,2) NOT NULL
);

CREATE TABLE orders (
  id         INT PRIMARY KEY,
  user_id    INT NOT NULL,
  status     VARCHAR(20) NOT NULL,
  created_at TIMESTAMP NOT NULL
);

CREATE TABLE order_items (
  order_id   INT NOT NULL,
  product_id INT NOT NULL,
  qty        INT NOT NULL,
  price      DECIMAL(10,2) NOT NULL,
  PRIMARY KEY (order_id, product_id)
);

Данные

SQL
INSERT INTO users (id, name, email, created_at) VALUES
(1, 'Анна',  'anna@example.com',  '2026-01-10 10:00:00'),
(2, 'Борис', 'boris@example.com', '2026-01-11 12:30:00'),
(3, 'Хлоя',  'chloe@example.com', '2026-01-12 09:15:00');

INSERT INTO products (id, name, price) VALUES
(1, 'Клавиатура', 49.90),
(2, 'Мышь',       19.90),
(3, 'Монитор',   199.00),
(4, 'Кабель USB-C', 9.90);

INSERT INTO orders (id, user_id, status, created_at) VALUES
(1001, 1, 'paid',     '2026-01-20 14:00:00'),
(1002, 1, 'new',      '2026-01-22 18:10:00'),
(1003, 2, 'canceled', '2026-01-23 09:05:00');

INSERT INTO order_items (order_id, product_id, qty, price) VALUES
(1001, 1, 1, 49.90),
(1001, 2, 2, 19.90),
(1002, 3, 1, 199.00),
(1003, 4, 3,  9.90),
(1003, 2, 1, 19.90);

sql-01-table-basics.svg Таблица = колонки (поля) + строки (записи).


SELECT: выбрать данные из таблицы

Самый базовый запрос:

SQL
SELECT * FROM users;
  • SELECT — что выбрать
  • FROM — из какой таблицы
  • * — все колонки

Совет новичку: в реальных проектах лучше не злоупотреблять SELECT *, а явно указывать поля — так понятнее и безопаснее.

SQL
SELECT id, name, email
FROM users;

Псевдонимы (alias) для читаемости

SQL
SELECT
  u.id   AS user_id,
  u.name AS user_name
FROM users AS u;

AS можно часто опускать: FROM users u.


WHERE: фильтруем строки

1) Равно / не равно / больше / меньше

SQL
SELECT id, name
FROM users
WHERE id = 2;
SQL
SELECT id, name
FROM products
WHERE price >= 50;

2) AND / OR / NOT

SQL
SELECT id, name, price
FROM products
WHERE price >= 10 AND price <= 50;

То же проще через BETWEEN:

SQL
SELECT id, name, price
FROM products
WHERE price BETWEEN 10 AND 50;

BETWEEN включает границы диапазона.

3) IN: значение входит в список

SQL
SELECT id, name
FROM products
WHERE id IN (1, 3, 4);

ORDER BY: сортировка

SQL
SELECT id, name, price
FROM products
ORDER BY price DESC;
  • ASC — по возрастанию (по умолчанию)
  • DESC — по убыванию

Сортировка по нескольким полям:

SQL
SELECT id, user_id, status, created_at
FROM orders
ORDER BY status ASC, created_at DESC;

LIMIT / OFFSET: показать кусочек

SQL
SELECT id, name, price
FROM products
ORDER BY price DESC
LIMIT 2;

Пагинация:

SQL
SELECT id, name, price
FROM products
ORDER BY id
LIMIT 2 OFFSET 2;

В SQL Server используется другая форма, но идея та же: ограничить выдачу.


DISTINCT: убрать дубликаты

Например, список статусов заказов:

SQL
SELECT DISTINCT status
FROM orders;

NULL: нет значения (это не ноль и не пустая строка)

Так нельзя:

SQL
SELECT * FROM users WHERE email = NULL;

Правильно:

SQL
SELECT * FROM users WHERE email IS NULL;

И наоборот:

SQL
SELECT * FROM users WHERE email IS NOT NULL;

Логический порядок выполнения SELECT

Мы пишем запрос сверху вниз, но логически он выполняется в другом порядке.

sql-02-select-order.svg FROM/JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT.

Это важно, когда кажется, что SELECT "не видит" WHERE или HAVING — просто вспомните порядок.