1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

61
SQL: Structured Query Language (‘Sequel’) Chapter 5

Transcript of 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

Page 1: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

1

SQL: Structured Query Language(‘Sequel’)

Chapter 5

Page 2: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

3

Running Example

sid sname rating age

22 dustin 7 45.0

31 lubber 8 55.558 rusty 10 35.0

sid sname rating age28 yuppy 9 35.031 lubber 8 55.544 guppy 5 35.058 rusty 10 35.0

sid bid day

22 101 10/10/9658 103 11/12/96

R1

S1

S2

Instances of the Sailors and Reserves relations in our examples.

Page 3: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

4

Basic SQL Query

relation-list A list of relation names target-list A list of attributes of relations in

relation-list qualification

• Comparisons (Attr op const or Attr1 op Attr2, where op is one of ) combined using AND, OR and NOT.

DISTINCT is optional keyword indicating that answer should not contain duplicates. Default is that duplicates are not eliminated!

SELECT [DISTINCT] target-listFROM relation-listWHERE qualification

, , , , ,

Page 4: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

5

Example Query

SELECT S.snameFROM Sailors S, Reserves RWHERE S.sid=R.sid AND R.bid=103

Page 5: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

6

Comparisons in Oracle

Page 6: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

7

Conceptual Evaluation Strategy

Semantics of SQL query defined in terms of conceptual evaluation strategy:

• Compute cross-product of relation-list.• Discard resulting tuples if they fail

qualifications.• Delete attributes that are not in target-list.• If DISTINCT is specified, eliminate duplicate

rows. Probably the least efficient way! Optimizer must find more efficient strategies

to compute same answers.

SELECT S.snameFROM Sailors S, Reserves RWHERE S.sid=R.sid AND R.bid=103

Page 7: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

8

sid sname rating age

22 dustin 7 45.0

31 lubber 8 55.558 rusty 10 35.0

sid bid day

22 101 10/10/9658 103 11/12/96

R S

(sid) sname rating age (sid) bid day

22 dustin 7 45.0 22 101 10/ 10/ 96

22 dustin 7 45.0 58 103 11/ 12/ 96

31 lubber 8 55.5 22 101 10/ 10/ 96

31 lubber 8 55.5 58 103 11/ 12/ 96

58 rusty 10 35.0 22 101 10/ 10/ 96

58 rusty 10 35.0 58 103 11/ 12/ 96

SELECT S.snameFROM Sailors S, Reserves RWHERE S.sid=R.sid AND R.bid=103

Page 8: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

10

A Note on Range Variables Needed only if same relation appears twice in FROM

clause. The previous query can also be written as:

SELECT S.snameFROM Sailors S, Reserves RWHERE S.sid=R.sid AND bid=103

SELECT snameFROM Sailors, Reserves WHERE Sailors.sid=Reserves.sid AND bid=103

It is good style, however, to use range variables always!

OR

Page 9: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

11

Find sailors who’ve reserved at least one boat

Question: What is the output of this query ?

SELECT S.sidFROM Sailors S, Reserves RWHERE S.sid=R.sid

Page 10: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

13

Expressions and Strings

AS and = are two ways to name fields in result. LIKE is used for string matching. `_’ stands for any one

character and `%’ stands for 0 or more arbitrary characters.

MEANING of Query: Find sailors (age of sailor and two fields defined by

expressions) whose names begin and end with B and contain at least three characters.

SELECT S.age, age1=S.age-5, 2*S.age AS age2FROM Sailors SWHERE S.sname LIKE ‘B_%B’

Page 11: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

14

SQL Queries Using Set Operations

Page 12: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

15

UNIONcompute union of any two union-compatible sets of tuples

SELECT S.sidFROM Sailors S, Reserves R, Boats BWHERE S.sid=R.sid AND R.bid=B.bid AND (B.color=‘red’ OR B.color=‘green’)

SELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’UNIONSELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘green’

Find sid’s of sailors who’ve reserved a red or a green boat

Page 13: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

17

If we replace OR by AND as done below, what are the semantics?

SELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND (B.color=‘red’ AND B.color=‘green’)

Find sid’s of sailors who’ve reserved a red and a green boat.

Page 14: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

18

SELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’

INTERSECT

SELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘green’

Find sid’s of sailors who’ve reserved a red and a green boat

INTERSECT: compute intersection of two union-compatible sets of tuples.

What happens if change S.sid as S.sname ?

Key field!

Page 15: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

20

SELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’INTERSECTSELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘green’

Find sid’s of sailors who’ve reserved a red and a green boat

Could query be written without INTERSECT?

SELECT S.sidFROM Sailors S, Boats B1, Reserves R1, Boats B2, Reserves R2WHERE (S.sid=R1.sid AND R1.bid=B1.bid AND B1.color=‘red’ ) AND (S.sid=R2.sid AND R2.bid=B2.bid AND B2.color=‘green’)

Do we need Sailors relation in the FROM clauses?

Page 16: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

22

SELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’EXCEPTSELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘green’

Find sid’s of sailors who’ve reserved a red and not a green boat

What if we want to compute the DIFFERENCE instead?

SELECT S.sidFROM Sailors S, Boats B1, Reserves R1, Boats B2, Reserves R2WHERE S.sid=R1.sid AND R1.bid=B1.bid AND S.sid=R2.sid AND R2.bid=B2.bid AND (B1.color='red' AND NOT(B2.color = 'green'))

SQL/92 standard, but some systems don’t support EXCEPT.

What then?

Page 17: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

23

SELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’EXCEPTSELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘green’

Find sid’s of sailors who’ve reserved a red and not a green boat

What if we want to compute the DIFFERENCE instead?

SELECT S.sidFROM Sailors S, Boats B1, Reserves R1, Boats B2, Reserves R2WHERE S.sid=R1.sid AND R1.bid=B1.bid AND S.sid=R2.sid AND R2.bid=B2.bid AND (B1.color='red' AND NOT(B2.color = 'green'))

Except is SQL/92 standard, but some systems don’t . support EXCEPT.

Is the above query correct, or not correct ?

Page 18: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

24

About duplication

Default: Eliminate duplicate

Unless we use special keyword “ALL” :

# of copies of a row in result

UNION ALL (m+n)INTERSECT ALL min(m,n)EXCEPT ALL m-n

Page 19: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

25

Nested Queries

Page 20: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

26

Nested Queries

WHERE, FROM, HAVING clauses can itself contain another SQL query, called a subquery.

powerful feature of SQL.

SELECT S.snameFROM Sailors SWHERE S.sid IN (SELECT R.sid FROM Reserves R WHERE R.bid=103)

Find names of sailors who’ve reserved boat #103:

Page 21: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

27

Nested Queries Evaluation

Nested loops evaluation: For each Sailors tuple,

• Evaluate the WHERE clause qualification• Which here means re-compute subquery.

SELECT S.snameFROM Sailors SWHERE S.sid IN (SELECT R.sid FROM Reserves R WHERE R.bid=103)

Find names of sailors who’ve reserved boat #103:

Page 22: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

28

Nested Queries

Change query to find sailors who’ve not reserved #103:

SELECT S.snameFROM Sailors SWHERE S.sid IN (SELECT R.sid FROM Reserves R WHERE R.bid=103)

Find names of sailors who’ve reserved boat #103:

SELECT S.snameFROM Sailors SWHERE S.sid NOT IN (SELECT R.sid FROM Reserves R WHERE R.bid=103)

Page 23: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

29

Nested Queries

Could this query be rewritten without nesting?

SELECT S.snameFROM Sailors SWHERE S.sid IN (SELECT R.sid FROM Reserves R WHERE R.bid=103)

Find names of sailors who’ve reserved boat #103:

Page 24: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

30

Nested Queries with Correlation

EXISTS is another set comparison operator, like IN.

SELECT S.snameFROM Sailors SWHERE EXISTS (SELECT * FROM Reserves R WHERE R.bid=103 AND S.sid=R.sid)

Find names of sailors who’ve reserved boat #103:

Page 25: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

31

Nested Queries with Correlation

Why, in general, this subquery must be re-computed for each Sailors tuple ?

Could this query be rewritten into a flat SQL query?

SELECT S.snameFROM Sailors SWHERE EXISTS (SELECT * FROM Reserves R WHERE R.bid=103 AND S.sid=R.sid)

Find names of sailors who’ve reserved boat #103:

Page 26: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

33

More on Set-Comparison Operators op ANY and op ALL where op = { }

Find sailors whose rating is greater than that of some sailor called Horatio:

IN is equal to =ANY

NOT IN is equal to <>ANY

, , , , ,

SELECT *FROM Sailors SWHERE S.rating > ANY (SELECT S2.rating FROM Sailors S2 WHERE S2.sname=‘Horatio’)

Page 27: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

34

More on Set-Comparison Operators

What if there is no other sailor with that name? “> ALL” would return TRUE if set is empty.

SELECT *FROM Sailors SWHERE S.rating > ALL (SELECT S2.rating FROM Sailors S2 WHERE S2.sname=‘Horatio’)

Find sailors whose rating is greater than that of all sailors called Horatio:

Page 28: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

35

Rewriting INTERSECT Queries Using IN

Find sid’s of sailors who’ve reserved both a red and a green boat:

SELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’ AND S.sid IN (SELECT S2.sid FROM Sailors S2, Boats B2, Reserves R2 WHERE S2.sid=R2.sid AND R2.bid=B2.bid AND B2.color=‘green’)

Page 29: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

36

Rewriting INTERSECT Queries Using IN

INTERSECT queries re-written using IN.

Note: This query can return “sname” (and not just “sid) of Sailors who’ve reserved both red and green boats

Find sname’s of sailors who’ve reserved both a red and a green boat:

SELECT S.snameFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’ AND S.sid IN (SELECT S2.sid FROM Sailors S2, Boats B2, Reserves R2 WHERE S2.sid=R2.sid AND R2.bid=B2.bid AND B2.color=‘green’)

Page 30: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

37

Division in SQLFind sailors who’ve reserved all boats.

Page 31: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

38

Division in SQL

SELECT S.snameFROM Sailors SWHERE NOT EXISTS ((SELECT B.bid FROM Boats B) EXCEPT (SELECT R.bid FROM Reserves R WHERE R.sid=S.sid))

Find sailors who’ve reserved all boats.

Page 32: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

39

Division in SQL

Can we do it without EXCEPT ?

SELECT S.snameFROM Sailors SWHERE NOT EXISTS ((SELECT B.bid FROM Boats B) EXCEPT (SELECT R.bid FROM Reserves R WHERE R.sid=S.sid))

Find sailors who’ve reserved all boats.

(1)

Page 33: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

40

Division in SQL

Let’s do it without EXCEPT:

SELECT S.snameFROM Sailors SWHERE NOT EXISTS ((SELECT B.bid FROM Boats B) EXCEPT (SELECT R.bid FROM Reserves R WHERE R.sid=S.sid))

SELECT S.snameFROM Sailors SWHERE 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))

Sailors S such that ...

there is no boat B without ...

a Reserves tuple showing S reserved B

Find sailors who’ve reserved all boats.

(1)

(2)

Page 34: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

41

Aggregation and Having Clauses

Page 35: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

42

Aggregate Operators

Significant extension of relational algebra.

COUNT (*)COUNT ( [DISTINCT] A)SUM ( [DISTINCT] A)AVG ( [DISTINCT] A)MAX (A)MIN (A)

Why no Distinct?

Page 36: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

43

Aggregate Operators

COUNT (*)COUNT ( [DISTINCT] A)SUM ( [DISTINCT] A)AVG ( [DISTINCT] A)MAX (A)MIN (A)

SELECT AVG (S.age)FROM Sailors SWHERE S.rating=10

SELECT COUNT (*)FROM Sailors S

Why no Distinct?

SELECT COUNT (DISTINCT S.rating)FROM Sailors SWHERE S.sname=‘Bob’

Page 37: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

44

More Examples of Aggregate Operators

SELECT AVG ( DISTINCT S.age)FROM Sailors SWHERE S.rating=10

SELECT S.snameFROM Sailors SWHERE S.rating= (SELECT MAX(S2.rating) FROM Sailors S2)

Page 38: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

47

Find name and age of the oldest sailor(s)

SELECT S.sname, MAX (S.age)FROM Sailors S

SELECT S.sname, S.ageFROM Sailors SWHERE S.age = (SELECT MAX (S2.age) FROM Sailors S2)

