Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭУМКД_БД_2.doc
Скачиваний:
20
Добавлен:
23.09.2019
Размер:
6.01 Mб
Скачать

1.3.13. Повторяющиеся строки (предикат distinct)

Если в списке возвращаемых столбцов запроса на выборку указать первичный ключ таблицы, то каждая строка результатов запроса будет уникальной (из-за того, что значения первичного ключа во всех строках разные). Если первичный ключ не указан, результаты запроса могут содержать повторяющиеся строки. Предположим, например, что был выполнен следующий запрос: вывести список идентификаторов всех менеджеров офисов.

SELECT MGR FROM OFFICES

MGR

108

106

104

105

108

Таблица результатов запроса содержит пять строк (по одной для каждого офиса), однако две из них совпадают. Почему? Потому что Ларри Фитч (Larry Fitch) является менеджером двух офисов: в Лос-Анджелесе и в Денвере. Поэтому его идентификатор (108) содержится в двух строках таблицы OFFICES. Это не совсем те результаты, которых мы ожидали. Если в фирме работают четыре менеджера, то, вероятнее всего, мы ожидали, что результаты запроса будут содержать четыре строки.

Повторяющиеся строки из таблицы результатов запроса можно удалить, если в инструкции SELECT перед списком возвращаемых столбцов указать предикат DISTINCT. Ниже приведён вариант предыдущего запроса, возвращающий те результаты, которых мы ожидали:

SELECT DISTINCT MGR FROM OFFICES

MGR

106

104

105

108

Этот запрос выполняется следующим образом. Вначале генерируются все строки таблицы результатов (пять строк), а затем удаляются те из них, которые в точности повторяют другие. Предикат DISTINCT можно указывать независимо от содержимого списка возвращаемых столбцов инструкции SELECT. Если предикат DISTINCT не указан, повторяющиеся строки не удаляются. Можно также задать предикат ALL, явно показывая, что повторяющиеся строки следует оставить, однако делать это не обязательно, поскольку предикат ALL используется по умолчанию.

1.3.14. Отбор строк (предложение where)

SQL-запросы, извлекающие из таблицы все строки, полезны при просмотре базы данных и создании отчётов, однако редко применяются для чего-нибудь ещё. Обычно требуется выбрать из таблицы несколько строк и включить в результаты запроса только их. Чтобы указать, какие строки нужно отобрать, следует воспользоваться предложением WHERE. Ниже показано несколько запросов, в которых встречается это предложение.

Перечислить офисы, в которых фактические объёмы продаж превысили плановые.

SELECT CITY, SALES, TARGET FROM OFFICES WHERE SALES > TARGET

Вывести имя, объёмы фактических и плановых продаж служащего с идентификатором 105.

SELECT NAME, SALES, QUOTA FROM SALESREPS WHERE EMPL_NUM = 105

Вывести список всех служащих, менеджером которых является Боб Смит (идентификатор 104).

SELECT NAME, SALES FROM SALESREPS WHERE MANAGER = 104

Предложение WHERE состоит из ключевого слова WHERE, за которым следует условие отбора, определяющее, какие именно строки требуется извлечь. В предыдущем запросе, например, условием отбора являлось выражение MANAGER = 104.

На рисунке изображено, как работает предложение WHERE. Все строки в таблице SALESREPS просматриваются одна за другой, и к каждой из них применяется условие отбора. Если в условии отбора встречается имя столбца (как, например, имя MANAGER в предыдущем примере), то используется значение этого столбца из текущей строки.

Рисунок 1.3.14.1 – Предложение WHERE

Для каждой из строк условие отбора может иметь одно из трёх перечисленных ниже значений.

1) Если условие отбора имеет значение TRUE, строка будет включена в результаты запроса. Например, значение столбца MANAGER в строке для Билла Адамса (Bill Adams) соответствует условию отбора, поэтому строка для него включается в результаты запроса.

2) Если условие отбора имеет значение FALSE, строка исключается из результатов запроса. Например, значение столбца MANAGER в строке для Сью Смит (Sue Smith) не соответствует условию отбора, поэтому строка для неё исключается из результатов запроса.

3) Если условие отбора имеет значение NULL, строка исключается из результатов запроса. Например, значение столбца MANAGER в строке для Сэма Кларка (Sam Clark) имеет значение NULL, поэтому строка для него исключается из результатов запроса.

Можно сказать, что условие отбора служит фильтром для строк таблицы. Строки, удовлетворяющие условию отбора, проходят через фильтр и становятся частью результатов запроса. Строки, не удовлетворяющие условию отбора, отфильтровываются и исключаются из результатов запроса.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]