SQL
Murali Mani
SELECT-FROM-WHERE
SELECT * FROM Student WHERE sName=Greg AND address=320 FL Student
sNumber 1 2 3 sName Dave Greg Matt address 320FL 320FL 320FL professor MM MM ER sNumber 2 sName Greg address 320FL professor MM
(sName=Greg AND address=320 FL) (Student)
Murali Mani
Project
SELECT sNumber, sName FROM Student
Student
sNumber 1 2 3 sName Dave Greg Matt address 320FL 320FL 320FL professor MM MM ER sNumber 1 2 3 sName Dave Greg Matt
(sNumber, sName) (Student)
Murali Mani
Extended Projection
SELECT sNumber || sName AS info FROM Student WHERE address=320 FL
Student
sNumber 1 2 3 sName Dave Greg Matt address 320FL 320FL 320FL professor MM MM ER info 1Dave 2Greg 3Matt
(sNumber||sNameinfo) ( (address=320 FL) (Student))
Murali Mani
SQL and Relational Algebra
In short, L ( C (R)) becomes SELECT L FROM R WHERE C
Murali Mani
Renaming
SELECT s1.sNumber AS num FROM Student S1 WHERE s1.sNumber >= 1;
Student
sNumber 1 2 3 sName Dave Greg Matt address 320FL 320FL 320FL professor MM MM ER num 1 2 3
(s1.sNumbernum) ( (s1.sNumber >= 1) ( S1 (Student)))
Murali Mani
String operators
Comparison Operators based on lexicographic ordering: =, <, >, <>, >=, <= Concatenation operator: || represented in strings with two consecutive Pattern match: s LIKE p
p = pattern % : any sequence of 0 or more characters - : matches 1 character Patterns can explicitly declare escape characters as: s LIKE x%%am% ESCAPE x
Murali Mani
Comparison with NULL values
Arithmetic operations on NULL return NULL. Comparison operators on NULL return UNKNOWN. We can explicitly check whether a value is null or not, by IS NULL, IS NOT NULL.
Murali Mani
Truth table with UNKNOWN
UNKNOWN AND TRUE = UNKNOWN UNKNOWN OR TRUE = TRUE UNKNOWN AND FALSE = FALSE UNKNOWN OR FALSE = UNKNOWN UNKNOWN AND UNKNOWN = UNKNOWN UNKNOWN OR UNKNOWN = UNKNOWN NOT UNKNOWN = UNKNOWN A WHERE clause is satisfied only when it evaluates to TRUE.
Murali Mani
UNION, INTERSECT, EXCEPT
(SELECT sName FROM Student) EXCEPT (SELECT sName FROM Student WHERE address=320 FL) UNION, INTERSECT, EXCEPT have set semantics. For bag semantics, use UNION ALL, INTERSECT ALL, EXCEPT ALL
Murali Mani
EXCEPT - Example
(SELECT sName FROM Student) EXCEPT (SELECT sName FROM Student WHERE address=320 FL) Student
sNumber 1 2 3 4 sName Dave Greg Matt Matt address 320FL 320FL 320FL 300FL professor MM MM ER ER sNumber sName address professor
Murali Mani
Joins
SELECT sName FROM Student, Professor WHERE pName=MM AND pNumber=professor;
(sName)(Student (pName=MM and pNumber=professor) Professor)
Murali Mani
Joins - example
Student
sNumber 1 2 3 sName Dave Greg Matt address 320FL 320FL 320FL professor 1 1 2 1 2
Professor
pNumber pName MM ER address 141FL 201FL
SELECT sName FROM Student, Professor WHERE pName=MM AND pNumber=professor;
Murali Mani
sName Dave Greg
Cross Product (Cartesian Product)
SELECT * FROM Student CROSS JOIN Professor; Student X Professor can also be written as: SELECT * FROM Student, Professor
Murali Mani
Cross Product - Example
Student
sNumber 1 2 3 sNumber 1 1 2 2 3 3 sName Dave Greg Matt sName Dave Dave Greg Greg Matt Matt address 320FL 320FL 320FL address 320FL 320FL 320FL 320FL 320FL 320FL professor 1 1 2 professor 1 1 1 1 2 2
Murali Mani
Professor
pNumber 1 2 pName MM ER address 141FL 201FL
pNumber 1 2 1 2 1 2
pName MM ER MM ER MM ER
address 141FL 201FL 141FL 201FL 141FL 201FL
Theta Join
SELECT * FROM Student JOIN Professor ON professor=pNumber;
Student (professor=pNumber) Professor
SELECT * FROM Student, Professor WHERE professor=pNumber;
Murali Mani
Theta Join Example
sNumber 1 2 3 sName Dave Greg Matt address 320FL 320FL 320FL professor 1 1 2 pNumber 1 1 2 pName MM MM ER address 141FL 141FL 201FL
Murali Mani
Natural Join
SELECT * FROM Student NATURAL JOIN Professor (Note: This requires the columns on which the join should be done should have the same names for Student and Professor).
Student Professor
Murali Mani
Natural Join - Example
Student
sNumber 1 2 3 sNumber 1 2 3 sName Dave Greg Matt sName Dave Greg Matt address 320FL 320FL 320FL address 320FL 320FL 320FL pNumber 1 1 2 pNumber 1 1 2 pName MM MM ER address 141FL 141FL 201FL 1 2
Professor
pNumber pName MM ER address 141FL 201FL
Murali Mani
Outer Joins
SELECT * FROM Student NATURAL FULL OUTER JOIN Professor
Student o Professor
SELECT * FROM Student NATURAL LEFT OUTER JOIN Professor
Student oL Professor
Murali Mani
10
Outer Joins
SELECT * FROM Student NATURAL RIGHT OUTER JOIN Professor
Student oR Professor
Murali Mani
Outer Joins - Example
Student
sNumber 1 2 3 4 sNumber 1 2 3 4 Null sName Dave Greg Matt Ben sName Dave Greg Matt Ben Null address 320FL 320FL 320FL 320FL address 320FL 320FL 320FL 320FL Null pNumber 1 1 2 4 pNumber 1 1 2 4 3
Murali Mani
Professor
pNumber 1 2 3 pName MM ER MW address 141FL 201FL 168FL
pName MM MM ER Null MW
address 141FL 141FL 201FL Null 168FL
11
Sorting: ORDER BY clause
SELECT * FROM Student WHERE sNumber >= 1 ORDER BY sNumber, sName (sNumber, sName) ( (sNumber >= 1) (Student))
Murali Mani
Subqueries
SELECT * FROM Student WHERE professor = (SELECT pName FROM Professor WHERE pNumber=1) Note: the inner subquery returns a relation, but SQL runtime ensures that the subquery returns a relation with one column and with one row, otherwise it is a run-time error.
Murali Mani
12
Subqueries - Example
Student
sNumber 1 2 3 sName Dave Greg Matt address 320FL 320FL 320FL professor MM MM ER
SELECT * FROM Student WHERE professor = (SELECT pName FROM Professor WHERE pNumber=1)
Professor
pNumber 1 2 pName MM ER address 141FL 201FL sNumber 1 2 sName Dave Greg address 320FL 320FL professor MM MM
Murali Mani
Subqueries
We can use IN, EXISTS (also NOT IN, NOT EXISTS) ALL, ANY can be used with comparisons SELECT * FROM Student WHERE (sNumber, professor) IN (SELECT pNumber, pName FROM Professor)
Murali Mani
13
Subqueries - Example
Student
sNumber 1 2 3 sName Dave Greg Matt address 320FL 320FL 320FL professor MM MM ER
Professor
pNumber 1 2 pName MM ER address 141FL 201FL
SELECT * FROM Student WHERE (sNumber, professor) IN (SELECT pNumber, pName FROM Professor)
sNumber 1
sName Dave
address 320FL
professor MM
Murali Mani
Subqueries: EXISTS
SELECT * FROM Student WHERE EXISTS (SELECT pName FROM Professor WHERE Student.professor=pName)
Professor
pNumber 1 2 pName MM ER address 141FL 201FL
Student
sNumber 1 2 3 sName Dave Greg Matt address 320FL 320FL 320FL professor MM MM ER sNumber 1 2 3 sName Dave Greg Matt address 320FL 320FL 320FL professor MM MM ER
Murali Mani
14
Subqueries with negation
SELECT * FROM Student WHERE (sNumber, professor) NOT IN (SELECT pNumber, pName FROM Professor)
Professor
pNumber 1 2 pName MM ER address 141FL 201FL
Student
sNumber 1 2 3 sName Dave Greg Matt address 320FL 320FL 320FL professor MM MM ER sNumber 2 3 sName Greg Matt address professor 320FL 320FL MM ER
Murali Mani
Subqueries with negation
Student
sNumber 1 2 3 sName Dave Greg Matt address 320FL 320FL 320FL professor MM MM ER 1 2
Professor
pNumber pName MM ER address 141FL 201FL
SELECT * FROM Student WHERE NOT EXISTS (SELECT pName FROM Professor WHERE Student.professor=pName)
sNumber sName address professor
Murali Mani
15
Subqueries: ALL, ANY
SELECT * FROM Student WHERE sNumber > ALL (SELECT pNumber FROM Professor) SELECT * FROM Student WHERE sNumber = ANY (SELECT pNumber FROM Professor)
Murali Mani
Subqueries: ALL - Example
Student
sNumber 1 2 3 sName Dave Greg Matt address 320FL 320FL 320FL professor MM MM ER 1 2
Professor
pNumber pName MM ER address 141FL 201FL
SELECT * FROM Student WHERE sNumber > ALL (SELECT pNumber FROM Professor)
sNumber 3
sName Matt
address professor 320FL ER
Murali Mani
16
Subqueries: ANY - Example
Student
sNumber 1 2 3 sName Dave Greg Matt address 320FL 320FL 320FL professor MM MM ER 1 2
Professor
pNumber pName MM ER address 141FL 201FL
SELECT * FROM Student WHERE sNumber = ANY (SELECT pNumber FROM Professor)
sNumber 1 2
sName Dave Greg
address 320FL 320FL
professor MM MM
Murali Mani
Subqueries: NOT ALL Example
Student
sNumber 1 2 3 sName Dave Greg Matt address 320FL 320FL 320FL professor MM MM ER 1 2
Professor
pNumber pName MM ER address 141FL 201FL
SELECT * FROM Student WHERE NOT sNumber > ALL (SELECT pNumber FROM Professor)
sNumber 1 2
sName Dave Greg
address 320FL 320FL
professor MM MM
Murali Mani
17
Subqueries: NOT ANY Example
Student
sNumber 1 2 3 sName Dave Greg Matt address 320FL 320FL 320FL professor MM MM ER 1 2
Professor
pNumber pName MM ER address 141FL 201FL
SELECT * FROM Student WHERE NOT sNumber = ANY (SELECT pNumber FROM Professor)
sNumber 3
sName Matt
address professor 320FL ER
Murali Mani
Subqueries: Tip
Murali Mani
18
Subqueries in FROM clause
SELECT sName, pName FROM Student, (SELECT * FROM Professor WHERE pNumber=1) WHERE professor=pName;
Professor
pNumber 1 2 pName MM ER address 141FL 201FL
Student
sNumber 1 2 3 sName Dave Greg Matt address 320FL 320FL 320FL professor MM MM ER sName Dave Greg pName MM MM
Murali Mani
Duplicate Elimination
SELECT DISTINCT * FROM Student;
(Student)
Student
SELECT DISTINCT address FROM Student WHERE sNumber >= 1;
( (address) ( (sNumber >= 1) (Student)))
sNumber 1 2 3
sName Dave Greg Matt
address 320FL 320FL 320FL
professor MM MM ER
address 320FL
Murali Mani
19
Aggregation
SELECT COUNT (*) FROM Student; SELECT COUNT (sNumber) FROM Student; SELECT MIN (sNumber) FROM Student; SELECT MAX (sNumber) FROM Student; SELECT SUM (sNumber) FROM Student; SELECT AVG (sNumber) FROM Student; We can have distinct such as: SELECT COUNT (DISTINCT sNumber) FROM Student
Murali Mani
Grouping
SELECT COUNT (sName) FROM Student GROUP BY address;
(COUNT (sName))
( (address, COUNT (sName)) (Student))
professor MM MM ER COUNT (sName) 3
Student
sNumber 1 2 3 sName Dave Greg Matt address 320FL 320FL 320FL
Murali Mani
20
Grouping
SELECT address, COUNT (sNumber) FROM Student WHERE sNumber > 1 GROUP BY address HAVING COUNT (sNumber) > 1; Student
sNumber 1 2 3 4 sName Dave Greg Matt Ben address 320FL 320FL 320FL 300FL professor MM MM ER ER
Murali Mani
address 320FL
COUNT (sNumber) 2
Aggregation and NULLs
NULLs are ignored in any aggregation; except COUNT (*) However if the set of attributes to be grouped on has null values, then grouping is done on the null values as well.
Murali Mani
21
SQL Queries - Summary
SELECT [DISTINCT] a1, a2, , an FROM R1, R2, , Rm [WHERE C1] [GROUP BY g1, g2, , gl [HAVING C2]] [ORDER BY o1, o2, , oj]
Murali Mani
22