85
MIS 335 - Database Systems SQL: Queries, Constraints, Triggers Ahmet Onur Durahim http://www.mis.boun.edu.tr/durahim/

MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

  • Upload
    others

  • View
    34

  • Download
    0

Embed Size (px)

Citation preview

Page 1: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

MIS 335 - Database SystemsSQL: Queries, Constraints, Triggers

Ahmet Onur Durahimhttp://www.mis.boun.edu.tr/durahim/

Page 2: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Learning Objectives

• Basics of SQL

• Conceptual Evaluation of SQL Queries

• Range Variables, Expressions and Strings

• Nested Queries

• Joins, Aggregate Operators

• General Constraints

• Grouping

• Triggers

Page 3: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Example Instances

• “Sailors” and “Reserves” relations

• If the key for the Reserves relation contained only the attributes sid and bid, how would the semantics differ?

sid sname rating age

22 dustin 7 45.0

31 lubber 8 55.5

58 rusty 10 35.0

sid sname rating age

28 yuppy 9 35.0

31 lubber 8 55.5

44 guppy 5 35.0

58 rusty 10 35.0

sid bid day

22 101 10/10/96

58 103 11/12/96

R1

S1

S2

Page 4: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Basic SQL Query

• SQL is the standard for querying relational data

• Basic query structure

• Relation-list: A list of relation names (possibly with a range-variable after each name)

• Target-list: A list of attributes of relations in relation-list

SELECT [DISTINCT] target-listFROM relation-listWHERE qualification

Page 5: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Basic SQL Query

• SQL is the standard for querying relational data• Basic query structure

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

• DISTINCT is an optional keyword indicating that the answer should not contain duplicates– Default is that duplicates are not eliminated!

SELECT [DISTINCT] target-listFROM relation-listWHERE qualification

, , , , ,

Page 6: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Conceptual Evaluation Strategy

• Semantics of an SQL query defined in terms of the following conceptual evaluation strategy:– Compute the 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

• This strategy is probably the least efficient way to compute a query!– A query optimizer will find more efficient strategies to

compute the same answers

Page 7: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Example of Conceptual Evaluation• Query: Find names of sailors who’ve reserved boat #103

• Solution (Rel.Alg.):

• Solution (SQL):

sname bidserves Sailors(( Re ) )

103

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

(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

Page 8: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Range Variables• Really needed only if the same relation appears

twice in the 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=103OR

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

• Range variables are necessary when joining a table with itself !!

Page 9: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Expressions and Strings

• Illustrates use of arithmetic expressions and string pattern matching:– Find triples (of ages of sailors and two fields defined

by expressions) for sailors whose names begin and end with B and contain at least three characters

• 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

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

Page 10: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

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

• UNION: Can be used to compute the union of any two union-compatible sets of tuples (which are themselves the result of SQL queries)

• If we replace OR by AND in the first version, what do we get?

SELECT S.sidFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bidAND (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’

Page 11: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

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

• EXCEPT: Used to compute the set difference of two union-compatible sets of tuples

• What do we get if we replace UNION by EXCEPT in the previous query?

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’

Page 12: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

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

• EXCEPT: Used to compute the set difference of two union-compatible sets of tuples

• What do we get if we replace UNION by EXCEPT in the previous query?

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’

Page 13: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

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

• EXCEPT: Used to compute the set difference of two union-compatible sets of tuples

SELECT R.sidFROM Boats B, Reserves RWHERE R.bid=B.bid

AND B.color=‘red’EXCEPTSELECT R.sidFROM Boats B, Reserves RWHERE R.bid=B.bid

AND B.color=‘green’

Page 14: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

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

• INTERSECT: Can be used to compute the intersection of any two union-compatible sets of tuples.

• Included in the SQL/92 standard, but some systems don’t support it.

• Contrast symmetry of the UNION and INTERSECT queries with how much the other versions differ

SELECT S.sidFROM Sailors S, Boats B1, Reserves R1,

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

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’

Key field!

Page 15: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

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

BID Colr

b1 red

b2 grn

SID BID

s1 b1

s1 b2

s2 b1

BID Colr SID BID

b1 red s1 b1

b1 red s1 b2

b1 red s2 b1

b2 grn s1 b1

b2 grn s1 b2

b2 grn s2 b1

B1R1

B1 X R1

B1 X R1

X

Page 16: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

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

SID BID

s1 b1

s1 b2

s2 b1

BID Colr SID BID

b1 red s1 b1

b1 red s1 b2

b1 red s2 b1

b2 grn s1 b1

b2 grn s1 b2

b2 grn s2 b1

R2 B1 X R1

SID BID BID Colr SID BID

S1 b1 b1 red s1 b1

s1 b1 b1 red s1 b2

S1 b1 b1 red s2 b1

s1 b1 b2 grn s1 b1

s1 b1 b2 grn s1 b2

s1 b1 b2 grn s2 b1

s1 b2 b1 red s1 b1

s1 b2 b1 red s1 b2

s1 b2 b1 red s2 b1

s1 b2 b2 grn s1 b1

s1 b2 b2 grn s1 b2

s1 b2 b2 grn s2 b1

s2 b1 b1 red s1 b1

s2 b1 b1 red s1 b2

s2 b1 b1 red s2 b1

s2 b1 b2 grn s1 b1

s2 b1 b2 grn s1 b2

s2 b1 b2 grn s2 b1

R2 X B1 X R1

X

Page 17: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

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

SID BID BID Colr SID BID

s1 b1 b1 red s1 b1

s1 b1 b1 red s1 b2

S1 b1 b1 red s2 b1

s1 b1 b2 grn s1 b1

s1 b1 b2 grn s1 b2

s1 b1 b2 grn s2 b1

s1 b2 b1 red s1 b1

s1 b2 b1 red s1 b2

s1 b2 b1 red s2 b1

s1 b2 b2 grn s1 b1

s1 b2 b2 grn s1 b2

s1 b2 b2 grn s2 b1

s2 b1 b1 red s1 b1

s2 b1 b1 red s1 b2

s2 b1 b1 red s2 b1

s2 b1 b2 grn s1 b1

s2 b1 b2 grn s1 b2

s2 b1 b2 grn s2 b1

BID Colr

b1 red

b2 grn

B2

BID Colr SID BID BID Colr SID BID

b1 red s1 b1 b1 red s1 b1

b1 red s1 b1 b1 red s1 b2

b1 red s1 b1 b1 red s2 b1

b1 red s1 b1 b2 grn s1 b1

b1 red s1 b1 b2 grn s1 b2

b1 red s1 b1 b2 grn s2 b1

b1 red s1 b2 b1 red s1 b1

b1 red s1 b2 b1 red s1 b2

b1 red s1 b2 b1 red s2 b1

b1 red s1 b2 b2 grn s1 b1

b1 red s1 b2 b2 grn s1 b2

b1 red s1 b2 b2 grn s2 b1

b1 red s2 b1 b1 red s1 b1

b1 red s2 b1 b1 red s1 b2

b1 red s2 b1 b1 red s2 b1

b1 red s2 b1 b2 grn s1 b1

b1 red s2 b1 b2 grn s1 b2

b1 red s2 b1 b2 grn s2 b1

B2 X R2 X B1 X R1 (First half)

R2 X B1 X R1

X

Page 18: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

BID Colr SID BID BID Colr SID BID

b2 grn s1 b1 b1 red s1 b1

b2 grn s1 b1 b1 red s1 b2

b2 grn S1 b1 b1 red s2 b1

b2 grn s1 b1 b2 grn s1 b1

b2 grn s1 b1 b2 grn s1 b2

b2 grn s1 b1 b2 grn s2 b1

b2 grn s1 b2 b1 red s1 b1

b2 grn s1 b2 b1 red s1 b2

b2 grn s1 b2 b1 red s2 b1

b2 grn s1 b2 b2 grn s1 b1

b2 grn s1 b2 b2 grn s1 b2

b2 grn s1 b2 b2 grn s2 b1

b2 grn s2 b1 b1 red s1 b1

b2 grn s2 b1 b1 red s1 b2

b2 grn s2 b1 b1 red s2 b1

b2 grn s2 b1 b2 grn s1 b1

b2 grn s2 b1 b2 grn s1 b2

b2 grn s2 b1 b2 grn s2 b1

B2 X R2 X B1 X R1 (Second half)

SELECT S.sidFROM Sailors S, Boats B1, Reserves R1,

Boats B2, Reserves R2WHERE S.sid=R1.sid AND R1.bid=B1.bidAND S.sid=R2.sid AND R2.bid=B2.bidAND (B1.color=‘red’ AND

B2.color=‘green’)

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

Page 19: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

BID Colr SID BID BID Colr SID BID

b2 grn s1 b1 b1 red s1 b1

b2 grn s1 b1 b1 red s1 b2

b2 grn S1 b1 b1 red s2 b1

b2 grn s1 b1 b2 grn s1 b1

b2 grn s1 b1 b2 grn s1 b2

b2 grn s1 b1 b2 grn s2 b1

b2 grn s1 b2 b1 red s1 b1

b2 grn s1 b2 b1 red s1 b2

b2 grn s1 b2 b1 red s2 b1

b2 grn s1 b2 b2 grn s1 b1

b2 grn s1 b2 b2 grn s1 b2

b2 grn s1 b2 b2 grn s2 b1

b2 grn s2 b1 b1 red s1 b1

b2 grn s2 b1 b1 red s1 b2

b2 grn s2 b1 b1 red s2 b1

b2 grn s2 b1 b2 grn s1 b1

b2 grn s2 b1 b2 grn s1 b2

b2 grn s2 b1 b2 grn s2 b1

B2 X R2 X B1 X R1 (Second half)

SELECT R1.sidFROM Boats B1, Reserves R1, Boats B2,

Reserves R2WHERE R1.sid =R2.sid AND

R1.bid=B1.bid AND R2.bid=B2.bidAND (B1.color=‘red’ AND

B2.color=‘green’)

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

Page 20: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

BID Colr SID BID BID Colr SID BID

b2 grn s1 b1 b1 red s1 b1

b2 grn s1 b1 b1 red s1 b2

b2 grn S1 b1 b1 red s2 b1

b2 grn s1 b1 b2 grn s1 b1

b2 grn s1 b1 b2 grn s1 b2

b2 grn s1 b1 b2 grn s2 b1

b2 grn s1 b2 b1 red s1 b1

b2 grn s1 b2 b1 red s1 b2

b2 grn s1 b2 b1 red s2 b1

b2 grn s1 b2 b2 grn s1 b1

b2 grn s1 b2 b2 grn s1 b2

b2 grn s1 b2 b2 grn s2 b1

b2 grn s2 b1 b1 red s1 b1

b2 grn s2 b1 b1 red s1 b2

b2 grn s2 b1 b1 red s2 b1

b2 grn s2 b1 b2 grn s1 b1

b2 grn s2 b1 b2 grn s1 b2

b2 grn s2 b1 b2 grn s2 b1

B2 X R2 X B1 X R1 (Second half)

SELECT R1.sidFROM Boats B1, Reserves R1, Boats B2,

Reserves R2WHERE R1.sid =R2.sid AND

R1.bid=B1.bid AND R2.bid=B2.bid

AND (B1.color=‘red’ ANDB2.color=‘green’)

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

Page 21: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

BID Colr SID BID BID Colr SID BID

b2 grn s1 b1 b1 red s1 b1

b2 grn s1 b1 b1 red s1 b2

b2 grn S1 b1 b1 red s2 b1

b2 grn s1 b2 b1 red s1 b1

b2 grn s1 b2 b1 red s1 b2

b2 grn s1 b2 b1 red s2 b1

b2 grn s2 b1 b1 red s1 b1

b2 grn s2 b1 b1 red s1 b2

b2 grn s2 b1 b1 red s2 b1

B2 X R2 X B1 X R1 (Second half)

SELECT R1.sidFROM Boats B1, Reserves R1, Boats B2,

Reserves R2WHERE R1.sid =R2.sid AND

R1.bid=B1.bid AND R2.bid=B2.bid

AND (B1.color=‘red’ ANDB2.color=‘green’)

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

Page 22: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

BID Colr SID BID BID Colr SID BID

b2 grn s1 b1 b1 red s1 b1

b2 grn s1 b1 b1 red s1 b2

b2 grn S1 b1 b1 red s2 b1

b2 grn s1 b2 b1 red s1 b1

b2 grn s1 b2 b1 red s1 b2

b2 grn s1 b2 b1 red s2 b1

b2 grn s2 b1 b1 red s1 b1

b2 grn s2 b1 b1 red s1 b2

b2 grn s2 b1 b1 red s2 b1

B2 X R2 X B1 X R1 (Second half)

SELECT R1.sidFROM Boats B1, Reserves R1, Boats B2,

Reserves R2WHERE R1.sid =R2.sid AND

R1.bid=B1.bid AND R2.bid=B2.bidAND (B1.color=‘red’ AND

B2.color=‘green’)

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

Page 23: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

BID Colr SID BID BID Colr SID BID

b2 grn s1 b2 b1 red s1 b1

b2 grn s1 b2 b1 red s1 b2

b2 grn s1 b2 b1 red s2 b1

B2 X R2 X B1 X R1 (Second half)

SELECT R1.sidFROM Boats B1, Reserves R1, Boats B2,

Reserves R2WHERE R1.sid =R2.sid AND

R1.bid=B1.bid AND R2.bid=B2.bidAND (B1.color=‘red’ AND

B2.color=‘green’)

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

Page 24: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

BID Colr SID BID BID Colr SID BID

b2 grn s1 b2 b1 red s1 b1

b2 grn s1 b2 b1 red s1 b2

b2 grn s1 b2 b1 red s2 b1

B2 X R2 X B1 X R1 (Second half)

SELECT R1.sidFROM Boats B1, Reserves R1, Boats B2,

Reserves R2WHERE R1.sid =R2.sid AND

R1.bid=B1.bid AND R2.bid=B2.bid

AND (B1.color=‘red’ ANDB2.color=‘green’)

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

Page 25: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

BID Colr SID BID BID Colr SID BID

b2 grn s1 b2 b1 red s1 b1

b2 grn s1 b2 b1 red s2 b1

B2 X R2 X B1 X R1 (Second half)

SELECT R1.sidFROM Boats B1, Reserves R1, Boats B2,

Reserves R2WHERE R1.sid =R2.sid AND

R1.bid=B1.bid AND R2.bid=B2.bid

AND (B1.color=‘red’ ANDB2.color=‘green’)

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

Page 26: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

BID Colr SID BID BID Colr SID BID

b2 grn s1 b2 b1 red s1 b1

b2 grn s1 b2 b1 red s2 b1

B2 X R2 X B1 X R1 (Second half)

SELECT R1.sidFROM Boats B1, Reserves R1, Boats B2,

Reserves R2

WHERE R1.sid =R2.sid AND

R1.bid=B1.bid AND R2.bid=B2.bidAND (B1.color=‘red’ AND

B2.color=‘green’)

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

Page 27: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

BID Colr SID BID BID Colr SID BID

b2 grn

s1b2 b1 red

s1b1

B2 X R2 X B1 X R1 (Second half)

SELECT R1.sidFROM Boats B1, Reserves R1, Boats B2,

Reserves R2WHERE R1.sid =R2.sid AND

R1.bid=B1.bid AND R2.bid=B2.bidAND (B1.color=‘red’ AND

B2.color=‘green’)

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

Page 28: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

For (i=1…10) do {x=x+1;For (j=1…5) do {

y=y+1;}

}

SELECT S.snameFROM Sailors SWHERE S.sid IN (SELECT R.sid

FROM Reserves RWHERE R.bid=103)

• A very powerful feature of SQL: a WHERE clause can itself contain an SQL query! (Actually, so can FROM and HAVING clauses)

• To understand semantics of nested queries, think of a nested loops evaluation: – For each Sailors tuple, check the qualification by computing the

subquery

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

Page 29: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

SELECT S.snameFROM Sailors SWHERE S.sid IN (SELECT R.sid

FROM Reserves RWHERE R.bid=103)

Nested QueriesFind names of sailors who’ve reserved boat #103:

Page 30: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

SELECT S.snameFROM Sailors SWHERE S.sid NOT IN (SELECT R.sid

FROM Reserves RWHERE R.bid=103)

Nested QueriesFind names of sailors who’ve NOT reserved boat #103:

Page 31: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

SELECT S.snameFROM Sailors SWHERE EXISTS (SELECT *

FROM Reserves RWHERE R.bid=103 AND S.sid = R.sid)

• EXISTS is another set comparison operator, like IN

Nested Queries with Correlation

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

Page 32: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

SELECT S.snameFROM Sailors SWHERE UNIQUE (SELECT R.sid

FROM Reserves RWHERE R.bid=103 AND S.sid = R.sid)

• If UNIQUE is used, and * is replaced by R.bid– UNIQUE checks for duplicate tuples; returns true if no row

appears twice – UNIQUE returns true if the answer is empty– * denotes all attributes; Why do we have to replace * by R.bid?

• Illustrates why, in general, subquery must be re-computed for each Sailors tuple

Nested Queries with CorrelationFind names of sailors with at most one reservation for boat #103:

Page 33: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

More on Set-Comparison Operators

• We’ve already seen IN, EXISTS and UNIQUE. Can also use negated versions: NOT IN, NOT EXISTS and NOT UNIQUE

• Also available: op ANY, op ALL, op IN

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

SELECT *FROM Sailors SWHERE S.rating > ANY (SELECT S2.rating

FROM Sailors S2WHERE S2.sname=‘Horatio’)

)}( ),( ),( , , ,{

Page 34: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Rewriting INTERSECT Queries Using IN

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

• Similarly, EXCEPT queries re-written using NOT IN

• To find names (not sid’s) of Sailors who’ve reserved both red and green boats, just replace S.sid by S.snamein SELECT clause. (What about INTERSECT query?)

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.sidFROM Sailors S2, Boats B2, Reserves R2WHERE S2.sid=R2.sid AND R2.bid=B2.bid

AND B2.color=‘green’)

Page 35: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Rewriting INTERSECT Queries Using IN• Find sid’s of sailors who’ve reserved both a red and a green

boat:• To find names (not sid’s) of Sailors who’ve reserved both

red and green boats, just replace S.sid by S.sname in SELECT clause. (What about INTERSECT query?)

SELECT S.snameFROM Sailors SWHERE S.sid IN (( SELECT R.sid

FROM Boats B, Reserves RWHERE R.bid=B.bid AND B.color=‘red’)INTERSECT

(SELECT R.sidFROM Boats B2, Reserves R2WHERE R2.bid=B2.bid AND B2.color=‘green’)

Page 36: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Division in SQL• Find sailors who’ve reserved

all boats

• How to do it the hard way, without EXCEPT?

SELECT S.snameFROM Sailors SWHERE NOT EXISTS

((SELECT B.bidFROM Boats B)

EXCEPT(SELECT R.bidFROM Reserves RWHERE 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 RWHERE 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

Page 37: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Joins (SQL 2003 std, source: wikipedia)

Department Table

DepartmentID DepartmentName

31 Sales

33 Engineering

34 Clerical

35 Marketing

Employee Table

LastName DepartmentID

Rafferty 31

Jones 33

Steinberg 33

Robinson 34

Smith 34

Jasper 36

Adapted from the slides of Yücel Saygın

Page 38: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Inner Joins

SELECT * FROM employee INNER JOIN department

ON employee.DepartmentID = department.DepartmentID

SELECT * FROM employee, department WHERE employee.DepartmentID = department.DepartmentID

Page 39: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Inner Joins

Employee.LastName Employee.DepartmentID Department.DepartmentName Department.DepartmentID

Smith 34 Clerical 34

Jones 33 Engineering 33

Robinson 34 Clerical 34

Steinberg 33 Engineering 33

Rafferty 31 Sales 31

Page 40: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Joins

Employee.LastName DepartmentID Department.DepartmentName

Smith 34 Clerical

Jones 33 Engineering

Robinson 34 Clerical

Steinberg 33 Engineering

Rafferty 31 Sales

SELECT * FROM employee NATURAL JOIN department

SELECT * FROM employee CROSS JOIN department

SELECT * FROM employee, department;

Page 41: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Joins (Outer Joins)

Employee.

LastName

Employee.

DepartmentID

Department.

DepartmentName

Department.

DepartmentID

Jones 33 Engineering 33

Rafferty 31 Sales 31

Robinson 34 Clerical 34

Smith 34 Clerical 34

Jasper 36 NULL NULL

Steinberg 33 Engineering 33

SELECT * FROM employee LEFT OUTER JOIN department

ON department.DepartmentID = employee.DepartmentID

Page 42: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Joins (Full Outer Join)

• Some DBMSs do not support FULL OUTER JOIN!• Can you implement FULL OUTER JOIN WITH LEFT

and RIGHT OUTER JOINS?

SELECT * FROM employee FULL OUTER JOIN department

ON department.DepartmentID = employee.DepartmentID

Page 43: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Aggregate Operators• Significant extension of relational

algebra• A function where the values of

multiple rows are grouped together as input on certain criteria to form a single value of more significant meaning or measurement such as a set, a bag or a list

http://en.wikipedia.org/wiki/Aggregate_function http://msdn.microsoft.com/en-us/library/ms173454.aspx

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

single column

• Used to write statistical queries• Mainly used for reporting such as

– Total sales in 2014– Average, max, min income of employees– Total number of employees hired in 2014

Page 44: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Aggregate Operators

http://en.wikipedia.org/wiki/Aggregate_function http://msdn.microsoft.com/en-us/library/ms173454.aspx

COUNT (*): The number of values in a tableCOUNT ( [DISTINCT] A): The number of (unique) values in the A columnSUM ( [DISTINCT] A): The sum of all (unique) values in the A columnAVG ( [DISTINCT] A): The average of all (unique) values in the A columnMAX (A): The maximum value in the A columnMIN (A) : The minimum value in the A column

Page 45: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Aggregate Operators• Except for COUNT, aggregate functions

ignore null values• Aggregate functions are frequently

used with the GROUP BY clause of the SELECT statement

http://en.wikipedia.org/wiki/Aggregate_function http://msdn.microsoft.com/en-us/library/ms173454.aspx

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

single column

SELECT COUNT (*)FROM Sailors S

• Total number of Sailors?

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

• Average age of Sailors whose ratings are 10

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

• Average distinct age of Sailors whose ratings are 10

Page 46: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

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

single column

SELECT COUNT (S.rating)FROM Sailors S

• How many different ratings are there among the Sailors?

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

• Number of distinct ratings in Sailors whose names are Bob

SELECT COUNT (DISTINCT S.rating)FROM Sailors S

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

FROM Sailors S2)

• Name of Sailors whose ratings are equal to the maximum rating among Sailors

?

Page 47: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Find name and age of the oldest sailor(s)

• This query is illegal!– If the Select clause uses an aggregate operation,

then it must use only aggregate operations unless the query contains a GROUP BY clause

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

• This query is allowed in the SQL/92 standard, but is not supported in some systems

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

FROM Sailors S2)= S.age

Page 48: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Find name and age of the oldest sailor(s)

• This query is allowed in the SQL/92 standard and is valid for all systems

SELECT S.sname, S.ageFROM Sailors SWHERE S.age =

(SELECT MAX (S2.age)FROM Sailors S2)

• This query is allowed in the SQL/92 standard, but is not supported in some systems

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

FROM Sailors S2)= S.age

SELECT S.sname, S.ageFROM Sailors SWHERE S.age > ALL

(SELECT S2.ageFROM Sailors S2)

Page 49: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Motivation for Grouping• We’ve applied aggregate operators to all (qualifying)

tuples• Sometimes, we want to apply them to each of several

groups of tuples• Find the age of the youngest sailor for each rating level

– In general, we don’t know how many rating levels exist, and what the rating values for these levels are

– Suppose we know that rating values go from 1 to 10; we can write 10 queries that look like this:

For i = 1, 2, ... , 10:SELECT MIN (S.age)FROM Sailors SWHERE S.rating = i

Page 50: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Queries with GROUP BY and HAVING

• The target-list contains i. attribute names

ii. terms with aggregate operations (e.g., MIN (S.age))

• The attribute list (i) must be a subset of grouping-list

• Each answer tuple corresponds to a group, and these attributes must have a single value per group– A group is a set of tuples that have the same value for all

attributes in grouping-list

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

Page 51: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Conceptual Evaluation• The cross-product of relation-list is computed, tuples

that fail qualification are discarded, `unnecessary’ fields are deleted, and the remaining tuples are partitioned into groups by the value of attributes in grouping-list

• The group-qualification is then applied to eliminate some groups– Expressions in group-qualification must have a single value

per group• In effect, an attribute in group-qualification that is not an

argument of an aggregate op also appears in grouping-list

• One answer tuple is generated per qualifying group

Page 52: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

gr1

gr2

gr3

gr4

SELECT target-listFROM relation-listWHERE qualification

GROUP BY grouping-list HAVING group-qualification

RESULT

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

Conceptual Evaluation

Page 53: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Age=70

Age = 33

Age = 60

Age = 19

Age = 22

Age = 40

Age = 25Age = 20

Age = 32

Age = 18

Age = 39

Rating = 4

Rating=4

Rating=1

Rating=5

Rating=3

Rating=2

Rating =3

Rating=1

Rating=3

Rating=4

Rating=1

Rating=5

Rating=4

Rating=4

Rating=4

Rating=3

Rating=3

Rating=3

Rating=2

Rating=2

Rating=1gr1

gr2

gr3

gr4

Rating = 1

Rating = 2

Rating = 3

Rating =2

Rating = 4

SELECT S.ratingFROM Sailors SWHERE S.age >= 18

GROUP BY S.rating HAVING COUNT(*) > 1

RESULT

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

Conceptual Evaluation

Page 54: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

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

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

rating minage

3 25.5

7 35.0

8 25.5

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

Answer relation:

Sailors instance:

• Only S.rating and S.ageare mentioned in the SELECT, GROUP BY or HAVING clauses;

• 2nd column of result is named minage using AS

Page 55: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

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 56: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

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

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

FROM Sailors S2WHERE S.rating=S2.rating)

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:

• Shows HAVING clause can also contain a subquery.

• Compare this with the query where we considered only ratings with 2 sailors over 18!

• What if HAVING clause is replaced by:– HAVING COUNT(*) >1

Page 57: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

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

SELECT S.rating, MIN (S.age) AS minageFROM Sailors SWHERE S.age > 18GROUP BY S.ratingHAVING 1 < (SELECT COUNT (*)

FROM Sailors S2WHERE S.rating=S2.rating)

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:

rating minage

3 25.5

7 35.0

8 25.5

10 35.0

Answer relation:

Page 58: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

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

SELECT S.rating, MIN (S.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:• Shows HAVING clause can also contain a subquery.

• Compare this with the query where we considered only ratings with 2 sailors over 18!

• What if HAVING clause is replaced by:– HAVING COUNT(*) >1

Page 59: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

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

SELECT S.rating, MIN (S.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:

Answer relation:

rating minage

3 25.5

7 35.0

8 25.5

Page 60: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

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

• Aggregate operations cannot be nested! WRONG:

• Correct solution (in SQL/92):

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

SELECT Temp.rating, Temp.avgageFROM (SELECT S.rating, AVG (S.age) AS avgage

FROM _Sailors SGROUP BY S.rating) AS Temp

WHERE Temp.avgage = (SELECT MIN (Temp2.avgage)FROM (SELECT AVG (S.age) AS avgage

FROM _Sailors SGROUP BY S.rating) AS Temp2)

Page 61: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

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

Page 62: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

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

• Grouping over a join of three relations.• What do we get if we remove B.color=‘red’ from

the WHERE clause and add a HAVING clause with this condition?

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

SELECT B.bid, COUNT (*) AS scountFROM Sailors S, Boats B, Reserves RWHERE S.sid=R.sid AND R.bid=B.bidGROUP BY B.bidHAVING B.color=‘red’

Page 63: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Find the product models for which the maximum list price is more than twice the average for the model

USE AdventureWorks2008R2;GOSELECT p1.ProductModelIDFROM Production.Product p1GROUP BY p1.ProductModelIDHAVING MAX(p1.ListPrice) >= ALL(SELECT 2 * AVG(p2.ListPrice)FROM Production.Product p2WHERE p1.ProductModelID = p2.ProductModelID) ;GO

Page 64: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

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)

– SQL provides a special value null for such situations

• The presence of null complicates many issues– Special operators needed to check if value is/is not null

– Is rating>8 true or false when rating is equal to null? What about AND, OR and NOT connectives?

– We need a 3-valued logic (true, false and unknown)

– Meaning of constructs must be defined carefully• WHERE clause eliminates rows that don’t evaluate to true

– New operators (in particular, outer joins) possible/needed

Page 65: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Integrity Constraints• An IC describes conditions that every legal instance of a

relation must satisfy– Inserts/deletes/updates that violate IC’s are disallowed.

– Can be used to ensure application semantics (e.g., sid is a key), or

– Can be used to prevent inconsistencies (e.g., sname has to be a string, age must be < 200)

• Types of IC’s: Domain constraints, primary key constraints, foreign key constraints, general constraints.– Domain constraints: Field values must be of right type.

Always enforced

Page 66: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

General Constraints

• Useful when more general ICs than keys are involved

CREATE TABLE Sailors( sid INTEGER,sname CHAR(10),rating INTEGER,age REAL,PRIMARY KEY (sid),CHECK ( rating >= 1

AND rating <= 10 )

CREATE TABLE Reserves( sname CHAR(10),bid INTEGER,day DATE,PRIMARY KEY (bid,day),CONSTRAINT noInterlakeResCHECK (`Interlake’ <>

( SELECT B.bnameFROM Boats BWHERE B.bid=bid)))

