Главная » Просмотр файлов » Мартин Грубер - Понимание SQL

Мартин Грубер - Понимание SQL (991940), страница 17

Файл №991940 Мартин Грубер - Понимание SQL (Мартин Грубер. Понимание SQL) 17 страницаМартин Грубер - Понимание SQL (991940) страница 172015-08-23СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 17)

Вы видели, что использование результата одного запроса для управления другим, расширяет возможности позволяющие выполнить большее количество функций. Вы теперь понимаетекак использовать подзапросы с реляционными операторами также как и со специальным оператором IN, или в предложении WHERE или в предложении HAVING внешнего запроса.В следующих главах, мы будем разрабатывать подзапросы. Сначала в Главе 11,мы обсудим другой вид подзапроса, который выполняется отдельно для каждой строки таблицы вызываемой во внешнем запросе.

Затем, в Главе 12 и 13, мы представимвас нескольким специальным операторам которые функционируют на всех подзапросах, как это делает IN, за исключением когда эти операторы могут использоватьсятолько в подзапросах.РАБОТА С SQL1. Напишите запрос, который бы использовал подзапрос для получения всех порядков для заказчика с именем Cisneros. Предположим, что вы не знаете номера этогозаказчика, указываемого в поле cnum.2. Напишите запрос, который вывел бы имена и оценки всех заказчиков, которыеимеют усредненые порядки.3. Напишите запрос, который бы выбрал общую сумму всех приобретений в порядкахдля каждого продавца, у которого эта общая сумма больше, чем сумма наибольшего порядка в таблице.(См.

Приложение A для ответов.)11СООТНЕСЕННЫЕПОДЗАПРОСЫВ ЭТОЙ ГЛАВЕ, МЫ ПРЕДСТАВИМ ВАС ТИПУ подзапроса о котором мы не говорили в Главе 10 — посвященной соотнесенному подзапросу. Вы узнаете как использовать соотнесенные подзапросы в предложениях запросов WHERE и HAVING.Сходства и различия между соотнесенными подзапросами и обьединениями будутобсуждаться далее, и вы сможете повысить ваше знание псевдонимов и префиксовимени таблицы — когда они необходимы и как их использовать.КАК СФОРМИРОВАТЬ СООТНЕСЕННЫЙ ПОДЗАПРОСКогда вы используете подзапросы в SQL, вы можете обратиться к внутреннемузапросу таблицы в предложении внешнего запроса FROM, сформировав соотнесенный подзапрос. Когда вы делаете это, подзапрос выполняется неоднократно, по одному разу для каждой строки таблицы основного запроса.Соотнесенный подзапрос — один из большого количества тонких понятий в SQLиз-за сложности в его оценке.Если вы сумеете овладеть им, вы найдете что он очень мощный, потому что может выполнять сложные функции с помощью очень лаконичных указаний.Например, имеется один способ найти всех заказчиков в порядках на 3-е Октября (вывод показывается в Рисунке 11.1):SELECT *FROM Customers outerWHERE 10/03/1990 IN ( SELECT odateFROM Orders innerWHERE outer.cnum = inner.cnum );=============== SQL Execution Log ============| SELECT *|| FROM Customers outer|| WHERE 10/03/1990 IN|| (SELECT odate|| FROM Orders inner|| WHERE outer.cnum = inner.cnum);|| ============================================= ||cnumcnamecityratingsnum|| -----------------------||2001HoffmanLondon1001001||2003LiuSan Jose2001002||2008CisnerosSan Jose3001007||2007PereiraRome1001004|===============================================Рисунок 11.1: Использование соотнесенного подзапросаКАК РАБОТАЕТ СООТНЕСЕННЫЙ ПОДЗАПРОСВ вышеупомянутом примере, "внутренний" (inner) и "внешний" (outer), это псевдонимы, подобно обсужденным в Главе 9.

Мы выбрали эти имена для большей ясности; они отсылают к значениям внутренних и внешних запросов, соответственно. Таккак значение в поле cnum внешнего запроса меняется, внутренний запрос должен выполняться отдельно для каждой строки внешнего запроса. Строка внешнего запросадля которого внутренний запрос каждый раз будет выполнен, называется — текущейстрокой-кандидатом. Следовательно, процедура оценки выполняемой соотнесеннымподзапросом — это:1. Выбрать строку из таблицы именованной в внешнем запросе.

Это будет текущаястрока-кандидат.2. Сохранить значения из этой строки-кандидата в псевдониме с именем в предложении FROM внешнего запроса.3. Выполнить подзапрос. Везде, где псевдоним данный для внешнего запроса найден(в этом случае "внешний"), использовать значение для текущей строки-кандидата.Использование значения из строки-кандидата внешнего запроса в подзапросе называется — внешней ссылкой.4. Оценить предикат внешнего запроса на основе результатов подзапроса выполняемого в шаге 3. Он определяеть — выбирается ли строка-кандидат для вывода.5. Повторить процедуру для следующей строки-кандидата таблицы, и так далее покавсе строки таблицы не будут проверены.В вышеупомянутом примере, SQL осуществляет следующую процедуру:1. Он выбирает строку Hoffman из таблицы Заказчиков.2.

Сохраняет эту строку как текущую строку-кандидат под псевдонимом — "внешним".3. Затем он выполняет подзапрос. Подзапрос просматривает всю таблицу Порядковчтобы найти строки где значение cnum поле — такое же как значение outer.cnum,которое в настоящее время равно 2001, — поле cnum строки Hoffmanа. Затем онизвлекает поле odate из каждой строки таблицы Порядков, для которой это верно, иформирует набор значений поля odate.4.

