0% found this document useful (0 votes)
45 views65 pages

SQL: Queries, Programming, Triggers: Database Management Systems, R. Ramakrishnan and J. Gehrke 1

1. SQL is the most widely used commercial relational database language, originally developed at IBM. 2. SQL has two main components - the Data Definition Language (DDL) for defining schemas and the Data Manipulation Language (DML) for querying and modifying data. 3. Basic SQL queries involve selecting fields, specifying tables, joining tables, and adding qualifications to filter results.

Uploaded by

Mohammad Diab
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
45 views65 pages

SQL: Queries, Programming, Triggers: Database Management Systems, R. Ramakrishnan and J. Gehrke 1

1. SQL is the most widely used commercial relational database language, originally developed at IBM. 2. SQL has two main components - the Data Definition Language (DDL) for defining schemas and the Data Manipulation Language (DML) for querying and modifying data. 3. Basic SQL queries involve selecting fields, specifying tables, joining tables, and adding qualifications to filter results.

Uploaded by

Mohammad Diab
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 65

SQL: Queries, Programming,

Triggers
Chapter 5

Database Management Systems, R. Ramakrishnan and J. Gehrke 1


SQL

 most widely used commercial relational db


language
 originally developed at IBM
 SQL:1999: current ANSI/ISO standard for
SQL

Database Management Systems, R. Ramakrishnan and J. Gehrke 2


SQL

 Data Definition Language (DDL): subset of SQL that


supports creation, deletion, and modification of
definitions for tables and views. Other aspects: define
integrity constraints on tables; specify access rights or
privileges to tables or views
 Data Manipulation Language (DML): subset of SQL
that allows users to pose queries and to insert, delete,
and modify rows.
 Other aspects in pages 131-132

Database Management Systems, R. Ramakrishnan and J. Gehrke 3


Example tables
Sailors(sid: integer, sname: string, rating: integer, age: real)

Boats(bid: integer, bname: string, color: string)

Reserves(sid: integer, bid: integer, day: date)

Database Management Systems, R. Ramakrishnan and J. Gehrke 4


R1 sid bid day
Example Instances 22 101 10/10/96
58 103 11/12/96
 We will use these S1 sid sname rating age
instances of the
Sailors and 22 dustin 7 45.0
Reserves relations 31 lubber 8 55.5
in our examples.
58 rusty 10 35.0
S2 sid sname rating age
28 yuppy 9 35.0
31 lubber 8 55.5
44 guppy 5 35.0
58 rusty 10 35.0
Database Management Systems, R. Ramakrishnan and J. Gehrke 5
SELECT [DISTINCT] target-list
Basic SQL Query FROM relation-list
WHERE qualification

 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
 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!

Database Management Systems, R. Ramakrishnan and J. Gehrke 6


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! An optimizer will find more
efficient strategies to compute the same answers.

Database Management Systems, R. Ramakrishnan and J. Gehrke 7


Example of Conceptual Evaluation
SELECT S.sname
FROM Sailors S, Reserves R
WHERE 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

Database Management Systems, R. Ramakrishnan and J. Gehrke 8


A Note on 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.sname
FROM Sailors S, Reserves R
It is good style,
WHERE S.sid=R.sid AND bid=103
however, to use
range variables
OR SELECT sname always!
FROM Sailors, Reserves
WHERE Sailors.sid=Reserves.sid
AND bid=103
Database Management Systems, R. Ramakrishnan and J. Gehrke 9
Example queries

(Q15) Find the names and ages of all sailors. (see text pp. 134-135)

(Q16) Find all sailors with a rating above 7. (see text pp. 135)

SELECT S.sname, S.age


FROM Sailors S

SELECT *
FROM Sailors S
WHERE S.rating > 7

Database Management Systems, R. Ramakrishnan and J. Gehrke 10


(Q4) Find sailors who’ve reserved at least one
boat
SELECT S.sid
FROM Sailors S, Reserves R
WHERE S.sid=R.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?

Database Management Systems, R. Ramakrishnan and J. Gehrke 11


