Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
ФОРМАТИРОВАНИЕ РЕЗУЛЬТАТОВ ЗАПРОСОВ
Скалярные выражения с выбранными полями.Например, если вам удобнее представить комиссионные продавцов в виде процентов, а не десятичных чисел,достаточно указать: SELECT snum, sname, city, comm * 100 Выходные столбцы — это столбцы, которые создаются с помощью запроса (в тех случаях, когда в предложении запроса SELECT используются агрегатные функции, константы или выражения), а не извлекаются непосредственно из таблицы. Поскольку имена столбцов являются атрибутами таблицы, столбцы, не переходящие из таблицы в выходные данные, не имеют имен. Внесение текста в выходные данные запроса. Константы, а также текст, можно включать в предложение запроса SELECT. Однако, буквенные константы, в отличие от числовых, нельзя использовать в выражениях. В SELECT-предложение можно включить 1+2, но не 'А' + 'В', поскольку 'А' и 'В' здесь просто буквы, а не переменные или символы, используемые для обозначения чего-либо отличного от них самих. Тем не менее, возможность вставить текст в выходные данные запроса вполне реальна. SELECT snum, sname, city,'%', comm * 100 FROM Salespeople; Упорядочение выходных полей По умолчанию принята возрастающая последовательность сортировки. Таблица заявок (Orders), упорядоченная по номеру заявки, выглядит так: SELECT* FROM Orders ORDER BY cnum DESC; Внутри уже произведенного упорядочения по полю cnum можно упорядочить таблицу и по другому столбцу, например, amt: SELECT *FROM Orders ORDER BY cnum DESC, amt DESC; Так можно использовать ORDER BY одновременно для любого количества столбцов. Во всех случаях столбцы, по которым выполняется сортировка, входят в число выбранных. Упорядочение составных групп До этого выходные данные были сгруппированы, но порядок групп был произвольным; теперь группы выстроены в определенной последовательности: SELECT snum, odate, MAX(amt) FROM Orders GROUP BY snum, odate ORDER BY snum; Поскольку в команде не указан способ упорядочения, по умолчанию применяется возрастающий. Упорядочение результата по номеру столбца Например, можно применить следующую команду, чтобы увидеть определенные поля таблицы Salespeople, упорядоченные по убыванию поля commission (comm): SELECT sname, comm FROM Salespeople ORDER BY 2 DESC; Столбцы, полученные с помощью функций агрегирования, константы или выражения в предложении запроса SELECT, можно применить и с ORDER BY, если на них ссылаются по номеру. Например, чтобы подсчитать заявки (orders) для каждого продавца (salespeople) и вывести результаты в убывающем порядке: SELECT snum, COUNT (DISTINCT onum) FROM Orders GROUP BY snum ORDER BY 2 DESC; В этом случае был использован номер столбца, но так как выходной столбец не имеет имени, саму функцию агрегирования применять не понадобилось. SELECT snum, COUNT (DISTINCT onum) FROM Orders; Использование множества таблиц в одном запросе Соединение таблиц. Предположим, нужно установить связь между продавцами (Salespeople) и покупателями (Customers) в соответствии с местом их проживания, чтобы получить все возможные комбинации продавцов и покупателей из одного города. Для этого необходимо взять продавца из таблицы Salespeople и выполнить по таблице Customes поиск всех покупателей, имеющих то же значение в столбце city. Это можно сделать, введя следующую команду: SELECT Customers.cname, Salespeople.sname, Salespeople.city FROM Salespeople, Customers Операция соединения таблиц посредством ссылочной целостности Эта операция применяется для использования связей, встроенных в базу данных. В предыдущем примере связь между таблицами была установлена с помощью операции соединения. Но эти таблицы уже связаны по значениям полем snum. Такая связь называется состоянием ссылочной целостности. Стандартное применение операции соединения состоит в извлечении данных в терминах этой связи. Чтобы показать соответствие имен покупателей именам продавцов, обслуживающих этих покупателей, используется следующий запрос: SELECT Customers. cname, Salespeople. sname WHERE Salespeople.snum = Customers.snum;
Эквисоединение и другие виды соединений Соединение, использующее предикаты, основанные на равенствах, называется эквисоединением. SELECT sname, cname FROM Salespeople, Customers WHERE sname < cname Команда генерирует все комбинации имен продавцов и покупателей так, что первые предшествуют последним в алфавитном порядке, а последние имеют рейтинг меньше чем 200. Соединение более чем двух таблиц Можно конструировать запросы путем соединения более чем двух таблиц. 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; Вложение запросов Необходимо извлечь все ее заказы из таблицы Orders. SELECT * FROM Orders WHERE snum = (SELECT snum FROM Salespeople WHERE sname = ‘Ivanov’); В результате выбранной оказывается единственная строка с snum = 1004. Однако вместо простого вывода этого значения SQL подставляет его в предикат основного запроса вместо самого подзапроса, теперь предикат читается следующим образом: WHERE snum = 1004 Затем основной запрос выполняется как обычный, и его результат точно такой же. Подзапрос должен выбирать один и только один столбец, а тип данных этого столбца должен соответствовать типу значения, указанному в предикате. Часто выбранное поле и это значение имеют одно и то же имя (в данном случае, snum). DISTINCT с подзапросами В некоторых случаях можно использовать DISTINCT для гарантии получения единственного значения в результате выполнения подзапроса. Предположим, нужно найти все заказы (orders), с которыми работает продавец, обслуживающий покупателя Levin (cnum = 2001). Вот один из вариантов решения этой задачи: SELECT * FROM Orders WHERE snum = (SELECT DISTINCT snum FROM Orders WHERE cnum = 2001); Использование агрегатных функций в подзапросах Например, нужно узнать все заказы, стоимость которых превышает среднюю стоимость заказов за 4 октября 1990 г. SELECT * FROM Orders WHERE amt > (SELECT AVG (amt) FROM Orders
Сгруппированные, то есть примененные с предложением GROUP BY, агрегатные функции могут дать в результате множество значений. Поэтому их нельзя применять в подзапросах. SELECT * FROM Orders WHERE snum IN (SELECT snum FROM Salespeople WHERE city = 'London'); Можно применять IN и в тех ситуациях, когда есть абсолютная уверенность в получении единственного значения в результате выполнения подзапроса. IN можно также использовать там, где применим реляционный оператор сравнения. В отличие от реляционных операторов IN не приводит к ошибке выполнения команды, когда в результате выполнения подзапроса получается не одно, а несколько значений (выходных данных). В этом есть и плюсы, и минусы. Результаты выполнения подзапроса непосредственно не видны. При абсолютной уверенности в том, что в результате выполнения подзапроса будет получено только одно значение, а в действительности их получается несколько, невозможно объяснить разницу в выходных данных, полученных в результате выполнения основного запроса. Подзапросы используют единственный столбец.Общая черта всех подзапросов, рассмотренных в этой главе, состоит в том, что они выбирают единственный столбец. Это существенно, так как выходные данные вложенного SELECT-предложения сравниваются с единственным значением. Из этого следует, что вариант SELECT * нельзя использовать в подзапросе. Исключением из этого правила являются подзапросы с оператором EXISTS. Использование выражений в подзапросах.В предложении подзапроса SELECT можно использовать выражения, основанные на столбцах, а не сами столбцы. Это можно сделать, применяя операторы отношения или IN. Например, следующий запрос использует оператор отношения = SELECT * FROM Customers WHERE cnum = (SELECT snum + 1000 Запрос находит всех покупателей, для которых cnum на 1000 превосходит значение поля snum для Lavrov. В данном случае предполагается, что в столбце snum нет повторяющихся значений, в противном случае результатом выполнения подзапроса может оказаться множество значений. Подзапросы с НА VING Подзапросы можно применять также внутри предложения HAVING. В самих таких подзапросах можно использовать их собственные агрегатные функции, если они не дают множества значений, а также GROUP BY или HAVING. Например: |
||
Последнее изменение этой страницы: 2018-05-29; просмотров: 497. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |