СУБД 5. SQL для выборки данных
2 SELECT Обработка элементов оператора SELECT выполняется в следующей последовательности: FROM – определяются имена используемых таблиц; WHERE – выполняется фильтрация строк объекта в соответствии с заданными условиями; GROUP BY – образуются группы строк, имеющих одно и то же значение в указанном столбце; HAVING – фильтруются группы строк объекта в соответствии с указанным условием; SELECT – устанавливается, какие столбцы должны присутствовать в выходных данных; ORDER BY – определяется упорядоченность результатов выполнения операторов. SELECT [ALL | DISTINCT ] {*|[имя_столбца [AS новое_имя]]} [,...n] FROM имя_таблицы [[AS] псевдоним] [,...n] [WHERE ] [GROUP BY имя_столбца [,...n]] [HAVING ] [ORDER BY имя_столбца [,...n]] SELECT и FROM являются обязательными, все остальные могут быть опущены.
3 Примеры SELECT Пример 1. Составить список сведений о всех клиентах. SELECT * FROM Клиент Предикат ALL задает включение в выходной набор всех дубликатов. Нет необходимости указывать ALL явно, поскольку это значение действует по умолчанию. Пример 2. Составить список всех фирм. SELECT ALL Клиент.Фирма FROM Клиент Или (что эквивалентно) SELECT Клиент.Фирма FROM Клиент Предикат DISTINCT следует применять в тех случаях, когда требуется отбросить блоки данных, содержащие дублирующие записи в выбранных полях. SELECT DISTINCT Клиент.Фирма FROM Клиент
4 WHERE С помощью WHERE-параметра пользователь определяет, какие блоки данных из приведенных в списке FROM таблиц появятся в результате запроса. пять основных типов условий поиска (или предикатов): Сравнение: сравниваются результаты вычисления одного выражения с результатами вычисления другого. Диапазон: проверяется, попадает ли результат вычисления выражения в заданный диапазон значений. Принадлежность множеству: проверяется, принадлежит ли результат вычислений выражения заданному множеству значений. Соответствие шаблону: проверяется, отвечает ли некоторое строковое значение заданному шаблону. Значение NULL: проверяется, содержит ли данный столбец определитель NULL (неизвестное значение).
5 Сравнение Операторы сравнения: = равенство; больше; = больше или равно; не равно. Пример 3. Показать все операции отпуска товаров объемом больше 20. SELECT * FROM Сделка WHERE Количество>20 Более сложные предикаты могут быть построены с помощью логических операторов AND, OR или NOT, а также скобок. Вычисление выражения в условиях выполняется по следующим правилам: Выражение вычисляется слева направо. Первыми вычисляются подвыражения в скобках. Операторы NOT выполняются до выполнения операторов AND и OR. Операторы AND выполняются до выполнения операторов OR. Пример 4. Вывести список товаров, цена которых больше или равна 100 и меньше или равна 150. SELECT Название, Цена FROM Товар WHERE Цена>=100 And Цена
6 Диапазон Оператор BETWEEN используется для поиска значения внутри некоторого интервала, определяемого своими минимальным и максимальным значениями. При этом указанные значения включаются в условие поиска. Пример 6. Вывести список товаров, цена которых лежит в диапазоне от 100 до 150 SELECT Название, Цена FROM Товар WHERE Цена Between 100 And 150 При использовании отрицания NOT BETWEEN требуется, чтобы проверяемое значение лежало вне границ заданного диапазона. Пример 7. Вывести список товаров, цена которых не лежит в диапазоне от 100 до 150. SELECT Товар.Название, Товар.Цена FROM Товар WHERE Товар.Цена Not Between 100 And 150 Или (что эквивалентно) SELECT Товар.Название, Товар.Цена FROM Товар WHERE (Товар.Цена 150)
7 Принадлежность множеству Оператор IN используется для сравнения некоторого значения со списком заданных значений, при этом проверяется, соответствует ли результат вычисления выражения одному из значений в предоставленном списке. При помощи оператора IN может быть достигнут тот же результат, что и в случае применения оператора OR, однако оператор IN выполняется быстрее. Пример 8. Вывести список клиентов из Москвы или из Самары SELECT Фамилия, ГородКлиента FROM Клиент WHERE ГородКлиента IN ("Москва", "Самара") NOT IN используется для отбора любых значений, кроме тех, которые указаны в представленном списке. Пример 9. Вывести список клиентов, проживающих не в Москве и не в Самаре. SELECT Фамилия, ГородКлиента FROM Клиент WHERE ГородКлиента NOT IN ("Москва","Самара")
8 Соответствие шаблону С помощью оператора LIKE можно выполнять сравнение выражения с заданным шаблоном, в котором допускается использование символов-заменителей: Символ % –любое количество произвольных символов. Символ _ один символ строки. [] – вместо символа строки будет подставлен один из возможных символов, указанный в этих ограничителях. [^] – вместо соответствующего символа строки будут подставлены все символы, кроме указанных в ограничителях.
9 Пример. Соответствие шаблону Пример 10. Найти клиентов, у которых в номере телефона вторая цифра – 4. SELECT Клиент.Фамилия, Клиент.Телефон FROM Клиент WHERE Клиент.Телефон Like "_4%" Пример 11. Найти клиентов, у которых в номере телефона вторая цифра – 2 или 4. SELECT Клиент.Фамилия, Клиент.Телефон FROM Клиент WHERE Клиент.Телефон Like "_[2,4]%« Пример 12. Найти клиентов, у которых в номере телефона вторая цифра 2, 3 или 4. SELECT Клиент.Фамилия, Клиент.Телефон FROM Клиент WHERE Клиент.Телефон Like "_[2-4]%" Пример 13. Найти клиентов, у которых в фамилии встречается слог "ро". SELECT Клиент.Фамилия FROM Клиент WHERE Клиент.Фамилия Like "%ро%"
10 Значение NULL Оператор IS NULL используется для сравнения текущего значения со значением NULL – специальным значением, указывающим на отсутствие любого значения. Пример 14. Найти сотрудников, у которых нет телефона (поле Телефон не содержит никакого значения). SELECT Фамилия, Телефон FROM Клиент WHERE Телефон IS NULL IS NOT NULL используется для проверки присутствия значения в поле. Пример 15. Выборка клиентов, у которых есть телефон (поле Телефон содержит какое-либо значение). SELECT Клиент.Фамилия, Клиент.Телефон FROM Клиент WHERE Клиент.Телефон IS NOT NULL
11 Предложение ORDER BY Фраза ORDER BYсортирует данные выходного набора в заданной последовательности. Сортировка может выполняться по нескольким полям, в этом случае они перечисляются за ключевым словом ORDER BY через запятую. Для выполнения сортировки в обратной последовательности необходимо после имени поля, по которому она выполняется, указать ключевое слово DESC Фраза ORDER BY всегда должна быть последним элементом в операторе SELECT. Пример 16.Вывести список клиентов в алфавитном порядке. SELECT Клиент.Фамилия, Клиент.Фирма FROM Клиент ORDER BY Клиент.Фамилия Пример 17. Вывести список фирм и клиентов. Названия фирм упорядочить в алфавитном порядке, имена клиентов в каждой фирме отсортировать в обратном порядке. SELECT Клиент.Фирма, Клиент.Фамилия FROM Клиент ORDER BY Клиент.Фирма, Клиент.Фамилия DESC
12 Операция соединения по двум отношениям (таблицам) JOIN Соединение - это процесс, когда две или более таблицы объединяются в одну. Формат операции: FROM имя_таблицы_1 {INNER | LEFT | RIGHT} JOIN имя_таблицы_2 ON условие_соединения Внутреннее соединение (INNER JOIN ) Операция INNER JOIN (внутреннее соединение) используется, когда нужно включить все строки из обеих таблиц, удовлетворяющие условию объединения. Внутреннее соединение имеет место и тогда, когда в предложении WHERE сравниваются значения полей из разных таблиц. В этом случае строится декартово произведение строк первой и второй таблиц, а из полученного набора данных отбираются записи, удовлетворяющие условиям объединения.
13 Примеры INNER JOIN Пример 18. Вывести информацию о проданных товарах. SELECT * FROM Сделка, Товар WHERE Сделка.КодТовара=Товар.КодТовара Или (что эквивалентно) SELECT * FROM Товар INNER JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара Пример 19. Получить сведения о товарах, дате сделок, количестве проданного товара и покупателях. SELECT Товар.Название, Сделка.Количество, Сделка. Дата, Клиент.Фирма FROM Клиент INNER JOIN (Товар INNER JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара) ON Клиент.КодКлиента=Сделка.КодКлиента Использование общих имен таблиц для идентификации столбцов неудобно из-за их громоздкости. Каждой таблице можно присвоить какое-нибудь краткое обозначение, псевдоним. Пример 20. Получить сведения о товарах, дате сделок, количестве проданного товара и покупателях. В запросе используются псевдонимы таблиц. SELECT Т.Название, С.Количество, С.Дата, К.Фирма FROM Клиент AS К INNER JOIN (Товар AS Т INNER JOIN Сделка AS С ON Т.КодТовара=С.КодТовара) ON К.КодКлиента=С.КодКлиента;
14 Внешнее соединение (LEFT JOIN / RIGHT JOIN ) Внешнее соединение похоже на внутреннее, но в результирующий набор данных включаются также записи ведущей таблицы соединения, которые объединяются с пустым множеством записей другой таблицы. Какая из таблиц будет ведущей, определяет вид соединения. LEFT - левое внешнее соединение, ведущей является таблица, расположенная слева от вида соединения; RIGHT - правое внешнее соединение, ведущая таблица расположена справа от вида соединения. Пример 21. Вывести информацию о всех товарах. Для проданных товаров будет указана дата сделки и количество. Для непроданных эти поля останутся пустыми. SELECT Товар.*, Сделка.*FROM Товар LEFT JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара;