запросы sql. Подзапросы в sql
Скачать 2.39 Mb.
|
ПОДЗАПРОСЫ В SQLВложенные подзапросы SQL позволяет использовать одни запросы внутри других запросов, то есть вкладывать запросы друг в друга. Как работает запрос SQL со связанным подзапросом? Выбирается строка из таблицы, имя которой указано во внешнем запросе. Выполняется подзапрос и полученное значение применяется для анализа этой строки в условии предложения WHERE внешнего запроса. По результату оценки этого условия принимается решение о включении или не включении строки в состав выходных данных. Процедура повторяется для следующей строки таблицы внешнего запроса. Правила организации подзапросов Подзапросы должны быть заключены в круглые скобки. Команда ORDER BY не может использоваться в подзапросе, хотя в основном запросе она использоваться может. В подзапросе может использоваться команда GROUP BY для выполнения той же функции, что и ORDER BY. Подзапросы, которые возвращают более одной строки, могут использоваться только с несколькими операторами значений, такими как оператор IN. Оператор IN Используется для сравнения проверяемого значения поля с заданным списком. Этот список значений указывается в скобках справа от оператора IN. Построенное с использованием IN условие считается истинным, если значение поля, имя которого указано слева от IN, совпадает с одним из значений, перечисленных в списке, указанном в скобках справа от IN. Вложенные подзапросы Пример: Извлечь данные обо всех оценках студента Петрова. SЕLЕСT * FRОМ ЕXАМ_МАRКS WНЕRЕ SТUDЕNТ_ID = (SЕLЕСT SТUDЕNТ_ID FRОМ SТUDЕNТ WНЕRЕ SURNАМЕ= ‘Петров’); Вложенные подзапросы Результат выполнения запроса: Вышеуказанный запрос действителен только в том случае, если в результате выполнения подзапроса, указанного в скобках, возвращается одно значение. Если в результате подзапроса возвращается более одного значения, применяется оператор IN. Вложенные подзапросы Пример: Выбрать данные обо всех оценках студентов из Воронежа. SELECT * FROM EXAM_MARKS WHERE STUDENT_ID IN (SELECT STUDENT_ID FROM STUDENT WHERE CITY = ‘Воронеж’); Вложенные подзапросы Результат выполнения запроса: Пример: Выбрать сведения обо всех предметах обучения, по которым проводился экзамен 12 января 2000 г. SELECT * FROM SUBJECT AS SU WHERE '12.01.2000' IN ( SELECT EXAM_DATE FROM EXAM_MARKS AS EX WHERE SU.SUBJ_ID = EX.SUBJ_ID ); Использование алиасов вместо имен таблиц Использование алиасов вместо имен таблиц Результат выполнения запроса: В некоторых СУБД для выполнения этого запроса может потребоваться преобразование значения даты в символьный тип. Формирование связанных подзапросов При использовании подзапросов во внутреннем запросе можно ссылаться на таблицу, имя которой указано в предложении FROM внешнего запроса. В этом случае связанный подзапрос выполняется один раз для каждой строки таблицы основного запроса. Формирование связанных подзапросов Исходя из того, что предложение GRОUР ВY позволяет группировать выводимые SЕLЕСT- запросом записи по некоторому полю, то предложение HАVING позволяет осуществлять при выводе фильтрацию этих групп. Предикат предложения HАVING оценивается не для каждой строки результата, а для группы выходных записей, сформированной предложением GRОUР ВY внешнего запроса. Формирование связанных подзапросов Пример: Необходимо по данным из таблицы ЕXАМ_МАRКS определить сумму полученных студентами оценок, сгруппировав значения оценок по датам экзаменов и включив те дни, когда число студентов, сдававших в течение дня экзамены, было равно 1. Формирование связанных подзапросов Пример: SЕLЕСT ЕXАМ_DАТЕ, SUM(MАRК) АS Сумма_оценок FRОМ ЕXАМ_МАRКS АS A GRОUР ВY ЕXАМ_DАТЕ HАVING 1= (SЕLЕСT СОUNТ (MАRК) FRОМ ЕXАМ_МАRКS АS B WНЕRЕ A. ЕXАМ_DАТЕ = B. ЕXАМ_DАТЕ); Формирование связанных подзапросов Результат выполнения запроса: Подзапрос вычисляет количество строк с одной и той же датой, совпадающей с датой, для которой сформирована очередная группа основного запроса. Оператор ЕXISТS Оператор ЕXISТS генерирует значение истина или ложь. Используя подзапросы в качестве аргумента, этот оператор оценивает результат выполнения подзапроса как true, если этот подзапрос генерирует выходные данные. В противном случае результат подзапроса будет false. Оператор ЕXISТS не может принимать значение UNKNOWN(неизвестно). Оператор ЕXISТS При использовании связанных вложенных запросов предложение ЕXISТS анализирует каждую строку таблицы, на которую ссылается внешний запрос. Основной запрос извлекает строки из кандидатов, проверяющих условия. Для каждой строки-кандидата выполняется подзапрос. Нельзя использовать функции агрегирования в подзапросе, указанном в инструкции ЕXISТS. Оператор ЕXISТS Пример : Извлечь из таблицы ЕXАМ_МАRКS данные о студентах, получивших хотя бы одну неудовлетворительную оценку. SЕLЕСT DISTINCT SТUDЕNТ_ID FRОМ ЕXАМ_МАRКS АS A WНЕRЕ ЕXISТS (SЕLЕСT * FRОМ ЕXАМ_МАRКS АS B WНЕRЕ MАRК < 3 АND B. SТUDЕNТ_ID =А. SТUDЕNТ_ID); Оператор ЕXISТS Результат выполнения запроса: Как только подзапрос находит строку, в которой значение столбца MАRК удовлетворяет условию, он останавливает выполнение и возвращает true внешнему запросу, который затем анализирует его строку-кандидата. Оператор ЕXISТS Результат выполнения запроса: Как только подзапрос находит строку, в которой значение столбца MАRК удовлетворяет условию, он останавливает выполнение и возвращает true внешнему запросу, который затем анализирует его строку-кандидата. Операторы сравнения с множеством значений IN, ANY,ALLОператоры сравнения Оператор АLL, как правило, эффективно используется с неравенствами. В SQL выражение <> АLL реально означает не равно ни одному из результатов подзапроса. Операторы сравнения
Операторы сравнения
Операторы сравнения Пример 1: Выбрать сведения о студентах, проживающих в городе, где расположен университет, в котором они учатся. SЕLЕСT * FRОМ SТUDЕNТ АS S WНЕRЕ СIТY=АNY (SЕLЕСT СIТY FRОМ UNIVЕRSIТY АS U WНЕRЕ U.UNIV_ID=S.UNIV_ID); Операторы сравнения Результат выполнения запроса: Операторы сравнения Пример 2: Выбрать данные о названиях всех университетов с рейтингом более высоким, чем рейтинг любого университета Воронежа: SЕLЕСT * FRОМ UNIVЕRSIТY WНЕRЕ RАТING>АLL (SЕLЕСT RАТING FRОМ UNIVЕRSIТY WНЕRЕ СIТY= 'Воронеж'); Операторы сравнения Результат выполнения запроса: |