Чтение онлайн

на главную - закладки

Жанры

Обработка баз данных на Visual Basic®.NET

Прайс Кевин Т.

Шрифт:

Использование конструктора представлений для создания объединений

Поскольку создание объединений может составлять самую сложную часть запросов, особенно когда задействовано более двух таблиц, неплохо было бы при создании таких запросов иметь некоторое подспорье. К счастью, в Visual Basic предусмотрен конструктор представлений (View Designer), благодаря которому создание запроса с объединением нескольких таблиц значительно упрощается. При использовании конструктора представлений нет необходимости запоминать сложный синтаксис объединения в SQL. Вместо этого можно создать объединение графическим путем, выполнив приведенные ниже действия.

1. В окне Server Explorer создайте новое представление для базы данных Novelty.

2. После этого появится диалоговое окно Add Table (Создать таблицу), в котором следует указать таблицы tblCustomer и tblOrder, а затем щелкнуть на кнопке Close. Схема представления в окне конструктора представлений показана на рис. 2.5.

РИС. 2.5. Создание объединения двух таблиц в окне конструктора представлений

Обратите внимание на то, что конструктор представлений автоматически создает объединение между двумя таблицами на основе известного ключевого поля ID в таблице tblCustomer и явно заданного ранее отношения с полем CustomerID в таблице tblOrder.

После выполнения запроса на основе объединения двух таблиц в окне конструктора представлений будут отображены извлеченные данные, как показано на рис. 2.6.

Использование внешних объединений

Обычное (внутреннее) объединение (inner join) возвращает записи из двух таблиц, если значение первичного ключа первой таблицы соответствует значению внешнего ключа второй таблицы, связанной с первой. Предположим, необходимо получить все записи из одной таблицы, участвующей в объединении, вне зависимости от того, существуют ли связанные записи в другой таблице. В этом случае необходимо использовать внешнее объединение (outer join).

Например, для извлечения списка клиентов и заказов, в который включены также клиенты, не имеющие неоплаченных заказов, можно использовать приведенный ниже запрос.

SELECT FirstName, LastName, OrderDate

FROM tblCustomer LEFT OUTER JOIN

tblOrder ON tblCustomer.ID = tblOrder.CustomerID

Обратите внимание, что в предложении LEFT JOIN используется синтаксис имя_таблицы.имя_поля. Более длинное имя позволяет избежать неоднозначности при использовании полей с одинаковыми именами, поскольку поле ID существует как в так и в tblOrder. Фактически предложение LEFT OUTER JOIN означает, что будут отображены все данные таблицы tblCustomer, которая находится в левой стороне выражения tblCustomer.ID = tblOrder.CustomerID.

РИС. 2.6. Выполнение запроса на основе объединения двух таблиц в окне конструктора представлений

Этот запрос возвращает приведенный ниже набор записей.

FirstName LastName OrderDate
John Smith 1/4/2001
John Smith 1/9/2001
Jill Azalia 1/14/2001
Brad Jones <NULL>
Daisy Klein 2/18/2001
Daisy Klein 3/21/2001
Daisy Klein 4/4/2001
Dave Martin 6/5/2001
Betty Klein <NULL>
Thurston Ryan 7/2/2001
Jane Winters 8/16/2001
Jane Winters 9/10/2001

В этот результирующий набор включены все клиенты базы данных, независимо от того, имеют ли они заказы или нет. Для клиентов, не имеющих заказов, в поле OrderDate появится <NULL>, что означает отсутствие данных.

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

Выполнение вычислений в запросах

В строках запроса допускается выполнение вычислений. Для этого нужно просто заменить имя поля в предложении SELECT именем арифметического выражения. Допустим, вам нужно создать запрос для вычисления налога с продаж для складских запасов (сведения о которых хранятся в таблице tblItem). В приведенном ниже запросе SQL вычисляется налог с продаж с учетной ставкой 7,5% для каждого товара.

SELECT ID, Item, Price, Price * 0.075 AS SalesTax

FROM tblItem

После выполнения этого запроса будут получен показанный ниже результат. 

ID Name Price SalesTax
1 Rubber Chicken 5.99 0.44925
2 Hand Buzzer 1.39 0.10425
3 Stink Bomb 1.29 0.09675
4 Disappearing Penny Magic Trick 3.99 0.29925
5 Invisible Ink 2.29 0.17175
6 Loaded Dice 3.49 0.26175
7 Whoopee Cushion 5.99 0.44925 

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

SELECT Name, Retail Price, ROUND (Retail Price + Retail Price * 0.075, 2)

AS PriceWithTax

FROM tblInventory

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

Name Retail Price PriceWithTax
Rubber Chicken 5.99 6.44
Hand Buzzer 1.39 1.49
Stink Bomb 1.29 1.39
Disappearing Penny Magic Trick 3.99 4.29
Invisible Ink 2.29 2.46
Loaded Dice 3.49 3.75
Whoopee Cushion 5.99 6.44 
Поделиться:
Популярные книги

Бояръ-Аниме. Газлайтер. Том 33

Володин Григорий Григорьевич
33. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
6.25
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 33

Собрание сочинений. Том третий

Гашек Ярослав
3. Ярослав Гашек. Собрание сочинений в 6-ти томах
Юмор:
юмористическая проза
5.00
рейтинг книги
Собрание сочинений. Том третий

Наследие Маозари

Панежин Евгений
1. Наследие Маозари
Фантастика:
рпг
попаданцы
аниме
5.80
рейтинг книги
Наследие Маозари

Изгой Проклятого Клана

Пламенев Владимир
1. Изгой
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Изгой Проклятого Клана

Стая

Сергеева Оксана Николаевна
1. Стая
Любовные романы:
современные любовные романы
остросюжетные любовные романы
9.37
рейтинг книги
Стая

Изгнанник Ардена

Анри Софи
Фантастика:
фэнтези
готический роман
историческое фэнтези
5.00
рейтинг книги
Изгнанник Ардена

Газлайтер. Том 27

Володин Григорий Григорьевич
27. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.25
рейтинг книги
Газлайтер. Том 27

Лекарь Империи 5

Карелин Сергей Витальевич
5. Лекарь Империи
Фантастика:
городское фэнтези
аниме
героическая фантастика
попаданцы
5.00
рейтинг книги
Лекарь Империи 5

Чужое лицо

Тополь Эдуард Владимирович
Детективы:
политические детективы
8.81
рейтинг книги
Чужое лицо

Виконт. Книга 1. Второе рождение

Юллем Евгений
1. Псевдоним `Испанец`
Фантастика:
фэнтези
боевая фантастика
попаданцы
6.43
рейтинг книги
Виконт. Книга 1. Второе рождение

Бояръ-Аниме. Газлайтер. Том 35

Володин Григорий Григорьевич
35. История Телепата
Фантастика:
аниме
боевая фантастика
фэнтези
6.25
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 35

Камень. Книга пятая

Минин Станислав
5. Камень
Фантастика:
боевая фантастика
6.43
рейтинг книги
Камень. Книга пятая

Гроза богов

Мазуров Дмитрий
10. Громовая поступь
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Гроза богов

Робин Гуд

Дюма-отец Александр
Приключения:
исторические приключения
8.06
рейтинг книги
Робин Гуд