← Назад к вопросам

Как сделать фильтрацию в SQL-запросе?

2.3 Middle🔥 132 комментариев
#Базы данных и SQL

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Подходы к фильтрации данных в SQL

Фильтрация в SQL — это процесс выборки только тех строк из таблицы, которые удовлетворяют заданным условиям. Основной оператор для фильтрации — WHERE, но существуют и другие методы.

Базовый синтаксис WHERE

SELECT column1, column2
FROM table_name
WHERE condition;

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

  • = (равно)
  • <> или != (не равно)
  • > (больше)
  • < (меньше)
  • >= (больше или равно)
  • <= (меньше или равно)
  • BETWEEN (в диапазоне)
  • LIKE (по шаблону)
  • IN (в списке значений)

Практические примеры фильтрации

Фильтрация по точному значению:

SELECT * FROM Employees 
WHERE Department = 'IT' 
AND Salary > 50000;

Фильтрация по диапазону:

SELECT * FROM Orders 
WHERE OrderDate BETWEEN '2024-01-01' AND '2024-01-31';

Фильтрация с использованием шаблонов:

SELECT * FROM Products 
WHERE ProductName LIKE 'Apple%'; -- начинается с Apple

Расширенные методы фильтрации

1. Фильтрация с использованием подзапросов

SELECT * FROM Orders
WHERE CustomerID IN (
    SELECT CustomerID FROM Customers 
    WHERE Country = 'USA'
);

2. Фильтрация по NULL значениям

SELECT * FROM Employees
WHERE ManagerID IS NULL; -- IS NOT NULL для обратного

SELECT * FROM Products
WHERE COALESCE(Discount, 0) > 0; -- безопасная работа с NULL

3. Комбинирование условий

SELECT * FROM Products
WHERE (Category = 'Electronics' AND Price > 1000)
   OR (Category = 'Books' AND StockQuantity > 50);

4. Фильтрация с агрегатными функциями (HAVING)

SELECT Department, COUNT(*) as EmployeeCount
FROM Employees
GROUP BY Department
HAVING COUNT(*) > 5; -- фильтрация результатов группировки

Оптимизация производительности

Создание индексов для часто фильтруемых столбцов:

CREATE INDEX idx_department ON Employees(Department);
CREATE INDEX idx_date_amount ON Orders(OrderDate, TotalAmount);

Использование параметризованных запросов (в C#):

string sql = "SELECT * FROM Products WHERE Category = @category AND Price > @minPrice";
using (var command = new SqlCommand(sql, connection))
{
    command.Parameters.AddWithValue("@category", category);
    command.Parameters.AddWithValue("@minPrice", minPrice);
    // выполнение запроса
}

Лучшие практики

  1. Используйте индексы эффективно

    • Индексируйте столбцы, часто используемые в WHERE
    • Избегайте функций над индексированными столбцами в условиях
  2. Оптимизируйте условия

    -- Плохо (не использует индекс):
    SELECT * FROM Users WHERE YEAR(CreatedDate) = 2024;
    
    -- Хорошо (использует индекс):
    SELECT * FROM Users 
    WHERE CreatedDate >= '2024-01-01' 
      AND CreatedDate < '2025-01-01';
    
  3. Учитывайте селективность условий

    • Ставьте более селективные условия первыми
    • Используйте составные индексы для часто сочетаемых фильтров
  4. Избегайте функций в условиях WHERE

    -- Плохо:
    SELECT * FROM Products WHERE LOWER(Name) = 'iphone';
    
    -- Лучше:
    SELECT * FROM Products WHERE Name = 'iPhone' COLLATE SQL_Latin1_General_CP1_CI_AS;
    

Фильтрация в современных СУБД

В SQL Server (T-SQL):

-- Фильтрация с OFFSET-FETCH (пагинация)
SELECT * FROM Products
ORDER BY ProductID
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY;

В PostgreSQL:

-- Использование FILTER с агрегатными функциями
SELECT 
    Department,
    COUNT(*) FILTER (WHERE Salary > 50000) as HighEarners
FROM Employees
GROUP BY Department;

Фильтрация JSON данных:

-- Для СУБД с поддержкой JSON
SELECT * FROM Orders
WHERE JSON_VALUE(OrderDetails, '$.Status') = 'Completed';

Заключение

Эффективная фильтрация в SQL требует понимания:

  • Основного синтаксиса WHERE и операторов сравнения
  • Особенностей работы с NULL значениями
  • Различий между WHERE и HAVING
  • Принципов оптимизации запросов через индексы
  • Безопасности (защита от SQL-инъекций через параметризацию)

Правильная фильтрация не только обеспечивает получение нужных данных, но и значительно влияет на производительность приложения, особенно при работе с большими объемами данных. Всегда анализируйте план выполнения запросов и тестируйте различные подходы к фильтрации для достижения оптимальной производительности.

Как сделать фильтрацию в SQL-запросе? | PrepBro