|
Программирование >> Руководство по sql
Это еще один пример, когда могут возникнуть определенные затруднения. На обычном языке суть запроса формулируется следующим образом: нужно найти все книги с количеством проданных экземпляров до 4095 и все книги с количеством проданных экземпляров больше 12000. Хотя мы говорим и , в запросе нужно использовать оператор OR (или). Если вместо него применить оператор AND, то в результате не будет найдена ни одна книга, так как не может быть продано экземпляров одной книги меньше 4095 и одновременно больше 12000. Списки (IN и NOT IN) Ключевое слово IN позволяет выбрать значения, совпадающие со значениями из заданного списка. Например, без использования IN для получения списка авторов, проживающих в Калифорнии, Индиане и Мериленде, нужно было бы выполнить следующий запрос: SQL: select au lname, state from authors where state = CA or state = IN or state = MD Этот же результат можно получить с использованием ключевого слова IN. Значения, идущие после IN, должны браться в кавычки, разделяться запятыми и заключаться в скобки. SQL: select au lname, state from authors where state in (CA, IN, MD) Оба предыдущих запроса дают одинаковый результат:
Чем больше элементов в списке, тем значительнее становится экономия времени при использовании ключевого слова IN, так как отпадает необходимость во вводе многочисленных операторов сравнения. Возможно, наиболее полно преимущества ключевого слова IN проявляются во вложенных запросах, также называемых подзапросами. Подзапросы подробно обсуждаются в главе 8. Тем не менее, рассмотрев следующий пример, вы поймете, как в подзапросах можно использовать ключевое слово IN. Предположим, нужно найти имена авторов, которые получают меньше 50 процентов от суммарного гонорара за книги, написанные ими в соавторстве. Имена авторов содержатся в таблице authors, информация о распределении гонораров хранится в таблице titleauthors. Ключевое слово IN позволяет как бы объединить обе таблицы (без получения общей таблицы) и извлечь при этом нужную информацию. SQL: select au lname, au fname from authors where au id in (select au id from titleauthors where royaltyshare < .50)
Таким образом, шесть авторов хотя бы за одну книгу получали меньше 50 процентов от общего гонорара. Конструкция NOT IN позволяет найти авторов, не удовлетворяющих условиям, перечисленным в списке. С помощью следующего запроса можно найти всех авторов, которые хотя бы за одну книгу получили больше половины от общего гонорара. SQL: select au lname, au fname from authors where au id not in (select au id from titleauthors where royaltyshare < .50)
Выборка нулевых значений Как вы помните из предыдущих глав, значение NULL используется для представления неизвестной информации. И это не то же самое, что обычный нуль или пустая позиция. Чтобы прояснить эти различия, рассмотрим следующий листинг, в котором представлены названия и расходы по книгам, принадежащим одному издателю. SQL: select title, advance from titles where pub id = 0877 Результат: title advance Silicon Valley Gastronomic Treats 0 Sushi, Anyone? 8000 Fifty Years in Buckingham Palace Kitchens 4000 The Psychology of Computer Cooking NULL The Gourmet Microwave 15000 Onions, Leeks, and Garlic: Cooking Secrets of the Mediterranean 7000 Бросив взгляд на результаты запроса, можно отметить, что расходы (авансовые выплаты) на книгу Silicon Valley Gastronomic Treats составили ровно $0.00, что, вероятно, связано с малоизвестностью автора. Свой гонорар он будет получать по мере продажи экземпляров этой книги. Расходы на другую книгу The Psychology of Computer Cooking выражаются нулевым значением (NULL), возможно, автор и издатель еще не полностью договорились о характере своих отношений либо эти данные просто забыли ввести в базу данных. Со временем это значение будет уточнено и помещено в таблицу. Возможно, оно будет нулем (как в случае с пер-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |