63
1 Jerry Post Copyright © 2003 Database Management Database Management Systems Systems Chapter 5 Advanced Queries

Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

Embed Size (px)

Citation preview

Page 1: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

1

Jerry PostCopyright © 2003

Database Management Database Management SystemsSystems

Chapter 5

Advanced Queries

Page 2: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

2

DDAATTAABBAASSEE

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

Page 3: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

3

DDAATTAABBAASSEE

Organization

Harder Questions Subqueries Not In, LEFT JOIN UNION, Multiple JOIN columns, Recursive JOIN Other SQL Commands

DDL: Data Definition LanguageDML: Data Manipulation Language

OLAPMicrosoft SQL ServerOracleMicrosoft Access Crosstab

Page 4: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

4

DDAATTAABBAASSEE

Harder Questions

How many cats are “in-stock” on 10/1/04?

Which cats sold for more than the average price?

Which animals sold for more than the average price of animals in their category?

Which animals have not been sold?

Which customers (who bought something at least once) did not buy anything between 11/1/04 and 12/31/04?

Which customers who bought Dogs also bought products for Cats (at any time)?

Page 5: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

5

DDAATTAABBAASSEE

Sub-query for Calculation Which cats sold for more than the average sale price of cats?

Assume we know the average price is $170. Usually we need to compute it first.

SELECT SaleAnimal.AnimalID, Animal.Category, SaleAnimal.SalePriceFROM AnimalINNER JOIN SaleAnimal ON Animal.AnimalID = SaleAnimal.AnimalIDWHERE ((Animal.Category=‘Cat’) AND (SaleAnimal.SalePrice>170));

SELECT SaleAnimal.AnimalID, Animal.Category, SaleAnimal.SalePriceFROM AnimalINNER JOIN SaleAnimal ON Animal.AnimalID = SaleAnimal.AnimalIDWHERE ((Animal.Category=‘Cat’) AND (SaleAnimal.SalePrice> ( SELECT AVG(SalePrice)

FROM AnimalINNER JOIN SaleAnimal ON Animal.AnimalID = SaleAnimal.AnimalIDWHERE (Animal.Category=‘Cat’)

) ) );

Page 6: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

6

DDAATTAABBAASSEE

Query Sets (IN)

List all customers (Name) who purchased one of the following items: 1, 2, 30, 32, 33.

SELECT Customer.LastName, Customer.FirstName, SaleItem.ItemIDFROM (Customer INNER JOIN Sale ON Customer.CustomerID = Sale.CustomerID) INNER JOIN SaleItem ON Sale.SaleID = SaleItem.SaleIDWHERE (SaleItem.ItemID In (1,2,30,32,33))ORDER BY Customer.LastName, Customer.FirstName;

Query04_13

SaleIDSaleDateEmployeeIDCustomerID

Field LastName FirstName ItemID

Table Customer Customer SaleItem

Sort Ascending Ascending

Criteria In (1,2,30,32,33)

Or

CustomerIDPhoneFirstNameLastName

SaleCustomerSaleIDItemIDQuantitySalePrice

SaleItem

Page 7: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

7

DDAATTAABBAASSEE

Using IN with a Sub-query

List all customers who bought items for cats.

SELECT Customer.LastName, Customer.FirstName, SaleItem.ItemIDFROM (Customer

INNER JOIN Sale ON Customer.CustomerID = Sale.CustomerID)INNER JOIN SaleItem ON Sale.SaleID = SaleItem.SaleID

WHERE (SaleItem.ItemID In(SELECT ItemID FROM Merchandise WHERE Category=‘Cat’));

Page 8: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

8

DDAATTAABBAASSEE

SubQuery (IN: Look up a Set)

List all of the customers who bought something in March and who bought something in May. (Two tests on the same data!)

LastName FirstAdkins IngaMcCain SamGrimes Earl

SELECT Customer.LastName, Customer.FirstNameFROM Customer INNER JOIN Sale ON Customer.CustomerID = Sale.CustomerIDWHERE ((Month([SaleDate])=3)) And Customer.CustomerID In (SELECT CustomerID FROM Sale WHERE (Month([SaleDate])=5) );

