advanced sql queries

Post on 01-Jan-2016

171 Views

Category:

Documents

7 Downloads

Preview:

Click to see full reader

DESCRIPTION

Advanced SQL Queries. Example Tables Used. Rewriting Minus Queries. Name and id of sailors that has reserved at least one red boat and has never reserved green boat. SELECT S.sname, S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid = R.sid and R.bid = B.bid - PowerPoint PPT Presentation

TRANSCRIPT

1

Advanced SQL QueriesAdvanced SQL Queries

2

Example Tables UsedExample Tables Used

Reserves

sid bid day

22

58

101

103

10/10/04

11/12/04

Sailors

sid sname rating age

22

31

58

Dustin

Lubber

Rusty

7

8

10

45.0

55.5

35.0

Boats

bid bname color

101

103

Nancy

Gloria

red

green

3

Rewriting Rewriting MinusMinus Queries Queries

SELECT S.sname, S.sid

FROM Sailors S, Boats B, Reserves R

WHERE S.sid = R.sid and R.bid = B.bid

and B.color = ‘red’

MINUS

SELECT S.sname, S.sid

FROM Sailors S, Boats B, Reserves R

WHERE S.sid = R.sid and R.bid = B.bid

and B.color = ‘green’;

Name and id of sailors that has reserved at least one red boat and has never reserved green boat

4

Rewriting Rewriting MinusMinus Queries Queries Using Using Not InNot In

SELECT S.sname, S.sid

FROM Sailors S, Boats B, Reserves R

WHERE S.sid = R.sid

and R.bid = B.bid

and B.color = ‘red’

and S.sid NOT IN (

SELECT R.sid

FROM Boats B, Reserves R

WHERE R.bid = B.bid and B.color = ‘green’);

5

Rewriting Rewriting MinusMinus Queries Queries Using Using Not ExistsNot Exists

SELECT S.sname, S.sid

FROM Sailors S, Boats B, Reserves R

WHERE S.sid = R.sid and R.bid = B.bid

and B.color = ‘red’

and NOT EXISTS (

SELECT *

FROM Boats B, Reserves R

WHERE R.sid = S.sid and R.bid = B.bid and B.color = ‘green’);

6

DivisionDivision

• Consider: A(X,Y) and B(Y).

Then AB =

• In general, we require that the set of fields in B be contained in those of A.