• Can use queries to express constraint

• Constraints can be named

Page 67: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Constraints Over Multiple Relations

• Awkward and wrong!• If Sailors is empty, the

number of Boats tuples can be anything!

CREATE TABLE Sailors( sid INTEGER,sname CHAR(10),rating INTEGER,age REAL,PRIMARY KEY (sid),CHECK ( (SELECT COUNT (S.sid) FROM Sailors S)+ (SELECT COUNT (B.bid) FROM Boats B) < 100 )

Number of boatsplus number of sailors is < 100

• ASSERTION is the right solution; not associated with either table

CREATE ASSERTION smallClubCHECK ( (SELECT COUNT (S.sid) FROM Sailors S)+ (SELECT COUNT (B.bid) FROM Boats B) < 100 )

Page 68: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Triggers

• Trigger: procedure that starts automatically if specified changes occur to the DBMS– Deamon that monitors a database, and is executed

when the DB is modified in a way that matches the event specification

– An insert, delete or update statement could activate a trigger (before/after executing the changes)

• Three parts:– Event (activates the trigger)

– Condition (tests whether the triggers should run)

– Action (what happens if the trigger runs)

Page 69: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Triggers: Example (SQL:1999)

CREATE TRIGGER youngSailorUpdateAFTER INSERT ON SAILORS

REFERENCING NEW TABLE NewSailorsFOR EACH STATEMENT

INSERTINTO YoungSailors(sid, name, age, rating)SELECT sid, name, age, ratingFROM NewSailors NWHERE N.age <= 18

Page 70: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Summary• SQL was an important factor in the early

acceptance of the relational model– more natural than earlier, procedural query languages

• Relationally complete; in fact, significantly more expressive power than relational algebra

• Even queries that can be expressed in RA can often be expressed more naturally in SQL

• Many alternative ways to write a query; optimizer should look for most efficient evaluation plan– In practice, users need to be aware of how queries are

optimized and evaluated for best results

Page 71: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Summary

• NULL for unknown field values brings many complications

• SQL allows specification of rich integrity constraints

• Triggers respond to changes in the database

Page 72: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Sample Questions

Page 73: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Q11: List the names of managers with at least one dependent

EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO)

DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE)

DEPT_LOCATIONS(DNUMBER, DLOCATION)

PROJECT(PNAME, PNUMBER, PLOCATION, DNUM)

WORKSON(ESSN, PNO, HOURS)

DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP)

SELECT EMPLOYEE.NAME FROM EMPLOYEE, DEPARTMENT WHERE DEPARTMENT.MGRSSN = EMPLOYEE.SSN AND

EMPLOYEE.SSN IN (SELECT DISTINCT ESSN FROM DEPENDENT)

Page 74: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Q12: List the names of employees who do not work on a project controlled by department no 5

EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO)

DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE)

DEPT_LOCATIONS(DNUMBER, DLOCATION)

PROJECT(PNAME, PNUMBER, PLOCATION, DNUM)

WORKSON(ESSN, PNO, HOURS)

DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP)

SELECT NAMEFROM EMPLOYEEWHERE SSN NOT IN (SELECT WORKSON.ESSN

FROM WORKSON, PROJECTWHERE WORKSON.PNO = PROJECT.PNUMBER

AND PROJECT.DNUM = 5)

Page 75: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Q13: List the names of employees who do not work on all projects controlled by department no 5

EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO)

DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE)

DEPT_LOCATIONS(DNUMBER, DLOCATION)

PROJECT(PNAME, PNUMBER, PLOCATION, DNUM)