Query04_14

SaleIDSaleDateEmployeeIDCustomerID

Field LastName FirstName Month(SaleDate) CustomerID

Table Customer Customer Sale Customer

Sort Ascending Ascending

Criteria 3 In (SELECT CustomerID FROM State WHERE (Month(SaleDAte)=5)

Or

CustomerIDPhoneFirstNameLastName

SaleCustomer

Page 9: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

9

DDAATTAABBAASSEE

SubQuery (ANY, ALL)

Any: value is compared to each item in the list. If it is True for any of the items, the statement is evaluated to True.

All: value is compared to each item in the list. If it is True for every item in the list, the statement is evaluated to True (much more restrictive than any.

SELECT Animal.AnimalID, Name, SalePrice, ListPriceFROM Animal INNER JOIN SaleAnimal ON Animal.AnimalID = SaleAnimal.AnimalIDWHERE ((SalePrice > Any

(SELECT 0.80*ListPrice FROM Animal INNER JOIN SaleAnimal ON Animal.AnimalID = SaleAnimal.AnimalID WHERE Category = ‘Cat’))

AND (Category=‘Cat’);

Query04_15

Page 10: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

10

DDAATTAABBAASSEE

SubQuery: NOT IN (Subtract)

Which animals have not been sold? Start with list of all animals. Subtract out list of those who were sold.

AnimalID Name Category12 Leisha Dog19 Gene Dog25 Vivian Dog34 Rhonda Dog88 Brandy Dog181 Fish

SELECT Animal.AnimalID, Animal.Name, Animal.CategoryFROM AnimalWHERE (Animal.AnimalID Not In (SELECT AnimalID From SaleAnimal));

Query04_16

Field AnimalID Name Category

Table Animal Animal Animal

Sort

Criteria Not In (SELECT AnimalID FROM SaleAnimal)

Or

AnimalIDNameCategoryBreed

Animal

Page 11: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

11

DDAATTAABBAASSEE

SubQuery: NOT IN (Data)

ID Name Category Breed2 Fish Angel4 Gary Dog Dalmation5 Fish Shark6 Rosie Cat Oriental Shorthair7 Eugene Cat Bombay8 Miranda Dog Norfolk Terrier9 Fish Guppy

10 Sherri Dog Siberian Huskie11 Susan Dog Dalmation12 Leisha Dog Rottweiler

ID SaleID SalePrice2 35 $10.804 80 $156.666 27 $173.997 25 $251.598 4 $183.38

10 18 $150.1111 17 $148.47

Animal SaleAnimal

Which animals have not been sold?

Page 12: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

12

DDAATTAABBAASSEE

Left Outer Join

Which animals have not been sold? LEFT JOIN includes all rows from left table (Animal)

But only those from right table (SaleAnimal) that match a row in Animal. Rows in Animal without matching data in Sale Animal will have Null.

SELECT Animal.AnimalID, Animal.Name, Animal.CategoryFROM Animal LEFT JOIN SaleAnimalON Animal.AnimalID = SaleAnimal.AnimalIDWHERE (SaleAnimal.SaleID Is Null);

AnimalID Name Category12 Leisha Dog19 Gene Dog25 Vivian Dog34 Rhonda Dog88 Brandy Dog181 Fish

Query04_17

SaleIDAnimalIDSalePrice

Field AnimalID SaleID Name Category

Table Animal SaleAnimal Animal Animal

Sort

Criteria Is Null

Or

AnimalIDNameCategoryBreed

SaleAnimalAnimal

Page 13: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

13

DDAATTAABBAASSEE

Left Outer Join (Example)

ID Name Category Breed2 Fish Angel4 Gary Dog Dalmation5 Fish Shark6 Rosie Cat Oriental Shorthair7 Eugene Cat Bombay8 Miranda Dog Norfolk Terrier9 Fish Guppy

10 Sherri Dog Siberian Huskie11 Susan Dog Dalmation12 Leisha Dog Rottweiler

ID SaleID SalePrice2 35 $10.804 80 $156.66

Null Null Null6 27 $173.997 25 $251.598 4 $183.38

Null Null Null10 18 $150.1111 17 $148.47

Null Null Null

Page 14: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

14

DDAATTAABBAASSEE

Older Syntax for Left Join

Which animals have not been sold?

SELECT ALL

FROM Animal, SaleAnimal

WHERE Animal.AnimalID *= SaleAnimal.AnimalID

And SaleAnimal.SaleID Is Null;

SELECT ALL

FROM Animal, SaleAnimal

WHERE Animal.AnimalID = SaleAnimal.AnimalID (+)

And SaleAnimal.SaleID Is Null;

Old Oracle syntax—note that the (+) symbol is on the reversed side.

Page 15: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

15

DDAATTAABBAASSEE

SubQuery for Computation

Don’t know the average, so use a subquery to look it up.

Watch parentheses.

Query04_18

SELECT SaleAnimal.AnimalID, Animal.Category, SaleAnimal.SalePriceFROM AnimalINNER JOIN SaleAnimal ON Animal.AnimalID = SaleAnimal.AnimalIDWHERE ((Animal.Category=‘Cat’) AND (SaleAnimal.SalePrice> ( SELECT AVG(SalePrice)

FROM AnimalINNER JOIN SaleAnimal ON Animal.AnimalID = SaleAnimal.AnimalIDWHERE (Animal.Category=‘Cat’) ) ) );

SaleIDAnimalIDSalePrice

Field AnimalID Name Category SalePrice

Table Animal Animal Animal SaleAnimal

Sort Descending

Criteria 3 > (SELECT Avg(SalePrice) FROM Animal INNER JOIN SaleAnimal ON Animal.AnimalID = SaleAnimal.AnimalID WHERE Animal.Category = ‘Cat’)

Or

AnimalIDNameCategoryBreed

SaleAnimalAnimal

Page 16: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

16

DDAATTAABBAASSEE

Correlated Subquery

SELECT AnimalID, Name, Category, SalePriceFROM Animal INNER JOIN SaleAnimal ON Animal.AnimalID = SaleAnimal.AnimalIDWHERE (SaleAnimal.SalePrice> (SELECT Avg(SaleAnimal.SalePrice) FROM Animal INNER JOIN SaleAnimal ON Animal.AnimalID = SaleAnimal.AnimalID WHERE (Animal.Category = Animal.Category) ) )ORDER BY SaleAnimal.SalePrice DESC;

List the Animals that have sold for a price higher than the average for animals in that Category.

The subquery needs to compute the average for a given category.

Problem: Which category? Answer: the category that matches the category from the main

part of the query. Problem: How do we refer to it? Both tables are called Animal.

This query will not work yet.

Page 17: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

17

DDAATTAABBAASSEE

Correlated SubQuery (Avoid)

List the Animals that have sold for a price higher than the average for animals in that Category.

Match category in subquery with top level Rename tables (As)

Correlated Subquery Recompute subquery for every row in top level--slow! Better to compute and save Subquery, then use in join.

SELECT A1.AnimalID, A1.Name, A1.Category, SaleAnimal.SalePriceFROM Animal As A1 INNER JOIN SaleAnimal

ON A1.AnimalID = SaleAnimal.AnimalIDWHERE (SaleAnimal.SalePrice> (SELECT Avg(SaleAnimal.SalePrice) FROM Animal As A2 INNER JOIN SaleAnimal

ON A2.AnimalID = SaleAnimal.AnimalID WHERE (A2.Category = A1.Category) ) )ORDER BY SaleAnimal.SalePrice DESC;

Query04_19

Page 18: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

18

DDAATTAABBAASSEE

Correlated Subquery Problem

Fish $10.80Dog $156.66Fish $19.80Cat $173.99Cat $251.59Dog $183.38Fish $1.80Dog $150.11Dog $148.47

Category SalePrice

Animal + SaleAnimal

Compute Avg: $37.78Compute Avg: $174.20Compute Avg: $37.78Compute Avg: $169.73Compute Avg: $169.73

Recompute average for every row in the main query!

Assume small query 100,000 rows 5 categories of 20,000 rows

100,000 * 20,000 = 1 billion rows to read!

Page 19: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

19

DDAATTAABBAASSEE

More Efficient Solution: 2 queries

Compute the averages once and save query JOIN saved query to main query Two passes through table: 1 billion / 200,000 => 10,000

Fish $10.80Dog $156.66Fish $19.80Cat $173.99Cat $251.59Dog $183.38Fish $1.80Dog $150.11Dog $148.47

Category SalePrice

Animal + SaleAnimal

Bird $176.57Cat $169.73Dog $174.20Fish $37.78Mammal $80.72Reptile $181.83Spider $118.16

Category AvgOfSalePrice

Saved Query

JOIN

Animal.Category = Query1.Category

Page 20: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

20

DDAATTAABBAASSEE

UNION Operator

Offices in Los Angeles and New York. Each has an Employee table (East and West). Need to search data from both tables. Columns in the two SELECT lines must match.

SELECT EID, Name, Phone, Salary, ‘East’ AS OfficeFROM EmployeeEastUNIONSELECT EID, Name, Phone, Salary, ‘West’ AS OfficeFROM EmployeeWest

EID Name Phone Salary Office352 Jones 3352 45,000 East876 Inez 8736 47,000 East372 Stoiko 7632 38,000 East

890 Smythe 9803 62,000 West361 Kim 7736 73,000 West

Page 21: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

21

DDAATTAABBAASSEE

UNION, INTERSECT, EXCEPT

T1 T2

A B C

SELECT EID, NameFROM EmployeeEastINTERSECTSELECT EID, NameFROM EmployeeWest

List the name of any employee who has worked for both the East and West regions.

Page 22: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

22

DDAATTAABBAASSEE

Multiple JOIN Columns

Sometimes need to JOIN tables on more than one column. PetStore: Category and Breed.

AnimalIDNameCategoryBreedDateBornGender. . .

CategoryBreed

Breed

Animal

SELECT *FROM Breed INNER JOIN AnimalON Breed.Category = Animal.CategoryAND Breed.Breed = Animal.Breed

Page 23: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

23

DDAATTAABBAASSEE

Reflexive Join

Need to connect a table to itself. Common example: Employee(EID, Name, . . ., Manager)

A manager is also an employee. Use a second copy of the table and an alias.

SELECT Employee.EID, Employee.Name, Employee.Manager, E2.Name

FROM Employee INNER JOIN Employee AS E2

ON Employee.Manager = E2.EID

EID Name . . . Manager115 Sanchez 765462 Miller 115523 Hawk 115765 Munoz 886

Employee

EID Name Manager Name115 Sanchez 765 Munoz462 Miller 115 Sanchez523 Hawk 115 Sanchez

SQL

Result

Page 24: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

24

DDAATTAABBAASSEE

Recursive Joins (SQL 99 and 200x)

WITH RECURSIVE EmployeeList (EmployeeID, Title, Salary) AS( SELECT EmployeeID, Title, 0.00FROM Manages WHERE Title = “CEO” -- starting levelUNION ALLSELECT Manages.EmployeeID, Manages.Title, Manages.SalaryFROM EmployeeList INNER JOIN ManagesON EmployeeList.EmployeeID = Manages.ManagerID )

SELECT EmployeeID, Count(Title), Sum(Salary)FROM EmployeeListGROUP BY EmployeEID ;

List all of the employees and list everyone who reports to them.

Not yet supported by vendors.It provides tree spanning capabilities.

Page 25: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

25

DDAATTAABBAASSEE

CASE Function

Used to change data to a different context. Example: Define age categories for the animals.

Less than 3 months Between 3 months and 9 months Between 9 months and 1 year Over 1 year

Select AnimalID,CASE

WHEN Date()-DateBorn < 90 Then “Baby”WHEN Date()-DateBorn >= 90 AND Date()-DateBorn < 270 Then “Young”WHEN Date()-DateBorn >= 270 AND Date()-DateBorn < 365 Then “Grown”ELSE “Experienced”

ENDFROM Animal;

Not available in Microsoft Access. It is in SQL Server and Oracle.

Page 26: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

26

DDAATTAABBAASSEE

Inequality Join

AR(TransactionID, CustomerID, Amount, DateDue)

AccountsReceivable Categorize by Days Late

30, 90, 120+

Three queries? New table for business rules

LateCategory(Category, MinDays, MaxDays, Charge, …)

Month 30 90 3%Quarter 90 120 5%Overdue 120 9999 10%

SELECT *FROM AR INNER JOIN LateCategory ON ((Date() - AR.DateDue) >= LateCategory.MinDays) AND ((Date() - AR.DateDue) < LateCategory.MaxDays)

Page 27: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

27

DDAATTAABBAASSEE

SQL 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 second select }

Page 28: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

28

DDAATTAABBAASSEE

SQL Mnemonic

Someone

From

Ireland

Will

Grow

Horseradish and

Onions

SELECT

FROM

INNER JOIN

WHERE

GROUP BY

HAVING

ORDER BY

SQL is picky about putting the commands in the proper sequence.

If you have to memorize the sequence, this mnemonic may be helpful.

Page 29: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

29

DDAATTAABBAASSEE

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})

