Видео курс SQL Essential. Вложенные запросы

  • Главная >
  • Каталог >
  • SQL Базовый >
  • Вложенные запросы

Для прохождения теста нужно авторизироваться

Войти Регистрация

×

Вы открыли доступ к тесту! Пройти тест

Для просмотра полной версии видеокурса, онлайн тестирования и получения доступа к дополнительным учебным материалам купите курс Купить курс

Для просмотра всех видеокурсов ITVDN, представленных в Каталоге, а также для получения доступа к учебным материалам и онлайн тестированию купите подписку Купить подписку

№1

Введение в SQL

0:59:17

Материалы урокаДомашние заданияТестирование

На этом уроке по SQL Вы получите необходимые знания о базах данный – ознакомитесь с терминологией, узнаете принцип функционирования SQL сервера и его архитектуру. На уроке Вы узнаете о программной среде SQL Management Studio, в которой будете работать на протяжении всех последующих уроков. Вы ознакомитесь с правилами построения запросов и изучите типы данных, которые используются в SQL Server. После прохождения этого урока Вы сможете создать базу данных с несколькими таблицами, определить содержимое таблиц, указав типы данных и названия колонок, а также сможете создать простые SQL запросы для того, чтобы получить данные из таблиц.

Читать дальше…

Запросы. Манипуляция данными.

0:55:28

Материалы урокаДомашние заданияТестирование

На этом уроке по SQL Вы научитесь манипулировать данными, хранящимися в таблицах базы данных. Вы узнаете, как можно добавить, удалить, изменить или просто прочитать информацию, которая находится в таблице. Вы познакомитесь с командами SQL SELECT, INSERT, UPDATE, DELETE и научитесь правильно их использовать.

Читать дальше…

Основы DDL.

1:27:42

Материалы урокаДомашние заданияТестирование

На этом видео уроке из курса SQL Essential Вы познакомитесь с языком описания структуры хранения данных Data Definition Language. В этом уроке Вы изучите основные команды (CREATE, ALTER, DROP) для создания, редактирования и удаления сущностный в базе данных. Также Вы узнаете, что такое реляционная база данных и как строятся связи между таблицами в базах данных, что такое первичный ключ и внешний ключ, для чего они нужны в базе. В конце урока Вы увидите, как можно создать диаграмму базы данных для того, чтобы графически представить структуру таблиц и связи между ними.

Читать дальше…

Проектирование БД

0:41:32

Материалы урокаДомашние заданияТестирование

Видео урок расскажет о сложностях проектирования базы данных. Чтобы создать правильную структуру базы данных, нужно следовать различным рекомендациям и лучшим практикам. На занятии подробно расматриваетчся набор правил, которые следует помнить и соблюдать при проектировании баз данных. Вы узнаете, что такое нормализация баз данных и какие нормальные формы баз данных существуют. Этот урок даст Вам представление о том, как должна выглядеть правильно спроектированная база данных.

Читать дальше…

Команда JOIN

0:38:29

Материалы урокаДомашние заданияТестирование

Редко вся информация, которая нам необходима, находится в одной таблице. Зачастую в реляционных базах данные находятся в разных таблицах и связанны между собой. В этом видеоуроке по SQL Вы изучите команды JOIN, LEFT JOIN, RIGHT JOIN, CROSS JOIN, которые используются для получения данных из связанных таблиц.

Читать дальше…

Вложенные запросы

0:59:18

Материалы урокаДомашние заданияТестирование

Иногда для того, чтобы получить всю необходимую информацию из базы, простого запроса не достаточно. В данном видео уроке по SQL для начинающих Вы увидите, как можно создавать запросы со вложенными запросами для создания сложных правил выборки данных из базы. Также Вы узнаете, что такое курсор и на примерах увидите в каких ситуациях можно применять курсоры.

Читать дальше…

Индексирование

0:55:11

Материалы урокаДомашние заданияТестирование

На этом видео уроке Вы узнаете, как SQL сервер организовывает хранение данных таблиц на жестком диске. Вы узнаете, что такое B-деревья и индексы, научитесь использовать индексы для более быстрого поиска информации в базе данных.

Читать дальше…

Хранимые процедуры. Пользовательские функции

1:24:53

Материалы урокаДомашние заданияТестирование

