Использование условий отбора
Для выбора отдельных строк по некоторому критерию используется ключевое слово WHERE Получить список предприятий, расположенных в Москве: SELECT firm_name as "Название предприятия" FROM k_firm WHERE firm_addr='Москва' Результат: Название предприятия -------------------- Альфа Для сравнения поля со значением NULL нельзя использовать операции = и!=, вместо них нужно использовать выражения IS NULL и IS NOT NULL. Получить список постоянно работающих сотрудников, т.е., таких, у которых staff_termdate равно NULL: SELECT staff_name FROM k_staff WHERE staff_termdate IS NULL Результат: staff_name ----------- Иванов Петров Сидоров Условия могут быть сложные, представляющие собой комбинацию нескольких операций сравнения. В них можно использовать логические связки AND и OR, а также отрицание NOT. Получить список предприятий, расположенных в Москве или Казани: SELECT firm_name as "Название предприятия" FROM k_firm WHERE firm_addr='Москва' OR firm_addr='Казань' Результат: Название предприятия --------------------- Альфа Бета Если условие заключается в сравнении поля со списком значений, удобно использовать ключевое слово IN. Получить список предприятий, расположенных в Москве или Казани: SELECT firm_name as "Название предприятия" FROM k_firm WHERE firm_addr IN ('Москва','Казань') Результат: Название предприятия --------------------- Альфа Бета Если условие заключается в сравнении поля с диапазоном значений, удобно использовать ключевое слово BETWEEN. Получить список договоров, заключенных в ноябре 2011 г.: SELECT * FROM k_contract WHERE contract_date BETWEEN '2011-11-01' AND '2011-11-30' Заметим, что полезно предварительно задать желаемый формат даты год-месяц-день: SET DATEFORMAT YMD Результат: contract_num contract_date contract_type firm_num staff_num ---------------------------------------------------------- 1 2011-11-01 00:00:00.000 A 1 1
4 2011-11-15 00:00:00.000 A 2 2 7 2011-11-12 00:00:00.000 A 4 1 Для полей строкового типа можно применять сравнение с подстрокой. Получить список сотрудников, фамилия которых начинается на И: SELECT staff_name FROM k_staff WHERE staff_name LIKE 'И%' (рассмотрите более подробно использование LIKE в MSDN ) Результат: staff_name ---------- Иванов Использование агрегирующих функций
Для подсчета итоговых значений используются функции SUM, COUNT, MAX, MIN, AVG. Если не используется группировка строк, запрос с использованием итоговой функции вернет ровно одну строку. Подсчитать, на какую сумму выставлены счета в декабре. SELECT SUM(bill_sum) FROM k_bill WHERE bill_date BETWEEN '2011-12-01' AND '2011-12-31' Результат: ---------------------------------------- Функция COUNT позволяет подсчитать, сколько строк в таблице имеется вообще. Подсчитать количество сотрудников. SELECT COUNT(*) FROM k_staff Результат: ----------- А также эта функция позволяет подсчитать, сколько строк с не-NULL-значениями в определенном поле. Подсчитать количество временно работающих сотрудников (у них заполнен срок окончания трудового довора – поле staff_termdate). SELECT COUNT(staff_termdate) FROM k_staff Результат: ----------- Сортировка
Для сортировки используется ключевое слово ORDER BY и имя поля или его номер в списке полей выборки. Напечатать список сотрудников, отсортированный по алфавиту: SELECT staff_name FROM k_staff ORDER BY 1 Результат: staff_name ------------- Григорьев Иванов Петров Семенов Сидоров Можно сортировать строки даже по такому полю, которое не входит в список полей выборки. Напечатать список сотрудников, отсортированный по дате поступления на работу: SELECT staff_name FROM k_staff ORDER BY staff_hiredate Сортировать данные можно и по убыванию. Кроме того, можно ограничить количество строк в результате. Напечатать информацию о 5 последних выписанных счетах в порядке убывания даты счета: SELECT TOP 5 bill_num, bill_date FROM k_bill ORDER BY bill_date DESC Результат: bill_num bill_date -------- ----------------------- 3 2012-01-12 00:00:00.000 6 2012-01-12 00:00:00.000
5 2012-01-12 00:00:00.000 9 2012-01-12 00:00:00.000 4 2011-12-12 00:00:00.000 Подзапросы
Для более сложных формулировок иногда удобно использовать подзапросы. Подзапрос всегда указывается в скобках. Подзапрос может быть несвязанным, т.е. в формулировке подзапроса нет ссылки на главный запрос. В этом случае подзапрос выполняется один раз при выполнении главного запроса. В данном примере используется ключевое слово IN, так как подзапрос может возвращать несколько значений. Получить список договоров, по которым в декабре выписаны счета: SELECT contract_num, contract_date FROM k_contract WHERE contract_num IN (SELECT contract_num FROM k_bill WHERE bill_date BETWEEN '2011-12-01' AND '2011-12-31') Результат: contract_num contract_date ----------------------------------- 1 2011-11-01 00:00:00.000 2 2011-10-01 00:00:00.000 4 2011-11-15 00:00:00.000 5 2011-08-01 00:00:00.000 Тот же самый запрос с использованием ключевого слова ANY: SELECT contract_num, contract_date FROM k_contract c WHERE contract_num = ANY (SELECT contract_num FROM k_bill WHERE bill_date BETWEEN '2011-12-01' AND '2011-12-31') Тот же самый запрос можно выполнить и с помощью связанного подзапроса, т.е., подзапроса, в котором есть ссылка на главный запрос. Для ссылки на таблицу главного запроса нужно указать псевдоним. Такой подзапрос будет выполняться заново для каждой строки главного запроса. Кроме того, в данном примере иллюстрируется использование ключевого слова EXISTS: SELECT contract_num, contract_date FROM k_contract c WHERE EXISTS (SELECT * FROM k_bill b WHERE bill_date BETWEEN '2011-12-01' AND '2011-12-31' AND c.contract_num=b.contract_num) Пример использования ключевого слова ALL. Напечатать информацию о товаре (товарах) с наименьшей ценой. SELECT price_name, price_sum FROM k_price WHERE price_sum <= ALL (SELECT price_sum FROM k_price) Результат: price_name price_sum -------------------------- Раздача слонов 100.00 Этот запрос можно сформулировать и по-другому. В этом примере мы можем использовать операцию сравнения =, т.к. подзапрос возвращает ровно одну строку и один столбец. SELECT price_name, price_sum FROM k_price WHERE price_sum = (SELECT MIN(price_sum) FROM k_price) А так, как в следующем примере, запрос формулировать нельзя, поскольку при запуске будет выдана ошибка. Если используются агрегирующие функции без группировки, в списке полей могут присутствовать только агрегирующие функции. SELECT price_name, MIN(price_sum) FROM k_price Результат – сообщение об ошибке: Msg 8120, Level 16, State 1, Line 1 Столбец "k_price.price_name" недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.
(Подробнее по поводу ошибок – см. Приложение 1.)
Группировка
Для подведения итога по группе данных используется комбинация ключевого слова GROUP BY и агрегирующих функций. Причем в списке полей для выборки могут присутствовать только поля группировки и агрегирующие функции (при необходимости можно просто расширить список полей группировки). Получить список договоров и общую сумму счетов по каждому договору: SELECT contract_num, SUM(bill_sum) AS contract_sum FROM k_bill GROUP BY contract_num Результат: contract_num contract_sum -------------------------- 1 5000 2 8000 3 2500 4 1500 5 11200 В том случае, когда нужно выбрать не все группы, а только некоторые из них, используется ключевое слово HAVING: Получить список договоров, имеющих 2 или более счетов, и общую сумму счетов по каждому договору: SELECT contract_num, SUM(bill_sum) AS contract_sum FROM k_bill GROUP BY contract_num HAVING COUNT(bill_num)>=2 Результат: contract_num contract_sum ------------ ---------------------------------------- 1 5000 2 8000 5 11200
Читайте также: A) за создание условий неэффективного использования ресурсов Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|