Other example queries

 (Q16) Find the sids of sailors who have


reserved a red boat (see text pp. 138)

 (Q2) Find the names of sailors who have


reserved red boats (see text pp. 139)

 (Q3) Find the colors of boats reserved by


Lubber (see text pp. 139)

Database Management Systems, R. Ramakrishnan and J. Gehrke 12


Other example queries

SELECT R.sid
FROM Boats B, Reserves R
WHERE B.bid = R.bid AND B.color = ‘red’

SELECT S.sname
FROM Sailors S, Reserves R, Boats B
WHERE S.sid = R.sid AND R.bid = B.bid AND B.color = ‘red’

SELECT B.color
FROM Sailors S, Reserves R, Boats B
WHERE S.sid = R.sid AND R.bid = B.bid AND S.sname = ‘Lubber’

Database Management Systems, R. Ramakrishnan and J. Gehrke 13


Q17 : Compute increments for the ratings of persons
who have sailed two different boats on the same day
(see text pp. 140)

SELECT S.sname, S.rating+1 AS rating


FROM Sailors S, Reserves R1, Reserves R2
WHERE S.sid = R1.sid AND S.sid = R2.sid
AND R1.day = R2.day AND R1.bid <> R2.bid

Database Management Systems, R. Ramakrishnan and J. Gehrke 14


Expressions and Strings

Read 1st paragraph of Section 5.2.2 in pp. 139-140

Each item in a qualification can be as general as


expression1 = expressions2.

SELECT S1.sname AS name1, S2.sname AS name2


FROM Sailors S1, Sailors S2
WHERE 2*S1.rating=S2.rating-1

Database Management Systems, R. Ramakrishnan and J. Gehrke 15


Expressions and Strings

SQL provides support for pattern matching through


the LIKE operator, along with the use of the wild-card
symbols % (which stands for zero or more arbitrary
characters) and _ (which stands for exactly one, arbitrary,
character)

‘_AB%’  a pattern that will match every string that contains


at least three characters, with the second and third
characters being A and B respectively.

Database Management Systems, R. Ramakrishnan and J. Gehrke 16


Expressions and Strings

(Q18) Find the ages of sailors who have name begins and ends
with B and has at least three characters. (see text pp. 140)

SELECT S.age
FROM Sailors S
WHERE S.sname LIKE 'B.%B'

Database Management Systems, R. Ramakrishnan and J. Gehrke 17


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

 UNION: Can be used to SELECT R.sid


compute the union of any FROM Boats B, Reserves R
WHERE R.bid=B.bid
two union-compatible sets of
AND (B.color=‘red’ OR B.color=‘green’)
tuples (which are
themselves the result of
SELECT R.sid
SQL queries). FROM Boats B, Reserves R
 If we replace OR by AND in WHERE R.bid=B.bid
the first version, what do AND B.color=‘red’
UNION
we get? SELECT R.sid
 Also available: EXCEPT FROM Boats B, Reserves R
(What do we get if we WHERE R.bid=B.bid
AND B.color=‘green’
replace UNION by EXCEPT?)

Database Management Systems, R. Ramakrishnan and J. Gehrke 18


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

 INTERSECT: Can be used to SELECT S.sid


compute the intersection FROM Sailors S, Boats B1, Reserves R1,
Boats B2, Reserves R2
of any two union-
WHERE S.sid=R1.sid AND R1.bid=B1.bid
compatible sets of tuples. AND S.sid=R2.sid AND R2.bid=B2.bid
 Included in the SQL/92 AND (B1.color=‘red’ AND B2.color=‘green’)
standard, but some Key field!
systems don’t support it. SELECT S.sid
 Contrast symmetry of the FROM Sailors S, Boats B, Reserves R