Для того, чтобы оптимизировать работу базы и не отправлять на сервер большие объемы SQL запросов, можно создать хранимую процедуру, которая будет представлять блок кода, хранящийся на сервере для неоднократного запуска со стороны клиента. В этом видео уроке по SQL Вы изучите тонкости написания хранимых процедур, а также научитесь создавать функции, которые также помогут оптимизировать и упростить работу с данными.

Читать дальше…

Транзакции. Триггеры

0:49:13

Материалы урокаДомашние заданияТестирование

Для того, чтобы гарантировать целостность информации в базе данных после применения ряда запросов, в SQL сервере используются транзакции. В этом видео уроке Вы узнаете, как выполнять запросы в контексте транзакции. На уроке будут рассмотрены триггеры, порядок их создания, задачи, которые принято решать с помощью триггеров.

Читать дальше…

Следующий курс:

Видео курс Entity Framework 6 — видео уроки ITVDN

ПОКАЗАТЬ ВСЕ

основные темы, рассматриваемые на уроке

0:00:00

Рассмотрение понятия «Подзапрос»

0:05:45

Связанные запросы

0:09:18

Пример создания вложенных запросов

0:15:43

Пример создания вложенного запроса совместно с JOIN

0:19:16

Пример создания связанного вложенного запроса

0:26:22

Связанный вложенный запрос — EXISTS

0:43:28

Временные таблицы

0:46:13

Связанные вложенные запросы — WITH … AS

0:49:23

Пример создания и использования «Курсора»

ПОКАЗАТЬ ВСЕ

Рекомендуемая литература

Ицик Бен-Ган- Microsoft SQL Server 2008. Основы T-SQL В книге изложены теоретические основы формирования запросов и программирования на языке T-SQL: однотабличные запросы, соединения, подзапросы, табличные выражения, операции над множествами, реорганизация данных и наборы группирования. Описываются различные аспекты извлечения и модификации данных, обсуждаются параллелизм и транзакции, приводится обзор программируемых объектов. Для дополнения теории практическими навыками в книгу включены упражнения, в том числе и повышенной сложности.

Крис Дейт- Введение в системы баз данных. 8-е издание Новое издание фундаментального труда Криса Дейта представляет собой исчерпывающее введение в очень обширную в настоящее время теорию систем баз данных. С помощью этой книги читатель сможет приобрести фундаментальные знания в области технологии баз данных, а также ознакомиться с направлениями, по которым рассматриваемая сфера деятельности, вероятно, будет развиваться в будущем. Книга предназначена для использования в основном в качестве учебника, а не справочника, поэтому, несомненно, вызовет интерес у программистов-профессионалов, научных работников и студентов, изучающих соответствующие курсы в высших учебных заведениях. В ней сделан акцент на усвоении сути и глубоком понимании излагаемого материала, а не просто на его формальном изложении. Книга, безусловно, будет полезна всем, кому приходится работать с базами данных или просто пользоваться ими.

Титры видеоурока

Титров к данному уроку не предусмотрено

ПОДРОБНЕЕ

ПОДРОБНЕЕ

ПОДРОБНЕЕ

ПОДРОБНЕЕ

Python SQLite: вложенные SQL-запросы

Смотреть материал на видео

На этом занятии поговорим о возможности создавать вложенные запросы к СУБД. Лучше всего это понять на конкретном примере. Предположим, что у нас имеются две таблицы:

Первая students содержит информацию о студентах, а вторая marks – их отметки по разным дисциплинам. Каждый из студентов (кроме четвертого) проходил язык Си. От нас требуется выбрать всех студентов, у которых оценка по языку Си выше, чем у Маши (студент с id = 2). По идее нам тут нужно реализовать два запроса: первый получает значение оценки для Маши по языку Си:

SELECT mark FROM marks
WHERE id = 2 AND subject LIKE 'Си'

А второй выбирает всех студентов, у которых оценка по этому предмету выше, чем у Маши:

SELECT name, subject, mark FROM marks
JOIN students ON students.
rowid = marks.id WHERE mark > 3 AND subject LIKE 'Си'

Так вот, в языке SQL эти два запроса можно объединить, используя идею вложенных запросов:

SELECT name, subject, mark FROM marks
JOIN students ON students.rowid = marks.id
WHERE mark > (SELECT mark FROM marks
WHERE id = 2 AND subject LIKE 'Си')
AND subject LIKE 'Си'

Мы здесь во второй запрос вложили первый для определения оценки Маши по предмету Си. Причем, этот вложенный запрос следует записывать в круглых скобках, говоря СУБД, что это отдельная конструкция, которую следует выполнить независимо. То, что будет получено на его выходе и будет фигурировать в качестве Машиной оценки.

Но, что если вложенный запрос вернет несколько записей (оценок), например, если записать его вот так:

SELECT name, subject, mark FROM marks
JOIN students ON students.rowid = marks.id
WHERE mark > (SELECT mark FROM marks WHERE id = 2 )
AND subject LIKE 'Си'

В этом случае будет использован только первый полученный результат, другие попросту проигнорируются и результат будет тем же (так как первое значение – это оценка Маши по предмету Си).

Если же вложенный SELECT ничего не находит (возвращает значение NULL), то внешний запрос не будет возвращать никаких записей.

Также следует обращать внимание, что подзапросы не могут обрабатывать свои результаты, поэтому в них нельзя указывать, например, оператор GROUP BY. Но агрегирующие функции вполне можно использовать, например, так:

SELECT name, subject, mark FROM marks
JOIN students ON students.rowid = marks.id
WHERE mark > (SELECT avg(mark) FROM marks WHERE id = 2 )
AND subject LIKE 'Си'

Вложения в команде INSERT

Вложенные запросы можно объявлять и в команде INSERT. Предположим, что у нас имеется еще одна таблица female вот с такой структурой:

Она идентична по структуре таблице students со списком студентов. Наша задача добавить в female всех студентов женского пола.

Для начала запишем запрос выбора девушек из таблицы students:

SELECT * FROM students WHERE sex = 2

А, затем, укажем, что их нужно поместить в таблицу female:

INSERT INTO female SELECT * FROM students WHERE sex = 2

После выполнения этого запроса таблица female будет содержать следующие записи:

Но если выполнить запрос еще раз, то возникнет ошибка, т.

к. мы попытаемся добавить строки с уже существующими id, что запрещено по структуре этого поля – оно определено как главный ключ и содержит только уникальные значения.

Чтобы поправить ситуацию, можно вложенный запрос написать так:

INSERT INTO female 
SELECT NULL, name, sex, old FROM students WHERE sex = 2

Мы здесь в качестве значения первого поля указали NULL и, соответственно, СУБД вместо него сгенерирует уникальный ключ для добавляемых записей. Теперь таблица female выглядит так:

Вложения в команде UPDATE

Похожим образом можно создавать вложенные запросы и для команды UPDATE. Допустим, мы хотим обнулить все оценки в таблице marks, которые меньше или равны минимальной оценки студента с id = 1. Такой запрос можно записать в виде:

UPDATE marks SET mark = 0
WHERE mark <= (SELECT min(mark) FROM marks WHERE id = 1)

И на выходе получим измененную таблицу:

Как видите, минимальная оценка у первого студента была равна 3 и все тройки обнулились.

Вложения в команде DELETE

Ну, и наконец, аналогичные действия можно выполнять и в команде DELETE. Допустим, требуется удалить из таблицы students всех студентов, возраст которых меньше, чем у Маши (студента с id = 2). Запрос будет выглядеть так:

DELETE FROM students
WHERE old < (SELECT old FROM students WHERE id = 2)

В результате, получим таблицу:

Вот так создаются вложенные запросы в языке SQL. Однако, прибегать к ним следует в последнюю очередь, если никакими другими командами не удается решить поставленную задачу. Так как они создают свое отдельное обращение к БД и на это тратятся дополнительные вычислительные ресурсы.

Конечно, на этом занятии мы лишь рассмотрели примеры, принцип создания вложенных запросов. На практике они могут разрастаться и становиться довольно объемными, включать в себя различные дополнительные операции для выполнения нетривиальных действий с таблицами БД.

На этом мы завершим обзор SQL-языка. Этого материала вам будет вполне достаточно для начальной работы с БД. По мере развития сможете дальше углубляться в эту тему и узнавать множество новых подходов к реализации различных задач с помощью SQL-запросов.

Видео по теме

Python SQLite #1: что такое СУБД и реляционные БД

Python SQLite #2: подключение к БД, создание и удаление таблиц

Python SQLite #3: команды SELECT и INSERT при работе с таблицами БД

Python SQLite #4: команды UPDATE и DELETE при работе с таблицами

Python SQLite #5: агрегирование и группировка GROUP BY

Python SQLite #6: оператор JOIN для формирования сводного отчета

Python SQLite #7: оператор UNION объединения нескольких таблиц

Python SQLite #8: вложенные SQL-запросы

Python SQLite #9: методы execute, executemany, executescript, commit, rollback и свойство lastrowid

Python SQLite #10: методы fetchall, fetchmany, fetchone, Binary, iterdump

Пример вложенного подзапроса SQL Вопрос для собеседования

Обзор вложенных запросов

Вложенный запрос SQL, также известный как подзапрос или подзапрос, представляет собой метод запроса SELECT, встроенный в другой запрос. Это эффективный способ получить желаемый результат, который может потребовать нескольких шагов запроса или для обработки взаимозависимых запросов.

Когда использовать вложенные подзапросы

Вложенные подзапросы можно использовать несколькими способами:

  • Вы можете запрашивать подзапросы (например, выбирать из подзапроса)
  • Вы можете заменить одномерные массивы (например, типичный список элементов) и соединения отдельных полей одним подзапросом в предложении WHERE или HAVING

Чтобы использовать подзапрос, необходимо соблюдать несколько синтаксических правил:

  • Подзапрос должен быть заключен в круглые скобки
  • В зависимости от используемого механизма SQL вам может потребоваться псевдоним для данного подзапроса
  • При использовании в предложении WHERE или HAVING оператор SELECT подзапроса может возвращать только одно оцениваемое поле

Пример вопроса SQL для собеседования с использованием вложенного подзапроса продажа_id продажа_доллары 05. 01.2020 1111 93695 07.01.2020 1112 879617 07.01.2020 1113 752878 ………

Рассчитать совокупный процент от общего объема продаж в данный день. Вывод таблицы должен выглядеть примерно так, как показано ниже.

дата pct_total_sales
05.01.2020 Х%
07.01.2020 Д%

Вы можете работать с этим примером, используя интерактивную скрипку SQL здесь.

Прежде чем мы начнем писать SQL, мы разобьем вопрос на этапы:

  • Подсчитаем общий объем продаж за день
  • Рассчитать кумулятивную сумму общего объема продаж за день и общего объема продаж за все дни
  • Разделить общий объем продаж за день на общую сумму

1. Подсчитайте сумму продаж за день

Сначала мы напишем базовый запрос, который на следующем шаге станет подзапросом. Приведенный ниже запрос вычисляет общий объем продаж за день, и вы можете взаимодействовать с запросом с помощью этой скрипки SQL.

 ВЫБОР
  #нам нужно просуммировать sale_usd по дате
  дата,
  сумма (sale_usd) как total_usd
ОТ sales_info
#поскольку мы агрегируем sale_usd по дате, нам нужно
#нужно группировать по дате
ГРУППИРОВАТЬ ПО дате 

2. Рассчитать кумулятивную сумму общего объема продаж за день и общего объема продаж за все дни

Приведенный ниже запрос вычисляет кумулятивную сумму общего объема продаж за день и общего объема продаж за все дни. Вы можете взаимодействовать с приведенным ниже запросом с помощью этой скрипты SQL.

На этом шаге вы заметите, что мы строим запрос на основе предыдущего запроса из предыдущего шага. Чтобы успешно построить подзапрос, нам нужно было заключить подзапрос в круглые скобки и убедиться, что мы используем псевдоним для таблицы (поскольку мы используем MySQL, обратите внимание, что это не является требованием для некоторых вариантов SQL). Нам также необходимо убедиться, что мы включили все поля, необходимые для внешнего запроса (например, дату и общий объем продаж).

 ВЫБОР
#в этом запросе мы не группируем по, так как используем оконную функцию
  дата,
    СУММА(total_usd) ПРЕВЫШЕ (
      ORDER BY даты ASC строки
      МЕЖДУ неограниченной предыдущей и текущей строкой)
    as cum_total, # это оконная функция для
            # вычисляем общую сумму
    SUM(total_usd) OVER () как итог # это оконная функция для
                    # подсчитать итог
ОТ(
  ВЫБИРАТЬ
      #нам нужно просуммировать sale_usd по дате
      дата,
      сумма (sale_usd) как total_usd
  ОТ sales_info
  #поскольку мы агрегируем sale_usd по дате, нам нужно
  #нужно группировать по дате
  СГРУППИРОВАТЬ ПО дате
) as q1 #создаем псевдоним для этой таблицы, как того требует MySQL 

3. Разделите совокупный общий объем продаж на совокупную сумму