A}, B)y( |x{ yx

7

Suppliers from A who supply Suppliers from A who supply All Parts from B (1)All Parts from B (1)

sno pno

S1

S1

S1

S1

S2

S2

S3

S4

S4

P1

P2

P3

P4

P1

P2

P2

P2

P4A

P2

pno

B1

sno

=

8

Suppliers from A who supply Suppliers from A who supply All Parts from B (1)All Parts from B (1)

sno pno

S1

S1

S1

S1

S2

S2

S3

S4

S4

P1

P2

P3

P4

P1

P2

P2

P2

P4A

P2

pno

B1

sno

=S1

S2

S3

S4

9

Suppliers from A who supply Suppliers from A who supply All Parts from B (2)All Parts from B (2)

sno pno

S1

S1

S1

S1

S2

S2

S3

S4

S4

P1

P2

P3

P4

P1

P2

P2

P2

P4A

sno

=P2

P4

pno

B2

10

Suppliers from A who supply Suppliers from A who supply All Parts from B (2)All Parts from B (2)

sno pno

S1

S1

S1

S1

S2

S2

S3

S4

S4

P1

P2

P3

P4

P1

P2

P2

P2

P4A

sno

=P2

P4

pno

B2

S1

S4

11

Suppliers from A who supply Suppliers from A who supply All Parts from B (3)All Parts from B (3)

sno pno

S1

S1

S1

S1

S2

S2

S3

S4

S4

P1

P2

P3

P4

P1

P2

P2

P2

P4A

sno

=P1

P2

P4

pno

B3

12

Suppliers from A who supply Suppliers from A who supply All Parts from B (3)All Parts from B (3)

sno pno

S1

S1

S1

S1

S2

S2

S3

S4

S4

P1

P2

P3

P4

P1

P2

P2

P2

P4A

sno

=P1

P2

P4

pno

B3

S1

13

Sailors who Reserved all Sailors who Reserved all BoatsBoats

(sid,bid

Reserves) (bid

Boats)

Sailor S whose "set of boats

reserved" contains the "set of

all boats"

14

Division in SQL (1)Division in SQL (1)

SELECT sid

FROM Sailors S

WHERE NOT EXISTS

(SELECT B.bid

FROM Boats B

WHERE B.bid NOT IN

(SELECT R.bid

FROM Reserves R

WHERE R.sid = S.sid));

Sailor S for which there does not exist a boat B in Boats that he did not reserve

15

Division in SQL (2)Division in SQL (2)

SELECT S.sid

FROM Sailors S

WHERE NOT EXISTS(

SELECT B.bid

FROM Boats B

WHERE NOT EXISTS(

SELECT R.bid

FROM Reserves R

WHERE R.bid=B.bid and

R.sid=S.sid))

Sailor S for which there does not exist a boat B in Boats that he did not reserve

16

Division in SQL (3)Division in SQL (3)

SELECT S.sid

FROM Sailors S

WHERE NOT EXISTS((SELECT B.bid

FROM Boats B)

MINUS

(SELECT R.bid

FROM Reserves R

WHERE R.sid = S.sid));

Sailor S for which there does not exist

a boat B in Boats for which there is no

reservation in Reserves

17

AggregationAggregation

18

Aggregate OperatorsAggregate Operators

• The aggregate operators available in SQL are:

– COUNT(*)

– COUNT([DISTINCT] A)

– SUM([DISTINCT] A)

– AVG([DISTINCT] A)

– MAX(A)

– MIN(A)

• NULL values are ignored

19

Some ExamplesSome Examples

SELECT COUNT(*)

FROM Sailors S

SELECT AVG(S.age)

FROM Sailors S

WHERE S.rating=10

SELECT COUNT(distinct color)

FROM Boats

SELECT COUNT(sid)

FROM Sailors S

20

Find Average Age for each Find Average Age for each RatingRating

• So far, aggregation has been

applied to all tuples that

passed the WHERE clause test.

• How can we apply aggregation

to groups of tuples?

21

Basic SQL QueryBasic SQL Query

SELECT [Distinct] target-list

FROM relation-list

WHERE condition

GROUP BY grouping-list

HAVING group-condition;

•target-list: Fields appearing in grouping-list and aggregation operators

•group-condition: Can only constrain attributes appearing in grouping-list and aggregation operators

22

EvaluationEvaluation

1. Compute cross product of relations in FROM

2. Tuples failing WHERE are thrown away

3. Tuples are partitioned into groups by values

of grouping-list attributes

4. The group-condition is applied to eliminate

groups

5. One answer in generated for each group

23

Find Average Age for each Find Average Age for each RatingRating

SELECT AVG(age)

FROM Sailors

GROUP BY rating;

24

Sailors

sid snameratin

gage

22

31

58

63

78

84

Dustin

Lubber

Rusty

Fluffy

Morley

Popey

e

7

8

10

7

7

10

45.0

55.5

35.0

44.0

31.0

33.0

Sailors

sid snameratin

gage

22

63

78

31

58

84

Dustin

Fluffy

Morley

Lubber

Rusty

Popey

e

7

7

7

8

10

10

45.0

44.0

31.0

55.5

35.0

33.0

40 55.5 34

25

Find name and age of Find name and age of oldest Sailoroldest Sailor

SELECT S.sname, MAX(S.age)

FROM Sailors S

Wrong!

SELECT S.sname, MAX(S.age)

FROM Sailors S

GROUP BY S.sname

Wrong: we don’t obtain what we want

26

Find name and age of Find name and age of oldest Sailoroldest Sailor

SELECT S.sname, S.age

FROM Sailors S

WHERE S.age >= ALL

(SELECT S2.age

FROM Sailors S2)

SELECT S.sname, S.age

FROM Sailors S

WHERE S.age =

(SELECT MAX(S2.age)

FROM Sailors S2)

Right!!

How else can this be done?

Hint: >= ALL

27

What does this return?What does this return?

SELECT B.bid, COUNT(*)

FROM Boats B, Reserves R

WHERE R.bid=B.bid and B.color=‘red’

GROUP BY B.bid

Tuples: (id of reserved red boat,

number of reservations of the red boat)

What would happen if we put the condition about the color in the HAVING clause?

28

What would happen if we What would happen if we put the condition about put the condition about the color in the HAVING the color in the HAVING

clause?clause?

SELECT B.bid, COUNT(*)

FROM Boats B, Reserves R

WHERE R.bid=B.bid

GROUP BY B.bid, B.color

HAVING B.color=‘red’

We have also to put the color in the grouping list!

29

Names of Boats that were Names of Boats that were not Reserved on more than not Reserved on more than

5 days5 days

Can we move the condition in the HAVING to the WHERE?

SELECT bname

FROM Boats B, Reserves R

WHERE R.bid=B.bid

GROUP BY bid, bname

HAVING count(DISTINCT day) <= 5

Aggregate functions are not allowed in WHERE

30

The Color for which there The Color for which there are the most boatsare the most boats

SELECT color

FROM Boats B

GROUP BY color

HAVING max(count(bid))

What is wrong with this?

How would you fix it?

31

The Color for which there The Color for which there are the most boatsare the most boats

SELECT color

FROM Boats B

GROUP BY color

HAVING count(bid) >= ALL

(SELECT count(bid)

FROM Boats

GROUP BY Color)

32

Aggregation Instead of Aggregation Instead of ExistsExists

• Aggregation can take the place of

exists.

• Example:SELECT color

FROM Boats B1

WHERE NOT EXISTS(

SELECT *

FROM Boats B2

WHERE B1.bid <> B2.bid

AND B1.color=B2.color)

The color of the boat that there is no other boat of this color

33

Aggregation Instead of Aggregation Instead of ExistsExists

SELECT color

FROM Boats B1

GROUP BY color

HAVING count(bid) = 1

34

Sub-queries and ViewsSub-queries and Views

35

A Complex QueryA Complex Query

• We would like to create a table

containing 3 columns:

– Sailor id

– Sailor age

– Age of the oldest Sailor

How can this be done?

36

Attempt 1Attempt 1

SELECT S.sid, S.age, MAX(S.age)

FROM Sailors S;

Why is this wrong?

37

Attempt 2Attempt 2

SELECT S.sid, S.age, MAX(S.age)

FROM Sailors S

GROUP BY S.sid, S.age;

Why is this wrong?

Each group contains only one tuple

38

Solution 1:Solution 1:Sub-query in FROMSub-query in FROM

SELECT S.sid, S.age, M.mxage

FROM Sailors S,(SELECT MAX(S2.age) as mxage

FROM Sailors S2) M;

•We can put a query in the FROM clause instead of a table

•The sub-query in the FROM clause must be renamed with a range variable (M in this case).

39

Solution 2:Solution 2:Sub-query in SELECTSub-query in SELECT

SELECT S.sid, S.age, (SELECT MAX(S2.age)

FROM Sailors S2)

FROM Sailors S;

•A sub-query in the SELECT clause must return at most one value for each row returned by the outer query.

40

Another Example of a Another Example of a Sub-query in SELECTSub-query in SELECT

SELECT S.sid, S.age, (SELECT MAX(S2.age)

FROM Sailors S2

WHERE S2.age<S.age)

FROM Sailors S;

•What does this query return? For each sailor S, the age of the oldest sailor among the sailors younger than S

•Note the use of S (defined in the outer query) in the sub-query.

41

Another Example of a Another Example of a Sub-query in FROM??Sub-query in FROM??

SELECT S.sid, S.age, M.mxage

FROM Sailors S, (SELECT MAX(S2.age) as mxage

FROM Sailors S2

WHERE S2.age<S.age) M;

Why is this wrong?

We cannot refer to S.age in a sub-query in FROM

42

Solution 3: Create a TableSolution 3: Create a Table

CREATE TABLE MaxAge as

SELECT MAX(S.age) as mxage

FROM Sailors S;

SELECT S.sid, S.age, M.mxage

FROM Sailors S, MaxAge M;

MUST Rename

!

Problem: how to update MaxAge table?

43

ViewsViews

• A view is a "virtual table" defined using

a query

• You can use a view as if it were a table,

even though it doesn't contain data

• The view is computed every time that

it is referenced

44

Advantages and Advantages and DisadvantagesDisadvantages

• Advantages:

– no memory used for views

– update of table does not require updating views

– gives query processor more choices for

optimizing

• Disadvantages:

– must be recomputed every time used

– if tables that view uses are dropped, view data is

lost

45

Solution 4: ViewsSolution 4: Views

• A View is a query that looks like a table and can be used as a table.

CREATE OR REPLACE VIEW MaxAge as

SELECT MAX(S.age) as mxage

FROM Sailors S;

SELECT S.sid, S.age, M.mxage

FROM Sailors S, MaxAge M;

MUST Rename

!

46

Another Example of ViewsAnother Example of Views

CREATE OR REPLACE VIEW MaxAges AS

SELECT S1.sid, S2.age AS mxage

FROM Sailors S1, Sailors S2

WHERE S2.age = (SELECT MAX(S3.age)

FROM Sailors S3

WHERE S3.age < S1.age);

SELECT S.sid, S.age, M.mxage

FROM Sailors S, MaxAges M

WHERE S.sid = M.sid;

47

Views For Restricting Views For Restricting AccessAccess

• Suppose that we have a table:

Grades(Login, Exercise, Grade)

• We would like a user to only be able to see his own grades. We create the following view and grant privileges to query the view (not the underlying table)

CREATE OR REPLACE VIEW UserGrades as

SELECT *

FROM Grades

WHERE Login = User;

The system defines the user name.

top related