1
.NET Web Forms
Database Queries© 2002 by Jerry Post
2
Why do we Need Queries
Natural languages (English) are too vague With complex questions, it can be hard to verify that the
question was interpreted correctly, and that the answer we received is truly correct.
Consider the question: Who are our best customers?
We need a query system with more structure We need a standardized system so users and
developers can learn one method that works on any (most) systems. Query By Example (QBE) SQL
3
Four Questions to Create a Query
What output do you want to see? What do you already know (or what constraints are
given)? What tables are involved? How are the tables joined together?
4
Tables
SupplierIDNameContactNamePhoneAddressZipCodeCityID
Supplier
PONumberOrderDateReceiveDateSupplierIDEmployeeIDShippingCost
MerchandiseOrder
OrderIDOrderDateReceiveDateSupplierIDShippingCostEmployeeID
AnimalOrder
OrderIDAnimalIDCost
AnimalOrderItem
CityIDZipCodeCityStateAreaCodePopulation1990Population1980CountryLatitudeLongitude
City
EmployeeIDLastNameFirstNamePhoneAddressZipCodeCityIDTaxPayerIDDateHiredDateReleased
Employee
PONumberItemIDQuantityCost
OrderItem
CategoryRegistration
Category
CategoryBreed
Breed
AnimalIDNameCategoryBreedDateBornGenderRegisteredColorListPricePhoto
Animal
SaleIDSaleDateEmployeeIDCustomerIDSalesTax
Sale
SaleIDItemIDQuantitySalePrice
SaleItem
ItemIDDescriptionQuantityOnHandListPriceCategory
Merchandise
SaleIDAnimalIDSalePrice
SaleAnimal
CustomerIDPhoneFirstNameLastNameAddressZipCodeCityID
Customer
*
*
*
*
*
*
*
*
*
**
*
*
*
**
*
**
*
5
Organization
Single table Constraints Computations Groups/Subtotals Multiple Tables
6
Sample Questions List all animals with yellow in
their color. List all dogs with yellow in
their color born after 6/1/01. List all merchandise for cats
with a list price greater than $10.
List all dogs who are male and registered or who were born before 6/1/01 and have white in their color.
What is the average sale price of all animals?
What is the total cost we paid for all animals?
List the top 10 customers and total amount they spent.
How many cats are in the animal list?
Count the number of animals in each category.
List the CustomerID of everyone who bought something between 4/1/01 and 5/31/01.
List the first name and phone of every customer who bought something between 4/1/01 and 5/31/01.
List the last name and phone of anyone who bought a registered white cat between 6/1/01 and 12/31/01.
Which employee has sold the most items?
7
Query By Example & SQL
List all animals with yellow in their color.
SELECTAnimalID, Category, Breed, ColorFROM AnimalWHERE (Color LIKE “*yellow*”);
What tables?
What to see?
What conditions?
Query04_01
8
Basic SQL SELECT
SELECT columns What do you want to see?
FROM tables What tables are involved?
JOIN conditions How are the tables joined?
WHERE criteria What are the constraints?
9
ORDER BYSELECT columnsFROM tablesJOIN join columnsWHERE conditionsORDER BY columns (ASC DESC)
SELECT Name, Category, BreedFROM AnimalORDER BY Category, Breed;
Name Category BreedCathy Bird African Grey
Bird CanaryDebbie Bird Cockatiel
Bird CockatielTerry Bird Lovebird
Bird OtherCharles Bird ParakeetCurtis Bird ParakeetRuby Bird ParakeetSandy Bird ParrotHoyt Bird Parrot
Bird Parrot
10
DISTINCTSELECT Category FROM Animal;
CategoryFishDogFishCatCatDogFishDogDogDogFishCatDog. . .
SELECT DISTINCT Category FROM Animal;
CategoryBirdCatDogFishMammalReptileSpider
11
Constraints: And
List all dogs with yellow in their color born after 6/1/01.
SELECTAnimalID, Category, DateBornFROM AnimalWHERE ((Category="Dog") AND (Color Like "*Yellow*") AND (DateBorn>#6/1/2001#));
Query04_02
12
Conditions: AND, OR
List all dogs who are male and registered or who were born before 6/1/2001 and have white in their color.
SELECT AnimalID, Category, Gender, Registered, DateBorn, ColorFROM AnimalWHERE (( Category="Dog") AND
( ( (Gender="Male") AND (Registered Is Not Null) ) OR ( (DateBorn<#6/1/2001#) AND (Color Like "*White*") ) ) );
Query04_03
13
Useful Where Conditions
14
Oracle Views
15
Oracle Views and SQL
CREATE VIEW Pets.Example AS
SELECT Pets.Animal.AnimalID,
Pets.Animal.Breed,
Pets.Animal.Category,
Pets.Animal.Color
FROM Pets.Animal
WHERE (Pets.Animal.Color LIKE ‘%Yellow%’)
SQL version is created by the Oracle View Wizard.The CREATE VIEW command saves it with the specified name.
16
Oracle View Wizard
17
Oracle Schema Manager: Views
18
Oracle Content Viewer
19
SQL Server Views
20
Simple Computations
OrderItem(OrderID, ItemID, Price, Quantity)
Select OrderID, ItemID, Price, Quantity, Price*Quantity As ExtendedFrom OrderItem;
Basic computations (+ - * /) can be performed on numeric data.The new display column should be given a meaningful name.
OrderID ItemID Price Quantity Extended
151 9764 19.50 2 39.00
151 7653 8.35 3 25.05
151 8673 6.89 2 13.78
21
Computations: Aggregation--Avg
What is the average sale price of all animals?
SELECT Avg(SalePrice) AS AvgOfSalePriceFROM SaleAnimal;
Sum Avg Min Max Count StDev Var
Query04_04
22
Computations (Math Operators)
What is the total value of the order for PONumber 22? Use any common math operators on numeric data. Operate on data in one row at a time.
OrderTotal 1798.28
SELECT Sum([Quantity]*[Cost]) AS OrderTotalFROM OrderItemWHERE (PONumber=22);
Query04_05
23
SQL Differences
24
Subtotals (Where)
How many cats are in the Animal list?
SELECT Count(AnimalID) AS CountOfAnimalIDFROM AnimalWHERE (Category = “Cat”);
Query04_06
25
Groups and Subtotals
Count the number of animals in each category. You could type in each WHERE clause, but that is slow. And you would have to know all of the Category values.
SELECT Category, Count(AnimalID) AS CountOfAnimalIDFROM AnimalGROUP BY CategoryORDER BY Count(AnimalID) DESC;
Category CountOfAnimalID Dog 100 Cat 47 Bird 15 Fish 14 Reptile 6 Mammal 6 Spider 3
Query04_07
26
Conditions on Totals (Having)
Count number of Animals in each Category, but only list them if more than 10.
Category CountOfAnimal Dog 100 Cat 47 Bird 15 Fish 14
SELECT Category, Count(AnimalID) AS CountOfAnimalIDFROM AnimalGROUP BY CategoryHAVING Count(AnimalID) > 10ORDER BY Count(AnimalID) DESC;
Query04_08
27
Where (Detail) v Having (Group)
Count Animals born after 6/1/2001 in each Category, but only list Category if more than 10.
CategoryCountOfAnimalID
Dog 30 Cat 18
SELECT Category, Count(AnimalID) AS CountOfAnimalIDFROM AnimalWHERE DateBorn > #6/1/2001#GROUP BY CategoryHAVING Count(AnimalID) > 10ORDER BY Count(AnimalID) DESC;
Query04_09
28
Multiple Tables (Intro & Distinct)
List the CustomerID of everyone who bought something between 4/1/01 and 5/31/01.
CustomerID 6 8 14 19 22 24 28 36 37 38 39 42 50 57 58 63 74 80 90
SELECT DISTINCT CustomerIDFROM SaleWHERE (SaleDate Between #4/1/01# And #5/31/01#)ORDER BY CustomerID;
Avoid Duplicateswith DISTINCT
Query04_10
29
Joining Tables
List LastNames of Customers who bought between 4/1/2001 and 5/31/2001.
CustomerID LastName
22 Adkins 57 Carter 38 Franklin 42 Froedge 63 Grimes 74 Hinton 36 Holland 6 Hopkins 50 Lee 58 McCain 37 McPherson 90 Nichols 14 Patterson 8 Reid 28 Samuels 80 Vance 39 Williams 24 Young 19 Zhang
SELECT DISTINCT Sale.CustomerID, Customer.LastNameFROM CustomerINNER JOIN Sale ON Customer.CustomerID = Sale.CustomerIDWHERE (Sale.SaleDate Between #4/1/2001# And #5/31/2001#)ORDER BY Customer.LastName;
Query04_11
30
SQL JOIN
FROM table1
INNER JOIN table2
ON table1.column = table2.column
FROM table1, table2
JOIN table1.column = table2.column
SQL 92 syntax (Access and SQL Server)
Informal syntax
FROM table1, table2
WHERE table1.column = table2.column
SQL 89 syntax (Oracle)
31
Syntax for Three Tables
FROM Table1
INNER JOIN (Table2 INNER JOIN Table3
ON Table2.ColA = Table3.ColA)
ON Table1.ColB = Table2.ColB
FROM Table1, Table2, Table3
JOIN Table1.ColB = Table2.ColB
Table2.ColA = Table3.ColA
Easier notation, but not correct syntax
SQL ‘92 syntax to join three tables
32
Multiple Tables (Many)
List the Last Name and Phone of anyone who bought a registered White cat between 6/1/2001 and 12/31/2001.
SELECT DISTINCTROW Customer.LastName, Customer.PhoneFROM Customer INNER JOIN (Sale INNER JOIN (Animal INNER JOIN SaleAnimal ON Animal.AnimalID = SaleAnimal.AnimalID) ON Sale.SaleID = SaleAnimal.SaleID) ON Customer.CustomerID = Sale.CustomerIDWHERE ((Animal.Category="Cat") AND (Animal.Registered Is Not Null) AND (Color Like "*White*") AND (SaleDate Between #6/1/2001# And #12/31/2001#));
Query04_12
33
Building a Query List the Last Name and Phone of anyone who bought a registered
White cat between 6/1/01 and 12/31/ 01.
Identify the tables involved. Look at the columns you want to see.
LastName, Phone: Customer
Look at the columns used in the constraints. Registered, Color, Category: Animal Sale Date: Sale
Find connector tables. To connect Animal to Sale: SaleAnimal
Select the desired columns and test the query. Enter the constraints. Set Order By columns. Add Group By columns. Add summary computations to the SELECT statement.
34
Joining Tables (Hints)
Build Relationships First Drag and drop From one side to many side
Avoid multiple ties between tables
SQL FROM Table1 INNER JOIN Table2 ON Table1.ColA =
Table2.ColB
Join columns are often keys, but they can be any columns--as long as the domains (types of data) match.
Multiple Tables FROM (Table1 INNER JOIN Table2 ON T1.ColA = T2.ColB ) INNER JOIN Table3 ON T3.ColC = T3.ColD
Shorter Notation FROM T1, T2, T3 JOIN T1.ColA = T2.ColB T1.ColC = T3.ColD
Shorter Notation is not correct syntax, but it is easier to write.
35
Tables with Multiple Joins Potential problem with three or more tables. Access uses predefined relationships to
automatically determine JOINs. JOINS might loop. Most queries will not work with loops.
A query with these four tables with four JOINS would only return rows where the Employee had the same ZipCode as the Supplier. If you only need the Supplier city, just delete the JOIN between Employee and ZipCode. If you want both cities, add the ZipCode table again as a fifth table.
AnimalOrder
OrderIDOrderDateReceiveDateSupplierIDShippingCostEmployeeID
Supplier
SupplierIDNameContactNamePhoneAddressZipCodeCityID
City
CityIDZipCodeCityStateAreaCodePopulation1990Population1980CountryLatitudeLongitude
Employee
EmployeeIDLastNameFirstNamePhoneAddressZipCodeCityIDTaxPayerIDDateHiredDateReleased
¥
¥
1 1
36
Table Alias
SID Supplier.CityID City.City EID LastName Employee.CityID City2.City4 7972 Middlesboro 5 James 7083 Orlando2 10896 Springfield 1 Reeves 9201 Lincoln4 7972 Middlesboro 3 Reasoner 8313 Springfield9 10740 Columbia 8 Carpenter 10592 Philadelphia5 10893 Smyrna 3 Reasoner 8313 Springfield
SELECT Supplier.SID, Supplier.CityID, City.City, Employee.EID, Employee.LastName, Employee.CityID, City2.CityFROM (City INNER JOIN Supplier ON City.CityID = Supplier.CityID) INNER JOIN ((City AS City2 INNER JOIN Employee ON City2.CityID = Employee.CityID) INNER JOIN AnimalOrder ON Employee.EmployeeID = AnimalOrder.EmployeeID) ON Supplier.SupplierID = AnimalOrder.SupplierID;
37
Saved Query: Create View
CREATE VIEW Kittens AS
SELECT *
FROM Animal
WHERE (Category = ‘cat’) AND (Today - DateBorn < 180);
SELECT Avg(ListPrice)
FROM Kittens
WHERE (Color LIKE “*Black*”);
Save a query Faster: only enter once Faster: only analyze once
Any SELECT statement Can use the View within other
SQL queries.
38
Updateable Views
OrderItem(OrderID, ItemID, Quantity) Item(ItemID, Description)
OrderLine(OrderID, ItemID, Description, Quantity)
To be updateable, a view must focus on one primary table. (OrderItem) Goal is to change data in only one table. (OrderItem) Data can be displayed from other tables. (Item) Never include or attempt to change primary keys from
more than one table. (Item.ItemID)
39
Non Updateable ViewOrderItem(OrderID, ItemID, Quantity) Item(ItemID, Description)
OrderLine(OrderID, Item.ItemID, Description, Quantity)
121 57 3121 82 2122 57 1
57 Cat food58 Dog food59 Bird food
121 57 Cat food 3121 82 Bird feeder 2122 57 Cat food 1
If you attempt to change the Item.ItemID in the OrderLineView:
You will simply change the primary key value in the Item table.
It will not add a new row to the OrderItem table.
32
40
No Views are Updateable in .NET
Most databases do not really support updateable views very well, and Oracle had lots of problems. So, in .NET, you can only update underlying tables, not the views. This approach complicates your applications. But it is a realistic approach.
41
Primary Portability Hint
The DBMSs use different variations on SQL, particularly Oracle, which uses an older version.
To reduce application maintenance and make your application more portable: Save all relatively complex queries in the database (as views). Then use only simple Select queries in your application. That includes all queries with:
JOINConcatenationMost computations
In SQL Server, go a step further and save all of your queries as parameterized views.
42
SQL Data Definition
Create Schema Authorization dbName password Create Table TableName (Column Type, . . .) Alter Table Table {Add, Column, Constraint, Drop} Drop {Table Table | Index Index On table} Create Index IndexName ON Table (Column {ASC|
DESC})
43
Syntax Examples
CREATE TABLE Customer
(CustomerID INTEGER NOT NULL,
LastName CHAR (10),
more columns
);
ALTER TABLE Customer
DROP COLUMN ZipCode;
ALTER TABLE Customer
ADD COLUMN CellPhone CHAR(15);
44
SQL Data Manipulation Commands
Insert Into target (column1 . . .) VALUES (value1 . . .)
Insert Into target (column1 . . .) SELECT . . . FROM. . .
Delete From table WHERE condition
Update table SET Column=Value,. . . Where condition
Note the use of the Select and Where conditions.Synatx is the same--only learn it once.
You can also use subqueries.
45
Copy Old Animal Data
INSERT INTO OldAnimalsSELECT *FROM AnimalsWHERE AnimalID IN
(SELECT AnimalOrderItem.AnimalID
FROM AnimalOrder INNER JOIN AnimalOrderItem
ON AnimalOrder.OrderID = AnimalOrderItem.OrderId
WHERE (AnimalOrder.OrderDate<#1/1/01#) );
46
Delete Old Animal Data
DELETEFROM AnimalsWHERE AnimalID IN
(SELECT AnimalOrderItem.AnimalID
FROM AnimalOrder INNER JOIN AnimalOrderItem
ON AnimalOrder.OrderID = AnimalOrderItem.OrderId
WHERE (AnimalOrder.OrderDate<#1/1/01#) );
47
Update Example
Change the ListPrice of Animals at the PetStore. For cats, increase the ListPrice by 10%. For dogs, increase the ListPrice by 20%.
Typically use two similar UPDATE statements. With the CASE function, the statements can be combined.
UPDATE Animal
SET ListPrice = ListPrice*1.10
WHERE Category = “Cat” ;
UPDATE Animal
SET ListPrice = ListPrice*1.20
WHERE Category = “Dog” ;
48
Parameterized Queries
Parameterized queries often run faster and are somewhat easier to use in .NET.
Support for parameterized queries: SQL Server The best of them all. Access OK, available in most cases. Oracle OK for action queries but hard with Select. DB2 Unknown.
SQL Server:CREATE PROCEDURE GetOrder (@OrderID int) AS
SELECT OrderID, OrderDate, CustomerIDFROM Order WHERE OrderID = @OrderID
RETURN Even if you cannot (or do not want to) create parameterized
queries in the DBMS, we will create them within the code:cmdMine.CommandText = “SELECT OrderID, OrderDate,
CustomerID FROM Order WHERE OrderID = ?
49
Importance of Parameterized Queries
Consider a typical SQL Update command:UPDATE Customer SET LastName = ‘O’Malley’ WHERE CustomerID=222
Note the problem with the name—it includes an apostrophe, which also happens to be the string delimiter for SQL. So, this statement will crash.
The statement will still fail even if you create a variable (sLastName = “O’Malley”)
strSQL = “UPDATE Customer SET LastName = “ & sLastName … But, if you create a parameterized query, it will work!
strSQL = “UPDATE Customer SET LastName=? WHERE CustomerID=?”
Parameter 0 is “O’Malley”
Parameter 1 is 222 You must always use parameterized queries for UPDATE and
INSERT, so you might as well use them all of the time.
50
SQL Syntax List
ALTER TABLE COMMIT CREATE INDEX CREATE TABLE CREATE VIEW DELETE DROP INSERT GRANT REVOKE ROLLBACK SELECT SELECT INTO UPDATE
51
SQL Syntax: ALTER TABLE
ALTER TABLE table ADD COLUMN column datatype (size) DROP COLUMN column
See also:
CREATE TABLE
DROP TABLE Return to List
52
SQL Syntax: COMMIT
COMMIT WORK
See also: ROLLBACK
Return to List
53
SQL Syntax: CREATE INDEX
CREATE [UNIQUE] INDEX indexON table (column1, column2, … )WITH {PRIMARY | DISALLOW NULL | IGNORE NULL}
See also: CREATE TABLE
Return to List
54
SQL Syntax: CREATE TABLE
CREATE TABLE table( column1 datatype (size) [NOT NULL] [index1] , column2 datatype (size) [NOT NULL] [index2], … , CONSTRAINT pkname PRIMARY KEY (column, …), CONSTRAINT fkname FOREIGN KEY (column)
REFERENCES existing_table (key_column),)
See also:
ALTER TABLE
DROP TABLE Return to List
55
SQL Syntax: CREATE VIEW
CREATE VIEW viewname ASSELECT …
See also: SELECT
Return to List
56
SQL Syntax: DELETE
DELETEFROM tableWHERE condition
See also: DROP
Return to List
57
SQL Syntax: DROP
DROP INDEX index ON table
DROP TABLE
DROP VIEW
See also: DELETE
Return to List
58
SQL Syntax: GRANT
GRANT privilege privilegesON object ALL, ALTER, DELETE, INDEX,TO user | PUBLIC INSERT, SELECT, UPDATE
See also: REVOKE
Return to List
59
SQL Syntax: INSERT
INSERT INTO table (column1, column2, …)VALUES (value1, value2, … )
INSERT INTO newtable (column1, column2, …)SELECT …
See also: SELECT
Return to List
60
SQL Syntax: REVOKE
REVOKE privilege privilegesON object ALL, ALTER, DELETE, INDEX,FROM user | PUBLIC INSERT, SELECT, UPDATE
See also: GRANT
Return to List
61
SQL Syntax: ROLLBACK
SAVEPOINT savepoint {optional}
ROLLBACK WORK TO savepoint
See also: COMMIT
Return to List
62
SQL Syntax: SELECT
SELECT DISTINCT table.column {AS alias} , . . .FROM table/queryINNER JOIN table/query ON T1.ColA = T2.ColBWHERE (condition)GROUP BY columnHAVING (group condition)ORDER BY table.column{ UNION, INTERSECT, EXCEPT … }
GROUP BY CUBE (dimension1, dimension2, …)
TRANSFORM aggfunction {Crosstab values}SELECT . . . FROM . . . GROUP BY {Crosstab rows}PIVOT pivot column {Crosstab columns}
Return to List
63
SQL Syntax: SELECT INTO
SELECT column1, column2, … INTO newtableFROM tablesWHERE condition
See also: SELECT
Return to List
64
SQL Syntax: UPDATE
UPDATE TABLE table SET column1 = value1, column2 = value2, … WHERE condition
See also: DELETE
Return to List