Сделай Сам Свою Работу на 5

Сравнение с неопределенным значением





<Проверяемое выражение> IS NULL.

Результат операции принимает значение «истина», если в проверяемое выражение содержит неопределенное значение (NULL).

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

В условиях поиска могут быть использованы все рассмотренные
ранее конструкции. Рассмотрение всех возможностей и особенностей применения оператора SELECT проведем на конкретных примерах. Начнем со стандартных операций реляционной алгебры, которые, как уже известно из Занятия №1, являются основными при работе с реляционными базами данных.

Реализация операций реляционной алгебры средствами оператора SELECT

Горизонтальный выбор (фильтрация)

Горизонтальный выбор (или фильтрация) как операция реляционной алгебры представляет собой способ извлечения необходимой информации из таблицы базы данных.



Для выбора кортежей (записей набора данных), отвечающих некоторому условию, необходимо выполнить запрос вида:

SELECT [ALL | DISTINCT ] <список полей> | *)

FROM <список таблиц>

[WHERE <условие выборки или соединения>]

 

Пример 1

Выбрать из таблицы «Закупки» все операции по товару «Товар 1».

 

SELECT *

FROM Закупки

WHERE [Наименование товара] = "Товар 1",

 

где * означает, что необходимо выбрать все поля таблицы; Закупки – имя таблицы, из которой производится выборка; [Наименование товара] – имя поля таблицы «Закупки» (квадратные скобки используются в том случае, если в составе имени поля или таблицы используется символ пробела).

В результате будут выбраны все записи, для которых выполняется условие [Наименование товара] = «Товар 1», свидетельствующее о том, что операция проводится по товару «Товар 1».

 

Пример 2

Выбрать из таблицы «Закупки» все операции за период с 01.01.02
по 31.03.02.



 

SELECT *

FROM Закупки

WHERE [Дата операции] >= #01/01/2002# AND

[Дата операции] <= #31/03/2002#,

 

где # - символ, использующийся для обрамления значений типа дата
в запросах; AND – операция логического «И»

 

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

 

SELECT Закупки.*

FROM Закупки

WHERE Закупки.[Дата операции] >= #01/01/2002# AND

Закупки.[Дата операции] <= #31/03/2002#.

 

Пример 3

Выбрать из таблицы «Закупки» все операции за период с 01.01.02
по 31.03.02 по товарам «Товар 1» и «Товар 2».

 

SELECT *

FROM Закупки

WHERE ([Дата операции] >= #01/01/2002# AND

[Дата операции] <= #31/03/2002#) AND

([Наименование товара] = "Товар 1" OR

[Наименование товара] = "Товар 2"),

 

где Закупки – имя таблицы, из которой производится выборка; [Дата операции], [Наименование товара] – имена полей этой таблицы, на которые накладываются определенные условия; AND – операция логического "И"; OR – операция логического "ИЛИ".

Вертикальный выбор (проекция)

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

Пример 1

Выбрать все операции из таблицы закупки и вывести их определенные атрибуты.

SELECT [Дата операции], [Код товара], [Количество],



[Цена], [Сумма]

FROM Закупки

В результате получим таблицу, содержащую все записи таблицы «Закупки» и перечисленные в списке поля. Сочетание операций горизонтального и вертикального выбора можно проиллюстрировать следующим примером.

 

Пример 2

 

SELECT [Дата операции], [Код товара], [Количество],

[Цена], [Сумма]

FROM Закупки

WHERE Закупки.[Дата операции] >= #01/01/2002# AND

Закупки.[Дата операции] <= #31/3/2002#

Условное соединение

Условное соединение позволяет соединить кортежи наборов данных, для которых выполняется некоторое условие. Соединение может быть внутренним (естественным) и внешним.

Внутреннее соединениереализуется за счет помещения условия соединения в секции WHERE оператора SELECT.

Пример 1.

В рассмотренных выше примерах для таблицы «Закупки» для идентификации товара использовалось поле «Код товара», представляющее собой ссылку на запись таблицы «Товары». Однако реальная таблица с информацией по закупкам товаров, представляемая пользователю, должна содержать не коды товаров, а их наименования. Следовательно, требуется соединить набор данных Закупки с набором данных Товары по условию Закупки.[Код товара] = Товары.[Код товара].

SELECT Закупки.[Дата операции],

Товары.[Наименование товара],

Закупки.[Количество],

Закупки.[Цена],

Закупки.[Сумма]

FROM Закупки, Товары

WHERE Закупки.[Код товара] = Товары.[Код товара]

 

СУБД последовательно формирует строки декартова произведения таблиц, перечисленных во фразе FROM, проверяет, удовлетворяют ли данные сформированной строки условиям фразы WHERE, и если удовлетворяют, то включает в ответ на запрос те ее поля, которые перечислены во фразе SELECT.

В таблице «Закупки» также имеется поле «Код контрагента» (т.е. код поставщика), являющееся ссылкой (внешним ключом) на запись таблицы «Контрагенты». Пользователю после выполнения запроса нужны не коды записей, а наименования контрагентов в строках таблицы. Для этого снова необходимо использовать внутреннее соединение.

На основе ранее составленного запроса составим новый запрос, который, помимо внутреннего соединения таблиц «Закупки» и «Товары», будет также содержать соединение таблицы «Закупки» с таблицей «Контрагенты».

 

SELECT Закупки.[Дата операции],

Контрагенты.[Наименование организации],

Товары.[Наименование товара],

Закупки.[Количество],

Закупки.[Цена],

Закупки.[Сумма]

FROM Закупки, Товары, Контрагенты

WHERE (Закупки.[Код товара] = Товары.[Код товара]) AND

(Контрагенты.[Код контрагента] = Закупки.[Код контрагента])

 

При выполнении этого запроса СУБД сначала составляет строки декартова произведения таблиц «Закупки», «Товары», «Контрагенты»,
пос­­ле чего происходит фильтрация результирующего отношения по условию, указанному во фразе WHERE.

Внутреннее соединение может также создаваться через секцию FROM. Так, аналогичный запрос может выглядеть следующим образом:

 

SELECT Закупки.[Дата операции],

Контрагенты.Наименование,

Товары.[Наименование товара],

Закупки.Количество,

Закупки.Цена,

Закупки.Сумма

FROM(Закупки INNER JOIN Контрагенты
ON Закупки.[Код контрагента] =
Контрагенты.[Код контрагента])
INNER JOIN
Товары ON Закупки.[Код товара] = Товары.[Код товара],

 

где INNER JOIN - операция внутреннего соединения.

 

Внешнее соединениереализуется за счет помещения условия соединения в секции FROM оператора SELECT.

Существует три основных вида внешнего соединения наборов данных: естественное(рассмотрено выше), левоеи правое.

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

 

Пример 2

Предположим, необходимо определить список товаров, по которым закупок не производилось. Для этого общий список товаров (таблицу «Товары») необходимо соединить с таблицей «Закупки» внешним левым соединением.

Исходные данные представлены в виде таблиц «Товары» и «Закупки»:

 

Товары

Код товара Наименование товара Цена
Товар 1 3,00р.
Товар 2 5,00р.
Товар 3 4,50р.
Товар 4 8,00р.
Товар 5 10,00р.

Закупки

Код операции Дата операции Код товара Количество Цена
01.01.2001 15,00р.
05.01.2001 11,00р.
15.01.2001 2,00р.
17.01.2001 5,00р.

 

SELECT Товары.[Наименование товара], Закупки.Количество

FROM Товары LEFT JOIN Закупки

ON Товары.[Код товара] = Закупки.[Код товара]

WHERE Закупки.Количество IS NULL,

где LEFT JOIN– обозначение левого внешнего соединения; IS NULL– проверка поля на неопределенное значение (т.е. на отсутствие значения).

Левое соединение в данном случае означает, что записи таблицы «Товары», соединяются слева с записями таблицы «Закупки» (необходимо образно представить, что таблица «Товары» располагается в левой части, а таблица «Закупки» в правой. При соединении сначала берется запись левой таблицы («Товары») и соединяется поочередно с записями правой таблицы («Закупки») при выполнении условия соединения. Результат представляет собой таблицу, полученную от выполнения данной операции над всеми записями левой таблицы (таблицы «Товары»).

Из результата соединения отбираются записи, отвечающие условию

Закупки.Количество IS NULL.

Т.е. необходимо отобрать только те записи, которые говорят об отсутствии информации (имеют неопределенное значение в поле «Количество»). Следовательно, по данным товарам операций не производилось.

Результат выполнения запроса.

Запрос1

Наименование товара Количество
Товар 3  
Товар 5  

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

Можно сказать, что правое внешнее соединение будет равно левому если поменять порядок следования таблиц в секции FROM, т.е.:

 

…FROMТаблица1 LEFT JOINТаблица2 … = … FROMТаблица2 RIGHT JOINТаблица1 …

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.