UNION and INTERSECT WHERE S.sid=R.sid AND
queries with how much R.bid=B.bid
the other versions differ. AND B.color=‘red’
INTERSECT
 (See page 143 for a subtle SELECT S.sid
bug with a query using FROM Sailors S, Boats B, Reserves R
INTERSECT) WHERE S.sid=R.sid AND
R.bid=B.bid
Database Management Systems, R. Ramakrishnan and J. Gehrke AND B.color=‘green’ 19
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.
Database Management Systems, R. Ramakrishnan and J. Gehrke 20
More Examples

 (Q2) Find the names of sailors who have reserved a


red boat (see text pp. 146)

SELECT S.sname
FROM Sailors S
WHERE S.sid IN ( SELECT R.sid
FROM Reserves R
WHERE R.bid IN ( SELECT B.bid
FROM Boats B
WHERE B.color = ‘red’ )

Database Management Systems, R. Ramakrishnan and J. Gehrke 21


More Examples

 (Q21) Find the names of sailors who have not


reserved a red boat. (see text pp. 146)
– What if we replace the inner occurrence (rather than the out
occurrence ) of IN with NOT IN
– What if we replace both occurrences of IN with NOT IN

SELECT S.sname
FROM Sailors S
WHERE S.sid NOT IN ( SELECT R.sid
FROM Reserves R
WHERE R.bid IN ( SELECT B.bid
FROM Boats B
WHERE B.color = ‘red’ )
Database Management Systems, R. Ramakrishnan and J. Gehrke 22
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.


 It allows us to test whether a set is nonempty, an implicit comparison with
the empty set. Thus, for each Sailor row S, we test whether the set of
Reserves rows R such that R.bid = 103 AND S.sid = R.sid is nonempty.
 This query also illustrates the use of the special symbol * in situations
where all we want to do is to check that a qualifying row exists, and do
not really want to retrieve any columns from the row.

Database Management Systems, R. Ramakrishnan and J. Gehrke 23


Another Example using correlated
queries
 Recall the total participation in page 81 (ER diagram in page 80):
Every department must have at least one employee works in it.
How do we find out which departments do not have any
employee working in it?

SELECT D.did
FROM Departments D
WHERE NOT EXISTS (select *
from Works_IN W
where W.did = D.did)

Database Management Systems, R. Ramakrishnan and J. Gehrke 24


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 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 > ANY (SELECT S2.rating
FROM Sailors S2
WHERE S2.sname=‘Horatio’)

Database Management Systems, R. Ramakrishnan and J. Gehrke 25


More on Set-Comparison Operators

 If there were no sailor called Horatio? In this case the


comparison S.rating > ANY ... is defined to return false,
and the query returns an empty answer set. To
understand comparisons involving ANY, it is useful to
think of the comparison being carried out repeatedly.
 In this example, S. rating is successively compared with
each rating value that is an answer to the nested query.
Intuitively, the subquery must return a row that makes the
comparison true, in order for S. rating > ANY ... to return
true.

Database Management Systems, R. Ramakrishnan and J. Gehrke 26


More Examples

(Q23) Find sailors whose rating is better than every


sailor' called Horatio. (on page 148)
(Q24) Find the 8ailor's with the highest rating (on page
149)
SELECT S.sid
FROM Sailors S
WHERE S.rating >= ALL ( SELECT S2.rating
FROM Sailors S2 )

IN is equivalent to = ANY
NOT IN is equivalent to <> ALL

Database Management Systems, R. Ramakrishnan and J. Gehrke 27


Rewriting INTERSECT Queries Using IN
Find sid’s of sailors who’ve reserved both a red and a green boat:
SELECT S.sid
FROM Sailors S, Boats B, Reserves R
WHERE 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’)

 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.sname
in SELECT clause. (What about INTERSECT query?)
Database Management Systems, R. Ramakrishnan and J. Gehrke 28
(1) SELECT S.sname
FROM Sailors S
Division in SQL WHERE NOT EXISTS
((SELECT B.bid
FROM Boats B)
EXCEPT
Find sailors who’ve reserved all boats.
(SELECT R.bid
 Let’s do it the hard FROM Reserves R
WHERE R.sid=S.sid))
way, without EXCEPT:
(2) SELECT S.sname
FROM Sailors S
WHERE NOT EXISTS (SELECT B.bid
FROM Boats B
WHERE NOT EXISTS (SELECT R.bid
Sailors S such that ...
FROM Reserves R
there is no boat B without ... WHERE R.bid=B.bid
AND R.sid=S.sid))
a Reserves tuple showing S reserved B
Database Management Systems, R. Ramakrishnan and J. Gehrke 29
COUNT (*)
COUNT ( [DISTINCT] A)
Aggregate Operators SUM ( [DISTINCT] A)
AVG ( [DISTINCT] A)
 Significant extension of MAX (A)
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
Database Management Systems, R. Ramakrishnan and J. Gehrke 30
Aggregate Operators
(Q30) Find the names of sailors who are older than
the oldest sailor with a rating of 10.
SELECT S.sname
FROM Sailors S
WHERE S.age > ( SELECT MAX ( S2.age )
FROM Sailors S2
WHERE S2.rating = 10 )
OR

SELECT S.sname
FROM Sailors S
WHERE S.age > ALL ( SELECT S2.age
FROM Sailors S2
WHERE S2.rating = 10 )
Database Management Systems, R. Ramakrishnan and J. Gehrke 31
Assertion

 Checking whether every department has at least one


employee working in it

CREATE ASSERTION Every_dept_has_emp


CHECK ((Select count(D.did)
from Departments D
where NOT EXISTS (select *
from Works_IN W
where W.did = D.did)) = 0)

Database Management Systems, R. Ramakrishnan and J. Gehrke 32


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
SELECT S.sname, S.age
reason a bit later, when
FROM Sailors S
we discuss GROUP BY.) WHERE S.age =
 The third query is (SELECT MAX (S2.age)
equivalent to the second FROM Sailors S2)
query, and is allowed in
SELECT S.sname, S.age
the SQL/92 standard, FROM Sailors S
but is not supported in WHERE (SELECT MAX (S2.age)
some systems. FROM Sailors S2)
= S.age
Database Management Systems, R. Ramakrishnan and J. Gehrke 33
GROUP BY and HAVING
 So far, we’ve 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 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 (!):
SELECT MIN (S.age)
For i = 1, 2, ... , 10: FROM Sailors S
WHERE S.rating = i
Database Management Systems, R. Ramakrishnan and J. Gehrke 34
Queries With GROUP BY and HAVING
SELECT [DISTINCT] target-list
FROM relation-list
WHERE qualification
GROUP BY grouping-list
HAVING group-qualification

 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.
Intuitively, 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.)
Database Management Systems, R. Ramakrishnan and J. Gehrke 35
(Q31) Find the age of the youngest sailor for each rating level.

Select S.rating, MIN(S.age)


From Sailors S
Group By S.rating

Database Management Systems, R. Ramakrishnan and J. Gehrke 36


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.
(SQL does not exploit primary key semantics here!)
 One answer tuple is generated per qualifying group.
Database Management Systems, R. Ramakrishnan and J. Gehrke 37
(Q32) Find the age of the youngest sailor who is eligible to vote
(i.e., is at least 18 years old) for each rating level with at least
two such sailors. see pages 155~157

SELECT S.rating, MIN (S.age) AS minage


FROM Sailors S
WHERE S.age >= 18
GROUP BY S.rating
HAVING COUNT (*) > 1

Database Management Systems, R. Ramakrishnan and J. Gehrke 38


1. The first step is to construct the cross-
product of tables in the from-list. Because the
only relation in the from-list in Query Q32 is
Sailors, the result is just the instance
2. The second step is to apply the qualification
in the WHERE clause, S. age >= 18. This step
eliminates the row (71, zorba, 10, 16).
3. The third step is to eliminate unwanted columns. Only
columns mentioned in the SELECT clause, the GROUP BY
clause, or the HAVING clause are necessary, which means we
can eliminate sid and sname in our example.

Database Management Systems, R. Ramakrishnan and J. Gehrke 39


4. The fourth step is to sort the table according to the GROUP BY clause to
identify the groups. The result of this step is shown in Figure 5.12.
5. The fifth step ,-is to apply the group-qualification in the HAVING clause,
that is, the condition COUNT (*) > 1. This step eliminates the groups with
rating equal to 1, 9, and 10.

Database Management Systems, R. Ramakrishnan and J. Gehrke 40


6. The sixth step is to generate one
answer row for each remaining
group. The answer row
corresponding to a group consists of
a subset of the grouping columns,
plus one or more columns generated
by applying an aggregation operator.
In our example, each answer row has
a rating column and a minage
column, which is computed by
applying MIN to the values in the age
column of the corresponding group.
The result of this step is shown in
Figure 5.13.

Database Management Systems, R. Ramakrishnan and J. Gehrke 41


SQL:1999 Extensions

 Page 157
HAVING COUNT(*) > 1 and EVERY (S.age
<= 60)

The EVERY keyword requires that every row


in a group must satisfy the attached condition
to meet the group-qualification.

Database Management Systems, R. Ramakrishnan and J. Gehrke 42


SQL:1999 Extensions (cont)

 How is the first query on page 158 different


from the preceding query?

SELECT S.rating, MIN (S.age) AS minage


FROM Sailors S
WHERE S.age >= 18 AND S.age <= 60
GROUP BY S.rating
HAVING COUNT (*) > 1

Database Management Systems, R. Ramakrishnan and J. Gehrke 43


More examples of aggregate queries

Q33 For each red boat; find the number of reservations


for this boat (on page 158)
SELECT B.bid, COUNT (*) AS reservation_count
FROM Boats B, Reserves R
WHERE R.bid = B.bid AND B.color = ‘red’
GROUP BY B.bid

Why is the first query on page 159 illegal?


SELECT B.bicl, COUNT (*) AS reservationcount
FROM Boats B, Reserves R
WHERE R.bid = B.bid
GROUP BY B.bid
HAVING B.color = 'red'

Database Management Systems, R. Ramakrishnan and J. Gehrke 44


More examples of aggregate queries

 Q34 Find the average age of sailors for each rating


level that has at least two sailors. (on page 159)
SELECT S.rating, AVG (S.age) AS avgage
FROM Sailors S
GROUP BY S.rating
HAVING COUNT (*) > 1
 Alternative formulation of Q34 on the bottom of page 159
SELECT S.rating, AVG (S.age) AS avgage
FROM Sailors S
GROUP BY S.rating
HAVING 1 < (SELECT COUNT (*)
FROM Sailors S2
WHERE S.rating = S2.rating)

Database Management Systems, R. Ramakrishnan and J. Gehrke 45


More examples of aggregate queries

 Q35 on page 160


 Q36 on page 160
 Alternative formulation of Q36 on page 161
 Q37

Database Management Systems, R. Ramakrishnan and J. Gehrke 46


Null Values
 Field values in a tuple are sometimes unknown (e.g., a
rating has not been assigned) or inapplicable (e.g., no
spouse’s name).
– SQL provides a special value null for such situations.
 The presence of null complicates many issues. E.g.:
– 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. (e.g.,
WHERE clause eliminates rows that don’t evaluate to true.)
– New operators (in particular, outer joins) possible/needed.
Database Management Systems, R. Ramakrishnan and J. Gehrke 47
Embedded SQL
 SQL commands can be called from within a
host language (e.g., C or COBOL) program.
– SQL statements can refer to host variables
(including special variables used to return status).
– Must include a statement to connect to the right
database.
 SQL relations are (multi-) sets of records, with
no a priori bound on the number of records.
No such data structure in C.
– SQL supports a mechanism called a cursor to
handle this.
Database Management Systems, R. Ramakrishnan and J. Gehrke 48
Cursors
 Can declare a cursor on a relation or query
statement (which generates a relation).
 Can open a cursor, and repeatedly fetch a tuple then
move the cursor, until all tuples have been retrieved.
– Can use a special clause, called ORDER BY, in queries that
are accessed through a cursor, to control the order in
which tuples are returned.
 Fields in ORDER BY clause must also appear in SELECT clause.