•Is this first query legal?

Is this second query legal?

•No! •Why not ?

Page 39: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

48

Motivation for Grouping So far, aggregate operators to all (qualifying)

tuples. Question?

What if want to apply aggregate to each group of tuples. Example :

Find the age of the youngest sailor for each rating level. Example Procedure :

Suppose rating values {1,2,…,10}, 10 queries:

SELECT MIN (S.age)FROM Sailors SWHERE S.rating = i

For i = 1, 2, ... , 10:

Page 40: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

49

Motivation for Grouping

What’s the problem with above ? • We don’t know how many rating levels

exist.• Nor what the rating values for these

levels are.

SELECT MIN (S.age)FROM Sailors SWHERE S.rating = i

For i = 1, 2, ... , 10:

Page 41: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

50

Add Group By to SQL

Page 42: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

51

Queries With GROUP BY and HAVING

A group is a set of tuples that each have the same value for all attributes in grouping-list.

HAVING clause is a restriction on each group.

SELECT [DISTINCT] target-listFROM relation-listWHERE qualificationGROUP BY grouping-listHAVING group-qualification

Page 43: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

52

Queries With GROUP BY and HAVING

target-list contains :(i) attribute names (ii) aggregate-op (column-name) (e.g., MIN (S.age)).

A group is a set of tuples that each have the same value for all attributes in grouping-list.

REQUIREMENT: - target-list (i) grouping-list. - Why?

- Each answer tuple of a group must have single value.

SELECT [DISTINCT] target-listFROM relation-listWHERE qualificationGROUP BY grouping-listHAVING group-qualification

Page 44: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

53

Find age of the youngest sailor with age 18, for each rating with at least 2 such sailors

SELECT S.rating, MIN (S.age) AS min-ageFROM Sailors SWHERE S.age >= 18GROUP BY S.ratingHAVING COUNT (*) > 1

Page 45: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

54

GroupBy --- Conceptual Evaluation

