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

906 Chapter 20 DATABASES: ARCHITECTURE AND BASIC CONCEPTS

Listing 20.1: A SQL UPDATE Statement

UPDATE dbo.Customers

SET CustomerID = @CustomerID, CompanyName = @CompanyName, ContactName = @ContactName, ContactTitle = @ContactTitle, Address = @Address, City = @City, Region = @Region,

PostalCode = @PostalCode, Country = @Country, Phone = @Phone, Fax = @Fax WHERE (CustomerID = @Original_CustomerID) AND

(Address = @Original_Address OR @Original_Address1 IS NULL AND Address IS NULL) AND

(City = @Original_City OR @Original_City1 IS NULL AND City IS NULL) AND (CompanyName = @Original_CompanyName) AND

(ContactName = @Original_ContactName OR @Original_ContactName1 IS NULL AND ContactName IS NULL) AND

(ContactTitle = @Original_ContactTitle OR @Original_ContactTitle1 IS NULL AND ContactTitle IS NULL) AND

(Country = @Original_Country OR @Original_Country1 IS NULL AND Country IS NULL) AND

(Fax = @Original_Fax OR @Original_Fax1 IS NULL AND Fax IS NULL) AND

(Phone = @Original_Phone OR @Original_Phone1 IS NULL AND Phone IS NULL) AND (PostalCode = @Original_PostalCode OR @Original_PostalCode1 IS NULL

AND PostalCode IS NULL) AND

(Region = @Original_Region OR @Original_Region1 IS NULL AND Region IS NULL)

The variables with the original values are set when the row is read from the table. Then you can edit the row’s fields through the appropriate interface. This may take a few seconds, or minutes (or an hour, if you decide to take a lunch break before updating the table). There’s always a chance that another user might edit the same row before you commit your changes to the database. If a single field’s value is different from the value we read, it means that the row has been modified since we read it and the UPDATE operation will fail.

In a banking application, a customer’s balance might be $2,000. When a check is cashed, we must subtract the amount of the check from the current balance. But if another teller has already subtracted an amount from the same account, there may not be enough funds to cover both checks. You will learn more about updating tables with SQL statements (as well as stored procedures) in the following chapter.

I should bring to your attention that some of the complexity of the statements is due to the fact that Null values can’t be compared. If two values are Null, they’re not equal. The very essence of the Null value is to indicate that a field doesn’t have a value, and therefore can’t be compared. To find out whether two fields are both Null, you must use an expression like the following:

@value1 IS NULL AND field1 IS NULL

The Query Builder

The Query Builder is a visual tool for building SQL statements. It’s a highly useful tool that generates SQL statements for you—you just specify the data you want to retrieve with point-and-click

Copyright ©2002 SYBEX, Inc., Alameda, CA

www.sybex.com

THE QUERY BUILDER 907

operations, instead of typing complicated expressions. A basic understanding of SQL is obviously required, and this is why I’ve described the basic keywords of SQL in the last section, but it is possible to build SQL queries with the Query Builder without knowing anything about SQL. I would suggest you use this tool to quickly build SQL statements, but don’t expect that it will do your work for you. It’s a great tool for beginners, but you can’t get far by ignoring SQL. The Query Builder is also a great tool for learning SQL, as you specify the query with point-and-click operations but the Query Builder builds the appropriate SQL statements. You can also edit the SQL statement manually and execute it.

There are many ways to start the Query Builder. In the following chapter, you’ll see how the Query Builder is activated every time you need to specify a query. You can open the Views items in the Server Explorer, right-click the name of a view, and select Design View from the context menu. Views are based on SQL statements, and you will see the Query Builder with the statement that implements the view you selected.

You can also create new queries by creating a new view. A view is the result of a query: it’s a virtual table that consists of columns from one or more tables selected with a SQL SELECT statement. The Query Builder’s window is shown in Figure 20.15.

Figure 20.15

Using the Query Builder to build a SQL statement with point-and-click operations

The query shown in Figure 20.15 retrieved the names of all the products in the Product table, along with the name of the category they belong to (the category name is stored in the Categories table). To create a new query with the Query Builder, open the Northwind database’s section in the Server Explorer, right-click the Views item, and select New View. You will see the window of Figure 20.15, but it will be empty.

The Query Builder Interface

The Query Builder contains four panes: Diagram, Grid, SQL, and Results.

Copyright ©2002 SYBEX, Inc., Alameda, CA

www.sybex.com

908 Chapter 20 DATABASES: ARCHITECTURE AND BASIC CONCEPTS

Diagram Pane

This is where you select the tables you want to use in your queries—the tables in which the required data reside. To select a table, right-click anywhere on the Diagram pane and you will see the Add Table dialog box. Select as many tables as you need and then close the Add Table dialog box.