– The ORDER BY clause, which orders answer tuples, is only
allowed in the context of a cursor.
 Can also modify/delete tuple pointed to by a cursor.
Database Management Systems, R. Ramakrishnan and J. Gehrke 49
Cursor that gets names of sailors who’ve
reserved a red boat, in alphabetical order
EXEC SQL DECLARE sinfo CURSOR FOR
SELECT S.sname
FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’
ORDER BY S.sname

 Note that it is illegal to replace S.sname by, say,


S.sid in the ORDER BY clause! (Why?)
 Can we add S.sid to the SELECT clause and
replace S.sname by S.sid in the ORDER BY clause?

Database Management Systems, R. Ramakrishnan and J. Gehrke 50


Embedding SQL in C: An Example
char SQLSTATE[6];
EXEC SQL BEGIN DECLARE SECTION
char c_sname[20]; 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 > :c_minrating
ORDER BY S.sname;
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;
Database Management Systems, R. Ramakrishnan and J. Gehrke 51
Database APIs: Alternative to
embedding
Rather than modify compiler, add library with database
calls (API)
 special standardized interface: procedures/objects
 passes SQL strings from language, presents result
sets in a language-friendly way
 Microsoft’s ODBC becoming C/C++ standard on
Windows
 Sun’s JDBC a Java equivalent
 Supposedly DBMS-neutral
– a “driver” traps the calls and translates them into DBMS-
specific code
– database can be across a network

Database Management Systems, R. Ramakrishnan and J. Gehrke 52


SQL API in Java (JDBC)
Connection con = // connect
DriverManager.getConnection(url, ”login", ”pass");
Statement stmt = con.createStatement(); // set up stmt
String query = "SELECT name, rating FROM Sailors";
ResultSet rs = stmt.executeQuery(query);
try { // handle exceptions
// loop through result tuples
while (rs.next()) {
String s = rs.getString(“name");
Int n = rs.getFloat(“rating");
System.out.println(s + " " + n);
}
} catch(SQLException ex) {
System.out.println(ex.getMessage ()
+ ex.getSQLState () + ex.getErrorCode ());
}

Database Management Systems, R. Ramakrishnan and J. Gehrke 53


Integrity Constraints (Review)
 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 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.
Database Management Systems, R. Ramakrishnan and J. Gehrke 54
CREATE TABLE Sailors
( sid INTEGER,
General Constraints sname CHAR(10),
rating INTEGER,
age REAL,
 Useful when PRIMARY KEY (sid),
more general CHECK ( rating >= 1
ICs than keys AND rating <= 10 )
are involved. CREATE TABLE Reserves
( sname CHAR(10),
 Can use queries
bid INTEGER,
to express
day DATE,
constraint.
PRIMARY KEY (bid,day),
 Constraints can CONSTRAINT noInterlakeRes
be named. CHECK (`Interlake’ <>
( SELECT B.bname
FROM Boats B
WHERE B.bid=bid)))
Database Management Systems, R. Ramakrishnan and J. Gehrke 55
Constraints Over Multiple Relations
CREATE TABLE Sailors
( sid INTEGER, Number of boats
sname CHAR(10), plus number of
 Awkward and
rating INTEGER, sailors is < 100
wrong!
age REAL,
 If Sailors is
PRIMARY KEY (sid),
empty, the
CHECK
number of Boats
tuples can be ( (SELECT COUNT (S.sid) FROM Sailors S)
anything! + (SELECT COUNT (B.bid) FROM Boats B) < 100 )
 ASSERTION is the
right solution; CREATE ASSERTION smallClub
not associated CHECK
with either table. ( (SELECT COUNT (S.sid) FROM Sailors S)
+ (SELECT COUNT (B.bid) FROM Boats B) < 100
Database Management Systems, R. Ramakrishnan and J. Gehrke 56
Triggers
 Trigger:
– associated with a table, and activates when a
particular event occurs for the table.
– Some uses for triggers are to perform checks of
values to be inserted into a table or to perform
calculations on values involved in an update.
 Three parts:
– Event (activates the trigger)
– Condition (tests whether the triggers should run)
– Action (what happens if the trigger runs)

Database Management Systems, R. Ramakrishnan and J. Gehrke 57


Triggers

 Event:
– Inserts, updates, or deletes rows operations are trigger events.
– For example, rows can be inserted by INSERT or LOAD
DATA statements, and an insert trigger activates for each
inserted row
– A trigger can be set to activate either before or after the
trigger event.

Database Management Systems, R. Ramakrishnan and J. Gehrke 58


Triggers
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW
[trigger_order] trigger_body

trigger_time: { BEFORE | AFTER }


trigger_event: { INSERT | UPDATE | DELETE }
trigger_order: { FOLLOWS | PRECEDES } other_trigger_name

This statement creates a new trigger. The trigger becomes associated


with the table named tbl_name, which must refer to a permanent
table. You cannot associate a trigger with a TEMPORARY table or a
view.

Database Management Systems, R. Ramakrishnan and J. Gehrke 59


Triggers
 The DEFINER clause determines the security context to be used when
checking access privileges at trigger activation time
 trigger_time is the trigger action time. It can be BEFORE or AFTER to
indicate that the trigger activates before or after each row to be modified
 trigger_event indicates the kind of operation that activates the trigger.
These trigger_event values are permitted:
– INSERT: The trigger activates whenever a new row is inserted into the table;
for example, through INSERT, LOAD DATA, and REPLACE statements
– UPDATE: The trigger activates whenever a row is modified; for example,
through UPDATE statements.
– DELETE: The trigger activates whenever a row is deleted from the table; for
example, through DELETE and REPLACE statements. DROP TABLE and
TRUNCATE TABLE statements on the table do not activate this trigger,
because they do not use DELETE. Dropping a partition does not activate
DELETE triggers, either.

Database Management Systems, R. Ramakrishnan and J. Gehrke 60


Triggers
 It is possible to define multiple triggers for a given table that
have the same trigger event and action time.
 For example, you can have two BEFORE UPDATE triggers
for a table.
 By default, triggers that have the same trigger event and action
time activate in the order they were created. To affect trigger
order, specify a trigger_order clause that indicates FOLLOWS or
PRECEDES and the name of an existing trigger that also has the
same trigger event and action time.
 With FOLLOWS, the new trigger activates after the existing
trigger. With PRECEDES, the new trigger activates before
the existing trigger.

Database Management Systems, R. Ramakrishnan and J. Gehrke 61


Triggers: Example (SQL:1999)

 CREATE TABLE account (acct_num INT, amount


DECIMAL(10,2));
 CREATE TRIGGER ins_sum BEFORE INSERT ON account
FOR EACH ROW SET @sum = @sum + NEW.amount;
 SET @sum = 0;
 INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-
100.00);
 SELECT @sum AS 'Total amount inserted';
 DROP TRIGGER test.ins_sum;

Database Management Systems, R. Ramakrishnan and J. Gehrke 62


Triggers: Example

 CREATE TRIGGER ins_transaction BEFORE INSERT ON


account
FOR EACH ROW PRECEDES ins_sum
SET @deposits = @deposits + IF(NEW.amount>0,
NEW.amount,0),
@withdrawals = @withdrawals + IF(NEW.amount<0,-
NEW.amount,0);

Database Management Systems, R. Ramakrishnan and J. Gehrke 63


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.

Database Management Systems, R. Ramakrishnan and J. Gehrke 64


Summary (Contd.)
 NULL for unknown field values brings many
complications
 Embedded SQL allows execution within a host
language; cursor mechanism allows retrieval of
one record at a time
 APIs such as ODBC and ODBC introduce a layer
of abstraction between application and DBMS
 SQL allows specification of rich integrity
constraints
 Triggers respond to changes in the database

Database Management Systems, R. Ramakrishnan and J. Gehrke 65

You might also like