VIEW SQL — 100 универсальных примеров на все случаи жизни

🟢 VIEW SQL. Введение

Введение

VIEW — это представление, виртуальная таблица, формируемая запросом. Оно помогает структурировать логику, скрывать сложные JOIN, повторно использовать код и обеспечивать безопасность данных. view sql чаще всего используют, при создании представлений для аналитики, e-commerce, финансов, медицины, HR и других сфер.

Синтаксис

CREATE VIEW имя_представления AS
SELECT
    столбцы
FROM
    таблица
WHERE
    условие;

Типовая конструкция

CREATE VIEW high_value_orders AS
SELECT
    o.order_id,
    o.customer_id,
    o.total_amount
FROM
    orders AS o
WHERE
    o.status = 'PAID'
    AND o.total_amount > 1000
ORDER BY
    o.total_amount DESC;

Блок 1. Базовые представления из одной таблицы

Список активных пользователей:

CREATE VIEW active_users AS
SELECT
    u.user_id,
    u.email
FROM
    users AS u
WHERE
    u.is_active = 1;

Недорогие товары до 100 у.е.:

CREATE VIEW cheap_products AS
SELECT
    p.product_id,
    p.title,
    p.price
FROM
    products AS p
WHERE
    p.price < 100;

Фильмы с высоким рейтингом:

CREATE VIEW top_rated_films AS
SELECT
    f.film_id,
    f.title,
    f.rating
FROM
    films AS f
WHERE
    f.rating >= 8;

Сотрудники в активном статусе:

CREATE VIEW current_employees AS
SELECT
    e.emp_id,
    e.full_name
FROM
    employees AS e
WHERE
    e.status = 'ACTIVE';

Опубликованные статьи:

CREATE VIEW published_posts AS
SELECT
    p.post_id,
    p.title
FROM
    posts AS p
WHERE
    p.is_published = 1;

Пациенты с полисом страхования:

CREATE VIEW insured_patients AS
SELECT
    pt.patient_id,
    pt.policy_no
FROM
    patients AS pt
WHERE
    pt.policy_no IS NOT NULL;

Задачи с высоким приоритетом:

CREATE VIEW high_priority_tasks AS
SELECT
    t.task_id,
    t.title,
    t.priority
FROM
    tasks AS t
WHERE
    t.priority = 'HIGH';

Счета с положительным балансом:

CREATE VIEW positive_balance_accounts AS
SELECT
    a.account_no,
    a.balance
FROM
    accounts AS a
WHERE
    a.balance > 0;

Визиты за последние 30 дней:

CREATE VIEW recent_visits AS
SELECT
    v.visit_id,
    v.visit_date
FROM
    visits AS v
WHERE
    v.visit_date >= CURRENT_DATE - INTERVAL '30' DAY;

Активные курсы:

CREATE VIEW active_courses AS
SELECT
    c.course_id,
    c.title
FROM
    courses AS c
WHERE
    c.is_active = 1;

Блок 2. Алиасы и упрощение структуры

Пользователи с читаемыми именами:

CREATE VIEW users_with_aliases AS
SELECT
    u.user_id   AS id,
    u.full_name AS name
FROM
    users AS u;

Товары с укороченными колонками:

CREATE VIEW products_short AS
SELECT
    p.product_id AS id,
    p.title      AS product,
    p.price      AS cost
FROM
    products AS p;

Сотрудники с унифицированными полями:

CREATE VIEW employees_alias AS
SELECT
    e.emp_id    AS id,
    e.full_name AS employee_name,
    e.hire_date AS joined
FROM
    employees AS e;

Города клиентов:

CREATE VIEW customer_cities AS
SELECT
    c.customer_id AS id,
    c.city        AS hometown
FROM
    customers AS c;

Фильмы с сокращёнными именами:

CREATE VIEW films_short AS
SELECT
    f.film_id AS id,
    f.title   AS movie,
    f.rating  AS score
FROM
    films AS f;

Аккаунты с удобными колонками:

CREATE VIEW accounts_clear AS
SELECT
    a.account_no AS account,
    a.balance    AS money
