← Назад к вопросам
Как выбрать элементы из таблицы, используя 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;
Итого
Для выборки элементов:
- SELECT — какие столбцы
- FROM — из какой таблицы
- WHERE — какие строки (фильтр)
- GROUP BY — как группировать
- HAVING — фильтр после агрегации
- ORDER BY — как сортировать
- LIMIT — сколько строк
- JOIN — объединение таблиц
В Java используй PreparedStatement для защиты от SQL injection или Spring Data JPA для удобства.