The selected tables will appear on the Diagram pane as small boxes, along with their fields, as shown in Figure 20.15. The tables involved in the query are related to one another (although this is not a requirement, it’s rather unlikely that you’ll retrieve data from unrelated tables). The relations are indicated as lines between the tables. These lines connect the primary and foreign keys of the relation. The line between the Products and Categories tables in Figure 20.15 indicates that the two tables are related through the CategoryID field. The CategoryID field in the Categories table is the primary key, and the same field in the Products table is the foreign key. The symbol of a key at one end of the line shows the primary key of the relationship, and the other end of the arrow is either a key (indicating a one-to-one relationship) or the infinity symbol (indicating a one-to-many relationship).

The little shape in the middle of the line indicates the type of join that must performed on the two tables, and it can take several shapes. To change the type of the relation, you can right-click the shape and select one of the options in the context menu. The diamond-shaped icon indicates an inner join, which requires that only rows with matching primary and foreign keys will be retrieved. By default, the Query Builder treats all joins as inner joins, but you can change the type of the join; you’ll see how this is done in the section “Specifying Left, Right, and Inner Joins,” later in this chapter.

The first step in building a query is the selection of the fields that will be included in the result. Select the fields you want to include in your query by checking the box in front of their names, in the corresponding tables. As you select and deselect fields, their names appear in the Grid pane.

Notice that all fields are prefixed by the name of the table they came from, so that there will be no ambiguities.

Right-click the Diagram pane and select Add Table. In the dialog box that pops up, select the Products and Categories tables, click Add, then click Close to close the dialog box.

Grid Pane

The Grid pane contains the selected fields. Some fields may not be part of the output—you may use them only for selection purposes—but their names will appear on this pane. To exclude them from the output, clear the box in the Output column.

The Alias column contains a name for the field. By default, the column’s name is the alias. This is the heading of each column in the output, and you can change the default name to any string that suits you.

SQL Pane

As you build the statement with point-and-click operations, the Query Builder generates the SQL statement that must be executed against the database to retrieve the specified data. The statement that retrieves product names along with their categories is shown next:

SELECT

dbo.Products.ProductName, dbo.Categories.CategoryName

FROM

dbo.Categories INNER JOIN dbo.Products

 

ON dbo.Categories.CategoryID = dbo.Products.CategoryID

Copyright ©2002 SYBEX, Inc., Alameda, CA

www.sybex.com

THE QUERY BUILDER 909

If you paste this statement in the SQL pane and then execute it, you’ll see a list of product names along with their categories. To execute the query, right-click somewhere on the Query Builder window and select Run Query. The Query Builder will first fill out the remaining panes (if you’ve chosen to enter the SQL statement), and then it will execute the query. It will display the tables involved in the query on the Tables pane, it will insert the appropriate rows in the Grid pane, and then it will execute the query and display the results on the Results pane.

Results Pane

To execute a query, right-click somewhere on the SQL pane and select Run from the context menu. The Query Builder will execute the statement it generated and will display the results in the Results pane at the bottom of the window. The heading of each column is the column’s name, unless you’ve specified an alias for the column.

In the following section, we’re going to build a few fairly complicated queries with the visual tools of Query Builder, and in the process I will discuss additional features of the Query Builder.

SQL at Work: Calculating Sums

In this section we’ll build a query that retrieves all the products, along with the quantities sold. The names of the products will come from the Products table, while the quantities must be retrieved from the Order Details table. Because the same product appears in multiple rows of the tables (each product appears in multiple invoices with different quantities), we must sum the quantities of all rows that refer to the same product.

Create a new view in the Server Explorer to start the Query Builder, right-click the upper pane, and select Add Table. On the Add Table dialog box, select the tables Products and Order Details, then close the dialog box. The two tables will appear on the Diagram pane with a line connecting them. This is their relation.

Now check the fields you want to include in the query: Select the field ProductName in the Products table and the field Quantity in the Order Details table. Expand the options in the Sort Type box in the ProductName row and select Ascending. The Query Builder will generate the following SQL statement:

SELECT

dbo.Products.ProductName, dbo.[Order Details].Quantity

FROM

dbo.Products INNER JOIN dbo.[Order Details]

 

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

ORDER BY dbo.Products.ProductName

Execute this statement, and the first few lines in the Results pane will be

Alice Mutton 30

Alice Mutton 15

Alice Mutton 15

Alice Mutton 40

The Query Builder knows how the two tables are related and retrieved the matching rows from the two tables. It has also inserted a line that links the two tables in the Tables pane. This line indicates the relationship between the two tables. However, it didn’t sum the quantities for each product.

Copyright ©2002 SYBEX, Inc., Alameda, CA

www.sybex.com