WORKSON(ESSN, PNO, HOURS)

DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP)

SELECT E.NAMEFROM WORKSON W, EMPLOYEE EWHERE E.SSN = W.ESSNAND EXISTS ((SELECT P.PNUMBER

FROM PROJECT PWHERE P.DNUM = 5)

EXCEPT (SELECT W1.PNOFROM WORKSON W1WHERE W1.ESSN = W.ESSN))

ORACLE DOES NOT SUPPORT EXCEPT!!! – SQL Server Supports it

Page 76: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Q13: List the names of employees who do not work on all projects controlled by department no 5

EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO)

DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE)

DEPT_LOCATIONS(DNUMBER, DLOCATION)

PROJECT(PNAME, PNUMBER, PLOCATION, DNUM)

WORKSON(ESSN, PNO, HOURS)

DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP)

SELECT E.NAMEFROM WORKSON W, EMPLOYEE EWHERE E.SSN = W.ESSN

AND EXISTS (SELECT P.PNUMBERFROM PROJECT PWHERE P.DNUM = 5AND NOT EXISTS (SELECT W1.ESSN

FROM WORKSON W1WHERE W1.ESSN = W.ESSN

AND W1.PNO = P.PNUMBER))

Page 77: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Q14: List the names of employees who do not have supervisors (IS NULL checks for null values!)

EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO)

DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE)

DEPT_LOCATIONS(DNUMBER, DLOCATION)

PROJECT(PNAME, PNUMBER, PLOCATION, DNUM)

WORKSON(ESSN, PNO, HOURS)

DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP)

SELECT NAMEFROM EMPLOYEEWHERE SUPERSSN IS NULL

Page 78: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Q15: Find the SUM of the salaries of all employees, the max salary, min salary and average salary

EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO)

DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE)

DEPT_LOCATIONS(DNUMBER, DLOCATION)

PROJECT(PNAME, PNUMBER, PLOCATION, DNUM)

WORKSON(ESSN, PNO, HOURS)

DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP)

SELECT SUM(SALARY) AS SALARY_SUM, MAX(SALARY) AS MAX_SALARY, MIN(SALARY) AS MIN_SALARY, AVG(SALARY) AS AVERAGE_SALARY

FROM EMPLOYEE

Page 79: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Q16: Find the SUM of the salaries of all employees, the max salary, min salary and average salary for research department

EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO)

DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE)

DEPT_LOCATIONS(DNUMBER, DLOCATION)

PROJECT(PNAME, PNUMBER, PLOCATION, DNUM)

WORKSON(ESSN, PNO, HOURS)

DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP)

SELECT SUM(SALARY) AS SALARY_SUM, MAX(SALARY) AS MAX_SALARY, MIN(SALARY) AS MIN_SALARY, AVG(SALARY) AS AVERAGE_SALARY

FROM EMPLOYEE, DEPARTMENTWHERE EMPLOYEE.DNO = DEPARTMENT.DNUMBER

AND DEPARTMENT.DNAME = 'RESEARCH'

Page 80: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Q17: Find the number of employees in research department

EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO)

DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE)

DEPT_LOCATIONS(DNUMBER, DLOCATION)

PROJECT(PNAME, PNUMBER, PLOCATION, DNUM)

WORKSON(ESSN, PNO, HOURS)

DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP)

SELECT COUNT(*) AS EMPLOYEE_COUNTFROM EMPLOYEE, DEPARTMENTWHERE EMPLOYEE.DNO = DEPARTMENT.DNUMBER

AND DEPARTMENT.DNAME = 'RESEARCH'

Page 81: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Q19: Display the names of the employees who do not practice birth control (more than 5 children)

EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO)

DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE)

DEPT_LOCATIONS(DNUMBER, DLOCATION)

PROJECT(PNAME, PNUMBER, PLOCATION, DNUM)

WORKSON(ESSN, PNO, HOURS)

DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP)

SELECT NAMEFROM EMPLOYEE WHERE SSN IN (SELECT ESSN

FROM DEPENDENTWHERE RELATIONSHIP = 'Child'GROUP BY ESSNHAVING COUNT(*) > 5)

