1. Trang chủ
  2. » Công Nghệ Thông Tin

SQL VISUAL QUICKSTART GUIDE- P42 doc

10 171 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 195,11 KB

Nội dung

■ When you run a CREATE VIEW statement in Microsoft Access, the view appears as a query object in the Database window. To run Listing 13.4, change every occurrence of || to + ; see the DBMS Tip in “Concatenating Strings with || ” in Chapter 5. To run Listing 13.5, type: CREATE VIEW au_titles (LastName, Title) AS SELECT an.au_lname, t.title_name FROM au_names an INNER JOIN (titles t INNER JOIN title_authors ta ON t.title_id = ta.title_id) ON an.au_id = ta.au_id WHERE an.au_id IN (‘A02’,’A05’); To run Listings 13.1 through 13.5 in Microsoft SQL Server, remove the ter- minating semicolon from each statement. Additionally, to run Listing 13.4, change every occurrence of || to + and every occurrence of TRIM(x) to LTRIM(RTRIM(x)) ; see the DBMS Tips in “Concatenating Strings with || ” and “Trimming Characters with TRIM() ” in Chapter 5. To run Listings 13.2 and 13.5 in Oracle 8i and earlier, use WHERE syntax instead of JOIN syntax. Type (Listing 13.2): CREATE VIEW cities (au_id, au_city, pub_id, pub_city) AS SELECT a.au_id, a.city, p.pub_id, p.city FROM authors a, publishers p WHERE a.city = p.city; and (Listing 13.5): CREATE VIEW au_titles (LastName, Title) AS SELECT an.au_lname, t.title_name FROM title_authors ta, au_names an, titles t WHERE ta.au_id = an.au_id AND t.title_id = ta.title_id AND an.au_id in (‘A02’,’A05’); To run Listing 13.4 in DB2, change every occurrence of TRIM(x) to LTRIM(RTRIM(x)) ; see the DBMS Tip in “Trimming Characters with TRIM() ” in Chapter 5. To run Listing 13.4 in MySQL, use the function CONCAT() instead of the concatena- tion operator || ; see the DBMS Tips in “Concatenating Strings with || ” in Chapter 5. MySQL 5.0 and later support views. Earlier versions won’t run the listings in this section. (To hide data in earlier versions, use MySQL’s privilege system to restrict column access.) In Microsoft SQL Server, Oracle, DB2, MySQL, and PostgreSQL, you can add the optional clause WITH [CASCADED | LOCAL] CHECK OPTION when you create a view. This clause applies to only updateable views and ensures that only data that can be read by the view can be inserted, updated, or delet- ed; see “Updating Data Through a View” later in this chapter. If a view shows authors from only New York state, for example, it would be impossible to insert, update, or delete non–New York authors through that view. The CASCADED and LOCAL options apply to nested views only. CASCADED performs the check for the current view and all the views it references. LOCAL performs the check for the current view only. 390 Chapter 13 Creating a View with CREATE VIEW Retrieving Data Through a View Creating a view displays nothing. All that CREATE VIEW does is cause the DBMS to save the view as a named SELECT statement. To see data through a view, query the view by using SELECT , just as you would query a table. You can: ◆ Rearrange the order of the displayed columns with the SELECT clause ◆ Use operators and functions to perform calculations ◆ Change column headings with AS ◆ Filter rows with WHERE ◆ Group rows with GROUP BY ◆ Filter grouped rows with HAVING ◆ Join the view to other views, tables, and temporary tables with JOIN ◆ Sort the result with ORDER BY 391 Views Retrieving Data Through a View To retrieve data through a view: ◆ Type: SELECT columns FROM view [JOIN joins] [WHERE search_condition] [GROUP BY group_columns] [HAVING search_condition] [ORDER BY sort_columns]; view is the name of the view to query. The clauses work with views the same way that they work with tables, as described in Chapters 4 through 9. Listings 13.6 through 13.11 and Figures 13.1 through 13.6 show how to retrieve data through the views created by Listings 13.1 through 13.5 in “Creating a View with CREATE VIEW ” earlier in this chapter. ✔ Tip ■ To run Listing 13.9 in Microsoft Access, enclose the view’s column names in double quotes and brackets: SELECT [“address3”] FROM mailing_labels WHERE [“address1”] LIKE ‘%Kell%’; To run Listing 13.9 in Oracle and DB2, enclose the view’s column names in double quotes: SELECT “address3” FROM mailing_labels WHERE “address1” LIKE ‘%Kell%’; MySQL 5.0 and later support views. Earlier versions won’t run the listings in this section. 392 Chapter 13 Retrieving Data Through a View Listing 13.6 List all the rows and columns of the view au_titles . See Figure 13.1 for the result. SELECT * FROM au_titles; Listing LastName Title Kells Ask Your System Administrator Heydemark How About Never? Heydemark I Blame My Mother Heydemark Not Without My Faberge Egg Heydemark Spontaneous, Not Annoying Figure 13.1 Result of Listing 13.6. Listing 13.7 List the distinct cities in the view cities . See Figure 13.2 for the result. SELECT DISTINCT au_city FROM cities; Listing au_city New York San Francisco Figure 13.2 Result of Listing 13.7. 393 Views Retrieving Data Through a View Listing 13.8 List the types of books whose average revenue exceeds $1 million. See Figure 13.3 for the result. SELECT BookType, AVG(Revenue) AS "AVG(Revenue)" FROM revenues GROUP BY BookType HAVING AVG(Revenue) > 1000000; Listing BookType AVG(Revenue) biography 18727318.50 computer 1025396.65 psychology 2320933.76 Figure 13.3 Result of Listing 13.8. Listing 13.9 List the third line of the mailing address of each author whose name contains the string Kell. See Figure 13.4 for the result. SELECT address3 FROM mailing_labels WHERE address1 LIKE '%Kell%'; Listing address3 New York, NY 10014 Palo Alto, CA 94305 Figure 13.4 Result of Listing 13.9. Listing 13.10 List the name of each author who wasn’t the lead author of at least one book. See Figure 13.5 for the result. SELECT DISTINCT an.au_fname, an.au_lname FROM au_names an INNER JOIN title_authors ta ON an.au_id = ta.au_id WHERE ta.au_order > 1; Listing au_fname au_lname Hallie Hull Klee Hull Figure 13.5 Result of Listing 13.10. Listing 13.11 List the names of the authors from California. See Figure 13.6 for the result. SELECT au_fname, au_lname FROM au_names WHERE state = 'CA'; Listing ERROR: Invalid column name 'state'. Figure 13.6 Result of Listing 13.11. The view au_names references authors but hides the column state , so referring to state through the view causes an error. Updating Data Through a View An updateable view is a view to which you can apply INSERT , UPDATE , and DELETE opera- tions to modify data in the underlying table(s). Any changes made in an updateable view always pass through to the base table(s) unambiguously. The syntax for the INSERT , UPDATE , and DELETE statements is the same for views as it is for tables; see Chapter 10. A nonupdateable (or read-only) view is one that doesn’t support INSERT , UPDATE , and DELETE operations because changes would be ambiguous. To change the data that appear in a read-only view, you must change the underlying table(s) directly (or through another, nonambiguous view). Each row in an updateable view is associated with exactly one row in an underlying base table. A view isn’t updateable if its SELECT statement uses GROUP BY , HAVING , DISTINCT , or aggregate functions, for example. SQL-92 said that an updateable view must be defined over only one table, which is stringent but very safe. SQL:1999 relaxed that restriction because many more types of updateable views exist. By the time that standard was released, the DBMS vendors already offered an expanded set of update- able views. Single-table views always are updateable. DBMSs also examine the under- lying tables’ joins and referential-integrity constraints of a multitable view to deter- mine whether the view is updateable. Here are some of the types of queries that can define updateable views: ◆ One-to-one inner joins ◆ One-to-one outer joins ◆ One-to-many inner joins ◆ One-to-many outer joins ◆ Many-to-many joins ◆ UNION and EXCEPT queries The examples in this section use updateable views that reference only one underlying table. See your DBMS documentation to find out which multitable views you can update and how those updates affect each base table. 394 Chapter 13 Updating Data Through a View Inserting a row through a view Consider the view ny_authors , which consists of the IDs, names, and states of only those authors from New York State (Listing 13.12 and Figure 13.7). ny_authors references only the base table authors . Listing 13.13 inserts a new row through a view. The DBMS inserts a new row into the table authors . The row contains A08 in the column au_id , Don in au_fname , Dawson in au_lname , and NY in state . The other columns in the row— phone , address , city , and zip —are set to null (or their default values, if DEFAULT constraints exist). Listing 13.14, like Listing 13.13, inserts a new row through a view. But this time, the new author is from California, not New York, which violates the WHERE condition in the view’s definition. Does the DBMS insert the row or cancel the operation? The answer depends on how the view was created. In this particular example, the insertion is allowed because the CREATE VIEW statement (see Listing 13.12) lacks a WITH CHECK OPTION clause, so the DBMS isn’t forced to maintain consistency with the view’s original definition. For information about WITH CHECK OPTION , see the DBMS Tip in “Creating a View with CREATE VIEW ” earlier in this chapter. The DBMS would have canceled the insertion if ny_authors were defined as: CREATE VIEW ny_authors AS SELECT au_id, au_fname, au_lname, state FROM authors WHERE state = ‘NY’ WITH CHECK OPTION; 395 Views Updating Data Through a View Listing 13.12 Create and display the view ny_authors , which lists the IDs, names, and states of only those authors from New York state. See Figure 13.7 for the result. CREATE VIEW ny_authors AS SELECT au_id, au_fname, au_lname, state FROM authors WHERE state = 'NY'; SELECT * FROM ny_authors; Listing au_id au_fname au_lname state A01 Sarah Buchman NY A05 Christian Kells NY Figure 13.7 Result of Listing 13.12: the view ny_authors . Listing 13.13 Insert a new row through the view ny_authors . INSERT INTO ny_authors VALUES('A08','Don','Dawson','NY'); Listing Listing 13.14 Insert a new row through the view ny_authors . The DBMS would cancel this insertion if WITH CHECK OPTION had been used when ny_authors was created. INSERT INTO ny_authors VALUES('A09','Jill','LeFlore','CA'); Listing Updating a row through a view Listing 13.15 updates an existing row through a view. The DBMS updates the row for author A01 in the table authors by chang- ing the author’s name from Sarah Buchman to Yasmin Howcomely. The values in the other columns in the row— au_id , phone , address , city , state , and zip —don’t change. But suppose that Listing 13.15 looked like this: UPDATE ny_authors SET au_fname = ‘Yasmin’, au_lname = ‘Howcomely’, state = ‘CA’ WHERE au_id = ‘A01’; This statement presents the same problem as Listing 13.14: The desired change would cause Yasmin’s row to no longer meet the conditions for membership in the view. Again, the DBMS will accept or reject the UPDATE depending on whether the WITH CHECK OPTION clause was specified when the view was created. If WITH CHECK OPTION is used, rows can’t be modified in a way that causes them to disappear from the view. 396 Chapter 13 Updating Data Through a View Listing 13.15 Update an existing row through the view ny_authors . UPDATE ny_authors SET au_fname = 'Yasmin', au_lname = 'Howcomely' WHERE au_id = 'A01'; Listing Deleting a row through a view Listing 13.16 deletes a row through a view. The DBMS deletes the row for author A05 in the table authors . (Every column in the row is deleted, not just those in the view.) In turn, the row disappears from the view ny_authors . View updates can have integrity repercussions, of course. The DBMS will disallow a deletion if removing a row violates a referential-integrity constraint; see “Specifying a Foreign Key with FOREIGN KEY ” in Chapter 11. If you delete a row, all the underlying FOREIGN KEY constraints in related tables must still be satisfied for the deletion to succeed. Some updating can be handled by the CASCADE option (if specified) of a FOREIGN KEY constraint, not by the view definition. In Listing 13.16, for example, the DBMS will cancel the DELETE if I don’t first change or delete the foreign-key values in the table title_authors that point to author A05 in authors . ✔ Tips ■ An updateable view must contain a key of the base table to ensure that each view row maps back to only one row in the base table. ■ Any column excluded from an update- able view must be nullable or have a DEFAULT constraint in the base table, so that the DBMS can construct the entire row for insertion. ■ Updated values must adhere to the base table’s column restrictions, such as data type, nullability, and other constraints. 397 Views Updating Data Through a View Listing 13.16 Delete a row through the view ny_authors . DELETE FROM ny_authors WHERE au_id = 'A05'; Listing ■ Some arithmetically derived columns are (theoretically) updateable. In a view with the derived column bonus = 0.1 * salary , for example, you’d expect to be able to update bonus and have SQL apply the inverse function ( bonus/0.1 ) to update salary in the base table. Your expecta- tions would be dashed, however, because SQL won’t back-propagate updates in derived columns. ■ For complex updateable views, one type of operation can involve other types. Aview UPDATE , for example, might involve INSERT ing new base rows. ■ To run Listing 13.12 in Microsoft SQL Server, omit the terminating semicolon from the CREATE VIEW statement and run the two statements separately. MySQL 5.0 and later support views. Earlier versions won’t run the listings in this section. PostgreSQL doesn’t offer updateable views, but you can use its rule system to create the illusion of an updateable view by defining ON INSERT , ON UPDATE , and ON DELETE rules. Search PostgreSQL documen- tation for CREATE RULE or rule system. For all DBMSs, check the documenta- tion to see how your DBMS handles updateable views for columns whose data type generates a unique row identifier automatically; see “Unique Identifiers” in Chapter 3. Dropping a View with DROP VIEW Use the DROP VIEW statement to destroy a view. Because a view is physically independ- ent of its underlying table(s), you can drop the view at any time without affecting the table(s). All SQL programs, applications, and other views that reference the dropped view will break, however. To drop a view: ◆ Type: DROP VIEW view; view is the name of the view to drop (Listing 13.17). ✔ Tips ■ Dropping a table doesn’t drop the views that reference that table, so you must drop the views with DROP VIEW explicitly; see “Dropping a Table with DROP TABLE ” in Chapter 11. ■ MySQL 5.0 and later support views. Earlier versions won’t run the listing in this section. 398 Chapter 13 Dropping a View with DROP VIEW Listing 13.17 Drop the view ny_authors . DROP VIEW ny_authors; Listing A transaction is a sequence of one or more SQL statements executed as a single logical unit of work. The DBMS considers a transaction to be an indivisible, all-or-nothing proposition: It executes all the transaction’s statements as a group, or it executes none of them. Canonical law requires me to illustrate the importance of transactions with a banking example. Suppose that a customer transfers $500 from her savings account to her check- ing account. This operation consists of two separate actions, executed sequentially: 1. Decrement savings balance by $500. 2. Increment checking balance by $500. Figure 14.1 shows the two SQL statements for this transaction. Now imagine that the DBMS fails—power outage, system crash, hardware problem—after it executes the first statement but before the second. The accounts would be out of balance without your knowledge. Accusations of malfeasance and prison time would soon follow. To avoid a police record, use a transaction to guarantee that both SQL statements are per- formed to maintain the accounts in proper balance. When something prevents one of the statements in a transaction from executing, the DBMS undoes (rolls back) the other state- ments of the transaction. If no error occurs, the changes are made permanent (committed). 399 Transactions 14 Transactions UPDATE savings_accounts SET balance = balance - 500.00 WHERE account_number = 1009; UPDATE checking_accounts SET balance = balance + 500.00 WHERE account_number = 6482; Figure 14.1 Two SQL statements are needed when a banking customer transfers money from savings to checking. . section. (To hide data in earlier versions, use MySQL’s privilege system to restrict column access.) In Microsoft SQL Server, Oracle, DB2, MySQL, and PostgreSQL, you can add the optional clause WITH. section. PostgreSQL doesn’t offer updateable views, but you can use its rule system to create the illusion of an updateable view by defining ON INSERT , ON UPDATE , and ON DELETE rules. Search PostgreSQL documen- tation. BY , HAVING , DISTINCT , or aggregate functions, for example. SQL- 92 said that an updateable view must be defined over only one table, which is stringent but very safe. SQL: 1999 relaxed that restriction because

Ngày đăng: 05/07/2014, 05:20

TỪ KHÓA LIÊN QUAN