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

Что означает * в записи SELECT *?

1.8 Middle🔥 131 комментариев
#Основы Java

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

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

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

Значение * в SELECT * SQL запросе

SELECT * — это SQL инструкция, которая означает выбрать все столбцы из таблицы. Символ * (звёздочка) является подстановочным символом, который расширяется на все доступные колонки.

Основное значение

-- SELECT * выбирает ВСЕ столбцы из таблицы users
SELECT * FROM users;

-- Эквивалент (явное указание всех колонок)
SELECT id, name, email, age, created_at, updated_at FROM users;

Примеры использования

1. Простой SELECT

-- Получить все данные из таблицы
SELECT * FROM users;

-- Результат (пример):
-- id | name  | email              | age
-- 1  | Alice | alice@example.com  | 28
-- 2  | Bob   | bob@example.com    | 34
-- 3  | Carol | carol@example.com  | 25

2. SELECT с WHERE

-- Получить все колонки для пользователя с id=1
SELECT * FROM users WHERE id = 1;

-- Результат:
-- id | name  | email             | age
-- 1  | Alice | alice@example.com | 28

3. SELECT с JOIN

-- Получить всё из обеих таблиц
SELECT * FROM users u
JOIN orders o ON u.id = o.user_id;

-- Результат включит все колонки из users И все колонки из orders
-- id | name  | ... | order_id | amount | ...

Проблемы с SELECT *

Хотя SELECT * удобна для простых запросов, она имеет значительные недостатки в production коде:

1. Performance проблемы

// Неправильно - выбираем все колонки
SELECT * FROM users; // Может быть медленно, если много больших колонок

// Правильно - только нужные колонки
SELECT id, name, email FROM users; // Быстрее

Если в таблице есть BLOB или TEXT колонки с большим объёмом данных, SELECT * будет передавать их все в памяти.

2. Непредсказуемые результаты при добавлении столбцов

-- Первоначально: id, name, email
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
);

-- Запрос, написанный раньше
SELECT * FROM users; -- Возвращает: id, name, email

-- Позже добавили новую колонку
ALTER TABLE users ADD COLUMN password_hash VARCHAR(255);

-- Теперь SELECT * вернёт ЧЕТЫРЕ колонки вместо трёх!
SELECT * FROM users; -- Возвращает: id, name, email, password_hash

-- Если код зависит от порядка/количества колонок, может сломаться

3. Утечка конфиденциальной информации

-- Опасно в приложении
SELECT * FROM users; -- Может выбрать и пароль, и API ключи!

-- Правильно - явно выбираем только публичные поля
SELECT id, name, email FROM users;

Best Practices

✅ Правильный подход

-- Явно указываем нужные колонки
SELECT id, name, email, created_at FROM users WHERE active = true;

-- В JPA/Hibernate
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    @Query("SELECT u.id, u.name, u.email FROM User u WHERE u.active = true")
    List<UserDTO> findActiveUsers();
}
// Использование DTO для явного управления полями
public class UserDTO {
    private Long id;
    private String name;
    private String email;
    // Только нужные поля, без password_hash!
}

❌ Неправильный подход

SELECT * FROM users; -- Выбирает всё подряд
// В коде
public List<User> getAllUsers() {
    return userRepository.findAll(); // SELECT * FROM users
}

WHERE это особенно критично

1. JOIN с несколькими таблицами

-- Неправильно: выбираем ВСЕ колонки из ВСЕХ таблиц
SELECT * FROM users u
JOIN orders o ON u.id = o.user_id
JOIN products p ON o.product_id = p.id;

-- Может быть ОЧЕНЬ много данных!

-- Правильно: только нужные
SELECT u.id, u.name, o.id, o.total, p.name 
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN products p ON o.product_id = p.id;

2. Агрегирующие запросы

-- Неправильно (синтаксис ошибка в большинстве БД)
SELECT * FROM orders GROUP BY user_id;
-- ERROR: column "orders.id" must appear in the GROUP BY clause

-- Правильно
SELECT user_id, COUNT(*) as order_count, SUM(total) as total_amount
FROM orders
GROUP BY user_id;

Когда SELECT * приемлема

Существуют случаи, когда использование SELECT * оправдано:

  1. Разработка и отладка — быстро посмотреть все данные
  2. Простые административные запросы — SELECT * FROM small_table
  3. Когда таблица действительно маленькая — few rows, few columns
-- OK для малой таблицы
SELECT * FROM settings;

-- Плохо для большой таблицы с миллионами строк
SELECT * FROM events;

Java пример с ORM

// Плохо - SELECT * эквивалент
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findAll(); // SELECT * FROM users
}

// Хорошо - явно выбираем нужные поля
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    @Query("SELECT new com.example.UserDTO(u.id, u.name, u.email) " +
           "FROM User u WHERE u.active = true")
    List<UserDTO> findActiveUsersOptimized();
}

// Или с projection
@Query("SELECT u.id, u.name, u.email FROM User u")
List<UserProjection> findAllProjected();

public interface UserProjection {
    Long getId();
    String getName();
    String getEmail();
}

Резюме

  • * в SELECT означает все столбцы таблицы
  • В production коде избегай SELECT *, явно указывай нужные колонки
  • Преимущества явного списка:
    • Лучшая производительность
    • Защита от утечек данных
    • Защита от непредсказуемых изменений схемы
    • Явная документация

Всегда пиши: SELECT id, name, email FROM users вместо SELECT * FROM users!

Что означает * в записи SELECT *? | PrepBro