Раздел HAVING.

Этот раздел практически аналогичен по назначению с разделом WHERE (горизонтальная фильтрация), однако используется для задания условий групповой фильтрации. В этом разделе допускается использование функций агрегирования.

 

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

SELECT publishers.publisher, COUNT(titles.title)

FROM titles, publishers

WHERE titles.pub_id = publishers.pub_id

GROUP BY publisher

HAVING COUNT(*)>1;

 

Другой пример: получить номера деталей, суммарное количество которых на складе превышает 400 шт.

SELECT number, SUM(volume) FROM warehouse

GROUP BY number HAVING SUM(volume)>400

Раздел ORDER BYпредназначен для упорядочения набора данных, возвращаемых после выполнения запроса. Используются ключевые слова ASC (по возрастанию, используется по умолчанию) и DESC (по убыванию). При этом в сортировке могут участвовать столбцы, не входящие в раздел SELECT. Приоритет в сортировке по столбцам, указанным первыми.

 

SELECT data.* FROM data ORDER BY subject, msu, year

 

Раздел UNIONслужит для объединения результатов выборки, возвращаемых двумя и более запросами. Это может быть выборка из одной таблицы или слияние данных из множества таблиц. Иными словами, раздел UNION вставляется между двумя запросами, возвращающими одинаковый набор столбцов. В результат будут включены строки как первого, так и второго запроса. По умолчанию дублирующие строки в результат не включаются.

 

SELECT publisher, url FROM publishers

UNION

SELECT site, url FROM wwwsites

 

Использование вложенных запросов.

Команда SELECT позволяет использовать подзапросы в предикатах главного (т.е. в разделах WHERE и HAVING). Совместно с подзапросом можно использовать предикат EXIST, который возвращает истину, если вывод подзапроса не пуст.

 

Задача: найти названия всех изданий, выпущенные издательством «Wiley»

SELECT title FROM titles WHERE pub_id IN

(SELECT pub_id FROM publishers WHERE publisher='Wiley');

 

Более сложные задачи: даны отношения

Suppliers (id_supplier, name) – поставщики (код поставщика, ФИО поставщика)

Supply (id_supplier, number) – поставки (код поставщика, номер детали)

Components (number, title) – детали (номер детали, наименование детали).

 

1. Найти имена поставщиков, которые поставляют все детали из занесённых в базу.

SELECT MAX(suppliers.name)

FROM suppliers, supply

WHERE suppliers.id_supplier=supply.id_supplier

GROUP BY supply.id_supplier

HAVING COUNT( DISTINCT supply.number) = (

SELECT COUNT(number) FROM components)

 

2. Получить список поставщиков, поставляющих деталь с номером 222.

SELECT * FROM suppliers

WHERE EXIST

(SELECT * FROM supply

WHERE suppliers.id_supplier = supply.id_supplier AND supply.number = 222);

 

Такие подзапросы называются коррелируемыми (correlated). Внешняя ссылка может принимать различные значения для каждой строки-кандидата, оцениваемого с помощью подзапроса, поэтому подзапрос должен выполняться заново для каждой строки, отбираемой в основном запросе.

 

Простой пример: контроль ссылочной целостности вручную:

SELECT * FROM data WHERE item NOT IN (SELECT item FROM items)

Реализация реляционной алгебры средствами оператора SELECT (Реляционная полнота SQL)

Для того, чтобы показать, что язык SQL является реляционно полным, нужно показать, что любой реляционный оператор может быть выражен средствами SQL.

 

1. Объединение: SELECT * FROM A UNION SELECT * FROM B 2. Пересечение: SELECT * FROM A INTERSECT SELECT * FROM B 3. Разность: SELECT * FROM A EXCEPT SELECT * FROM B 4. Декартово произведение: SELECT A.*, B.* FROM A, B
5. Ограничение: SELECT * FROM A WHERE С; 6. Проекция отношения: SELECT DISTINCT X, Y, Z FROM A 7. Соединение по условию: SELECT A.*, B.* FROM A, B WHERE С; 8. Деление: SELECT DISTINCT A.X FROM A WHERE NOT EXIST (SELECT * FROM B WHERE NOT EXIST (SELECT * FROM A A1 WHERE A1.X = A.X AND A1.Y = B.Y));

 








Дата добавления: 2015-07-30; просмотров: 633;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.004 сек.