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

Расшифруй аббревиатуру SQL

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

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

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

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

SQL: Structured Query Language

SQL расшифровывается как Structured Query Languageязык структурированных запросов. Это стандартный язык для работы с реляционными базами данных.

История и значение

SQL был разработан в 1970-х годах в IBM и стал де-факто стандартом для работы с БД. Сегодня это самый популярный язык для работы с данными в мире, используется везде: от стартапов до BigTech компаний.

Основные компоненты SQL

1. DDL (Data Definition Language) — определение структуры

// Java: используем Hibernate/JPA для DDL
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.UUID)
    private UUID id;
    
    @Column(nullable = false, unique = true)
    private String email;
    
    @Column(name = "created_at", nullable = false)
    private LocalDateTime createdAt;
}

// Эквивалент в SQL:
// CREATE TABLE users (
//     id UUID PRIMARY KEY,
//     email VARCHAR(255) NOT NULL UNIQUE,
//     created_at TIMESTAMP NOT NULL
// );

2. DML (Data Manipulation Language) — работа с данными

// INSERT
String insertSql = "INSERT INTO users (id, email, created_at) VALUES (?, ?, ?)";
preparedStatement.setString(1, UUID.randomUUID().toString());
preparedStatement.setString(2, "user@example.com");
preparedStatement.setTimestamp(3, new Timestamp(System.currentTimeMillis()));
preparedStatement.executeUpdate();

// SELECT
String selectSql = "SELECT * FROM users WHERE email = ?";
preparedStatement.setString(1, "user@example.com");
ResultSet rs = preparedStatement.executeQuery();

// UPDATE
String updateSql = "UPDATE users SET email = ? WHERE id = ?";
preparedStatement.setString(1, "newemail@example.com");
preparedStatement.setString(2, userId);
preparedStatement.executeUpdate();

// DELETE
String deleteSql = "DELETE FROM users WHERE id = ?";
preparedStatement.setString(1, userId);
preparedStatement.executeUpdate();

3. DCL (Data Control Language) — права доступа

GRANT SELECT, INSERT ON users TO 'app_user'@'localhost';
REVOKE DELETE ON users FROM 'app_user'@'localhost';

4. TCL (Transaction Control Language) — управление транзакциями

@Transactional
public void transferMoney(UUID fromUserId, UUID toUserId, BigDecimal amount) {
    // BEGIN TRANSACTION (автоматически в @Transactional)
    
    User fromUser = userRepository.findById(fromUserId);
    User toUser = userRepository.findById(toUserId);
    
    fromUser.setBalance(fromUser.getBalance().subtract(amount));
    toUser.setBalance(toUser.getBalance().add(amount));
    
    userRepository.save(fromUser);
    userRepository.save(toUser);
    
    // COMMIT (автоматически при успехе)
    // ROLLBACK (автоматически при исключении)
}

SQL vs NoSQL: когда использовать

SQL (реляционные БД):

  • Структурированные данные
  • Нужны JOIN'ы между таблицами
  • Нужны ACID транзакции
  • Примеры: PostgreSQL, MySQL, Oracle
// Пример: получить все заказы пользователя с суммой
String sql = "SELECT o.id, o.total, u.name FROM orders o " +
             "JOIN users u ON o.user_id = u.id " +
             "WHERE u.email = ?";
preparedStatement.setString(1, "user@example.com");
ResultSet rs = preparedStatement.executeQuery();

NoSQL (документные БД):

  • Неструктурированные данные
  • Горизонтальная масштабируемость
  • Гибкая схема
  • Примеры: MongoDB, Cassandra, DynamoDB
// Пример: сохранить документ в MongoDB
Document userDoc = new Document()
    .append("email", "user@example.com")
    .append("orders", Arrays.asList(
        new Document().append("id", "order1").append("total", 100),
        new Document().append("id", "order2").append("total", 200)
    ));
collection.insertOne(userDoc);

SQL в Java приложениях

Уровень 1: Сырой JDBC (низкоуровневый контроль, много кода)

public User findUserByEmail(String email) throws SQLException {
    String sql = "SELECT id, email, created_at FROM users WHERE email = ?";
    try (Connection conn = getConnection();
         PreparedStatement stmt = conn.prepareStatement(sql)) {
        stmt.setString(1, email);
        try (ResultSet rs = stmt.executeQuery()) {
            if (rs.next()) {
                return new User(
                    UUID.fromString(rs.getString("id")),
                    rs.getString("email"),
                    rs.getTimestamp("created_at").toLocalDateTime()
                );
            }
        }
    }
    return null;
}

Уровень 2: Spring JdbcTemplate (меньше boilerplate)

@Repository
public class UserRepository {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    public User findByEmail(String email) {
        String sql = "SELECT * FROM users WHERE email = ?";
        return jdbcTemplate.queryForObject(sql, new UserRowMapper(), email);
    }
}

Уровень 3: JPA/Hibernate (ORM, самый удобный)

@Repository
public interface UserRepository extends JpaRepository<User, UUID> {
    Optional<User> findByEmail(String email);
}

// Использование:
User user = userRepository.findByEmail("user@example.com")
    .orElseThrow(() -> new UserNotFoundException());

Эволюция SQL в современной разработке

Современные тренды:

  • PostgreSQL вместо MySQL (более мощный, JSONB)
  • Query DSL и jOOQ для типобезопасности вместо сырого SQL
  • Миграции (Flyway, Liquibase) вместо ручного alter table
  • Event Sourcing как альтернатива традиционному CRUD

Ключевые моменты

  • SQLStructured Query Language, стандарт для 50+ лет
  • DDL, DML, DCL, TCL — четыре категории команд
  • В Java используем JDBC/Spring Data/JPA, не пишем SQL напрямую
  • Параметризованные запросы (?) обязательны для защиты от SQL-injection
  • ORM (Hibernate, JPA) скрывают SQL, но нужно понимать, что происходит "под капотом"
Расшифруй аббревиатуру SQL | PrepBro