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

Приведи пример 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 генерируется под капотом.

Приведи пример SQL запроса | PrepBro