Title: SQL: The Query Language
1SQL The Query Language
2Basic SQL Query
- SELECT DISTINCT target-list
- FROM relation-list
- WHERE qualification
- ORDER BY subset-of-target-list
3Conceptual Evaluation Strategy
- Semantics defined by a 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. - If ORDER BY is specified, sort the result.
4Example of Conceptual Evaluation
SELECT S.sname FROM Sailors S, Reserves
R WHERE S.sidR.sid AND R.bid103
5A Note on Range Variables
- Really needed only if the same relation appears
twice in the FROM clause.
SELECT S.sname FROM Sailors S, Reserves
R WHERE S.sidR.sid AND bid103
SELECT sname FROM Sailors, Reserves WHERE
Sailors.sidReserves.sid AND
bid103
6In alphabetical order, print names of sailors
whove reserved a red boat
SELECT S.sname FROM Sailors S, Boats B,
Reserves R WHERE S.sidR.sid AND R.bidB.bid AND
B.colorred ORDER BY S.sname
- It is illegal to replace S.sname byS.sid in the
ORDER BY clause! (Why?)
7Find sailors whove reserved at least one boat
SELECT S.sid FROM Sailors S, Reserves R WHERE
S.sidR.sid
- Would adding DISTINCT to this query make a
difference? - What is the effect of replacing S.sid by S.sname
in the SELECT clause? Would adding DISTINCT to
this variant of the query make a difference?
8Expressions and Strings
SELECT S.age, age1S.age-5, 2S.age AS age2 FROM
Sailors S WHERE S.sname LIKE B_B
- Arithmetic expressions, 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.
9Find sids of sailors whove reserved a red or a
green boat
SELECT S.sid FROM Sailors S, Boats B, Reserves
R WHERE S.sidR.sid AND R.bidB.bid AND
(B.colorred OR B.colorgreen)
- UNION computes the union of any two
union-compatible sets of tuples (which are
themselves the result of SQL queries). - Also available EXCEPT (i.e. set-minus).
What do we get if we replace UNION by EXCEPT?
SELECT S.sid FROM Sailors S, Boats B, Reserves
R WHERE S.sidR.sid AND R.bidB.bid AND
B.colorred UNION SELECT S.sid FROM Sailors
S, Boats B, Reserves R WHERE S.sidR.sid AND
R.bidB.bid AND B.colorgreen
10Find sids of sailors whove reserved a red and a
green boat
SELECT S.sid FROM Sailors S, Boats B1, Reserves
R1, Boats B2, Reserves R2 WHERE
S.sidR1.sid AND R1.bidB1.bid AND
S.sidR2.sid AND R2.bidB2.bid AND
(B1.colorred AND B2.colorgreen)
- INTERSECT computes the intersection of any two
union-compatible sets of tuples. - Contrast symmetry of the UNION and INTERSECT
queries with how much the other versions differ!
11Nested Queries
- 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 whove 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.
12Similar, but Different
- SELECT
- FROM Sailors S
- WHERE S.sname IN
- (SELECT Y.sname
- FROM YoungSailors Y)
SELECT S. FROM Sailors S, YoungSailors
Y WHERE S.sname Y.sname
13Nested Queries with Correlation
- 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?)
14More on Set-Comparison Operators
- Weve already seen IN, EXISTS and UNIQUE. Can
also use 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 S WHERE S.rating gt ANY
(SELECT S2.rating
FROM Sailors S2
WHERE S2.snameHoratio)
15Rewriting INTERSECT Queries Using IN
Find sids of sailors whove reserved both a red
and a green boat
SELECT S.sid FROM Sailors S, Boats B, Reserves
R WHERE S.sidR.sid AND R.bidB.bid AND
B.colorred AND S.sid IN (SELECT
S2.sid
FROM Sailors S2, Boats B2, Reserves R2
WHERE S2.sidR2.sid
AND R2.bidB2.bid
AND B2.colorgreen)
- Similarly, EXCEPT queries re-written using NOT
IN. - To find names (not sids) of Sailors whove
reserved both red and green boats, just replace
S.sid by S.sname in SELECT clause. (What about
INTERSECT query?)
16Division in SQL
SELECT S.sname FROM Sailors S WHERE NOT EXISTS
((SELECT B.bid
FROM Boats B) EXCEPT
(SELECT R.bid FROM
Reserves R WHERE R.sidS.sid))
Sailors whove reserved all boats...
- Lets do it the hard way, without EXCEPT
SELECT S.sname FROM Sailors S WHERE NOT EXISTS
(SELECT B.bid
FROM Boats B
WHERE NOT EXISTS (SELECT R.bid
FROM Reserves R
WHERE R.bidB.bid
AND R.sidS.sid))
17Aggregate Operators
COUNT () COUNT ( DISTINCT A) SUM ( DISTINCT
A) AVG ( DISTINCT A) MAX (A) MIN (A)
- Significant extension of relational algebra.
single column
SELECT AVG (S.age) FROM Sailors S WHERE
S.rating10
SELECT AVG ( DISTINCT S.age) FROM Sailors
S WHERE S.rating10
SELECT COUNT () FROM Sailors S
SELECT S.sname FROM Sailors S WHERE S.rating
(SELECT MAX(S2.rating)
FROM Sailors S2)
18Find name and age of the oldest sailor(s)
SELECT S.sname, MAX (S.age) FROM Sailors S
- The first query is illegal!
19GROUP BY and HAVING
- So far, weve applied aggregate operators to all
(qualifying) tuples. Sometimes, we want to apply
them to each of several groups of tuples. - Consider Find the age of the youngest sailor
for each rating level. - In general, we dont 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
(!)
SELECT MIN (S.age) FROM Sailors S WHERE
S.rating i
For i 1, 2, ... , 10
20Queries With GROUP BY and HAVING
SELECT DISTINCT target-list FROM
relation-list WHERE qualification GROUP
BY grouping-list HAVING group-qualification
ORDER BY subset-of-target-list
- 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.
21Conceptual Evaluation
- Cross-product of relation-list is computed
tuples that fail qualification are discarded
unnecessary fields are deleted 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.
22Find the age of the youngest sailor with age
18, for each rating with at least 2 such sailors
SELECT S.rating, MIN (S.age) FROM Sailors
S WHERE S.age gt 18 GROUP BY S.rating HAVING
COUNT () gt 1
- Only S.rating and S.age are mentioned in the
SELECT, GROUP BY or HAVING clauses
Answer relation
23For each red boat, find the number of
reservations for this boat
SELECT B.bid, COUNT () AS scount FROM Boats
B, Reserves R WHERE R.bidB.bid AND
B.colorred GROUP BY B.bid
- What do we get if we remove B.colorred from
the WHERE clause and add a HAVING clause with
this condition?
24Find the age of the youngest sailor with age gt
18, for each rating with at least 2 sailors (of
any age)
SELECT S.rating, MIN (S.age) FROM Sailors
S WHERE S.age gt 18 GROUP BY S.rating HAVING 1
lt (SELECT COUNT ()
FROM Sailors S2 WHERE
S.ratingS2.rating)
- Just like the WHERE clause, the HAVING clause can
also contain a subquery. - Compare this with the query where we considered
only ratings with 2 sailors over 18!
25Find those ratings for which the average age is
the minimum over all ratings
- Aggregate operations cannot be nested! WRONG
SELECT S.rating FROM Sailors S WHERE S.rating
(SELECT MIN (AVG (S2.age)) FROM Sailors S2)
- Correct solution (in SQL/92) View or Table Expr.
SELECT Temp.rating, Temp.avgage FROM (SELECT
S.rating, AVG (S.age) AS avgage FROM
Sailors S GROUP BY S.rating) AS
Temp WHERE Temp.avgage (SELECT MIN
(Temp.avgage)
FROM Temp)
26Creating Views
- A view is just a relation, but we store a
definition, rather than a set of tuples.
CREATE VIEW ActiveSailors (name, age, day) AS
SELECT S.sname, S.age, R.day FROM Sailors S,
Reserves R WHERE S.nameR.sname AND S.ratinggt6
- Views can be dropped using the DROP VIEW command.
- Views implement a conceptual schema (with
security and information hiding)
27Queries on Views
SELECT A.name, MAX ( A.day ) FROM Active
Sailors A GROUP BY A.name
- Evaluated using a technique known as query
modification - Note how sname has been renamed to name to
match the view definition.
SELECT name, MAX ( A.Day ) FROM ( SELECT
S.sname AS name, S.age, R.day FROM Sailors
S, Reserves R WHERE S.snameR.sname
AND S.ratinggt6 ) AS A GROUP BY
A.name
28Creating and Deleting Relations
CREATE TABLE Boats (bid INTEGER, bname
CHAR(10), color CHAR(10))
CREATE TABLE Reserves (sname CHAR(10), bid
INTEGER, day DATE)
ALTER TABLE Boats ADD COLUMN boatkind CHAR(10)
DROP TABLE Boats
29Inserting New Records
INSERT INTO Sailors (sid, sname, rating,
age) VALUES (12, Emmanuel, 5, 21.0)
- Multiple record insertion
INSERT INTO Sailors (sid, sname, rating,
age) SELECT S.sid, S.name, null, S.age FROM
Students S WHERE S.age gt 18
30Deleting Records
- Can delete all tuples that satisfy condition in a
WHERE clause
DELETE FROM Sailors S WHERE S.rating 5
- Example deletes all unrated sailors WHERE
clause can contain nested queries etc., in
general.
31Modifying Records
UPDATE Sailors S SET S.ratingS.rating-1 WHERE
S.age lt 15
- UPDATE command used to modify fields of existing
tuples. - WHERE clause is applied first and determines
fields to be modified. SET clause determines new
values. - If field being modified is also used to determine
new value, value on rhs is old value.
32Primary and Candidate Keys
CREATE TABLE Reserves ( sname CHAR(10) NOT
NULL, bid INTEGER, day DATE,
PRIMARY KEY (bid, day) UNIQUE (sname) )
CREATE TABLE Reserves ( sname CHAR(10)
bid INTEGER, day DATE, PRIMARY KEY
(sname, bid, day) )
33Foreign Keys
- Primary key fields cannot contain null values.
- Foreign key field values must match values in
some S tuple, or be null.
CREATE TABLE Reserves ( sname CHAR(10) NOT
NULL, bid INTEGER, day DATE,
PRIMARY KEY (bid, day) FOREIGN KEY (bid)
REFERENCES Boats )
CREATE TABLE Boats ( bid INTEGER,
bname CHAR(10) color CHAR(10),
PRIMARY KEY (bid) )
34Enforcing Referential Integrity
- What should be done if a Reserves tuple with a
non-existent boat id is inserted? (Reject it!) - What should be done if a Boats tuple is deleted?
- Disallow the deletion.
- Also delete all Reserves tuples that refer to it.
- Set bid of Reserves tuples that refer to it to a
default bid. - Set bid of Reserves tuples that refer to it to
null. - What if the primary key of a Boats tuple is
updated?
35Referential Integrity in SQL/92
- CREATE TABLE Reserves
- ( sname CHAR(10) NOT NULL,
- bid INTEGER DEFAULT 1000,
- day DATE,
- PRIMARY KEY (bid, day)
- UNIQUE (sname)
- FOREIGN KEY (bid)
- REFERENCES Boats
- ON DELETE CASCADE
- ON UPDATE SET DEFAULT )
36Updates on Views
R
- View update updating the underlying relations.
- Sometimes ambiguous or even impossible!
- E.g. delete (just) the highlighted tuple from
instance A of view ActiveSailors.
S
A
37Embedded SQL An Example
- char SQLSTATE6
- EXEC SQL BEGIN DECLARE SECTION
- char c_sname20 short c_minrating float c_age
- EXEC SQL END DECLARE SECTION
- c_minrating random()
- EXEC SQL DECLARE sinfo CURSOR FOR
- SELECT S.sname, S.age FROM Sailors S
- WHERE S.rating gt c_minrating
- do
- EXEC SQL FETCH sinfo INTO c_sname, c_age
- printf(s is d years old\n, c_sname, c_age)
- while (SQLSTATE ! 02000)
- EXEC SQL CLOSE sinfo
38Null Values
- Field values in a tuple are sometimes unknown
(e.g., a rating has not been assigned) or
inapplicable (e.g., no spouses name). - SQL provides a special value null for such
situations. - The presence of null complicates many issues.
E.g. - Special predicates needed to check if value is/is
not null. - How to represent nulls on disk, in memory?
- Is ratinggt8 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). - WHERE clause eliminates rows that dont evaluate
to true.