Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
(ebook) Visual Studio .NET Mastering Visual Basic.pdf
Скачиваний:
120
Добавлен:
17.08.2013
Размер:
15.38 Mб
Скачать

914 Chapter 20 DATABASES: ARCHITECTURE AND BASIC CONCEPTS

The wizard will replace the field names with fully qualified names:

(dbo.[Order Details].Quantity * dbo.Products.UnitPrice) * (1 - dbo.[Order Details].Discount)

This expression calculates the subtotal for each line in the Order Details table. We multiply the price with the quantity, taking into consideration the discount. Shortly, we’re going to sum the subtotals for each product.

Because this is a calculated column, its Alias becomes Expr1. Change this value to Revenue. In the Group By column, select Sum. Make sure the Output column is checked and then run the query. Same results as before, only this time with an extra column, which is the revenue generated by the corresponding product:

Alice Mutton

978

37

38142

Aniseed Syrup

328

12

3280

Boston Crab Meat

1103

41

20295.2

The SQL statement generated by the SQL Builder is:

SELECT

dbo.Products.ProductName,

 

SUM(dbo.[Order Details].Quantity) AS [Total Items],

 

COUNT(DISTINCT dbo.Orders.OrderID) AS [Times Ordered],

 

SUM(dbo.[Order Details].Quantity * dbo.Products.UnitPrice) AS Revenue

FROM

dbo.Products

 

 

 

INNER JOIN dbo.[Order Details] ON

 

dbo.Products.ProductID = dbo.[Order Details].ProductID

 

INNER JOIN dbo.Orders ON

 

dbo.[Order Details].OrderID = dbo.Orders.OrderID

WHERE

(dbo.Orders.OrderDate > @FromDate) AND

 

(dbo.Orders.OrderDate < @ToDate)

GROUP BY dbo.Products.ProductName

ORDER BY dbo.Products.ProductName

This is a fairly complicated statement, and we won’t get into any more complicated statements in this book. As you can see, you can create quite elaborate SQL statements to retrieve information from the database with point-and-click operations. But even if you don’t want to enter your own SQL statements, some understanding of this language is required. All the keywords have been explained previously, and you can test your knowledge of SQL by examining the code generated by the Query Builder.

Specifying Left, Right, and Inner Joins

This time we’ll build another query to demonstrate the differences between the various types of joins and, most importantly, the types of (subtle) errors introduced by the wrong type of join. We’ll build a query that retrieves all the titles from the Pubs database, along with their authors.

Open the Query Builder window, or remove all the tables from the Diagram pane if it’s already open. This time, select the Pubs database and drop the following tables on the Diagram pane: Titles,

Copyright ©2002 SYBEX, Inc., Alameda, CA

www.sybex.com

THE QUERY BUILDER 915

TitleAuthor, and Authors. Then check the fields title, au_lname, and au_fname to include in your query. Set the Title Sort Order to 1 and run the query. The first few lines in the Results pane will be:

But Is It User Friendly?

Carson

Cheryl

Computer Phobic AND Non-Phobic Individuals: Behavior Variations

MacFeather

Stearns

Computer Phobic AND Non-Phobic Individuals: Behavior Variations

Karsen

Livia

Cooking with Computers: Surreptitious Balance Sheets

O’Leary

Michael

Cooking with Computers: Surreptitious Balance Sheets

MacFeather

Stearns

If a book has multiple authors, the book’s title will appear in the results as many times as there are authors. This is how SQL works, and you can’t change this behavior. Be aware that many queries will return rows with identical information (the same title with each of its authors), and you must provide the code to display all the authors along with the corresponding title, rather than repeating the same title over and over. Later in the book, you’ll learn how to bring in selected titles and the authors that are related to the selected titles (not all authors). For now, let’s focus on SQL statements.

Let’s start by formatting the output a little. First, change the au_lname column to au_lname + ‘, ‘ + au_fname. This will concatenate first and last names to form the author’s name. This is a calculated column, and its Alias will be set to Expr1; change it to Author. Then run the query.

The Query Builder has generated the following SQL statement:

SELECT dbo.titles.title,

dbo.authors.au_lname + ‘, ‘ + dbo.authors.au_fname AS Author FROM dbo.authors

INNER JOIN dbo.titleauthor ON dbo.authors.au_id = dbo.titleauthor.au_id

INNER JOIN dbo.titles ON dbo.titleauthor.title_id = dbo.titles.title_id

ORDER BY dbo.titles.title

If you execute the query now, the following lines will appear at the top of the Results pane:

But Is It User Friendly?

Carson, Cheryl

Computer Phobic AND Non-Phobic Individuals: Behavior Variations

MacFeather, Stearns

Computer Phobic AND Non-Phobic Individuals: Behavior Variations

Karsen, Livia

Cooking with Computers: Surreptitious Balance Sheets

O’Leary, Michael

Cooking with Computers: Surreptitious Balance Sheets

MacFeather, Stearns

This is an inner join, which returned 25 rows. They are all the books with one or more authors. To include the books without an author, we must create a right join (the table to the right being the Titles table). The right join will include all the titles whether they have an author or not.

Copyright ©2002 SYBEX, Inc., Alameda, CA

www.sybex.com

916 Chapter 20 DATABASES: ARCHITECTURE AND BASIC CONCEPTS

Right-click the line that relates the table Titles to the table TitleAuthor, and from the menu choose Select All Rows From Titles. This action changes the inner join between the tables to a right join. Run the new query and it will generate 26 rows in the Results pane. The last title has no author, and the corresponding line is:

The Psychology of Computer Cooking

<NULL>

The SQL statement generated by the Query Builder is:

SELECT dbo.titles.title,

dbo.authors.au_lname + ‘, ‘ + dbo.authors.au_fname AS Author FROM dbo.titleauthor

INNER JOIN dbo.authors ON dbo.titleauthor.au_id = dbo.authors.au_id

RIGHT OUTER JOIN dbo.titles ON dbo.titleauthor.title_id = dbo.titles.title_id

ORDER BY dbo.titles.title

To do the opposite, select all authors whether they appear in a title or not, reset the relation between Titles and TitleAuthor (clear the check mark in front of Select All Rows From Title), and check the item Select All Rows From Authors. If you run the query, you’ll see that the following line is included in the Results pane:

<NULL>

Stringer, Dirk

The last type of join will return all titles and all authors. Right-click the line that connects the Titles and TitleAuthor tables and check both options, as shown in Figure 20.18.

Figure 20.18

A query that retrieves all the titles and all the authors

Copyright ©2002 SYBEX, Inc., Alameda, CA

www.sybex.com