Chap05 - SQL
Chap05 - SQL
¡ Bit string
- BIT, BIT(x)
- BIT VARYING(x)
¡ Datetime
- DATE
- TIME
- TIMESTAMP
¡ Columns
ALTER TABLE <Table_name> ADD COLUMN
<Column_name> <Data_type> [<Constraint>]
¡ Syntax
DROP TABLE <Table_name>
¡ Example
DROP TABLE EMPLOYEE
EMPLOYEE
LName MName FName SSN BDate Address Sex Salary SuperSSN DNo
DEPARTMENT
¡ Based on
Relational Some
+
algebra supplements
operations
- <List_of_columns>
• Column names showed in the result of the query
- <List_of_tables>
• Table names required to process the query
- <Condition>
• Boolean expression that identifies the rows to be retrieved
• Expression’s connection : AND, OR, and NOT
• Operations: < , > , <=, >=, <>, =, LIKE and BETWEEN
Introduction2DB - FIT - HCMUS 24
Basic query
¡ SQL and Relational Algebra
p
SELECT <List_of_columns>
´
FROM <List_of_tables>
s
WHERE <Condition>
SELECT L
p s
L ( R C (R))
FROM
WHERE C
SELECT *
FROM EMPLOYEE
WHERE DNo=5
SSN LName MName FName BirthDate Address Sex Salary SuperSSN DNo
333445555 Nguyen Thanh Tung 12/08/1955 638 NVC Q5 Nam 40000 888665555 5
987987987 Nguyen Manh Hung 09/15/1962 Ba Ria VT Nam 38000 333445555 5
s DNo=5 (EMPLOYEE)
Extension
Extension
SSN 10%SalaryIncrease
333445555 33000
987987987 27500
SELECT DISTINCT
Salary Salary
FROM EMPLOYEE
WHERE DNo=5 AND Sex= Nam
Salary
30000
25000 - Cost
25000
38000
- Users want to see all tuples
38000
¬ EMPLOYEE
R1 DNo=DNumber DEPARTMENT
Boolean
SELECT SSN, FName expressions
TRUE TRUE
Priority
BETWEEN
NOT BETWEEN
LIKE
Arbitrary characters
SELECT SSN, FName
FROM EMPLOYEE
WHERE Address LIKE Nguyen %
Arbitrary strings
NOT LIKE
ESCAPE
Datetime
1955-12-08 17:30:00
NULL
NULL
UNKNOWN
- Logical operator
• x and y (Minimum value)
• x or y (Maximum value)
• not x (1-x)
SSN DNumber
333445555 1
333445555 4
333445555 5
987987987 1
987987987 4
987987987 5
… …
Alias name
SELECT DName,
DName,DLocation
DLocation
FROM DEPARTMENT
DEPARTMENT,
AS DEPT_LOCATIONS
DE, DEPT_LOCATIONS AS DL
WHERE DE.DNumber=DL.DNumber
DNumber=DNumber
¡ Syntax
SELECT <List_of_columns>
FROM <List_of_tables>
WHERE <Conditions>
ORDER BY<List_of columns>
- ASC (default)
- DESC
ESSN PNo
999887777 10
999887777 30
987987987 10
987987987 30
987654321 10
987654321 20
987654321 30
SELECT EM.*
FROM EMPLOYEE EM, DEPENDENT DE
WHERE EM.SSN=DE.ESSN
AND EM.FName=DE.Dependent_name
AND EM.Sex=DE.Sex
SELECT EM.*
FROM EMPLOYEE EM, DEPENDENT DE
WHERE EM.FName=DE.Dependent_Name
AND EM.Sex=DE.Sex
SELECT <List_of_columns>
Outer query
FROM <List_of_tables>
WHERE <Set_comparison> (
SELECT <List_of_columns>
Subquery
FROM <List_of_tables>
WHERE <Condition>)
- Correlated subqueries
• WHERE clause of subqueries refer to at least one attribute of
relations in FROM clause of the outer query
• Subqueries will be executed many times, each time will
correlate to one tuple of the outer query
SELECT WO.PNo
FROM EMLOYEE EM, WORKS_ON WO
WHERE EM.SSN=WO.ESSN AND EM.LName= Nguyen
UNION
SELECT PR.PNumber
FROM EMPLOYEE EM, DEPARTMENT DE, PROJECT PR
WHERE EM.SSN=DE.MgrSSN AND DE.DNumber=PR.DNum
AND EM.LName= Nguyen
SELECT *
FROM EMPLOYEE
WHERE SSN <> ALL (
SELECT ESSN
FROM DEPENDENT )
SELECT *
FROM EMPLOYEE
WHERE Salary > ANY (
SELECT Salary
FROM EMPLOYEE
WHERE DNo=4 )
SELECT EM1.*
FROM EMPLOYEE EM1, EMPLOYEE EM2
WHERE EM1.Salary > EM2.Salary AND EM2.DNo=4
SELECT *
FROM EMPLOYEE
WHERE Salary > ALL (
SELECT Salary
FROM EMPLOYEE
WHERE DNo=4 )
SELECT *
FROM EMPLOYEE
WHERE SSN IN (SELECT ESSN FROM DEPENDENT)
AND SSN IN (SELECT MgrSSN FROM DEPARTMENT)
SELECT *
FROM EMPLOYEE
WHERE NOT EXISTS (
SELECT *
FROM DEPENDENT
WHERE SSN=ESSN)
SELECT *
FROM EMPLOYEE EM1
WHERE EXISTS (
SELECT *
FROM EMPLOYEE EM2
WHERE EM2.PNo=4
AND EM1.Salary>EM2.Salary)
R A B C D E S D E R÷S A B C
a a a a 1 bi a 1 ai a a g
a a g a 1 b 1 g a g
a a g b 1
b a g a 1
b a g b 3
g a g a 1
g a g b 1
g a b b 1
- R: WORKS_ON(ESSN, PNo)
- S: PROJECT(PNumber)
- R÷S: RESULT(ESSN)
- Joining RESULT to EMPLOYEE to retrieve FName
SELECT EM.FName
FROM EMPLOYEE EM, WORKS_ON WO1
WHERE EM.SSN=WO1.ESSN
AND NOT EXISTS (
SELECT *
FROM PROJECT PR
WHERE NOT EXISTS (
SELECT *
FROM WORKS_ON WO2
WHERE WO2.PNo=PR.PNumber
AND WO1.ESSN=WO2.ESSN ))
SELECT FName
FROM EMPLOYEE
WHERE NOT EXISTS (
( SELECT PNumber FROM PROJECT )
EXCEPT
( SELECT PNo FROM WORKS_ON WHERE SSN=ESSN ))
5 3
4 3
1 1
SSN LName MName FName BirthDate Address Sex Salary SuperSSN DNo
333445555 Nguyen Thanh Tung 12/08/1955 638 NVC Q5 Nam 40000 888665555 5
987987987 Nguyen Manh Hung 09/15/1962 Ba Ria VT Nam 38000 333445555 5
453453453 Tran Thanh Tam 07/31/1972 543 MTL Q1 Nu 25000 333445555 5
999887777 Bui Ngoc Hang 07/19/1968 33 NTH Q1 Nu 38000 987654321 4
987654321 Le Quynh Nhu 07620/1951 219 TD Q3 Nu 43000 888665555 4
987987987 Tran Hong Quang 04/08/1969 980 LHP Q5 Nam 25000 987654321 4
888665555 Pham Van Vinh 11/10/1945 450 TV HN Nam 55000 NULL 1
¡ After grouping
- Each group will have identical values at grouping
attributes
123456789 1 32.5
123456789 2 7.5
333445555 2 10.0
333445555 3 10.0
333445555 10 10.0
888665555 20 20.0
987987987 10 35.0
987987987 30 5.0
987654321 30 20.0
987654321 20 15.0
453453453 1 20.0
453453453 2 20.0
123456789 1 32.5
123456789 2 7.5
333445555 2 10.0
333445555 3 10.0
333445555 10 10.0
888665555 20 20.0 Eliminated
987987987 10 35.0
987987987 30 5.0
987654321 30 20.0
987654321 20 15.0
453453453 1 20.0
453453453 2 20.0
SELECT ESSN
FROM WORKS_ON
GROUP BY ESSN
HAVING COUNT(*) >= 2
¡ HAVING
- Use aggregate functions in SELECT clause to check a
certain condition
- Just validate the conditions for groups, not a condition for
filtering rows
- After grouping, conditions on groups will be performed
SELECT FName
FROM EMPLOYEE EM1
WHERE 2 >= (
SELECT COUNT(*)
FROM EMPLOYEE EM2
WHERE EM2.Salary>EM1.Salary )
¡ CASE structure
¡ Syntax
SELECT <List_of_columns>
FROM R1, R2, (<Subquery>) AS Table_name
WHERE <Conditions>
¡ Outer join
SELECT <List_of_columns>
FROM R1 LEFT|RIGHT [OUTER] JOIN R2 ON <Expression>
WHERE <Conditions>
ESSN=SSN
¡ Syntax
CASE <Column_name>
WHEN <Value> THEN <Expression>
WHEN <Value> THEN <Expression>
…
[ELSE <Expression>]
END
SELECT <List_of_columns>
FROM <List_of_tables>
[WHERE <Conditions>]
[GROUP BY <List_grouping_columns>]
[HAVING <Conditions>]
[ORDER BY <List_of_ordering_columns>]
¡ Syntax
333445555 Nguyen Thanh Tung 12/08/1955 638 NVC Q5 Nam 40000 888665555 5
987987987 Nguyen Manh Hung 09/15/1962 Ba Ria VT Nam 38000 333445555 5
453453453 Tran Thanh Tam 07/31/1972 543 MTL Q1 Nu 25000 333445555 5
999887777 Bui Ngoc Hang 07/19/1968 33 NTH Q1 Nu 38000 987654321 4
987654321 Le Quynh Nhu 07620/1951 219 TD Q3 Nu 43000 888665555 4
987987987 Tran Hong Quang 04/08/1969 980 LHP Q5 Nam 25000 987654321 4
888665555 Pham Van Vinh 11/10/1945 450 TV HN Nam 55000 NULL 1
333445555 10 10.0
888665555 20 20.0
987987987 10 35.0
987987987 30 5.0
987654321 30 20.0
453453453 1 20.0
SSN LName MName FName BirthDate Address Sex Salary SuperSSN DNo
333445555 Nguyen Thanh Tung 12/08/1955 638 NVC Q5 Nam 40000 888665555 NULL
5
987987987 Nguyen Manh Hung 09/15/1962 Ba Ria VT Nam 38000 333445555 NULL
5
453453453 Tran Thanh Tam 07/31/1972 543 MTL Q1 Nu 25000 333445555 NULL
5
999887777 Bui Ngoc Hang 07/19/1968 33 NTH Q1 Nu 38000 987654321 4
987654321 Le Quynh Nhu 07620/1951 219 TD Q3 Nu 43000 888665555 4
987987987 Tran Hong Quang 04/08/1969 980 LHP Q5 Nam 25000 987654321 4
888665555 Pham Van Vinh 11/10/1945 450 TV HN Nam 55000 NULL 1
¡ Syntax
UPDATE <Table_name>
SET <Attribute_name>=<The_new_value>,
<Attribute_name>=<The_new_value>,
…
[WHERE <Condition>]
UPDATE EMPLOYEE
SET BDate= 08/12/1965
WHERE SSN= 333445555
UPDATE EMPLOYEE
SET Salary=Salary*1.1
UPDATE PROJECT
SET PLocation= Vung Tau , DNum=5
WHERE PNumber=10
¡ View contains
- A list of attributes that are the same as attributes in
SELECT clause
- The number of tuples depending on the conditions in
WHERE clause
- Data derived from tables in FROM clause
Introduction2DB - FIT - HCMUS 138
Example
SELECT FName
FROM EMP_DEP5
WHERE LName LIKE Nguyen
p LName,FName,PName,Hours(TMP)
UPDATE EMP_DEP5
SET LName= Pham
WHERE SSN= 123456789
SELECT *
FROM EMPLOYEE Read 10.000
tuples
WHERE DNo=5 AND Sex= Nu
Read 200 tuples
¡ Example
¡ Selection of indexes
- One of the principal factors that influence a database
- One of the hardest parts of database design
- Q2 SELECT ESSN
FROM WORKS_ON
WHERE PNo=1 AND Hours=20.5
Q1 10 4 10 4
Q2 10 10 4 4
Q3 2 4 4 6