FROM
    accounts AS a;

Задачи с псевдонимами:

CREATE VIEW tasks_view AS
SELECT
    t.task_id    AS id,
    t.title      AS task,
    t.priority   AS importance
FROM
    tasks AS t;

Курсы с читаемыми названиями:

CREATE VIEW courses_view AS
SELECT
    c.course_id AS id,
    c.title     AS course,
    c.level     AS difficulty
FROM
    courses AS c;

Пациенты с короткими колонками:

CREATE VIEW patients_view AS
SELECT
    pt.patient_id AS id,
    pt.full_name  AS name,
    pt.age        AS years
FROM
    patients AS pt;

Статьи с простыми полями:

CREATE VIEW posts_view AS
SELECT
    p.post_id AS id,
    p.title   AS headline
FROM
    posts AS p;

Блок 3. Фильтрация через WHERE

Заказы с оплаченным статусом:

CREATE VIEW paid_orders AS
SELECT
    o.order_id,
    o.total_amount
FROM
    orders AS o
WHERE
    o.status = 'PAID';

Книги, изданные после 2020 года:

CREATE VIEW recent_books AS
SELECT
    b.book_id,
    b.title,
    b.year
FROM
    books AS b
WHERE
    b.year > 2020;

Клиенты из Москвы:

CREATE VIEW moscow_customers AS
SELECT
    c.customer_id,
    c.full_name,
    c.city
FROM
    customers AS c
WHERE
    c.city = 'Moscow';

Акции со сроком действия:

CREATE VIEW active_promotions AS
SELECT
    pr.promo_id,
    pr.name,
    pr.end_date
FROM
    promotions AS pr
WHERE
    pr.end_date >= CURRENT_DATE;

Билеты в продаже:

CREATE VIEW available_tickets AS
SELECT
    t.ticket_id,
    t.flight_no
FROM
    tickets AS t
WHERE
    t.is_sold = 0;

Пациенты старше 60 лет:

CREATE VIEW senior_patients AS
SELECT
    p.patient_id,
    p.full_name,
    p.age
FROM
    patients AS p
WHERE
    p.age > 60;

Студенты с GPA выше 4.0:

CREATE VIEW top_students AS
SELECT
    s.student_id,
    s.full_name,
    s.gpa
FROM
    students AS s
WHERE
    s.gpa > 4.0;

Товары с нулевым остатком:

CREATE VIEW out_of_stock AS
SELECT
    p.product_id,
    p.title
FROM
    products AS p
WHERE
    p.stock = 0;

Логины за последние сутки:

CREATE VIEW last_day_logins AS
SELECT
    l.user_id,
    l.login_time
FROM
    logins AS l
WHERE
    l.login_time >= CURRENT_TIMESTAMP - INTERVAL '1' DAY;

Непроверенные заказы:

CREATE VIEW unchecked_orders AS
SELECT
    o.order_id,
    o.status
FROM
    orders AS o
WHERE
    o.is_checked = 0;

Блок 4. Агрегаты с GROUP BY и HAVING

Общая сумма заказов по клиентам:

CREATE VIEW customer_totals AS
SELECT
    o.customer_id,
    SUM(o.total_amount) AS total_spent
FROM
    orders AS o
GROUP BY
    o.customer_id;

Количество товаров в категориях:

CREATE VIEW product_counts AS
SELECT
    p.category,
    COUNT(*) AS total_products
FROM
    products AS p
GROUP BY
    p.category;

Средняя зарплата по отделам:

CREATE VIEW avg_salary_departments AS
SELECT
    e.department_id,
    AVG(e.salary) AS avg_salary
FROM
    employees AS e
GROUP BY
    e.department_id;

Города с большим числом заказов:

CREATE VIEW top_city_orders AS
SELECT
    c.city,
    COUNT(o.order_id) AS orders_count
FROM
    customers AS c
    INNER JOIN orders AS o
        ON o.customer_id = c.customer_id
GROUP BY
    c.city
HAVING
    COUNT(o.order_id) > 100;

Категории с продажами свыше 1 млн:

CREATE VIEW big_sales_categories AS
SELECT
    p.category,
    SUM(o.total_amount) AS revenue
FROM
    orders AS o
    INNER JOIN products AS p
        ON o.product_id = p.product_id
GROUP BY
    p.category
HAVING
    SUM(o.total_amount) > 1000000;

Количество студентов на курсе:

CREATE VIEW course_enrollments AS
SELECT
    e.course_id,
    COUNT(e.student_id) AS students_count
FROM
    enrollments AS e
GROUP BY
    e.course_id;

Средняя продолжительность визитов:

CREATE VIEW avg_visit_length AS
SELECT
    v.hospital_id,
    AVG(v.duration) AS avg_duration
FROM
    visits AS v
GROUP BY
    v.hospital_id;

Минимальная цена по брендам:

CREATE VIEW min_price_brand AS
SELECT
    p.brand,
    MIN(p.price) AS min_price
FROM
    products AS p
GROUP BY
    p.brand;

Средний рейтинг фильмов по жанрам:

CREATE VIEW avg_rating_genres AS
SELECT
    f.genre,
    AVG(f.rating) AS avg_rating
FROM
    films AS f
GROUP BY
    f.genre;

Сумма баллов студентов по группам:

CREATE VIEW scores_by_group AS
SELECT
    s.group_id,
    SUM(s.score) AS total_score
FROM
    scores AS s
GROUP BY
    s.group_id;

Блок 5. Соединения (JOIN)

Заказы с именами клиентов:

CREATE VIEW orders_with_customers AS
SELECT
    o.order_id,
    c.full_name,
    o.total_amount
FROM
    orders AS o
    INNER JOIN customers AS c
        ON c.customer_id = o.customer_id;

Отзывы с названиями фильмов:

CREATE VIEW reviews_with_titles AS
SELECT
    r.review_id,
    f.title,
    r.rating
FROM
    reviews AS r
    LEFT JOIN films AS f
        ON f.film_id = r.film_id;

Сотрудники с названиями отделов:

CREATE VIEW employees_with_departments AS
SELECT
    e.emp_id,
    e.full_name,
    d.name AS department
FROM
    employees AS e
    INNER JOIN departments AS d
        ON e.department_id = d.department_id;

Продажи по категориям:

CREATE VIEW sales_by_category AS
SELECT
    p.category,
    SUM(o.total_amount) AS total_sales
FROM
    orders AS o
    INNER JOIN products AS p
        ON o.product_id = p.product_id
GROUP BY
    p.category;

Студенты с названиями курсов:

CREATE VIEW students_courses AS
SELECT
    s.student_id,
    s.full_name,
    c.title AS course
FROM
    students AS s
    INNER JOIN enrollments AS e
        ON s.student_id = e.student_id
    INNER JOIN courses AS c
        ON e.course_id = c.course_id;

Билеты с рейсами:

CREATE VIEW tickets_with_flights AS
SELECT
    t.ticket_id,
    f.flight_no,
    f.departure_time
FROM
    tickets AS t
    INNER JOIN flights AS f
        ON t.flight_no = f.flight_no;

Логины с данными пользователей:

CREATE VIEW logins_with_users AS
SELECT
    l.login_id,
    u.full_name,
    l.login_time
FROM
    logins AS l
    LEFT JOIN users AS u
        ON l.user_id = u.user_id;

Продукты с брендами:

CREATE VIEW products_with_brands AS
SELECT
    p.product_id,
    p.title,
    b.name AS brand
FROM
    products AS p
    INNER JOIN brands AS b
        ON p.brand_id = b.brand_id;

Задачи с именами сотрудников:

CREATE VIEW tasks_with_employees AS
SELECT
    t.task_id,
    t.title,
    e.full_name AS assignee
FROM
    tasks AS t
    INNER JOIN employees AS e
        ON t.assigned_to = e.emp_id;

Пациенты с именами врачей:

CREATE VIEW patients_with_doctors AS
SELECT
    p.patient_id,
    p.full_name,
    d.full_name AS doctor
FROM
    patients AS p
    INNER JOIN doctors AS d
        ON p.doctor_id = d.doctor_id;

