Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции по серверам.doc
Скачиваний:
5
Добавлен:
01.04.2025
Размер:
749 Кб
Скачать
☆

Сортировка результатов запроса

В SQL имеются специальные средства, которые позволяют совершенствовать вывод запросов:

  • размещение текста в выводе запроса:

SELECT имя_поля1, ‘текст’, имя_поля2 …

При этом все символы, в том числе и пробелы, вставляются в вывод, поэтому этот способ можно использовать для маркировки вывода вместе со вставляемыми комментариями.

  • упорядочение полей вывода:

ORDER BY имя_поля ASC|DESC;

Если указывается несколько полей, то столбцы вывода упорядочиваются один внутри другого, при этом можно определить ASC (возрастание) или DESC (убывание).

Например, определить количество объектов, находящихся в ведении каждого из сотрудников компании c упорядочением отделений по убыванию:

SELECT STAFF.Branch_no, STAFF.Staff_no, Count(*) AS Count_Staff_no

FROM STAFF INNER JOIN PROPERTY ON STAFF.Staff_no = PROPERTY.Staff_no

GROUP BY STAFF.Branch_no, STAFF.Staff_no

ORDER BY STAFF.Branch_no DESC, STAFF.Staff_no;

    1. Вложение запросов

Одни запросы могут быть размещены внутри других запросов. Обычно подчиненный запрос генерирует значение, которое проверяется в предикате внешнего запроса (в предложении WHERE или HAVING), определяющего верно оно или нет. Совместно с подзапросом можно использовать предикат EXISTS, который возвращает истину, если вывод подзапроса не пуст.

Часто бывает необходимо сравнивать значения в определенных столбцах со списком значений этого же столбца из другой таблицы или запроса. В подобных случаях используется ключевое слово IN (NOT IN).

Например, вывести список сотрудников, за которыми не закреплен ни один из объектов недвижимости.

SELECT *

FROM STAFF

WHERE Staff_no NOT IN (SELECT Staff_no FROM PROPERTY);

В подзапросах допускается использование агрегатных функций, например, для вывода списка трехкомнатных квартир, цена которых превышает среднюю цену трехкомнатной квартиры, используется запрос:

SELECT City, Street, House,Flat

FROM PROPERTY

WHERE Rooms=3

AND Selling_Price >(SELECT AVG(Selling_Price) FROM Property

WHERE Rooms=3);

Вывести список владельцев собственности, чьи объекты были осмотрены в определенный день:

SELECT OWNER.Owner_no, FName, LName

FROM OWNER INNER JOIN PROPERTY

ON PROPERTY.Owner_no=OWNER.Owner_no

WHERE PROPERTY.Property_no=(SELECT Property_no

FROM VIEWING

WHERE Date_View=’18.01.03’);

В таблице VIEWING будет найдена соответствующая дата и передана в предложение WHERE. После определения даты в основном запросе из таблицы PROPERTY будут отобраны записи, удовлетворяющие заданному условию.

(В данном примере предполагается, что подзапрос должен вернуть только одно значение).

Если подчиненный запрос возвращает более одного значения, использование запроса в таком виде приведет к ошибке. В тех случаях, когда подчиненный запрос возвращает более одной строки необходимо использовать следующие ключевые слова: ANY, SOME, ALL. Подчиненный запрос в этом случае должен возвращать один столбец.

ANY или SOME – возвращает TRUE, если заданное выражение является истинным для какой-нибудь из строк возвращаемой запросом.

ALL - возвращает TRUE, если заданное выражение является истинным для всех строк возвращаемой запросом.

Выведите список объектов собственности, которые были осмотрены покупателями (присутствуют в таблице VIEWING):

SELECT *

FROM PROPERTY

WHERE Property_no =ANY (SELECT Property_no

FROM VIEWING);

Этот же результат может быть получен с помощью оператора IN

SELECT Property_no

FROM PROPERTY

WHERE Property_no IN (SELECT Property_no

FROM VIEWING);

Оператор ALL работает таким образом, что предикат является верным, если каждое значение, выбранное подзапросом, удовлетворяет условию в предикате внешнего запроса.

Найти всех сотрудников, чья заработная плата выше заработной платы любого из сотрудников отделения компании под номером 3:

SELECT Staff_no, FName, LName, Salary

FROM STAFF

WHERE Salary > ALL (SELECT Salary FROM STAFF

WHERE Branch_no=3);

Использование оператора EXISTS

Оператор EXISTS проверяет, возвращает ли подчиненный запрос хотя бы одну строку. Для проверки противоположного значения используется предикат NOT EXISTS.

Выведите данные об объектах собственности из таблицы PROPERTY только в том случае, если хотя бы один из них был осмотрен покупателями, и было получено согласие на приобретение:

SELECT Property_no

FROM PROPERTY

WHERE EXISTS (SELECT Property_no FROM VIEWING

WHERE Comments=’согласен’);