Page 82: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Q20: For each department, retrieve the department number, number of employees in that department and the average salary

EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO)

DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE)

DEPT_LOCATIONS(DNUMBER, DLOCATION)

PROJECT(PNAME, PNUMBER, PLOCATION, DNUM)

WORKSON(ESSN, PNO, HOURS)

DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP)

SELECT DNO, COUNT(*) AS EMPLOYEE_COUNT, AVG(SALARY) AS AVERAGE_SALARY

FROM EMPLOYEE GROUP BY DNO

Page 83: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Q21: For each project, retrieve the project number, the project name, and the number of employees who work for that project

EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO)

DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE)

DEPT_LOCATIONS(DNUMBER, DLOCATION)

PROJECT(PNAME, PNUMBER, PLOCATION, DNUM)

WORKSON(ESSN, PNO, HOURS)

DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP)

SELECT PROJECT.PNAME, PROJECT.PNUMBER, COUNT(*) AS EMPLOYEE_COUNTFROM PROJECT, WORKSONWHERE WORKSON.PNO = PROJECT.PNUMBERGROUP BY PROJECT.PNUMBER

DO YOU SEE ANYTHING WRONG WITH THIS QUERY?

Page 84: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Q22: For each project on which more than two employees work, retrieve the project number, the project name, and the

number of employees who work on the project

EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO)

DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE)

DEPT_LOCATIONS(DNUMBER, DLOCATION)

PROJECT(PNAME, PNUMBER, PLOCATION, DNUM)

WORKSON(ESSN, PNO, HOURS)

DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP)

SELECT PROJECT.PNAME, PROJECT.PNUMBER, COUNT(*) AS EMPLOYEE_COUNTFROM PROJECT, WORKSONWHERE WORKSON.PNO = PROJECT.PNUMBERGROUP BY PROJECT.PNUMBER, PROJECT.PNAMEHAVING COUNT(*) > 2

Page 85: MIS 335 - Database Systemsmisprivate.boun.edu.tr/durahim/lectures/MIS335-W5-SQL.pdf · Basic SQL Query •SQL is the standard for querying relational data •Basic query structure

Q23: For each department that has more than five employees, retrieve the department number and the number of its

employees who are making more than 40000 yearly

EMPLOYEE(NAME, SSN, BDATE, ADDRESS, SALARY, SUPERSSN, DNO)

DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE)

DEPT_LOCATIONS(DNUMBER, DLOCATION)

PROJECT(PNAME, PNUMBER, PLOCATION, DNUM)

WORKSON(ESSN, PNO, HOURS)

DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP)

SELECT DNO, COUNT(*) AS EMPLOYEE_COUNTFROM EMPLOYEEWHERE SALARY * 12 > 40000

AND DNO IN (SELECT DNOFROM EMPLOYEEGROUP BY DNOHAVING COUNT(*) > 5)

GROUP BY DNO