Блок 6. Подзапросы внутри представлений

Клиенты с максимальными заказами:

CREATE VIEW top_customers AS
SELECT
    c.customer_id,
    c.full_name,
    (SELECT MAX(o.total_amount)
     FROM orders AS o
     WHERE o.customer_id = c.customer_id) AS max_order
FROM
    customers AS c;

Студенты с последним экзаменом:

CREATE VIEW last_exam_students AS
SELECT
    s.student_id,
    s.full_name,
    (SELECT MAX(e.exam_date)
     FROM exams AS e
     WHERE e.student_id = s.student_id) AS last_exam_date
FROM
    students AS s;

Фильмы с количеством отзывов:

CREATE VIEW films_with_reviews AS
SELECT
    f.film_id,
    f.title,
    (SELECT COUNT(*)
     FROM reviews AS r
     WHERE r.film_id = f.film_id) AS reviews_count
FROM
    films AS f;

Сотрудники с минимальной зарплатой в отделе:

CREATE VIEW employees_min_salary AS
SELECT
    e.emp_id,
    e.full_name,
    e.department_id,
    (SELECT MIN(salary)
     FROM employees AS e2
     WHERE e2.department_id = e.department_id) AS min_salary_in_dept
FROM
    employees AS e;

Товары с последней датой продажи:

CREATE VIEW products_last_sale AS
SELECT
    p.product_id,
    p.title,
    (SELECT MAX(o.order_date)
     FROM orders AS o
     WHERE o.product_id = p.product_id) AS last_sale_date
FROM
    products AS p;

Клиенты с количеством заказов:

CREATE VIEW customer_order_counts AS
SELECT
    c.customer_id,
    c.full_name,
    (SELECT COUNT(*)
     FROM orders AS o
     WHERE o.customer_id = c.customer_id) AS orders_count
FROM
    customers AS c;

Курсы с максимальной оценкой:

CREATE VIEW courses_max_score AS
SELECT
    c.course_id,
    c.title,
    (SELECT MAX(s.score)
     FROM scores AS s
     WHERE s.course_id = c.course_id) AS max_score
FROM
    courses AS c;

Врачи с количеством пациентов:

CREATE VIEW doctors_patient_counts AS
SELECT
    d.doctor_id,
    d.full_name,
    (SELECT COUNT(*)
     FROM patients AS p
     WHERE p.doctor_id = d.doctor_id) AS patients_count
FROM
    doctors AS d;

Пользователи с датой последнего логина:

CREATE VIEW users_last_login AS
SELECT
    u.user_id,
    u.full_name,
    (SELECT MAX(l.login_time)
     FROM logins AS l
     WHERE l.user_id = u.user_id) AS last_login
FROM
    users AS u;

Фильмы с максимальным рейтингом в жанре:

CREATE VIEW films_top_in_genre AS
SELECT
    f.film_id,
    f.title,
    f.genre,
    (SELECT MAX(rating)
     FROM films AS f2
     WHERE f2.genre = f.genre) AS max_genre_rating
FROM
    films AS f;

Блок 7. Аналитические сценарии (финансы, e-commerce, HR, медицина)

Доходы по месяцам:

CREATE VIEW monthly_revenue AS
SELECT
    DATE_TRUNC('month', o.order_date) AS month,
    SUM(o.total_amount) AS revenue
FROM
    orders AS o
GROUP BY
    DATE_TRUNC('month', o.order_date);

Средний чек по магазинам:

CREATE VIEW avg_check_stores AS
SELECT
    s.store_id,
    AVG(o.total_amount) AS avg_check
FROM
    orders AS o
    INNER JOIN stores AS s
        ON o.store_id = s.store_id
GROUP BY
    s.store_id;

Уровень текучести сотрудников:

CREATE VIEW employee_turnover AS
SELECT
    d.department_id,
    COUNT(e.emp_id) FILTER (WHERE e.status = 'FIRED')::float /
    COUNT(e.emp_id) AS turnover_rate
FROM
    employees AS e
    INNER JOIN departments AS d
        ON e.department_id = d.department_id
GROUP BY
    d.department_id;

Количество госпитализаций по годам:

CREATE VIEW hospitalizations_yearly AS
SELECT
    EXTRACT(YEAR FROM v.visit_date) AS year,
    COUNT(*) AS total_visits
FROM
    visits AS v
GROUP BY
    EXTRACT(YEAR FROM v.visit_date);

Популярные товары по продажам:

CREATE VIEW top_selling_products AS
SELECT
    p.product_id,
    p.title,
    SUM(o.total_amount) AS total_sales
FROM
    orders AS o
    INNER JOIN products AS p
        ON o.product_id = p.product_id
GROUP BY
    p.product_id,
    p.title
ORDER BY
    total_sales DESC;

Средний балл студентов по курсам:

CREATE VIEW avg_score_courses AS
SELECT
    c.course_id,
    c.title,
    AVG(s.score) AS avg_score
FROM
    scores AS s
    INNER JOIN courses AS c
        ON s.course_id = c.course_id
GROUP BY
    c.course_id,
    c.title;

Пациенты по возрастным группам:

CREATE VIEW patient_age_groups AS
SELECT
    CASE
        WHEN p.age < 18 THEN 'Child'
        WHEN p.age BETWEEN 18 AND 60 THEN 'Adult'
        ELSE 'Senior'
    END AS age_group,
    COUNT(*) AS count_patients
FROM
    patients AS p
GROUP BY
    age_group;

Продажи по каналам:

CREATE VIEW sales_by_channel AS
SELECT
    o.channel,
    SUM(o.total_amount) AS total_sales
FROM
    orders AS o
GROUP BY
    o.channel;

Доходы врачей по специализациям:

CREATE VIEW revenue_doctors AS
SELECT
    d.specialization,
    SUM(v.price) AS total_revenue
FROM
    visits AS v
    INNER JOIN doctors AS d
        ON v.doctor_id = d.doctor_id
GROUP BY
    d.specialization;

Производительность сотрудников:

CREATE VIEW employee_performance AS
SELECT
    e.emp_id,
    e.full_name,
    COUNT(t.task_id) AS tasks_done
FROM
    employees AS e
    LEFT JOIN tasks AS t
        ON e.emp_id = t.assigned_to
        AND t.status = 'DONE'
GROUP BY
    e.emp_id,
    e.full_name;

Блок 8. Представления для безопасности и маскирования данных

Клиенты без отображения телефона:

CREATE VIEW customers_masked AS
SELECT
    c.customer_id,
    c.full_name,
    '***-***-' || RIGHT(c.phone, 2) AS phone_masked
FROM
    customers AS c;

Пациенты без паспортных данных:

CREATE VIEW patients_safe AS
SELECT
    p.patient_id,
    p.full_name,
    NULL AS passport_no
FROM
    patients AS p;

Сотрудники с окладом без премий:

CREATE VIEW employees_salary_only AS
SELECT
    e.emp_id,
    e.full_name,
    e.salary AS base_salary
FROM
    employees AS e;

Маскирование email-адресов:

CREATE VIEW masked_emails AS
SELECT
    u.user_id,
    CONCAT(LEFT(u.email, 3), '***@***') AS email_masked
FROM
    users AS u;

Ограничение полей по GDPR:

CREATE VIEW gdpr_users AS
SELECT
    u.user_id,
    u.full_name
FROM
    users AS u;

Анонимные отзывы:

CREATE VIEW anonymous_reviews AS
SELECT
    r.review_id,
    'Anonymous' AS author,
    r.text
FROM
    reviews AS r;

Финансовые транзакции без деталей карт:

CREATE VIEW transactions_safe AS
SELECT
    t.trans_id,
    t.amount,
    NULL AS card_number
FROM
    transactions AS t;

Маскирование идентификаторов пациентов:

CREATE VIEW patients_masked AS
SELECT
    MD5(CAST(p.patient_id AS TEXT)) AS anon_id,
    p.age,
    p.diagnosis
FROM
    patients AS p;

Ограниченный список заказов для стажёров:

CREATE VIEW trainee_orders AS
SELECT
    o.order_id,
    o.total_amount