Получив набор всех значений поля odate, для поля cnum = 2001, он проверяет предикат основного запроса чтобы видеть имеется ли значение на 3 Октября в этомнаборе. Если это так (а это так), то он выбирает строку Hoffmanа для вывода ее изосновного запроса.5. Он повторяет всю процедуру, используя строку Giovanni как строку-кандидата, изатем сохраняет повторно пока каждая строка таблицы Заказчиков не будет проверена.Как вы можете видеть, вычисления которые SQL выполняет с помощью этихпростых инструкций — это полный комплекс. Конечно, вы могли бы решить ту же самую проблему используя обьединение, следующего вида (вывод для этого запросапоказывается в Рисунке 11.2):SELECT *FROM Customers first, Orders secondWHERE first.cnum = second.cnum AND second.odate = 10/03/1990;Обратите внимание, что Cisneros был выбран дважды, по одному разу для каждого порядка, который он имел для данной даты.

Мы могли бы устранить это используя SELECT DISTINCT вместо просто SELECT. Но это необязательно в вариантеподзапроса. Оператор IN, используемый в варианте подзапроса, не делает никакогоразличия между значениями которые выбираются подзапросом один раз и значениями которые выбираются неоднократно.

Следовательно DISTINCT необязателен.=============== SQL Execution Log ============| SELECT *|| FROM Customers first, Orders second|| WHERE first.cnum = second.cnum|| (SELECT COUNT (*)|| FROM Customers|| WHERE snum = main.snum;|| ============================================= ||cnumcname|| -----------||1001Peel||1002Serres|===============================================Рисунок 11.2: Использование обьединения вместо соотнесенногоподзапросаПредположим что мы хотим видеть имена и номера всех продавцов которыеимеют более одного заказчика. Следующий запрос выполнит это для вас (вывод показывается в Рисунке 11.3):SELECT snum, snameFROM Salespeople mainWHERE 1 < ( SELECT COUNT (*)FROM CustomersWHERE snum = main.snum );Обратите внимание, что предложение FROM подзапроса в этом примере не использует псевдоним.

При отсутствии имени таблицы или префикса псевдонима, SQLможет для начала принять, что любое поле выводится из таблицы с именем, указанным в предложении FROM текущего запроса. Если поле с этим именем отсутствует (внашем случае — snum) в той таблице, SQL будет проверять внешние запросы. Именно поэтому, префикс имени таблицы обычно необходим в соотнесенных подзапросах— для отмены этого предположения. Псевдонимы также часто запрашиваются, чтобыдавать вам возможность ссылаться к той же самой таблице во внутреннем и внешнемзапросе без какой-либо неоднозначности.=============== SQL Execution Log ============| SELECT snum sname|| FROM Salespeople main|| WHERE 1 <|| AND second.odate = 10/03/1990;|| ============================================= ||cnumcnamecityratingsnum|| -----------------------||2001HoffmanLondon1001001||2003LiuSan Jose2001002||2008CisnerosSan Jose3001007||2007PereiraRome1001004|==============================================={!!! здесь явно глюк}Рисунок 11.3: Нахождение продавцов с многочислеными заказчикамиИСПОЛЬЗОВАНИЕ СООТНЕСЕННЫХ ПОДЗАПРОСОВ ДЛЯНАХОЖДЕНИЯ ОШИБОКИногда полезно выполнять запросы, которые разработаны специально так, чтобы находить ошибки.

Это всегда возможно при дефектной информации, которую можно ввести в вашу базу данных, и, если она введена, бывает трудно ее определить.Следующий запрос не должен производить никакого вывода. Он просматривает таблицу Порядков, чтобы видеть, совпадают ли поля snum и cnum в каждой строке таблицы Заказчиков и выводит каждую строку, где этого совпадения нет.

Другимисловами, запрос выясняет, тот ли продавец кредитовал каждую продажу (он воспринимает поле cnum, как первичный ключ таблицы Заказчиков, который не будет иметьникаких двойных значений в этой таблице).SELECT *FROM Orders mainWHERE NOT snum = ( SELECT snumFROM CustomersWHERE cnum = main.cnum );При использовании механизма справочной целостности (обсужденного в Главе19), вы можете быть гарантированы от некоторых ошибок такого вида. Этот механизмне всегда доступен, хотя его использование желательно во всех случаях, причем поиск ошибки запроса описанный выше, может быть еще полезнее.СРАВНЕНИЕ ТАБЛИЦЫ С СОБОЙВы можете также использовать соотнесенный подзапрос, основанный на той жесамой таблице, что и основной запрос.

Это даст вам возможность извлечть определенные сложные формы произведенной информации. Например, мы можем найти всепорядки со значениями сумм приобретений выше среднего для их заказчиков (выводпоказан в Рисунке 11.4):SELECT *FROM Orders outerWHERE amt > ( SELECT AVG amtFROM Orders interWHERE inner.cnum = outer.cnum );=============== SQL Execution Log ==============| SELECT *|| FROM Orders outer|| WHERE amt >|| (SELECT AVG (amt)|| FROM Orders inner|| WHERE inner.cnum = outer.cnum|| =============================================== ||onumamtodatecnumsnum || ------------ ---------- ---------- ||30061098.19 10/03/199020081007 ||30101309.00 10/06/199020041002 ||30119891.88 10/06/199020061001 |=================================================Рисунок 11.4: Соотнесение таблицы с собойКонечно, в нашей маленькой типовой таблице, где большиство заказчиков имеют только один порядок, большинство значений являются одновременно средними иследовательно не выбираются.

Характеристики

Тип файла
PDF-файл
Размер
1,41 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6508
Авторов
на СтудИзбе
302
Средний доход
с одного платного файла
Обучение Подробнее