Transcript SQL

IT420: Database Management and
Organization
SQL part 3
7 February 2006
Adina Crăiniceanu
www.cs.usna.edu/~adina
1
Announcements
 Exam next Tuesday




2 hours
Closed book/closed notes
No computers
Covers all material
 Labs returned on Friday
2
Previously
 SQL DDL: Data Definition Language
 CREATE, DROP, ALTER
 DML: Data Manipulation Language




INSERT
DELETE
UPDATE
SELECT
3
Today
 More about SELECT
4
The SQL SELECT Statement
 Basic SQL Query:
SELECT
[DISTINCT] column_name(s)
FROM
table_name(s)
[WHERE
conditions]
[ORDER BY some_column_names
[ASC/DESC] ]
*Terms between [ ] are optional
5
WHERE Clause Options
 AND, OR
 IN, NOT IN, BETWEEN
 =, >, <, <>, >=
SELECT SNb
FROM Students S, Enrolled E
WHERE S.SNb = E.Nb AND
E.Cid NOT IN (‘ComSci’, ‘Math’)
6
Calculations in SQL
 Simple arithmetic
 Five SQL aggregate operators:





COUNT
SUM
AVG
MIN
MAX
7
Find the age of the youngest
student
 Students(Alpha, LName, FName, Class,
Age)
 SELECT MIN(Age)
FROM Students
8
Aggregate Operators
 So far, aggregate operations applied to all
(qualifying) rows
 We want to apply them to each of several
groups of rows
 Students(Alpha, LName, SName, Class, Age)
 Find the age of the youngest student for each
class
9
Example
 Students(Alpha, LName, FName, Class, Age)
 Find the age of the youngest student for each
class
 If class values go from 1 to 4 we can write 4
queries that look like this:
 SELECT MIN (S.Age)
FROM Students S
WHERE S.Class = i
10
GROUP-BY Clause
 SELECT grouping_columns(s), aggregates
FROM table_name(s)
[WHERE conditions]
GROUP BY grouping_columns
 SELECT Class, MIN(Age)
FROM Students
GROUP BY Class
11
Conceptual Evaluation
 SQL query semantics:




Compute the cross-product of table_names
Discard resulting rows if they fail conditions
Delete columns that are not specified in SELECT
Remaining rows are partitioned into groups by the
value of the columns in grouping-columns
 One answer row is generated per group
 Note: Does not imply query will actually be
evaluated this way!
12
GROUP BY Exercise
 Students(Alpha, LName, FName, Class, Age)
 For each last name, find the number of
students with same last name
13
HAVING Clause
 SELECT [grouping_columns(s), aggregates
FROM table_name(s)
[WHERE conditions]
GROUP BY grouping_columns
HAVING group_conditions
 HAVING restricts the groups presented in the
result
14
Example
 SELECT Class, MIN(Age)
FROM Students
WHERE MajDeptName = ‘ComSci’
GROUP BY Class
HAVING Class > 2
What does the query compute?
15
Another GROUP BY Example
 SKU_DATA(SKU, SKU_description, Buyer,
Department)
 SELECT
Department, COUNT(*) AS
Dept_SKU_Count
FROM
SKU_DATA
WHERE
SKU <> 302000
GROUP BY Department
HAVING
COUNT (*) > 1
ORDER BY
Dept_SKU_Count;
16
Select students with age higher
than average
 SELECT *
FROM Students
WHERE Age > AVG(Age)
Illegal!
17
Subqueries
 SELECT *
FROM Students
WHERE Age > (SELECT AVG(Age)
FROM Students)
 Second select is a subquery (or nested query)
 You can have subqueries in FROM or HAVING
clause also
18
Subqueries Exercise


Students(Alpha, LName, FName, Class, Age)
Enroll(Alpha, CourseID, Semester, Grade)
1. Find alpha for students enrolled in both
‘IT420’ and ‘IT334’
2. Find name of students enrolled in both
‘IT420’ and ‘IT334’
19
Class Exercise
 Students(Alpha, LName, FName, Class,
Age)
 Enroll(Alpha, CourseID, Semester, Grade)
 Find the name of students enrolled in
‘IT420’
 Usual way
 Use subqueries
20
 SELECT FName, LName
FROM Students S
WHERE S.Alpha IN
(SELECT Alpha
FROM Enroll E
WHERE E.CourseID = ‘IT420’)
21
Correlated Subqueries
 SELECT FName, LName
FROM Students S
WHERE EXISTS
(SELECT *
FROM Enroll E
WHERE E.CourseID = ‘IT420’
AND E.Alpha = S.Alpha)
22
Subqueries versus Joins
 Subqueries and joins both process
multiple tables.
 Subquery can only be used to retrieve
data from the top table.
 Join can be used to obtain data from any
number of tables
 Correlated subquery can do work that is
not possible with joins.
23
Class Exercise
 What does this query compute:
 SELECT FName, LName
FROM Students S, Enroll E1, Enroll E2
WHERE S.Alpha = E1.Alpha
AND S.Alpha = E2.Alpha
AND E1.CourseID = ‘IT420’
AND E2.CourseID = ‘IT344’
24
JOIN ON Syntax
 Students(Alpha, LName, FName, Class, Age)
 Courses(CourseID, Description, Textbook)
 Enroll(Alpha, CourseID, Semester, Grade)
 Find the names of students enrolled in ‘IT420’
SELECT LName, FName
FROM Students S JOIN Enroll C
ON S.Alpha = C.Alpha
WHERE CourseID = ‘IT420’
 Find the names of students enrolled in
‘Database Management’
25
Multiple JOIN ON
 Find the names of students
enrolled in ‘Database
Management’
 SELECT LName, FName
FROM
Enroll E JOIN Courses C
ON E.CourseID = C.CourseID
JOIN Students ON E.Alpha = S.Alpha
WHERE C.Description = ‘Database Management’
26
Outer Joins
 Find all students and courses in which they are
enrolled
 SELECT S.Alpha, S.LName, S.FName, E.CourseID
FROM Students S LEFT JOIN Enrolled E
ON S.Alpha = E.Alpha
27
Class Exercise
 Students(Alpha, LName, FName, Class,
Age)
 Courses(CourseID, Description, Textbook)
 Enroll(Alpha, CourseID, Semester, Grade)
 Find the age of youngest student older
than 18, for each course with at least one
such student enrolled in it
28