Мартин Грубер - Понимание SQL (Мартин Грубер. Понимание SQL), страница 13
Описание файла
PDF-файл из архива "Мартин Грубер. Понимание SQL", который расположен в категории "". Всё это находится в предмете "информационные технологии в материаловедении" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 13 страницы из PDF
Это будет темой Главы 8.РАБОТА С SQL1. Предположим что каждый продавец имеет 12% комиссионных. Напишите запрос ктаблице Порядков который мог бы вывести номер порядка, номер продавца, и сумму комиссионных продавца для этого порядка.2. Напишите запрос к таблице Заказчиков который мог бы найти высшую оценку в каждом городе. Вывод должен быть в такой форме:For the city (city), the highest rating is: (rating).3.
Напишите запрос который выводил бы список заказчиков в нисходящем порядке.Вывод поля оценки (rating) должден сопровождаться именем закзчика и его номером.4. Напишите запрос который бы выводил общие порядки на каждый день и помещалрезультаты в нисходящем порядке.(См. Приложение A для ответов.)8ЗАПРАШИВАНИЕМНОГОЧИСЛЕНЫХТАБЛИЦ ТАК ЖЕ, КАКОДНОЙДО ЭТОГО, КАЖДЫЙ ЗАПРОС КОТОРЫЙ МЫ ИССЛЕДОВАЛИ основывался наодиночной таблице.
В этой главе, вы узнаете как сделать запрос любого числа таблицс помощью одной команды. Это — чрезвычайно мощное средство потому что оно нетолько объединяет вывод из многочисленых таблиц, но и определяет связи междуними. Вы обучитесь различным формам которые могут использовать эти связи, а также устанавливать и использовать их чтобы удовлетворять возможным специальнымтребованиям.ОБЪЕДИНЕНИЕ ТАБЛИЦОдна из наиболее важных особенностей запросов SQL — это их способностьопределять связи между многочислеными таблицами и выводить информацию из нихв терминах этих связей, всю внутри одной команды.Этот вид операции называется — объединением, которое является одним из видов операций в реляционных базах данных.
Как установлено вГлаве 1, главное в реляционном подходе это связи которые можно создаватьмежду позициями данных в таблицах. Используя обьединения, мы непосредственносвязываем информацию с любым номером таблицы, и таким образом способны создавать связи между сравнимыми фрагментами данных.При обьединении, таблицы представленые списком в предложении FROM запроса, отделяются запятыми. Предикат запроса может ссылаться к любому столбцулюбой связанной таблицы и, следовательно, может использоваться для связи междуими.
Обычно, предикат сравнивает значения в столбцах различных таблиц чтобы определить, удовлетворяет ли WHERE установленному условию.ИМЕНА ТАБЛИЦ И СТОЛБЦОВПолное имя столбца таблицы фактически состоит из имени таблицы, сопровождаемого точкой и затем именем столбца. Имеются несколько примеров имен :Salespeople.snumSalespeople.cityOrders.odateДо этого, вы могли опускать имена таблиц потому что вы запрашивали толькоодну таблицу одновременно, а SQL достаточно интелектуален чтобы присвоить соответствующий префикс, имени таблицы.
Даже когда вы делаете запрос многочисленыхтаблиц, вы еще можете опускать имена таблиц, если все ее столбцы имеют различные имена. Но это не всегда так бывает. Например, мы имеем две типовые таблицысо столбцами называемыми city.Если мы должны связать эти столбцы (кратковременно), мы будем должны указать их с именами Salespeople.city или Customers.city, чтобы SQL мог их различать.СОЗДАНИЕ ОБЬЕДИНЕНИЯПредположим что вы хотите поставить в соответствии вашему продавцу вашихзаказчиков в городе в котором они живут, поэтому вы увидите все комбинации продавцов и заказчиков для этого города.
Вы будете должны брать каждого продавца иискать в таблице Заказчиков всех заказчиков того же самого города. Вы могли бысделать это, введя следующую команду (вывод показывается в Рисунке 8.1):SELECT Customers.cname, Salespeople.sname, Salespeople.cityFROM Salespeople, CustomersWHERE Salespeople.city = Customers.city;=============== SQL Execution Log ============| SELECT Customers.cname, Salespeople.sname,|| Salespeople.city|| FROM Salespeople, Customers|| WHERE Salespeople.city = Customers.city|| ============================================= ||cnamecnamecity|| ----------------|| HoffmanPeelLondon|| HoffmanPeelLondon|| LiuSerresSan Jose|| CisnerosSerresSan Jose|| HoffmanMotikaLondon|| ClemensMotikaLondon|===============================================Рисунок 8.1: Объединение двух таблицТак как это поле city имеется и в таблице Продавцов и таблице Заказчиков, имена таблиц должны использоваться как префиксы.
Хотя это необходимо только когдадва или более полей имеют одно и то же имя, в любом случае это хорошая идеявключать имя таблицы в обьединение для лучшего понимания и непротиворечивости.Несмотря на это, мы будем, в наших примерах далее, использовать имена таблицытолько когда необходимо, так что будет ясно, когда они необходимы а когда нет.Что SQL в основном делает в обьединении — так это исследует каждую комбинацию строк двух или более возможных таблиц, и проверяет эти комбинации по ихпредикатам. В предыдущем примере, требовалась строка продавца Peel из таблицыПродавцов и объединение ее с каждой строкой таблицы Пользователей, по одной вкаждый момент времени.Если комбинация производит значение которое делает предикат верным, и еслиполе city из строк таблиц Заказчика равно London, то Peel — это то запрашиваемоезначение которое комбинация выберет для вывода.
То же самое будет затем выполнено для каждого продавца в таблице Продавцов (у некоторых из которых небыло никаких заказчиков в этих городах).ОБЪЕДИНЕНИЕ ТАБЛИЦ ЧЕРЕЗ СПРАВОЧНУЮЦЕЛОСТНОСТЬЭта особенность часто используется просто для эксплуатации связей встроенных в базу данных. В предыдущем примере, мы установили связь между двумя таблицами в обьединении.
Это прекрасно. Но эти таблицы, уже были соединены черезsnum поле. Эта связь называется состоянием справочной целостности, как мы ужеговорили в Главе 1. Используя обьединение можно извлекать данные в терминах этойсвязи. Например, чтобы показать имена всех заказчиков соответствующих продавцамкоторые их обслуживают, мы будем использовать такой запрос:SELECT Customers.cname, Salespeople.snameFROM Customers, SalespeopleWHERE Salespeople.snum = Customers.snum;Вывод этого запроса показывается в Рисунке 8.2.Это — пример обьединения, в котором столбцы используются для определенияпредиката запроса, и в этом случае, snum столбцы из обеих таблиц, удалены из вывода.
И это прекрасно.Вывод показывает какие заказчики каким продавцом обслуживаются; значенияполя snum которые устанавливают связь — отсутствуют. Однако если вы введете их ввывод, то вы должны или удостовериться что вывод понятен сам по себе или обеспечить коментарий к данным при выводе.=============== SQL Execution Log ============| SELECT Customers.cname, Salespeople.sname,|| FROM Salespeople, Customers|| WHERE Salespeople.snum = Customers.snum|| ============================================= ||cnamesname|| -------------|| HoffmanPeel|| GiovanniAxelrod|| LiuSerres|| GrassSerres|| ClemensPeel|| CisnerosRifkin|| PereiraMotika|===============================================Рисунок 8.2: Объединение продавцов с их заказчикамОБЪЕДИНЕНИЯ ТАБЛИЦ ПО РАВЕНСТВУ ЗНАЧЕНИЙ ВСТОЛБЦАХ И ДРУГИЕ ВИДЫ ОБЪЕДИНЕНИЙОбьединения которые используют предикаты основанные на равенствах называются — объединениями по равенству.
Все наши примеры в этой главе до настоящего времени, относились именно к этой категории, потому что все условия впредложениях WHERE базировались на математических выражениях использующихзнак равно (=). Строки 'city = 'London' и 'Salespeople.snum = Orders.snum' — примеры таких типов равенств найденных в предикатах.Объединения по равенству — это вероятно наиболее общий вид объединения,но имеются и другие.
Вы можете, фактически, использовать любой из реляционныхоператоров в обьединении. Здесь показан пример другого вида объединения (выводпоказывается в Рисунке 8.3):SELECT sname, cnameFROM Salespeople, CustomersWHERE sname < cname AND rating < 200;=============== SQL Execution Log ============| SELECT sname, cname|| FROM Salespeople, Customers|| WHERE sname < cname|| AND rating < 200;|| ============================================= ||snamecname||-------------||PeelPereira||MotikaPereira||AxelrodHoffman||AxelrodClemens||AxelrodPereira|===============================================Рисунок 8.3: Обьединение основанное на неравенствеЭта команда не часто бывает полезна.
Она воспроизводит все комбинации имени продавца и имени заказчика так, что первый предшествует последнему в алфавитном порядке, а последний имеет оценку меньше чем 200. Обычно, вы не создаетесложных связей подобно этой, и, по этой причине, вы вероятно будете строить наиболее общие объединения по равенству, но вы должны хорошо знать и другие возможности.ОБЪЕДИНЕНИЕ БОЛЕЕ ДВУХ ТАБЛИЦВы можете также создавать запросы объединяющие более двух таблиц.
Предположим что мы хотим найти все порядки заказчиков не находящихся в тех городахгде находятся их продавцы. Для этого необходимо связать все три наши типовые таблицы (вывод показывается в Рисунке 8.4):SELECT onum, cname, Orders.cnum, Orders.snumFROM Salespeople, Customers,OrdersWHERE Customers.city < > Salespeople.cityAND Orders.cnum = Customers.cnumAND Orders.snum = Salespeople.snum;=============== SQL Execution Log ==============| SELECT onum, cname, Orders.cnum, Orders.snum|| FROM Salespeople, Customers, Orders|| WHERE Customers.city < > Salespeople.city|| AND Orders.cnum = Customers.cnum|| AND Orders.snum = Salespeople.snum;|| =============================================== ||onumcnamecnumsnum|| ------ --------------||3001Cisneros20081007||3002Pereira20071004||3006Cisneros20081007||3009Giovanni20021003||3007Grass20041002||3010Grass20041002|=================================================Рисунок 8.4: Объединение трех таблицХотя эта команда выглядит скорее как комплексная, вы можете следовать за логикой, просто проверяя — что заказчики не размещены в тех городах где размещеныих продавцы (совпадение двух snum полей), и что перечисленные порядки — выпол-нены с помощью этих заказчиков (совпадение порядков с полями cnum и snum в таблице Порядков).РЕЗЮМЕТеперь вы больше не ограничиваетесь просмотром одной таблицы в каждыймомент времени.
Кроме того, вы можете делать сложные сравнения между любымиполями любого числа таблиц и использовать полученные результаты чтобы решатькакую информацию вы бы хотели видеть. Фактически, эта методика настолько полезна для построения связей, что она часто используется для создания их внутри одиночной таблицы. Это будет правильным: вы сможете объединить таблицу с собой, аэто очень удобная вещь. Это будет темой Главы 9.РАБОТА С SQL1. Напишите запрос, который бы вывел список номеров порядков, сопровождающихсяименем заказчика, который создавал эти порядки.2. Напишите запрос, который бы выдавал имена продавца и заказчика для каждогопорядка после номера порядков.3. Напишите запрос, который бы выводил всех заказчиков, обслуживаемых продавцом с комиссионными выше 12%. Выведите имя заказчика, имя продавца и ставкукомиссионных продавца.4.