Последний шаг — разделить cum_total на общую сумму. Мы можем сделать это на том же шаге, что и выше (просто разделив две оконные функции), или мы можем построить подзапрос поверх предыдущего шага. В приведенном ниже запросе используется другой подзапрос, в результате чего конечный запрос имеет два вложенных подзапроса. Вы можете взаимодействовать с приведенным ниже запросом с помощью этой скрипты SQL.

 ВЫБОР
  дата,
    100 * cum_total / всего как
ОТ(
    #в этом запросе мы не группируем по
    #поскольку мы используем оконную функцию
    ВЫБИРАТЬ
        дата,
        СУММ(total_usd) ПРЕВЫШЕНО (ПО ДАТЕ ASC
              строки МЕЖДУ неограниченной предыдущей и текущей строкой)
        as cum_total, # это оконная функция для
                      # вычисляем общую сумму
        SUM(total_usd) OVER () как итог # это оконная функция
                                        # для расчета суммы
    ОТ(
      ВЫБИРАТЬ
          #нам нужно просуммировать sale_usd по дате
          дата,
          сумма (sale_usd) как total_usd
      ОТ sales_info
      #поскольку мы агрегируем sale_usd по дате, нам нужно
      #нужно группировать по дате
      СГРУППИРОВАТЬ ПО дате
    ) as q1 #мы создаем псевдоним для этой таблицы, как того требует MySQL
) как q2 

Объяснение вложенных соединений

Объяснение вложенных соединений

26 мая 2022 г. by Robert Gravelle

Когда вы думали, что знаете все типы соединений, вот еще одно! Возможно, вы слышали о вложенных соединениях или даже о планах запросов с вложенными циклами и интересовались, что они из себя представляют. Ну, не удивляйтесь больше. Сегодняшний блог раскроет тайну раз и навсегда!

В мире реляционных баз данных одно и то же может называться по-разному. Соединения не являются исключением из этого правила. На самом деле, когда дело доходит до вложенных соединений, мнения специалистов по базам данных расходятся. Некоторые говорят, что такой вещи не существует; другие более прагматичны и признают, что это просто альтернативный термин для объединения нескольких таблиц.

По всей вероятности, этот термин возник при упоминании планов запросов с вложенным циклом. Они часто используются обработчиком запросов для ответа на соединения. В самой грубой форме вложенный цикл выглядит примерно так:

.
для всех строк во внешней таблице
  для всех строк во внутренней таблице
    если внешняя_строка и внутренняя строка удовлетворяют условию соединения
      испускать строки
  следующий внутренний
следующий внешний
 

Это самый простой, но и самый медленный тип вложенного цикла. Между тем, многотабличные соединения с вложенными циклами работают еще хуже, потому что они ужасно масштабируются по мере роста произведения количества строк во всех задействованных таблицах.

Более эффективная форма вложенного цикла — вложенный цикл по индексу:

для всех строк, которые проходят фильтр из внешней таблицы
  использовать квалификатор соединения из строки внешней таблицы по индексу во внутренней таблице
    если строка найдена с помощью поиска по индексу
      испускать строки
следующий внешний
 

Теперь, когда мы установили, что термин «вложенные соединения» просто относится к соединениям между более чем двумя таблицами, давайте кратко рассмотрим их синтаксис.

Обычно, когда нам нужно соединить несколько таблиц и/или представлений, мы перечисляем их один за другим, используя этот общий формат:

ИЗ Таблицы1
[тип соединения] JOIN Table2
                Состояние включения2
[тип соединения] JOIN Table3
                Состояние включения3
 

Но это не единственный способ. Официальный стандарт синтаксиса ANSI для SQL предлагает другой допустимый способ написания вышеуказанного соединения:

.
ИЗ Таблицы1
[тип соединения] JOIN Table2
[тип соединения] JOIN Table3
                Состояние включения3
                Состояние включения2
 

Чтобы сделать приведенный выше стиль соединения более понятным для человека, мы можем добавить круглые скобки и отступ, чтобы сделать смысл более понятным:

ИЗ Таблицы1
[ тип соединения ] ПРИСОЕДИНЯЙТЕСЬ ( Table2
                    [тип соединения] JOIN Table3
                                    Состояние включения3 )
                Состояние включения2
 

Теперь легче увидеть, что соединение между Table2 и Table3 указывается первым и должно быть выполнено первым, перед соединением с Table1. Этот стиль запроса также размещает соединение между таблицами Table2 и Table3 таким образом, что они выглядят вложенными. На самом деле мы могли бы считать соединение между Table2 и Table3 вложенным.