0% found this document useful (0 votes)
32 views

SQL: The Query Language (Part II)

The document discusses advanced SQL query techniques including expressions, strings, set operations, nested queries, correlated subqueries, aggregate functions, and finding the oldest sailor. Key points covered include using expressions and naming fields in the target list, the UNION, EXCEPT, and INTERSECT set operations, how correlated subqueries must be re-evaluated for each outer tuple, and comparing values using operators like IN, EXISTS and aggregates like COUNT, SUM, AVG.

Uploaded by

faraherh amber
Copyright
© © All Rights Reserved
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
32 views

SQL: The Query Language (Part II)

The document discusses advanced SQL query techniques including expressions, strings, set operations, nested queries, correlated subqueries, aggregate functions, and finding the oldest sailor. Key points covered include using expressions and naming fields in the target list, the UNION, EXCEPT, and INTERSECT set operations, how correlated subqueries must be re-evaluated for each outer tuple, and comparing values using operators like IN, EXISTS and aggregates like COUNT, SUM, AVG.

Uploaded by

faraherh amber
Copyright
© © All Rights Reserved
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 10

SQL: The Query Language (Part II)

Expressions and Strings


SELECT S.age, age1=S.age-5, 2*S.age AS age2
FROM Sailors S
WHERE S.sname LIKE ‘B_%B’
 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.
Find sid’s of sailors who’ve reserved a red or a green boat

SELECT S.sid
 UNION: Can be used to FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid
compute the union of any
AND (B.color=‘red’ OR B.color=‘green’)
two union-compatible sets
of tuples (which are
themselves the result of SELECT S.sid
FROM Sailors S, Boats B, Reserves R
SQL queries).
WHERE S.sid=R.sid AND
 Also available: EXCEPT R.bid=B.bid
(What do we get if we AND B.color=‘red’
replace UNION by EXCEPT?) UNION
SELECT S.sid
FROM Sailors S, Boats B, Reserves R
WHERE 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
SELECT S.sid
FROM Sailors S, Boats B1, Reserves R1,
 INTERSECT: Can be used to Boats B2, Reserves R2
compute the intersection WHERE S.sid=R1.sid AND R1.bid=B1.bid
AND S.sid=R2.sid AND R2.bid=B2.bid
of any two union-
AND (B1.color=‘red’ AND B2.color=‘green’)
compatible sets of tuples.
Key field!
 Included in the SQL/92
SELECT S.sid
standard, but some FROM Sailors S, Boats B, Reserves R
systems don’t support it. WHERE S.sid=R.sid AND
 Contrast symmetry of the R.bid=B.bid
AND B.color=‘red’
UNION and INTERSECT INTERSECT
queries with how much SELECT S.sid
the other versions differ. FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND
R.bid=B.bid
AND B.color=‘green’
Nested Queries
Find names of sailors who’ve reserved boat #103:
SELECT S.sname
FROM Sailors S
WHERE S.sid IN (SELECT R.sid
FROM Reserves R
WHERE 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 find sailors who’ve not reserved #103, use NOT IN.
 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 with Correlation
Find names of sailors who’ve reserved boat #103:
SELECT S.sname
FROM Sailors S
WHERE EXISTS (SELECT *
FROM Reserves R
WHERE R.bid=103 AND S.sid=R.sid)

 EXISTS is another set comparison operator, like IN.


 If UNIQUE is used, and * is replaced by R.bid, finds sailors with at
most one reservation for boat #103. (UNIQUE checks for duplicate
tuples; * 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.
More on Set-Comparison Operators
 We’ve already seen IN, EXISTS and UNIQUE. Can also
use NOT IN, NOT EXISTS and NOT UNIQUE.
 Also available: op SOME, op ALL, where op is
,, ,,, 
 Find sailors whose rating is greater than that of some
sailor called Horatio:
SELECT *
FROM Sailors S
WHERE S.rating > SOME (SELECT S2.rating
FROM Sailors S2
WHERE S2.sname=‘Horatio’)
COUNT (*)
COUNT ( [DISTINCT] A)
Aggregate Operators SUM ( [DISTINCT] A)
AVG ( [DISTINCT] A)
MAX (A)
 Significant extension of
MIN (A)
relational algebra.
single column
SELECT COUNT (*)
SELECT S.sname
FROM Sailors S
FROM Sailors S
SELECT AVG (S.age) WHERE S.rating= (SELECT MAX(S2.rating)
FROM Sailors S FROM Sailors S2)
WHERE S.rating=10

SELECT COUNT (DISTINCT S.rating) SELECT AVG ( DISTINCT S.age)


FROM Sailors S FROM Sailors S
WHERE S.sname=‘Bob’ WHERE S.rating=10
Find name and age of the oldest sailor(s)
SELECT S.sname, MAX (S.age)
 The first query is illegal! FROM Sailors S
(We’ll look into the reason
a bit later, when we SELECT S.sname, S.age
discuss GROUP BY.) FROM Sailors S
WHERE S.age =
 The third query is
(SELECT MAX (S2.age)
equivalent to the second
FROM Sailors S2)
query, and is allowed in
the SQL/92 standard, but SELECT S.sname, S.age
is not supported in some FROM Sailors S
systems. WHERE (SELECT MAX (S2.age)
FROM Sailors S2)
= S.age
Summary
 There are many ways to write a given query in SQL.
 Target-list syntax can include arithmetic, naming
 Set operations: UNION, EXCEPT, INTERSECT
 Nested queries:
– Uncorrelated: subquery can be executed once
– Correlated: subquery executed once per “outer” tuple
 Set comparisons: semantics can be tricky
– It’s just first-order predicate logic (, , , , )
 Aggregates: Useful, and not part of relational
algebra. 1

You might also like