← Назад к вопросам
Приведи пример SQL запроса
2.3 Middle🔥 141 комментариев
#Docker, Kubernetes и DevOps#JVM и управление памятью#ORM и Hibernate
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Приведи пример SQL запроса
Простой пример: SELECT
-- Получить всех пользователей
SELECT * FROM users;
-- Результат:
-- id | name | email | created_at
-- 1 | Alice | alice@x.com | 2024-01-15
-- 2 | Bob | bob@x.com | 2024-01-20
-- 3 | Charlie | charlie@x.com | 2024-02-01
SELECT с условием: WHERE
-- Получить пользователей с именем Alice
SELECT id, name, email FROM users WHERE name = 'Alice';
-- Результат:
-- id | name | email
-- 1 | Alice | alice@x.com
SELECT с фильтрацией по дате
-- Пользователи, зарегистрированные после 2024-01-20
SELECT name, email, created_at
FROM users
WHERE created_at > '2024-01-20'
ORDER BY created_at DESC;
-- Результат:
-- name | email | created_at
-- Charlie | charlie@x.com | 2024-02-01
-- Bob | bob@x.com | 2024-01-20
JOIN: связь между таблицами
-- Таблица posts с внешним ключом на users
TABLE posts:
id | title | content | user_id | created_at
1 | Hello World | My first post | 1 | 2024-01-20
2 | Java Tips | Performance ... | 1 | 2024-01-25
3 | SQL Basics | Intro to SQL | 2 | 2024-02-01
-- Получить посты с именами авторов
SELECT
u.name,
p.title,
p.created_at
FROM users u
INNER JOIN posts p ON u.id = p.user_id
WHERE p.created_at > '2024-01-20'
ORDER BY p.created_at DESC;
-- Результат:
-- name | title | created_at
-- Alice | Java Tips | 2024-01-25
-- Bob | SQL Basics | 2024-02-01
Агрегация: COUNT, SUM, AVG
-- Сколько постов у каждого пользователя?
SELECT
u.name,
COUNT(p.id) as post_count,
MAX(p.created_at) as last_post
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.id, u.name
ORDER BY post_count DESC;
-- Результат:
-- name | post_count | last_post
-- Alice | 2 | 2024-01-25
-- Bob | 1 | 2024-02-01
-- Charlie | 0 | NULL
HAVING: фильтр для агрегации
-- Показать только пользователей с 2+ постами
SELECT
u.name,
COUNT(p.id) as post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.id, u.name
HAVING COUNT(p.id) >= 2;
-- Результат:
-- name | post_count
-- Alice | 2
INSERT: добавление данных
-- Добавить нового пользователя
INSERT INTO users (name, email, created_at)
VALUES ('David', 'david@x.com', '2024-03-01');
-- Добавить несколько постов
INSERT INTO posts (title, content, user_id, created_at)
VALUES
('Post 1', 'Content 1', 1, '2024-03-01'),
('Post 2', 'Content 2', 2, '2024-03-02'),
('Post 3', 'Content 3', 1, '2024-03-03');
UPDATE: изменение данных
-- Обновить email пользователя Alice
UPDATE users
SET email = 'alice.new@x.com', updated_at = NOW()
WHERE name = 'Alice';
-- Увеличить счётчик просмотров для всех постов
UPDATE posts
SET views = views + 1
WHERE user_id = 1;
DELETE: удаление данных
-- Удалить пользователя (каскадное удаление его постов)
DELETE FROM users
WHERE id = 3;
-- Удалить все посты старше 2024
DELETE FROM posts
WHERE created_at < '2024-01-01';
Сложный запрос: подзапрос (Subquery)
-- Пользователи с количеством постов выше среднего
SELECT u.name, COUNT(p.id) as post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.id, u.name
HAVING COUNT(p.id) > (
SELECT AVG(post_count)
FROM (
SELECT COUNT(id) as post_count
FROM posts
GROUP BY user_id
) subquery
);
Window Functions: продвинутая аналитика
-- Получить ранг пользователей по количеству постов
SELECT
u.name,
COUNT(p.id) as post_count,
RANK() OVER (ORDER BY COUNT(p.id) DESC) as rank
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.id, u.name;
-- Результат:
-- name | post_count | rank
-- Alice | 2 | 1
-- Bob | 1 | 2
-- Charlie | 0 | 3
UNION: объединение результатов
-- Все события: посты и комментарии
SELECT u.name, 'post' as type, p.title as content, p.created_at
FROM users u
JOIN posts p ON u.id = p.user_id
UNION
SELECT u.name, 'comment' as type, c.text as content, c.created_at
FROM users u
JOIN comments c ON u.id = c.user_id
ORDER BY created_at DESC;
Транзакция: несколько операций
-- Гарантирует, что либо всё выполнится, либо ничего
BEGIN TRANSACTION;
-- Перевести деньги со счета A на счет B
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- Записать в лог
INSERT INTO transaction_log (from_id, to_id, amount, status)
VALUES (1, 2, 100, 'success');
COMMIT; -- Сохранить все изменения
-- Если ошибка: ROLLBACK; — откатить всё
Пример с Java и JDBC
public class UserRepository {
private DataSource dataSource;
// SELECT пример
public List<User> findByName(String name) {
String sql = "SELECT id, name, email FROM users WHERE name = ?";
try (Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, name); // Защита от SQL injection
try (ResultSet rs = stmt.executeQuery()) {
List<User> users = new ArrayList<>();
while (rs.next()) {
users.add(new User(
rs.getInt("id"),
rs.getString("name"),
rs.getString("email")
));
}
return users;
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
// INSERT пример
public void insert(User user) {
String sql = "INSERT INTO users (name, email, created_at) VALUES (?, ?, ?)";
try (Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, user.getName());
stmt.setString(2, user.getEmail());
stmt.setTimestamp(3, Timestamp.from(Instant.now()));
stmt.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
Основные операции
| Операция | Назначение |
|---|---|
| SELECT | Выборка данных |
| INSERT | Добавление новых записей |
| UPDATE | Изменение существующих данных |
| DELETE | Удаление данных |
| JOIN | Объединение таблиц |
| GROUP BY | Группировка и агрегация |
| WHERE | Фильтрация по условиям |
| ORDER BY | Сортировка результатов |
| LIMIT | Ограничение количества строк |
Вывод
SQL запросы — это основной инструмент для работы с реляционными БД. Даже при использовании ORM (Hibernate, JPA) разработчик должен понимать, какой SQL генерируется под капотом.