Page 30: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

30

DDAATTAABBAASSEE

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);

Page 31: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

31

DDAATTAABBAASSEE

Queries with “Every” Need EXISTSList the employees who have sold animals from every category.

By hand: List the employees and the categories. Go through the SaleAnimal list and check off the animals they have sold.

Page 32: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

32

DDAATTAABBAASSEE

Query With EXISTSList the Animal categories that have not been sold by an employee (#5).

SELECT CategoryFROM Category WHERE (Category <> "Other") And Category NOT IN (SELECT Animal.Category FROM Animal INNER JOIN (Sale INNER JOIN SaleAnimal ON Sale.SaleID = SaleAnimal.SaleID) ON Animal.AnimalID = SaleAnimal.AnimalID WHERE Sale.EmployeeID = 5)

If this query returns any rows, then the employee has not sold every animal.So list all the employees for whom the above query returns no rows:

SELECT EmployeeID, LastName FROM Employee

WHERE NOT EXISTS

(above query slightly modified.)

Page 33: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

33

DDAATTAABBAASSEE

Query for Every

SELECT Employee.EmployeeID, Employee.LastNameFROM EmployeeWHERE Not Exists (SELECT Category FROM Category WHERE (Category <> "Other") And Category NOT IN (SELECT Animal.Category FROM Animal INNER JOIN (Sale INNER JOIN SaleAnimal ON Sale.SaleID = SaleAnimal.SaleID) ON Animal.AnimalID = SaleAnimal.AnimalID WHERE Sale.EmployeeID = Employee.EmployeeID) );

Result: 3 Reasoner

Page 34: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

34

DDAATTAABBAASSEE

Simpler Query for EverySometimes it is easier to use Crosstab and the Count function.

But some systems do not have Crosstab, and sometimes thelists would be too long. So you need to know both techniques.

Page 35: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

35

DDAATTAABBAASSEE

SQL: Foreign KeyCREATE TABLE Order

(OrderID INTEGER NOT NULL,

OrderDate DATE,

CustomerID INTEGER

CONSTRAINT pkorder PRIMARY KEY (OrderID),

CONSTRAINT fkorder FOREIGN KEY (CustomerID)

REFERENCES Customer (CustomerID)

);

OrderIDOrderDateCustomerID

CustomerIDLastNameFirstNameAddress…

Order Customer

*

Page 36: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

36

DDAATTAABBAASSEE

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.

Page 37: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

37

DDAATTAABBAASSEE

Copy Old Animal DataINSERT INTO OldAnimalsSELECT *FROM AnimalWHERE AnimalID IN

(SELECT AnimalOrderItem.AnimalID

FROM AnimalOrder INNER JOIN AnimalOrderItem

ON AnimalOrder.OrderID = AnimalOrderItem.OrderID

WHERE (AnimalOrder.OrderDate<’01-Jan-2004’) );

Page 38: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

38

DDAATTAABBAASSEE

Delete Old Animal DataDELETEFROM AnimalWHERE AnimalID IN

(SELECT AnimalOrderItem.AnimalID

FROM AnimalOrder INNER JOIN AnimalOrderItem

ON AnimalOrder.OrderID = AnimalOrderItem.OrderID

WHERE (AnimalOrder.OrderDate<’01-Jan-2004’) );

Page 39: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

39

DDAATTAABBAASSEE

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’ ;

Page 40: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

40

DDAATTAABBAASSEE

Quality: Building Queries Break questions into smaller pieces. Test each query.

Check the SQL. Look at the data. Check computations

Combine into subqueries. Use cut-and-paste to avoid errors. Check for correlated subqueries.

Test sample data. Identify different cases. Check final query and subqueries. Verify calculations. Dogs and cat products on the same sale.

Dogs and cat products at different times.Dogs and never any cat products.Cat products and never any Dogs.

Which customers who bought Dogsalso bought products for Cats(at any time)?

Who bought dogs?Who bought cat products?

Test SELECT queriesbefore executingUPDATE queries.

Page 41: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

41

DDAATTAABBAASSEE

Quality Queries: ExampleWhich customers who bought Dogs also bought products for Cats?

SELECT DISTINCT Animal.Category, Sale.CustomerIDFROM Sale INNER JOIN (Animal INNER JOIN SaleAnimal ON Animal.AnimalID = SaleAnimal.AnimalID) ON Sale.SaleID = SaleAnimal.SaleIDWHERE (((Animal.Category)=‘Dog’))

SELECT DISTINCT Sale.CustomerIDFROM Sale INNER JOIN (Merchandise INNER JOIN SaleItem ON Merchandise.ItemID = SaleItem.ItemID) ON Sale.SaleID = SaleItem.SaleIDWHERE (((Merchandise.Category)=‘Cat’))

A. Which customers bought dogs?B. Which customers bought cat products?

AND Sale.CustomerID IN (

);

Page 42: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

42

DDAATTAABBAASSEE

Programming Review: Variables

Integer 2 bytes -32768 32767

Long 4 bytes +/- 2,147,483,648

Single 4 bytes +/- 3.402823 E 38 +/- 1.401298 E-45

Global, Const, Static

Double 8 bytes +/- 1.79769313486232 E 308 +/- 4.94065645841247 E-324

Currency 8 bytes +/- 922,337,203,685,477.5808

String & String*n Variant

Any data type Null

Page 43: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

43

DDAATTAABBAASSEE

Programming: Scope and Lifetime Scope

Where is the variable, and which procedures can access it?

Lifetime When is the variable

created, and when is it destroyed?

Form--Module Code

Sub Button1_Click()Dim i1 As Integeri1 = 3End Sub

Sub Button2_Click()Dim i1 As Integeri1 = 7End Sub

FormButton1Button1Button2Button2

Different procedures,different variables.Created and destroyedeach time the buttonis clicked.

Page 44: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

44

DDAATTAABBAASSEE

Programming: Global Variables Wider scope and lifetime

Created at a higher level Form Public module

Accessible to any procedure in that form or module.

Declare it Global to make it available to any procedure.

Form--Module Code

Sub Button2_Click()i2 = i2 + 7End Sub

FormButton1Button1Button2Button2

Dim i2 As Integer

Variable is created whenform is opened.Clicking Button1 sets theinitial value.Clicking Button2 modifiesthe value.What if user clicks buttons in a different order?

Sub Button1_Click()i2 = 20End Sub

Page 45: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

45

DDAATTAABBAASSEE

Programming: Computations Standard Math

+ - * / \ Integer divide ^ Exponentiation

(2^3 = 2*2*2 = 8)

Mod (15 Mod 4 = 3) (12 + 3 = 15)

String & Concatenation Left, Right, Mid Trim, LTrim, RTrim String Chr, Asc LCase, UCase InStr Len StrComp Format

“Frank” & “Rose” “FrankRose”

Left(“Jackson”,5) “Jacks”

Trim(“ Maria “) “Maria”

Len(“Ramanujan”) 9

String(5,”a”) “aaaaa”

InStr(“8764 Main”,” “) 5

Page 46: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

46

DDAATTAABBAASSEE

Programming: Standard Functions

Numeric Exp, Log Atn, Cos, Sin, Tan Sqr Abs Sgn Int, Fix Rnd, Randomize

x = loge (ex)

Trigonometric functions2 = 1.414

Abs(-35) 35

Sgn(-35) -1

Int(17.893) 17

Rnd() 0.198474

? =3092

Page 47: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

47

DDAATTAABBAASSEE

Programming:Standard Functions: Date/Time

Date, Now, Time DateAdd, DateDiff

“y”, “m”, “q” . . . Firstweekday 1=Sunday,. . . Can also be used

to find number of Fridays, between two dates.

today DateDue

02/19/04 03/21/04

DateDue = DateAdd(“d”, 30, Date())

Page 48: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

48

DDAATTAABBAASSEE

Programming:Standard Functions: Variant

Variant IsDate IsNumeric VarType IsEmpty IsNull

Page 49: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

49

DDAATTAABBAASSEE

Programming: Debug

Stop Ctrl-Break F5: Go F8: Step through S-F8: Step over Breakpoints

Immediate Window ? or Print Any assignment Any code

Page 50: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

50

DDAATTAABBAASSEE

Programming:Output: Message Box MsgBox

Message Type Title

Types: Use Constants vbOKOnly

vbOKCancel vbAbortRetryIgnore vbYesNoCancel vbYesNo

vbRetryCancel Defaults

vbDefaultButton1 vbDefaultButton2 vbDefaultButton3

Icons vbCritical Stop sign vbQuestion Question mark vbExclamation Warning vbInformation Circle i

Responses vbOK vbCancel vbAbort vbRetry vbIgnore vbYes vbNo

MsgBox "This is a message box", vbYesNoCancel + vbInformation, "Sample Box"

Page 51: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

51

DDAATTAABBAASSEE

Programming:Input: InputBox

InputBox Prompt Title Default X-Pos, Y-Pos

Prompt Cannot change box size Use Chr(10) & Chr(13) for

blank lines.

Returns text or Variant Cancel = zero string ““ Positions

Twips Twentieth of inch point 72 points 1440 twips per inch

Dim str As Stringstr = InputBox( "Enter your name:", "Sample Input", , 5000, 5000)

Page 52: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

52

DDAATTAABBAASSEE

Programming: Conditions

If If (Condition) Then

statements for true

Else statements for false

End If

IIF (Cond., True, False) Select Case (expr)

Case value statements

Case value2 Case Else End Select

Conditions <, <=, >, >=, =, <> And, Or, Not, Xor Eqv, Imp (logic)

If (Condition1) Thenstatements for true

Elsestatements for falseIf (Condition2) Then

statements for trueEnd If

End If

Page 53: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

53

DDAATTAABBAASSEE

ProgrammingSelect Example Message Box

Could use repeated If statements

Better to use Select Case

response = MsgBox(…)If (response == vbYes) Then

‘ statements for YesElse

If (response == vbNo) Then‘ statements for No

Else ‘statements for Cancel

End IfEnd If

response = MsgBox(…) Select Case response

Case vbYes‘ statements for Yes

Case vbNo‘ statements for No

Case vbCancel‘ statements for Cancel

End Case

Page 54: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

54

DDAATTAABBAASSEE

Programming: Loops

Do For … Next For Each

Do Until (x > 10)

‘ Statements

x = x + 1

Loop

Initialize value

Statements

Change value

Test condition

Do While (x <= 10)

‘ Statements

x = x + 1

Loop

Do

‘ Statements

x = x + 1

Loop Until (x > 10)

For x = 1 to 10

‘ Statements

Next x

Page 55: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

55

DDAATTAABBAASSEE

Programming: Loops Again

Do Do {While | Until}

Exit Do (optional)

Loop

Do Loop {While | Until}

For/Next For counter = start To end

Step increment Exit For (optional)

Next counter

For/Each (objects) For Each element In group

[Exit For] (optional)

Next element

With (objects) With object End With

Page 56: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

56

DDAATTAABBAASSEE

ProgrammingSubroutines and Functions

Sub name (var1 As . . ., var2, . . .) End Sub Function fname (var1 As . . .) As datatype

fname = … ‘ returns a specific value

End Function Variables are passed by reference

Changes made to the parameters in the subroutine are passed back to the caller.

Unless you use ByVal Changes are made to a copy of the parameter, but are not

returned to the calling program.

Page 57: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

57

DDAATTAABBAASSEE

Programming: Example Subroutine

Main program…StatusMessage “Trying to connect.”…StatusMessage “Verifying access.”… End main program

Sub StatusMessage (Msg As String)‘ Display Msg, location, color

End Sub

Page 58: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

58

DDAATTAABBAASSEE

Programming: Parameter TypesMainj = 3DoSum j… ‘ j is now equal to 8

Subroutine DoSum (j2 As Integer)j2 = 8

End Sub

By ReferenceChanges to data in thesubroutine are passed back.

Mainj = 3DoSum j… ‘ j is still equal to 3

Subroutine DoSum (ByVal j2 As Integer)j2 = 8

End Sub

By ValueCreates a copy of thevariable, so changes arenot returned.

Page 59: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

59

DDAATTAABBAASSEE

ProgrammingArrays and User Types

Arrays Dim array(sub, . . .) As

type Dim iSorts(10) As Integer

Specifying bounds: (lower To upper, . . .) ReDim [Preserve] array ..

. Option Base 0 | 1 v 2.0 arrays less than

64KB

User defined types Type Tname

ename1 As type ename2 As type

End Type

Dim var1 As Tname var1.ename1 = . . . var1.ename2 = . . .

Page 60: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

60

DDAATTAABBAASSEE

Programming: Financial Functions Fixed payments

PV (rate, nper, pmt, fv, due) FV (rate, nper, pmt, pv, due) IPmt (rate, per, nper, pv, fv,

due) NPer (rate, pmt, pv, fv, due) Pmt (rate, nper, pv, fv,due) PPmt (rate, per, nper, pv, fv,

due) Rate (nper, pmt, pv, fv, due,

guess)

rate interest rate per period per specific period number nper # of periods pv present value fv future value due 0=due at end, 1=due at start

Arrays NPV (rate, array) IRR (array, guess) MIRR (array, finrate, re_rate)

Depreciation DDB (cost, salv, life, period) SLN (cost, salvage, life) SYD (cost, salv., life, period)

Page 61: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

61

DDAATTAABBAASSEE

Programming: Text File Input/Output

Open filename As # file# Close # file#, Reset Print #,Put, Write Spc, Tab Get, Input #, Line Input # EOF, LOF Seek # file#, position

ChDir, ChDirve Dir Kill, (re)Name Lock, Unlock CurDir, MkDir, RmDir

Page 62: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

62

DDAATTAABBAASSEE

OLE: Object Linking & Embedding

CreateObject (class) “appname . objecttype”

GetObject (file, class)

Methods and syntax are defined by the software that exports the object.

Example Dim obj As Object set obj =

CreateObject(“Word.Basic”) obj.Bold obj.Insert “text” obj.SaveAs “file”

Page 63: Jerry Post Copyright © 2003 1 Database Management Systems Chapter 5 Advanced Queries

63

DDAATTAABBAASSEE

DDE: Dynamic Data Exchange

Shell DDEInitiate DDEExecute DDEPoke, DDE Send

Send data

DDE, DDERequest Request data

DDETerminate

Application must be running Start a conversation/topic Issue a command Place data

Get data

Close the session