Раздел 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; просмотров: 671;