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

Как выбрать элементы из таблицы, используя SQL

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

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

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

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

Как выбрать элементы из таблицы, используя SQL

Выборка элементов из таблицы — это основная операция в SQL. Рассмотрю различные способы в зависимости от требований.

Базовая выборка

-- Выбрать все столбцы
SELECT * FROM users;

-- Выбрать конкретные столбцы
SELECT id, name, email FROM users;

-- Выбрать первые N строк
SELECT * FROM users LIMIT 10;

Фильтрация WHERE

-- По условию
SELECT * FROM users WHERE status = 'active';

-- Несколько условий
SELECT * FROM users 
WHERE age > 18 AND country = 'Russia';

-- OR условие
SELECT * FROM users 
WHERE status = 'active' OR status = 'premium';

-- IN список
SELECT * FROM users WHERE id IN (1, 5, 10);

-- BETWEEN диапазон
SELECT * FROM orders WHERE total_price BETWEEN 100 AND 500;

-- LIKE шаблон
SELECT * FROM users WHERE name LIKE 'A%';  -- Начинается на A
SELECT * FROM users WHERE email LIKE '%@gmail.com';  -- Заканчивается на

Сортировка

-- По возрастанию
SELECT * FROM users ORDER BY name ASC;

-- По убыванию
SELECT * FROM users ORDER BY created_at DESC;

-- По нескольким столбцам
SELECT * FROM users 
ORDER BY status DESC, name ASC;

Distinct (уникальные значения)

-- Уникальные страны
SELECT DISTINCT country FROM users;

-- Уникальные пары
SELECT DISTINCT country, status FROM users;

JOIN (объединение таблиц)

-- INNER JOIN: только пересечения
SELECT u.name, o.total_price
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

-- LEFT JOIN: все из левой + совпадения из правой
SELECT u.name, COUNT(o.id) as order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name;

-- FULL JOIN: все из обеих таблиц
SELECT * FROM users u
FULL JOIN orders o ON u.id = o.user_id;

Агрегация

-- Количество записей
SELECT COUNT(*) FROM users;

-- Количество активных
SELECT COUNT(*) FROM users WHERE status = 'active';

-- Сумма, среднее, минимум, максимум
SELECT SUM(price), AVG(price), MIN(price), MAX(price)
FROM orders;

-- Группировка
SELECT country, COUNT(*) as user_count
FROM users
GROUP BY country;

-- С фильтром после агрегации
SELECT country, COUNT(*) as user_count
FROM users
GROUP BY country
HAVING COUNT(*) > 10;

На Java с JDBC

public List<User> selectActiveUsers() {
    String sql = "SELECT id, name, email, status FROM users WHERE status = ? ORDER BY name";
    List<User> users = new ArrayList<>();
    
    try (Connection conn = getConnection();
         PreparedStatement stmt = conn.prepareStatement(sql)) {
        
        stmt.setString(1, "active");
        
        try (ResultSet rs = stmt.executeQuery()) {
            while (rs.next()) {
                User user = new User();
                user.setId(rs.getInt("id"));
                user.setName(rs.getString("name"));
                user.setEmail(rs.getString("email"));
                user.setStatus(rs.getString("status"));
                users.add(user);
            }
        }
    } catch (SQLException e) {
        logger.error("Database error", e);
    }
    
    return users;
}

На Java с Spring Data JPA

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
    // Простой метод по имени
    List<User> findByStatus(String status);
    
    // С сортировкой
    List<User> findByStatusOrderByNameAsc(String status);
    
    // С пагинацией
    Page<User> findByStatus(String status, Pageable pageable);
    
    // Кастомный JPQL запрос
    @Query("SELECT u FROM User u WHERE u.status = :status AND u.age > :age")
    List<User> findActiveAdults(
        @Param("status") String status,
        @Param("age") int age
    );
    
    // Нативный SQL
    @Query(nativeQuery = true, 
           value = "SELECT * FROM users WHERE country = ? ORDER BY name")
    List<User> findByCountryNative(String country);
}

// Использование
List<User> active = userRepository.findByStatus("active");
Page<User> paginated = userRepository.findByStatus(
    "active", 
    PageRequest.of(0, 20, Sort.by("name").ascending())
);

Примеры из реальной разработки

-- Топ 5 самых активных пользователей
SELECT u.name, COUNT(o.id) as order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name
ORDER BY order_count DESC
LIMIT 5;

-- Средний заказ по дням
SELECT DATE(created_at) as date, AVG(total_price) as avg_price
FROM orders
WHERE created_at >= NOW() - INTERVAL '30 days'
GROUP BY DATE(created_at)
ORDER BY date DESC;

-- Пользователи с несколькими заказами в один день
SELECT u.name, DATE(o.created_at), COUNT(*)
FROM users u
JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name, DATE(o.created_at)
HAVING COUNT(*) > 1;

Итого

Для выборки элементов:

  1. SELECT — какие столбцы
  2. FROM — из какой таблицы
  3. WHERE — какие строки (фильтр)
  4. GROUP BY — как группировать
  5. HAVING — фильтр после агрегации
  6. ORDER BY — как сортировать
  7. LIMIT — сколько строк
  8. JOIN — объединение таблиц

В Java используй PreparedStatement для защиты от SQL injection или Spring Data JPA для удобства.

Как выбрать элементы из таблицы, используя SQL | PrepBro