SQL: The Query Language - PowerPoint PPT Presentation

1 / 38
About This Presentation
Title:

SQL: The Query Language

Description:

Would adding DISTINCT to this query make a difference? ... Would adding DISTINCT to this variant of the ... Similarly, EXCEPT queries re-written using NOT IN. ... – PowerPoint PPT presentation

Number of Views:24
Avg rating:3.0/5.0
Slides: 39
Provided by: RaghuRama46
Category:
Tags: sql | language | query | readding

less

Transcript and Presenter's Notes

Title: SQL: The Query Language


1
SQL The Query Language
  • Relation Model Topic 4

2
Basic SQL Query
  • SELECT DISTINCT target-list
  • FROM relation-list
  • WHERE qualification
  • ORDER BY subset-of-target-list

3
Conceptual 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.

4
Example of Conceptual Evaluation
SELECT S.sname FROM Sailors S, Reserves
R WHERE S.sidR.sid AND R.bid103
5
A 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
6
In 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?)

7
Find 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?

8
Expressions 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.

9
Find 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
10
Find 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!

11
Nested 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.

12
Similar, 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
13
Nested 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?)

14
More 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)
15
Rewriting 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?)

16
Division 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))
17
Aggregate 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)
18
Find name and age of the oldest sailor(s)
SELECT S.sname, MAX (S.age) FROM Sailors S
  • The first query is illegal!

19
GROUP 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
20
Queries 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.

21
Conceptual 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.

22
Find 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
23
For 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?

24
Find 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!

25
Find 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)
26
Creating 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)

27
Queries 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
28
Creating 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
29
Inserting New Records
  • Single record insertion

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
30
Deleting 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.

31
Modifying 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.

32
Primary 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) )
33
Foreign 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) )
34
Enforcing 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?

35
Referential 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 )

36
Updates 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
37
Embedded 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

38
Null 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.
Write a Comment
User Comments (0)
About PowerShow.com