Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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
Ключевые моменты
- SQL — Structured Query Language, стандарт для 50+ лет
- DDL, DML, DCL, TCL — четыре категории команд
- В Java используем JDBC/Spring Data/JPA, не пишем SQL напрямую
- Параметризованные запросы (?) обязательны для защиты от SQL-injection
- ORM (Hibernate, JPA) скрывают SQL, но нужно понимать, что происходит "под капотом"