Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

ФОРМАТИРОВАНИЕ РЕЗУЛЬТАТОВ ЗАПРОСОВ




Скалярные выражения с выбранными полями.Например, если вам удобнее представить комиссионные продавцов в виде процентов, а не десятичных чисел,достаточно указать:

SELECT snum, sname, city, comm * 100
FROM Salespeople;

Выходные столбцы — это столбцы, которые создаются с помощью запроса (в тех случаях, когда в пред­ложении запроса 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, упорядоченные по убыванию поля com­mission (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
WHERE Salespeople.city = Customers.city;


Операция соединения таблиц посредством ссылочной целостности

Эта операция применяется для использования связей, встроенных в базу дан­ных. В предыдущем примере связь между таблицами была установлена с помо­щью операции соединения. Но эти таблицы уже связаны по значениям полем snum. Такая связь называется состоянием ссылочной целостности. Стандартное применение операции соединения состоит в извлечении данных в терминах этой связи. Чтобы показать соответствие имен покупателей именам продавцов, обслуживающих этих покупателей, используется следующий запрос:

SELECT Customers. cname, Salespeople. sname
FROM Customers, Salespeople                              

WHERE Salespeople.snum = Customers.snum;

 


Эквисоединение и другие виды соединений

Соединение, использующее предикаты, основанные на равенствах, называется эквисоединением.

SELECT sname, cname

FROM Salespeople, Customers

WHERE sname < cname
AND rating < 200;

Команда генерирует все комбинации имен продавцов и покупателей так, что первые предшествуют последним в алфавит­ном порядке, а последние имеют рейтинг меньше чем 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
WHERE odate = 10/04/1990);

 

Сгруппированные, то есть примененные с предложением 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
FROM Salespeople
WHERE sname ='Lavrov');

Запрос находит всех покупателей, для которых cnum на 1000 превосходит значение поля snum для Lavrov. В данном случае предполагается, что в столбце snum нет повторяющихся значений, в противном случае результатом выполнения подзапроса может оказаться множество значений.



Подзапросы с НА VING

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










Последнее изменение этой страницы: 2018-05-29; просмотров: 497.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...