SQL: Queries, Programming, Triggers

Download Report

Transcript SQL: Queries, Programming, Triggers

MATH IN SQL
AGGREGATION OPERATORS

Operators on sets of tuples.

Significant extension of relational algebra.

SUM ( [DISTINCT] A): the sum of all (unique) values in
attribute A.

AVG ( [DISTINCT] A): the average of all (unique) values
in attribute A.
SELECT AVG (S.age)
FROM Sailors S;
SELECT AVG ( DISTINCT S.age)
FROM Sailors S
WHERE S.rating=10;
2
AGGREGATION OPERATORS

Operators on sets of tuples.

Significant extension of relational algebra.

MAX (A): the maximum value in attribute A.

MIN (A): the minimum value in attribute A.
SELECT MAX(rating)
FROM Sailors;
SELECT S.sname
FROM Sailors S
WHERE S.rating= (SELECT MAX(S2.rating)
FROM Sailors S2);
3
AGGREGATION OPERATORS

Operators on sets of tuples.

Significant extension of relational algebra.

COUNT (*): the number of tuples.
SELECT COUNT (*)
FROM Sailors S
4
AGGREGATION OPERATORS

Operators on sets of tuples.

Significant extension of relational algebra.

COUNT ( [DISTINCT] A): the number of (unique) values
in attribute A.
SELECT COUNT (DISTINCT S.rating)
FROM Sailors S
WHERE S.sname=‘Bob’;
5
AGGREGATION OPERATORS
Find name and age of
the oldest sailor(s).
 The first query looks
correct, but is illegal.



SELECT S.sname, MAX (S.age)
FROM Sailors S;
Thoughts as to why?
The second query is a
correct and legal
solution.
SELECT S.sname, S.age
FROM Sailors S
WHERE S.age =
(SELECT MAX (S2.age)
FROM Sailors S2);
6
GROUP BY AND HAVING
So far, we’ve applied aggregation 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
value.


Suppose we know that rating values go from 1 to 10;
we can write ten (!) queries that look like this:
For i = 1, 2, ... , 10:
SELECT MIN (S.age)
FROM Sailors S
WHERE S.rating = i;
But in general, we don’t know how many rating values
exist, and what these rating values are.
 Plus, it’s a waste of time to write so many queries

7
GROUP BY AND HAVING
SELECT
FROM
WHERE
GROUP BY
HAVING
[DISTINCT] target-list
relation-list
qualification
grouping-list
group-qualification
Notice the
notation
A group is a set of tuples that have the same
value for all attributes grouping-list.
 The target-list contains



attribute names
terms with aggregation operations.
Attribute list must be a subset of grouping-list.
 Each answer tuple corresponds to a group, and
output attributes must have a single value per
group.

8
CONCEPTUAL EVALUATION

Given:
SELECT S.rating, MIN(S.age) as minage
FROM Sailors S
WHERE S.age >= 18
GROUP BY S.rating
HAVING COUNT(*) > 1

Step 1
The cross-product of relation-list is computed
 In this instance, it’s only Sailors

9
CONCEPTUAL EVALUATION

Given:
SELECT S.rating, MIN(S.age) as minage
FROM Sailors S
WHERE S.age >= 18
GROUP BY S.rating
HAVING COUNT(*) > 1

Step 2
Tuples that fail qualification are discarded
 ‘unnecessary’ attributes are deleted

10
CONCEPTUAL EVALUATION

Given:
SELECT S.rating, MIN(S.age) as minage
FROM Sailors S
WHERE S.age >= 18
GROUP BY S.rating
HAVING COUNT(*) > 1

Step 3

Remaining tuples are partitioned into
groups by the value of attributes in
grouping-list
11
CONCEPTUAL EVALUATION

Given:
SELECT S.rating, MIN(S.age) as minage
FROM Sailors S
WHERE S.age >= 18
GROUP BY S.rating
HAVING COUNT(*) > 1

Step 4

The group-qualification is then applied to
eliminate groups that do not satisfy this
condition.
12
CONCEPTUAL EVALUATION

Given:
SELECT S.rating, MIN(S.age) as minage
FROM Sailors S
WHERE S.age >= 18
GROUP BY S.rating
HAVING COUNT(*) > 1

Step 5

One answer tuple is generated per qualifying group by
applying the aggregation operator.
13
GROUP BY AND HAVING

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 >= 18
GROUP BY S.rating
HAVING COUNT (*) > 1;


Only S.rating and S.age are
mentioned in the SELECT,
GROUP BY or HAVING clauses;
other attributes `unnecessary’.
2nd column of result is
unnamed

What to do?
sid
22
31
71
64
29
58
rating
1
7
7
8
10
sn am e
d u stin
lu b b er
zo rb a
h o ratio
b ru tu s
ru sty
age
33.0
45.0
35.0
55.5
35.0
ratin g
7
8
10
7
1
10
ag e
4 5 .0
5 5 .5
1 6 .0
3 5 .0
3 3 .0
3 5 .0
Answer relation
rating
7
35.0
14
GROUP BY AND HAVING

For each red boat, find the number of
reservations for this boat.
SELECT B.bid, COUNT (*) AS scount
FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid AND
B.color=‘red’
GROUP BY B.bid;



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?
What if we drop Sailors and the condition
involving S.sid?
15
GROUP BY AND HAVING

Find the 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 S
WHERE S.age > 18
GROUP BY S.rating
HAVING 1 < (SELECT COUNT (*)
FROM Sailors S2
WHERE S.rating=S2.rating);


Shows HAVING clause can also contain a subquery.
What if HAVING clause is replaced by:
 HAVING COUNT(*) >1
16
GROUP BY AND HAVING



Find those ratings for which the average age is the minimum
over all ratings.
Aggregation operations cannot be nested!
WRONG:
SELECT S.rating
FROM Sailors S
WHERE S.age =
(SELECT MIN (AVG (S2.age)) FROM Sailors S2);

Correct solution:
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);
17
ORDERING & TOP/BOTTOM
ORDER BY
The ORDER BY keyword is used to sort the
result-set by a specified column.
 The ORDER BY keyword sort the records in
ascending order by default.
 If you want to sort the records in a descending
order, you can use the DESC keyword.

19
TOP/BOTTOM
The TOP clause is used to specify the number of
records to return.
 The TOP clause can be very useful on large tables
with thousands of records

Returning a large number of records can impact on
performance
 Can ‘sample’ the table using TOP


Not all database systems support the TOP clause
or implement it in different fashion
20
TOP/BOTTOM
SQL Server
SELECT TOP number|percent column_name(s)
FROM table_name
Ex: SELECT TOP 5 *
FROM Persons
MySQL
SELECT column_name(s)
FROM table_name
LIMIT number
Ex: SELECT *
FROM Persons
LIMIT 5
21
TOP/BOTTOM
Oracle
SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number
Ex: SELECT *
FROM Persons
WHERE ROWNUM <=5
DB2
SELECT column_name(s)
FROM table_name
FETCH FIRST number ROWS ONLY
Ex: SELECT *
FROM Persons
FETCH FIRST 5 ROWS ONLY
22
TOP/BOTTOM
 Can

Fixed number


specify
SELECT TOP 10 * …
A percent

SELECT TOP 10 PERCENT * …
23
TOP/BOTTOM

How to return the oldest 5 rentals?

How to return the newest 5 rentals?
24
TOP/BOTTOM

How to return the 3rd newest rental?
25
SUMMARY
SQL was an important factor in the early
acceptance of the relational model; more natural
than earlier, procedural query languages.
 All queries that can be expressed in relational
algebra can also be formulated in SQL.
 In addition, SQL has significantly more
expressive power than relational algebra, in
particular aggregation operations and grouping.
 Many alternative ways to write a query; query
optimizer looks for most efficient evaluation plan.
 In practice, users need to be aware of how queries
are optimized and evaluated for most efficient
results.

26