1. Compute the cross-product of relation-list2. Discard tuples that fail qualification 3. Delete `unnecessary’ fields4. Partition the remaining tuples into groups by the value

of attributes in grouping-list. (GroupBy)5. Eliminate groups using the group-qualification (Having)

We will have a single value per group That is, one answer tuple is generated per qualifying

group.

Page 46: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

55

Find age of the youngest sailor with age 18, for each rating with at least 2 such sailors

SELECT S.rating, MIN (S.age) AS min-age

FROM Sailors SWHERE S.age >= 18GROUP BY S.ratingHAVING COUNT (*) > 1

sid sname rating age

22 dustin 7 45.0

29 brutus 1 33.0

31 lubber 8 55.5

32 andy 8 25.5

58 rusty 10 35.0

64 horatio 7 35.0

71 zorba 10 16.0

74 horatio 9 35.0

85 art 3 25.5

95 bob 3 63.5

96 frodo 3 25.5

Sailors instance:

Page 47: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

56

Find age of the youngest sailor with age 18, for each rating with at least 2 such sailors.

rating age

7 45.0

1 33.0

8 55.5

8 25.5

10 35.0

7 35.0

10 16.0

9 35.0

3 25.5

3 63.5

3 25.5

rating minage 3 25.5 7 35.0 8 25.5

rating age

1 33.0

3 25.5

3 63.5

3 25.5

7 45.0

7 35.0

8 55.5

8 25.5

9 35.0

10 35.0

Page 48: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

60

Find age of the youngest sailor with age 18, for each rating with at least 2 sailors between 18 and 60.

SELECT S.rating, MIN (S.age) AS min-age

FROM Sailors SWHERE S.age >= 18 AND S.age <= 60GROUP BY S.ratingHAVING COUNT (*) > 1

sid sname rating age

22 dustin 7 45.0

29 brutus 1 33.0

31 lubber 8 55.5

32 andy 8 25.5

58 rusty 10 35.0

64 horatio 7 35.0

71 zorba 10 16.0

74 horatio 9 35.0

85 art 3 25.5

95 bob 3 63.5

96 frodo 3 25.5

Answer relation:

Sailors instance:

rating minage 3 25.5 7 35.0 8 25.5

Page 49: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

61

For each red boat, find the number of reservations for this boat

Grouping over Join of three relations. Q: What do we get if we remove B.color=‘red’ from

WHERE clause and add HAVING clause with this condition?

• No difference. But Illegal.• Only column in GroupBy can appear in Having,

unless in aggregate operator of Having

SELECT B.bid, COUNT (*) AS s-countFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’GROUP BY B.bid

Page 50: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

62

Find age of the youngest sailor with age > 18, for each rating with at least 2 sailors (of any age)

HAVING COUNT(*) >1

SELECT S.rating, MIN (S.age)FROM Sailors SWHERE S.age > 18GROUP BY S.ratingHAVING 1 < (SELECT COUNT (*) FROM Sailors S2 WHERE S.rating=S2.rating)

HAVING clause can also contain a subquery.

Find age of the youngest sailor with age > 18, for each rating with at least 2 such sailors (of age 18)

Page 51: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

63

Find those ratings for which the average age is the minimum over all ratings

WRONG : Aggregate operations cannot be nested!

SELECT S.ratingFROM Sailors SWHERE S.age = (SELECT MIN (AVG (S2.age))

FROM Sailors S2)

Page 52: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

65

SELECT Temp.rating, Temp.avg-age

FROM (SELECT S.rating, AVG (S.age) AS avg-age FROM Sailors S GROUP BY S.rating) AS Temp

WHERE Temp.avg-age = (SELECT MIN (avg-age) FROM (SELECT S.rating, AVG(S.age) as avg_age FROM Sailors S GROUP BY S.rating))

Find those ratings for which the average age is the minimum over all ratings

Correct solution (in SQL/92):

Page 53: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

66

Null Values

Page 54: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

67

Null Values

Field values in a tuple are sometimes : Unknown (e.g., a rating has not been assigned) or Inapplicable (e.g., no maiden-name when a male person)

SQL provides a special value null for such situations.

The presence of null complicates many issues.

Page 55: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

68

Comparisons Using Null Values

(S.rating = 8) is TRUE or FALSE ?? What if rating has null value in tuple ?

We need a 3-valued logic : condition can be true, false or unknown.

SQL special operators IS NULL to check if value is/is not null.

Disallow NULL value : rating INTEGER NOT NULL

Page 56: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

69

Comparison with NULL values

Arithmetic operations on NULL return NULL.

Comparison operators on NULL return UNKNOWN.

We can explicitly check whether a value is null or not by IS NULL and by IS NOT NULL.

Page 57: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

70

Truth table with UNKNOWN

UNKNOWN AND TRUE = UNKNOWNUNKNOWN OR TRUE = TRUEUNKNOWN AND FALSE = FALSEUNKNOWN OR FALSE = UNKNOWNUNKNOWN AND UNKNOWN = UNKNOWNUNKNOWN OR UNKNOWN = UNKNOWNNOT UNKNOWN = UNKNOWN

WHERE clause is satisfied only when it evaluates to TRUE.

Page 58: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

71

Outer Joins : Special Operators

Left Outer Join Right Outer Join Full Outer Join

SELECT S.sid, R.bidFROM Sailors S NATURAL LEFT OUTER JOIN Reserves R

SELECT S.sid, R.bidFROM Sailors S LEFT OUTER JOIN Reserves RON S.sid = R.sid

Sailors rows (left) without a matching Reserves row (right) appear in result, but not vice versa.

Page 59: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

72

Sorting: ORDER BY clause

SELECT * FROM StudentWHERE sNumber >= 1ORDER BY sNumber, sName

(sNumber, sName) ( (sNumber >= 1) (Student))

Page 60: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

73

SQL Queries - Summary

SELECT [DISTINCT] a1, a2, …, anFROM R1, R2, …, Rm[WHERE C1][GROUP BY g1, g2, …, gl [HAVING C2]][ORDER BY o1, o2, …, oj]

Page 61: 1 SQL: Structured Query Language (‘Sequel’) Chapter 5.

74

Summary SQL was important factor in early acceptance of

relational model : easy-to-understand !

Relationally complete: in fact, significantly more expressive power than relational algebra.

Many alternative ways to write a query. So optimizer must look for most efficient evaluation plan.

In practice, users (still) need to be aware of how queries are optimized and evaluated for best results.