FROM
    orders AS o;

Сокрытие зарплат руководителей:

CREATE VIEW no_exec_salaries AS
SELECT
    e.emp_id,
    e.full_name,
    CASE WHEN e.role = 'EXEC' THEN NULL ELSE e.salary END AS salary
FROM
    employees AS e;

Блок 9. Сложные конструкции (UNION, CASE, CTE)

Объединение клиентов и сотрудников:

CREATE VIEW people_union AS
SELECT
    c.customer_id AS id,
    c.full_name   AS name,
    'Customer'    AS role
FROM
    customers AS c
UNION
SELECT
    e.emp_id,
    e.full_name,
    'Employee'
FROM
    employees AS e;

Товары со статусом по цене:

CREATE VIEW products_case AS
SELECT
    p.product_id,
    p.title,
    CASE
        WHEN p.price < 100 THEN 'Cheap'
        WHEN p.price BETWEEN 100 AND 500 THEN 'Medium'
        ELSE 'Expensive'
    END AS price_category
FROM
    products AS p;

CTE в представлении:

CREATE VIEW top_departments AS
WITH dept_avg AS (
    SELECT
        e.department_id,
        AVG(e.salary) AS avg_salary
    FROM
        employees AS e
    GROUP BY
        e.department_id
)
SELECT
    d.department_id,
    d.name,
    da.avg_salary
FROM
    dept_avg AS da
    INNER JOIN departments AS d
        ON d.department_id = da.department_id;

Объединение активных и архивных заказов:

CREATE VIEW all_orders AS
SELECT
    o.order_id,
    o.status
FROM
    orders AS o
WHERE
    o.status = 'ACTIVE'
UNION
SELECT
    o.order_id,
    o.status
FROM
    orders AS o
WHERE
    o.status = 'ARCHIVED';

CASE для статуса сотрудников:

CREATE VIEW employees_status AS
SELECT
    e.emp_id,
    e.full_name,
    CASE
        WHEN e.status = 'ACTIVE' THEN 'Работает'
        WHEN e.status = 'FIRED' THEN 'Уволен'
        ELSE 'Неизвестно'
    END AS status_text
FROM
    employees AS e;

Фильмы с категоризацией рейтинга:

CREATE VIEW films_case AS
SELECT
    f.film_id,
    f.title,
    CASE
        WHEN f.rating >= 8 THEN 'Hit'
        WHEN f.rating >= 5 THEN 'Average'
        ELSE 'Flop'
    END AS category
FROM
    films AS f;

UNION студентов и преподавателей:

CREATE VIEW people_union_roles AS
SELECT
    s.student_id AS id,
    s.full_name,
    'Student' AS role
FROM
    students AS s
UNION
SELECT
    t.teacher_id,
    t.full_name,
    'Teacher'
FROM
    teachers AS t;

CTE для сумм по регионам:

CREATE VIEW sales_regions AS
WITH regional_sales AS (
    SELECT
        c.region,
        SUM(o.total_amount) AS sales
    FROM
        orders AS o
        INNER JOIN customers AS c
            ON o.customer_id = c.customer_id
    GROUP BY
        c.region
)
SELECT
    region,
    sales
FROM
    regional_sales;

UNION фильмов и сериалов:

CREATE VIEW media_union AS
SELECT
    f.film_id AS id,
    f.title,
    'Film' AS type
FROM
    films AS f
UNION
SELECT
    s.series_id,
    s.title,
    'Series'
FROM
    series AS s;

CASE для возрастных групп:

CREATE VIEW age_groups AS
SELECT
    p.patient_id,
    p.full_name,
    CASE
        WHEN p.age < 18 THEN 'Child'
        WHEN p.age < 60 THEN 'Adult'
        ELSE 'Senior'
    END AS age_group
FROM
    patients AS p;

Блок 10. Комбинированные многослойные представления

Заказы с клиентами и товарами:

CREATE VIEW orders_full AS
SELECT
    o.order_id,
    c.full_name AS customer,
    p.title     AS product,
    o.total_amount
