Какие ключевые слова SQL используются для выборки данных из таблицы?

Ответ

Базовый запрос на выборку данных строится с помощью следующих ключевых слов SQL:

Основная структура SELECT-запроса:

SELECT column1, column2, column3  -- Выбор столбцов
FROM table_name                   -- Указание таблицы
WHERE condition                   -- Фильтрация строк
GROUP BY column1                  -- Группировка
HAVING group_condition           -- Фильтрация групп
ORDER BY column1 ASC|DESC        -- Сортировка
LIMIT count;                     -- Ограничение количества строк

Детальное описание ключевых слов:

1. SELECT — определяет какие столбцы возвращать

-- Все столбцы
SELECT * FROM employees;

-- Конкретные столбцы
SELECT id, first_name, last_name FROM employees;

-- Выражения и алиасы
SELECT 
    id,
    first_name || ' ' || last_name AS full_name,
    salary * 1.1 AS increased_salary
FROM employees;

2. FROM — указывает таблицу или представление

-- Одна таблица
SELECT * FROM products;

-- Несколько таблиц (декартово произведение)
SELECT * FROM table1, table2;

-- Подзапрос в FROM
SELECT * FROM (SELECT id, name FROM users) AS subquery;

3. WHERE — фильтрация строк по условию

SELECT * FROM orders 
WHERE status = 'completed' 
  AND total_amount > 1000 
  AND order_date >= '2024-01-01';

-- Операторы сравнения: =, <>, >, <, >=, <=, BETWEEN, LIKE, IN
SELECT * FROM products WHERE price BETWEEN 10 AND 100;
SELECT * FROM users WHERE email LIKE '%@gmail.com';
SELECT * FROM orders WHERE status IN ('pending', 'processing');

4. ORDER BY — сортировка результатов

-- Сортировка по одному столбцу
SELECT * FROM products ORDER BY price DESC;

-- Сортировка по нескольким столбцам
SELECT * FROM employees 
ORDER BY department ASC, last_name ASC, first_name ASC;

-- Сортировка по выражению
SELECT * FROM orders 
ORDER BY (total_amount - discount) DESC;

5. LIMIT / OFFSET — пагинация результатов

-- Первые 10 записей
SELECT * FROM products LIMIT 10;

-- Пагинация: страница 3, по 20 записей на странице
SELECT * FROM products 
LIMIT 20 OFFSET 40;  -- Пропустить 40, взять следующие 20

6. DISTINCT — удаление дубликатов

-- Уникальные значения столбца
SELECT DISTINCT category FROM products;

-- Уникальные комбинации нескольких столбцов
SELECT DISTINCT city, country FROM customers;

7. JOIN — соединение таблиц (хотя технически часть FROM)

-- INNER JOIN
SELECT users.name, orders.total
FROM users
INNER JOIN orders ON users.id = orders.user_id;

-- LEFT JOIN
SELECT departments.name, COUNT(employees.id) as emp_count
FROM departments
LEFT JOIN employees ON departments.id = employees.department_id
GROUP BY departments.name;

Полный пример сложного запроса:

SELECT 
    c.first_name,
    c.last_name,
    COUNT(o.id) AS order_count,
    SUM(o.total_amount) AS total_spent,
    AVG(o.total_amount) AS avg_order_value
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE c.registration_date >= '2023-01-01'
  AND c.active = true
GROUP BY c.id, c.first_name, c.last_name
HAVING COUNT(o.id) > 5
ORDER BY total_spent DESC
LIMIT 50;

Важные примечания:

  • Порядок ключевых слов фиксирован: SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT
  • Не все СУБД поддерживают LIMIT (в SQL Server используется TOP или OFFSET FETCH)
  • Для производительности важно использовать индексы на столбцах в WHERE и JOIN условиях

Ответ 18+ 🔞

А, SQL, ёпта! Ну, это ж как азбука для любого, кто хоть раз пытался вытащить что-то из базы данных, кроме головной боли. Слушай, давай разберём эту магию, но без заумных соплей, а по-простому, как есть.

Представь, что база данных — это огромный склад, забитый коробками (таблицами) до самого потолка. А ты — кладовщик, которому начальник кричит: «Принеси мне вот это, вот это и вот то, но только если оно красное и не сломано, и разложи всё по полочкам, и чтобы красиво было!». Вот SELECT — это твой волшебный пинок под зад, чтобы ты пошёл и начал что-то искать.

Основная схема твоего похода на склад:

SELECT что_забрать          -- Берёшь коробки или вещи из них
FROM с_какой_полки          -- Подходишь к нужному стеллажу
WHERE по_какому_признаку    -- Отбрасываешь всё, что не подходит (ахтунг, мусор!)
GROUP BY как_сгруппировать  -- Сваливаешь похожее в кучки
HAVING какая_кучка_нужна    -- Отбираешь только нужные кучи
ORDER BY как_разложить      -- Аккуратно расставляешь на столе
LIMIT сколько_принести;     -- И неси не всё, а ровно столько, сколько сказали!

А теперь подробнее, с матом для ясности:

1. SELECT — «Чё будем таскать?» Тут всё просто: говоришь, что тебе нужно выдернуть из таблицы. Хочешь всё — скажи звёздочку, как дикарь. Хочешь по-умному — перечисляй столбцы.

-- Всё подряд, как есть, даже пыль (неэффективно, но иногда надо)
SELECT * FROM employees;

-- Только ID, имя и фамилию, как нормальный человек
SELECT id, first_name, last_name FROM employees;

-- А можно и посчитать на ходу, типа «а дай-ка я зарплату на 10% увеличу в уме»
SELECT 
    id,
    first_name || ' ' || last_name AS full_name, -- Склеил имя и фамилию, назвал «полное_имя»
    salary * 1.1 AS increased_salary             -- Умножил зарплату, назвал «повышенная_зарплата»
FROM employees;

2. FROM — «А где это, блядь, искать?» Указание адреса. Без него ты просто посреди пустого склада стоишь и в сопли дуешь.

-- Ищешь в конкретной папке «товары»
SELECT * FROM products;

-- Если совсем еблан, можешь взять две таблицы и скрестить их как бог на душу положит (декартово произведение, а по-простому — хуёво)
SELECT * FROM table1, table2;

-- А можно сначала в уме сделать маленькую выборку (подзапрос), а потом из неё уже выбирать
SELECT * FROM (SELECT id, name FROM users) AS subquery;

3. WHERE — «А оно нам надо? Фильтруем!» Вот тут начинается самое интересное. Это твой главный инструмент, чтобы не тащить с собой весь хлам со склада.

SELECT * FROM orders 
WHERE status = 'completed'      -- Только завершённые
  AND total_amount > 1000       -- И чтоб сумма больше тысячи
  AND order_date >= '2024-01-01'; -- И чтоб с нового года, старьё не надо!

-- Можно искать по диапазону, как в каталоге
SELECT * FROM products WHERE price BETWEEN 10 AND 100;

-- Искать по шаблону, типа все почты с gmail
SELECT * FROM users WHERE email LIKE '%@gmail.com';

-- Или выбрать из списка: статус должен быть вот таким ИЛИ вот таким
SELECT * FROM orders WHERE status IN ('pending', 'processing');

4. ORDER BY — «Разложи красиво, а то начальник придерётся» Принёс кучу данных — теперь уберись, сортируй.

-- Разложил товары по цене, от дорогих к дешёвым
SELECT * FROM products ORDER BY price DESC;

-- Сначала по отделам, потом по фамилиям, потом по именам. Чётко.
SELECT * FROM employees 
ORDER BY department ASC, last_name ASC, first_name ASC;

-- Можно сортировать даже по результату вычислений, типа «чистая сумма заказа»
SELECT * FROM orders 
ORDER BY (total_amount - discount) DESC;

5. LIMIT / OFFSET — «Много не бери, руки отвалятся!» Пагинация, ёпта. Чтоб не слить сразу терабайты данных.

-- Дай мне первые 10 записей и вали
SELECT * FROM products LIMIT 10;

-- «Покажи мне третью страницу каталога» (по 20 товаров на странице)
SELECT * FROM products 
LIMIT 20 OFFSET 40;  -- Пропусти первые 40 (это 2 страницы), дай следующие 20

6. DISTINCT — «Одинаковое — выкидывай!» Чтоб не тащить одно и то же десять раз.

-- Какие у нас вообще есть категории товаров? Только уникальные названия!
SELECT DISTINCT category FROM products;

-- Какие уникальные пары «город-страна» есть у клиентов?
SELECT DISTINCT city, country FROM customers;

7. JOIN — «А давай-ка сгоняем на соседний склад!» Вот это уже мощь. Соединяем таблицы, как пазл.

-- INNER JOIN: дай мне пользователей и их заказы, но только тех, у кого заказы ЕСТЬ
SELECT users.name, orders.total
FROM users
INNER JOIN orders ON users.id = orders.user_id;

-- LEFT JOIN: покажи мне ВСЕ отделы, даже если в них нихуя не работает
SELECT departments.name, COUNT(employees.id) as emp_count
FROM departments
LEFT JOIN employees ON departments.id = employees.department_id
GROUP BY departments.name;

И, наконец, полный разбор полётов — сложный запрос:

SELECT 
    c.first_name,                     -- Имя клиента
    c.last_name,                      -- Фамилия клиента
    COUNT(o.id) AS order_count,       -- Сколько раз он заказывал (считаем заказы)
    SUM(o.total_amount) AS total_spent, -- Сколько в сумме потратил
    AVG(o.total_amount) AS avg_order_value -- В среднем чек
FROM customers c                      -- Из таблицы клиентов (назвал её просто 'c')
LEFT JOIN orders o ON c.id = o.customer_id -- Присоединил заказы по ID клиента
WHERE c.registration_date >= '2023-01-01' -- Клиент зарегался не раньше 2023
  AND c.active = true                     -- И он активный
GROUP BY c.id, c.first_name, c.last_name -- Сгруппировал всё по каждому клиенту
HAVING COUNT(o.id) > 5                    -- Но оставил только тех, у кого больше 5 заказов
ORDER BY total_spent DESC                 -- Отсортировал по суммарным тратам, от больших к меньшим
LIMIT 50;                                 -- И дай мне топ-50 таких жирных котов!

И главное, запомни, чувак:

  • Порядок слов — закон. SELECTFROMWHEREGROUP BYHAVINGORDER BYLIMIT. Не перепутай, а то запрос пойдёт по пизде.
  • Не во всех базах LIMIT работает. В SQL Server, например, свои заморочки (TOP или OFFSET FETCH).
  • Если хочешь, чтобы всё летало, а не ползало — индексы, блядь, индексы! Ставь их на столбцы, по которым ищешь в WHERE и соединяешь в JOIN. Без этого — писец производительности.