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

На каком языке пишут запросы к БД?

1.0 Junior🔥 211 комментариев
#Python Core#REST API и HTTP#Базы данных (SQL)

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

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

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

# На каком языке пишут запросы к БД?

Запросы к базам данных пишут на SQL (Structured Query Language) — стандартизированном языке для работы с реляционными базами данных. SQL является универсальным стандартом, поддерживаемым практически всеми СУБД.

SQL как универсальный стандарт

SQL — это декларативный язык, который позволяет описать, ЧТО нужно получить, а не КАК это получить. Его синтаксис почти одинаков для всех реляционных баз данных:

-- Выборка данных
SELECT id, name, email FROM users WHERE age > 18;

-- Вставка данных
INSERT INTO users (name, email, age) VALUES ('Иван', 'ivan@example.com', 25);

-- Обновление данных
UPDATE users SET email = 'ivan.new@example.com' WHERE id = 1;

-- Удаление данных
DELETE FROM users WHERE id = 1;

SQL в Python разработке

В Python разработке есть несколько способов работы с БД через SQL:

1. Прямое выполнение SQL (Raw SQL)

Напрямую писать SQL-запросы в коде:

import sqlite3

conn = sqlite3.connect('database.db')
cursor = conn.cursor()

# Выполнение SQL-запроса
cursor.execute('SELECT * FROM users WHERE age > ?', (18,))
users = cursor.fetchall()

for user in users:
    print(user)

conn.close()

2. ORM (Object-Relational Mapping)

ORM преобразует SQL в объектно-ориентированный код. Это более "питоничный" способ:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, Session

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    email = Column(String)
    age = Column(Integer)

# Подключение и выполнение
engine = create_engine('sqlite:///database.db')
Base.metadata.create_all(engine)

with Session(engine) as session:
    # Вместо SQL пишем Python
    users = session.query(User).filter(User.age > 18).all()
    for user in users:
        print(user.name, user.email)

3. Query builders

Промежуточный вариант между Raw SQL и ORM — построители запросов:

from sqlalchemy import select

# Из SQLAlchemy 2.0
from sqlalchemy.orm import Session

stmt = select(User).where(User.age > 18)

with Session(engine) as session:
    users = session.execute(stmt).scalars().all()

Различные СУБД и их диалекты SQL

Хотя SQL стандартизирован, каждая СУБД имеет свои расширения:

PostgreSQL (с расширениями)

-- JSONB операции (специфично для PostgreSQL)
SELECT * FROM users WHERE data -> 'status' = 'active';

-- CTE (Common Table Expressions)
WITH recent_users AS (
    SELECT * FROM users WHERE created_at > NOW() - INTERVAL '7 days'
)
SELECT * FROM recent_users WHERE age > 18;

-- Window functions
SELECT 
    name, 
    salary,
    AVG(salary) OVER (PARTITION BY department) as avg_salary
FROM employees;

MySQL

-- MySQL синтаксис для JSON
SELECT * FROM users WHERE JSON_EXTRACT(data, '$.status') = 'active';

-- LIMIT и OFFSET для пагинации
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 20;

SQLite

-- Базовый синтаксис, работает везде
SELECT * FROM users WHERE age > 18 LIMIT 10;

SQL подзапросы и JOIN'ы

SQL позволяет писать сложные запросы:

-- INNER JOIN
SELECT u.name, o.order_id, o.total
FROM users u
INNER JOIN orders o ON u.id = o.user_id
WHERE u.age > 18;

-- LEFT JOIN (с NULL значениями)
SELECT u.name, COUNT(o.id) as order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name;

-- Подзапрос
SELECT * FROM users
WHERE id IN (
    SELECT user_id FROM orders WHERE total > 1000
);

Параметризованные запросы (защита от SQL Injection)

Очень важно использовать параметризованные запросы для безопасности:

# ПРАВИЛЬНО — защищено от SQL Injection
cursor.execute('SELECT * FROM users WHERE email = ?', (email,))

# НЕПРАВИЛЬНО — уязвимо!
query = f"SELECT * FROM users WHERE email = '{email}'"
cursor.execute(query)

NoSQL и альтернативные языки

Не все БД используют SQL. Для некоторых используются специализированные языки:

# MongoDB — использует JSON-подобные запросы
from pymongo import MongoClient

client = MongoClient()
db = client.mydb
collection = db.users

# Вместо SQL
users = collection.find({'age': {'$gt': 18}})

# Или Aggregation pipeline
users = collection.aggregate([
    {'$match': {'age': {'$gt': 18}}},
    {'$group': {'_id': '$city', 'count': {'$sum': 1}}}
])
# Redis — использует собственные команды
import redis

r = redis.Redis()
r.set('user:1:name', 'Иван')
name = r.get('user:1:name')

Современный подход в Python

В современной Python разработке используется комбинированный подход:

from sqlalchemy import text, select
from sqlalchemy.orm import Session

with Session(engine) as session:
    # Для простых запросов — ORM
    users = session.query(User).filter(User.age > 18).all()
    
    # Для сложных запросов — Raw SQL с параметризацией
    result = session.execute(
        text("""
            SELECT u.name, COUNT(o.id) as order_count
            FROM users u
            LEFT JOIN orders o ON u.id = o.user_id
            WHERE u.age > :min_age
            GROUP BY u.id
        """),
        {'min_age': 18}
    )

Заключение

Основной ответ: Запросы к БД пишут на SQL — это универсальный стандарт для реляционных СУБД (PostgreSQL, MySQL, SQLite, etc.).

В Python разработке:

  • Используют ORM (SQLAlchemy, Django ORM) для интеграции с кодом
  • Пишут Raw SQL для сложных запросов
  • Применяют параметризованные запросы для защиты от SQL Injection
  • Комбинируют подходы в зависимости от задачи

Знание SQL — обязательный навык для Python-разработчика, поскольку данные — это сердце любого приложения.

На каком языке пишут запросы к БД? | PrepBro