Для чего в SQL используется оператор WHERE и как он применяется в Java-приложениях?

«Для чего в SQL используется оператор WHERE и как он применяется в Java-приложениях?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оператор WHERE определяет условие для фильтрации строк, выбираемых из таблицы (или нескольких таблиц) в операторах SELECT, UPDATE, DELETE. Он выполняется до любых операций группировки или агрегации.

Основное применение в Java-экосистеме:

  1. Нативный SQL (JDBC):

    String sql = "SELECT * FROM products WHERE category = ? AND price > ?";
    PreparedStatement stmt = connection.prepareStatement(sql);
    stmt.setString(1, "Electronics"); // Безопасная подстановка параметров
    stmt.setBigDecimal(2, new BigDecimal("100.00"));
    ResultSet rs = stmt.executeQuery();
  2. JPA (Java Persistence API) / Hibernate (JPQL или Criteria API):

    // JPQL (работает с сущностями, а не таблицами)
    TypedQuery<Product> query = em.createQuery(
        "SELECT p FROM Product p WHERE p.category = :cat AND p.price > :minPrice", 
        Product.class
    );
    query.setParameter("cat", "Electronics");
    query.setParameter("minPrice", 100.0);
    List<Product> results = query.getResultList();
  3. Spring Data JPA (Derived Queries или @Query):

    // Автогенерируемый метод по имени
    List<User> findByLastNameAndActiveTrue(String lastName);
    
    // Явный запрос с @Query
    @Query("SELECT u FROM User u WHERE u.email LIKE %:domain")
    List<User> findUsersByEmailDomain(@Param("domain") String domain);

Типы условий в WHERE:

  • Сравнение: =, <>, >, <, >=, <=
  • Логические операторы: AND, OR, NOT
  • Проверка на NULL: IS NULL, IS NOT NULL
  • Вхождение в набор: IN (value1, value2, ...)
  • Диапазон значений: BETWEEN value1 AND value2
  • Сопоставление с шаблоном: LIKE 'pattern%'% и _)

Best Practice: Всегда используйте параметризованные запросы (PreparedStatement в JDBC, именованные параметры в JPA) вместо конкатенации строк, чтобы предотвратить SQL-инъекции.