FROM
    orders AS o
    INNER JOIN customers AS c
        ON o.customer_id = c.customer_id
    INNER JOIN products AS p
        ON o.product_id = p.product_id;

Студенты с оценками и курсами:

CREATE VIEW students_scores_courses AS
SELECT
    s.student_id,
    s.full_name,
    c.title AS course,
    sc.score
FROM
    students AS s
    INNER JOIN scores AS sc
        ON s.student_id = sc.student_id
    INNER JOIN courses AS c
        ON sc.course_id = c.course_id;

Сотрудники с отделами и задачами:

CREATE VIEW employees_dept_tasks AS
SELECT
    e.emp_id,
    e.full_name,
    d.name AS department,
    t.title AS task
FROM
    employees AS e
    INNER JOIN departments AS d
        ON e.department_id = d.department_id
    LEFT JOIN tasks AS t
        ON e.emp_id = t.assigned_to;

Фильмы с отзывами и рейтингом:

CREATE VIEW films_with_reviews_avg AS
SELECT
    f.film_id,
    f.title,
    AVG(r.rating) AS avg_rating
FROM
    films AS f
    LEFT JOIN reviews AS r
        ON f.film_id = r.film_id
GROUP BY
    f.film_id,
    f.title;

Пациенты с визитами и врачами:

CREATE VIEW patients_visits_doctors AS
SELECT
    p.patient_id,
    p.full_name,
    v.visit_date,
    d.full_name AS doctor
FROM
    patients AS p
    INNER JOIN visits AS v
        ON p.patient_id = v.patient_id
    INNER JOIN doctors AS d
        ON v.doctor_id = d.doctor_id;

Транзакции с пользователями и магазинами:

CREATE VIEW transactions_full AS
SELECT
    t.trans_id,
    u.full_name AS user,
    s.name      AS store,
    t.amount
FROM
    transactions AS t
    INNER JOIN users AS u
        ON t.user_id = u.user_id
    INNER JOIN stores AS s
        ON t.store_id = s.store_id;

Логины с устройствами:

CREATE VIEW logins_devices AS
SELECT
    l.login_id,
    u.full_name,
    d.device_type,
    l.login_time
FROM
    logins AS l
    INNER JOIN users AS u
        ON l.user_id = u.user_id
    INNER JOIN devices AS d
        ON l.device_id = d.device_id;

Курсы с преподавателями и студентами:

CREATE VIEW courses_full AS
SELECT
    c.course_id,
    c.title,
    t.full_name AS teacher,
    COUNT(e.student_id) AS students_count
FROM
    courses AS c
    INNER JOIN teachers AS t
        ON c.teacher_id = t.teacher_id
    LEFT JOIN enrollments AS e
        ON c.course_id = e.course_id
GROUP BY
    c.course_id,
    c.title,
    t.full_name;

Заказы с оплатой и доставкой:

CREATE VIEW orders_payments_shipments AS
SELECT
    o.order_id,
    o.total_amount,
    p.payment_date,
    s.shipment_date
FROM
    orders AS o
    LEFT JOIN payments AS p
        ON o.order_id = p.order_id
    LEFT JOIN shipments AS s
        ON o.order_id = s.order_id;

Сотрудники с ролями и проектами:

CREATE VIEW employees_roles_projects AS
SELECT
    e.emp_id,
    e.full_name,
    r.name AS role,
    pr.title AS project
FROM
    employees AS e
    INNER JOIN roles AS r
        ON e.role_id = r.role_id
    LEFT JOIN projects AS pr
        ON e.emp_id = pr.manager_id;

Заключение

view sql — это универсальный способ структурировать SQL-код. Представления позволяют скрывать сложные соединения, повторно использовать запросы, ограничивать доступ к данным и ускорять разработку аналитических решений.

В статье показаны 100 примеров: от простых фильтров и алиасов до аналитики с GROUP BY,
условными выражениями CASE, объединениями UNION и сложными JOIN.
Используйте VIEW для удобства и читаемости, но помните: чрезмерная вложенность представлений может влиять на производительность.


 

Понравилась статья? Поделиться с друзьями: