Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Использование условий отбора
Для выбора отдельных строк по некоторому критерию используется ключевое слово 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 Условия могут быть сложные, представляющие собой комбинацию нескольких операций сравнения. В них можно использовать логические связки 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'
Для полей строкового типа можно применять сравнение с подстрокой. Получить список сотрудников, фамилия которых начинается на И: SELECT staff_name FROM k_staff WHERE staff_name LIKE 'И%'
Использование агрегирующих функций
Для подсчета итоговых значений служат функции SUM, COUNT, MAX, MIN, AVG. Если не используется группировка строк, запрос с применением итоговой функции вернет ровно одну строку. Подсчитать, на какую сумму выставлены счета в декабре 2011 года. 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 ). Предполагается, что даты все разные (точнее говоря, здесь подсчитывается количество различных не- null значений). SELECT COUNT(staff_termdate) FROM k_staff
Сортировка
Для сортировки используется ключевое слово ORDER BY и имя поля или его номер в списке полей выборки. Напечатать список сотрудников, отсортированный по алфавиту: SELECT staff_name FROM k_staff ORDER BY 1
Можно сортировать строки даже по такому полю, которое не входит в список полей выборки. Напечатать список сотрудников, отсортированный по дате поступления на работу: SELECT staff_name FROM k_staff ORDER BY staff_hiredate
Сортировать данные можно и по убыванию. Кроме того, можно ограничить количество строк в результате. Напечатать информацию о 5 последних выписанных счетах в порядке убывания даты счета: SELECT bill_num, bill_date FROM k_bill ORDER BY bill_date DESC LIMIT 5
Подзапросы
Для более сложных формулировок иногда удобно использовать подзапросы. Подзапрос всегда указывается в скобках. Подзапрос может быть несвязанным , т.е. в формулировке подзапроса нет ссылки на главный запрос. В этом случае подзапрос выполняется один раз при выполнении главного запроса. В данном примере используется ключевое слово IN, так как подзапрос может возвращать несколько значений. Получить список договоров, по которым в декабре 2011 года выписаны счета: SELECT contract_num, contract_date FROM k_contract WHERE contract_num IN (SELECT k_contract_contract_num FROM k_bill WHERE bill_date BETWEEN '2011-12-01' AND '2011-12-31')
Тот же самый запрос с использованием ключевого слова ANY: SELECT contract_num, contract_date FROM k_contract WHERE contract_num =ANY (SELECT k_contract_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.k_contract_contract_num)
Пример использования ключевого слова ALL. Напечатать информацию о товаре (товарах) с наименьшей ценой. SELECT price_name, price_sum FROM k_price WHERE price_sum < = ALL (SELECT price_sum FROM k_price) Этот запрос можно сформулировать и по-другому. В этом примере мы можем использовать операцию сравнения =, т.к. подзапрос возвращает ровно одну строку и один столбец. 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
Как видите, значение столбца price_name просто было взято из первой строки таблицы.
Группировка
Для подведения итога по группе данных используется комбинация ключевого слова GROUP BY и агрегирующих функций. Причем в списке полей для выборки обычно присутствуют только поля группировки и агрегирующие функции. При необходимости можно добавить дополнительные поля, которые функционально зависят от «ключа группировки». Получить список договоров и общую сумму счетов по каждому договору: SELECT contract_num, SUM(bill_sum) AS contract_sum FROM k_bill GROUP BY contract_num
В том случае, когда нужно выбрать не все группы, а только некоторые из них, используется ключевое слово HAVING: Получить список договоров, имеющих 2 или более счетов, и общую сумму счетов по каждому договору: SELECT k_contract_contract_num, SUM(bill_sum) AS contract_sum FROM k_bill GROUP BY k_contract_contract_num HAVING COUNT(bill_num)> =2;
|
Последнее изменение этой страницы: 2019-06-19; Просмотров: 306; Нарушение авторского права страницы