SQL Basics and Database Management
SQL Basics and Database Management
Basic SQL
Danilo Montesi
[Link]@[Link]
SQL
3
SQL Improvements: SQL-base
4
SQL Improvements: SQL-2
5
SQL Improvements: SQL-3 (1)
Different subversions:
■ SQL:1999: proposes the object-relational,
triggers and external functions
■ SQL:2003: extends the object oriented
model and allows to perform queries in Java
and over semistructured data (XML)
6
SQL Improvements: SQL-3 (2)
7
SQL Improvements
Unofficial Official
Name Name Features
SQL-86 Basic keywords
SQL-Base
SQL-89 Referential Integrity
Modello relazionale
SQL-2 SQL-92 New keywords
3 levels: entry, intermediate, full
Relational model with object-oriented
SQL:1999 Structured in different parts
Trigger, external functions, …
The support of the Object-Oriented model is extended
SQL-3 SQL:2003 The no-longer used keywords were removed
Extensions: SQL/JRT, SQL/XML, …
SQL:2006 Extended support for XML data
CREATE DATABASE:
■ Each newly created database contains
tables, views, triggers and other things
■ For example:
CREATE DATABASE db_name
Please Note:
■ In SQLite sqlite3 db_name.db sqlite3_open_v2(db_name)
■ In Mimer CREATE DATABANK db_name
9
Data Definition (2)
CREATE SCHEMA:
■ A SQL Schema is identified by a name
and describes the elements belonging
to it (tables, types, constraints, views,
domains, …). The schema will belong
to the user which has typed the
statement
■ For example:
CREATE SCHEMA schema_name
10
Data Definition (3)
CREATE SCHEMA:
■ Such statement could be even followed
by the AUTHORIZATION keyword, to
indicate a specific user owning the
schema
■ For example:
CREATE SCHEMA schema_name
AUTHORIZATION ‘user_name’
From MySQL 8.0 Reference Manual … “CREATE SCHEMA is
a synonym for CREATE DATABASE” 11
Data Definition (4)
CREATE TABLE:
■ Specifies a new relation and creates its
empty instance
■ It specifies its attributes (with their
types) and initial constraints
12
CREATE TABLE: an Example
CREATE TABLE EMPLOYEE (
Number CHARACTER(6) PRIMARY KEY,
Name CHARACTER(20) NOT NULL,
Surname CHARACTER(20) NOT NULL,
Dept CHARACTER(15),
Wage NUMERIC(9) DEFAULT 0,
FOREIGN KEY(Dept) REFERENCES
DEPARTMENT(Dept),
UNIQUE (Surname, Name)
)
13
(Attribute) Data Types
14
Basic Data Types
CREATE DOMAIN:
■ Each custom data type could be used
when defining new relations, stating
constraints and default values
16
CREATE DOMAIN: an Example
17
Table Constraints
■ NOT NULL
■ UNIQUE defining keys
■ PRIMARY KEY: (just one, implies NOT
NULL; DB2 has a non standard behaviour)
■ CHECK, let’s see it later
18
UNIQUE and PRIMARY KEY
19
CREATE TABLE: an Example
CREATE TABLE EMPLOYEE (
Number CHARACTER(6) PRIMARY KEY,
Name CHARACTER(20) NOT NULL,
Surname CHARACTER(20) NOT NULL,
Dept CHARACTER(15),
Wage NUMERIC(9) DEFAULT 0,
FOREIGN KEY(Dept) REFERENCES
DEPARTMENT(Dept),
UNIQUE (Surname, Name)
)
20
PRIMARY KEY: Other Options
Number CHARACTER(6),
…
PRIMARY KEY (Number)
21
CREATE TABLE: an Example
23
Key and Referential Integrity Constraints
25
Referential Integrity Constraints (2)
26
CREATE TABLE: an Example
28
Referential Triggered Action: Delete
29
Referential Triggered Action: Update
■ ALTER DOMAIN
■ ALTER TABLE
■ DROP DOMAIN
■ DROP TABLE
31
ALTER DOMAIN
ALTER DOMAIN:
■ Allows to alter previously-defined
domains
■ Such statement has to be used
alongside with those other ones: SET
DEFAULT, DROP DEFAULT, ADD
CONSTRAINT or DROP CONSTRAINT
32
ALTER DOMAIN: an Example (1)
33
ALTER DOMAIN: an Example (2)
ALTER TABLE:
■ Performs changes to previously
defined tables
■ Such statement has to be used
alongside with these parameters:
ALTER COLUMN, ADD COLUMN, DROP
COLUMN, DROP CONSTRAINT or ADD
CONSTRAINT
35
ALTER TABLE: an Example (1)
DROP DOMAIN:
■ Removes a user-defined data type
Example:
DROP DOMAIN Grade
39
DROP TABLE
DROP TABLE:
■ Removes a whole table instance with
its schema and its data
Example:
DROP TABLE OFFENCES
40
Defining Indices
41
CREATE INDEX: an Example
42
DDL in Practice
43
SQL: Data Operations
■ Query:
■ SELECT
■ Edit:
■ INSERT, DELETE, UPDATE
44
How to Interpret the SELECT Clause
SELECT *
FROM PEOPLE
WHERE Age < 30
46
Basic SELECT Statement
SELECT <AttributeList>
FROM <TableList>
[ WHERE <Condition> ]
■ Target list
■ FROM statement
■ WHERE statement
47
Database Example
48
Selection and Projection
PEOPLE
Return name and income Name Age Income
of people under 30 yo Jim 27 21
James 25 15
πName, Income (σAge<30 (PEOPLE)) Alice 55 42
Jesse 50 35
SELECT Name, Income Phil 26 30
Louis 50 40
FROM PEOPLE Frank 60 20
WHERE Age < 30 Olga 30 41
Steve 85 35
Abby 75 87
49
Selection and Projection
50
SELECT: (Attribute) Renaming
51
Pure Selection
PEOPLE
Provide the Name, Age Name Age Income
and Income of people Jim 27 21
under 30 yo James 25 15
Alice 55 42
σAge<30 (PEOPLE) Jesse 50 35
Phil 26 30
Louis 50 40
SELECT * Frank 60 20
FROM PEOPLE Olga 30 41
WHERE Age < 30 Steve 85 35
Abby 75 87
52
Selection without Projection
SELECT *
FROM PEOPLE
WHERE Age < 30
53
Projection without Selection
PEOPLE
Return the peoples’ name Name Age Income
and income Jim 27 21
James 25 15
πName,Income (PEOPLE) Alice 55 42
Jesse 50 35
SELECT Name, Income Phil 26 30
Louis 50 40
FROM PEOPLE Frank 60 20
Olga 30 41
Steve 85 35
Abby 75 87
54
Projection without Selection
55
SELECT: Shortcuts (2)
It corresponds to:
SELECT X.A AS A, X.B AS B
FROM R AS X
WHERE true
56
Composed Conditions
SELECT *
FROM PEOPLE
WHERE Income>25 AND (Age<30 OR
WHERE Age>60)
PEOPLE
Name Age Income
Phil 26 30
Frank 60 20
Olga 30 41
Steve 85 35
57
Composed Conditions
SELECT *
FROM PEOPLE
WHERE Income>25 AND (Age<30 OR
WHERE Age>60)
58
LIKE Predicate (1)
SELECT *
FROM PEOPLE
WHERE Name LIKE 'J_m%'
59
LIKE Predicate (2)
SELECT *
FROM PEOPLE
WHERE Name LIKE 'J_m%'
PEOPLE
Name Age Income
Jim 27 21
James 25 15
Alice 55 42
Jesse 50 35
Phil 26 30
Louis 50 40
Frank 60 20
60
Handling NULL Values
EMPLOYEE
Number Surname Agency Age
5998 Neri Milan 45
9553 Bruni Milan NULL
61
Example
SELECT *
FROM EMPLOYEE
WHERE Age>40 OR Age IS NULL
62
Projection (Relational Algebra)
EMPLOYEE
Number Surname Agency Age
7309 Neri Naples 55
5998 Neri Milan 64
9553 Rossi Rome 44
5698 Rossi Rome 64
63
Projection (SQL and DISTINCT)
64
Select, Project, Join
65
SQL vs Relational Algebra (1)
■ R1(A1,A2) R2(A3,A4)
SELECT DISTINCT R1.A1, R2.A4
FROM R1, R2
WHERE R1.A2 = R2.A3
■ Cartesian products (FROM)
■ Selection (WHERE)
■ Projection (SELECT)
66
SQL vs Relational Algebra (2)
■ R1(A1,A2) R2(A3,A4)
SELECT DISTINCT R1.A1, R2.A4
FROM R1, R2
WHERE R1.A2 = R2.A3
πA1,A4 (σA2=A3 (R1 ⨝ R2))
67
SQL: Alias and Renaming
68
SQL vs Relational Algebra (3)
ρB1,B2←A1,A4 (
πA1,A4 (σA2 = A3 AND A4 = C1 (
R1 ⨝ R2 ⨝ ρC1,C2 ← A1,A2 (R1)
πA1,A4 ()
)
)
69
SQL: Evaluating the Queries
70
SQL: Formulating the Queries
71
Database Example
72
Example 1
73
Example 2
75
Using Expressions in the Target List
PEOPLE
Name Age Income halvedIncome
Jim 27 21 20
James 25 15
Alice 55 42
Louis 50 40
76
JOIN Statement
■ Explicit JOIN:
SELECT Mother, [Link], Father
FROM MOTHERHOOD JOIN FATHERHOOD ON
FROM [Link] = [Link]
77
SELECT with JOIN: Syntax
SELECT …
FROM LeftTable { … JOIN RightTable
FROM ON joincondition }, …
[ WHERE otherPredicate ]
78
Example
FATHERHOOD ⨝ MOTHERHOOD
80
Outer Join
83
Full Outer Join: an Example
85
Sorting the Answer
89
Union, Intersection, Difference
90
Set Union
MOTHERHOOD FATHERHOOD
Mother Child Father Child
Abby Alice Steve Frank
Abby Louis Louis Olga
Jesse Olga Louis Phil
SELECT Child
FROM MOTHERHOOD Child
Alice
UNION
Louis
SELECT Child Olga
FROM FATHERHOOD Frank
Phil
91
Multiset Union
MOTHERHOOD FATHERHOOD
Mother Child Father Child
Abby Alice Steve Frank
Abby Louis Louis Olga
Jesse Olga Louis Phil
SELECT Child
FROM MOTHERHOOD Child
Alice
UNION ALL
Louis
SELECT Child Olga Olga
FROM FATHERHOOD Frank appears
Olga twice
Phil 92
Positional Notation (1)
95
Difference
SELECT Name
FROM EMPLOYEE
EXCEPT
SELECT Surname AS Name
FROM EMPLOYEE
96
Intersection
SELECT Name
FROM EMPLOYEE
INTERSECT
SELECT Surname AS Name
FROM EMPLOYEE
■ It is the same as
SELECT [Link]
FROM EMPLOYEE E, EMPLOYEE F
WHERE [Link] = [Link]
97
Database Example
98
Nested Queries
99
Nested Queries: an Example (1)
105
Nested Queries: an Example (3)
■ Provide name and income of the fathers’ having child
earning more than 20, and provide the child’s income too
SELECT DISTINCT [Link], [Link], [Link]
FROM PEOPLE F, FATHERHOOD, PEOPLE C
WHERE [Link] = Father AND Child = [Link] AND
WHERE [Link] > 20
■ Does the following one provide the same answer?
SELECT Name, Income ANY meaning: clause is
FROM PEOPLE true if Child value is equal
to any of the values
WHERE Name IN (SELECT Father returned by nested query
WHERE Name IN (FROM FATHERHOOD
WHERE Name IN (WHERE Child = ANY (SELECT Name
WHERE Name IN (WHERE Child = ANY (FROM PEOPLE
WHERE Name IN (WHERE Child = ANY (WHERE Income>20))
106
Nested Queries Visibility
SELECT Name, Income
FROM PEOPLE
WHERE Name IN (SELECT Father
WHERE Name IN (FROM FATHERHOOD
WHERE Name IN (WHERE Child=ANY (SELECT Name
WHERE Name IN (WHERE Child=ANY (FROM PEOPLE
WHERE Name IN (WHERE Child=ANY (WHERE Income>20))
Name
Jim
Name Income Father Alice
Frank 20 Frank Jesse
Louis 40 Louis Phil
Louis 40 Louis Louis
Olga
■ Answer: no, because for each father Steve
we do not view the child’s income Abby
107
Nested Queries: Considerations
■ Visibility Rules
■ It is not possible to refer to variables
declared within inner blocks
■ If a variable’s name is omitted, we
assume to take the “nearest” declared
one
■ We can refer to a variable defined:
■ within the scope of the query in which it is
defined (i.e., outer blocks)
■ or within the scope of a nested query, at
any level, (i.e., inner block) within it
108
Semantics of Nested Queries with Variables
109
Existential Quantification
EXISTS ( Expr )
■ The predicate is true if Expr returns at
least one tuple (i.e., Expr returns a
non-empty set)
■ Typically Expr is a nested query
■ Useful with a linking variable between the
outer query and the nested query
110
Existential Quantification: an Example (1)
111
Existential Quantification: an Example (2)
112
Existential Quantification: Error
113
Existential Quantification: Correct
114
Visibility: Wrong!
SELECT *
FROM EMPLOYEE
WHERE Dept IN (SELECT Name
WHERE Dept IN (FROM DEPARTMENT D1
WHERE Dept IN (WHERE Name='Production')
WHERE OR
WHERE Dept IN (SELECT Name
WHERE Dept IN (FROM DEPARTMENT D2
WHERE Dept IN (WHERE [Link] = [Link])
SELECT Name
FROM EMPLOYEE
EXCEPT
SELECT Surname AS Name
FROM EMPLOYEE
SELECT [Link]
FROM EMPLOYEE E
WHERE NOT EXISTS (SELECT *
WHERE NOT EXISTS (FROM EMPLOYEE
WHERE NOT EXISTS (WHERE Surname = [Link])
116
Nested Queries Positions
118
Nested Queries in SELECT clause
120
Aggregate Functions: COUNT (1)
FATHERHOOD
Father Child
Steve Frank
Louis Olga
Louis Phil
Frank Jim
Frank James
NumFrankChildren
2
122
COUNT DISTINCT
PEOPLE
Name Age Income
Jim 27 30
James 25 24
Alice 55 36
Jesse 50 36
124
COUNT with NULL Values (1)
PEOPLE
Name Age Income
Jim 27 30
James 25 NULL
Alice 55 36
Jesse 50 36
COUNT(DISTINCT Income)
2
126
Aggregate Functions and NULLs
PEOPLE
Name Age Income
Jim 27 21
James 25 NULL
Alice 55 21
Jesse 50 35
AvgInc
25.6
127
Aggregate Functions and Target List
■ A wrong query:
SELECT Name, MAX(Income)
FROM PEOPLE
■ Whose the name? We cannot extract the
name having the max income. The Target
List must have all the same types of
attributes
SELECT MIN(Age), MAX(Income)
FROM PEOPLE
128
Maximum and Nested Queries
129
Aggregate Functions and Grouping (1)
130
Aggregate Functions and Grouping (2)
FATHERHOOD
Father Child Father NumberOfChildren
Steve Frank Steve 1
Louis Olga Louis 2
Louis Phil Frank 2
Frank Jim
Frank James
131
GROUP BY: Semantics
132
Grouping and Target Lists
Wrong:
SELECT Father, AVG([Link]), [Link]
FROM PEOPLE C JOIN FATHERHOOD ON [Link]=Child
FROM JOIN PEOPLE F ON Father=[Link]
GROUP BY Father
We also need to
group by [Link]
Correct:
SELECT Father, AVG([Link]), [Link]
FROM PEOPLE C JOIN FATHERHOOD ON [Link]=Child
FROM JOIN PEOPLE F ON Father=[Link]
GROUP BY Father, [Link]
133
Conditions on Groups
B COUNT(*) A COUNT(*)
SELECT B, COUNT(*) SELECT A, COUNT(*)
11 2 1 1
FROM R GROUP BY B FROM R GROUP BY A
NULL 2 2 1
3 1
4 1
SELECT A, COUNT(B) A COUNT(B)
FROM R GROUP BY A 1 1
2 1
3 0
4 0
136
SELECT Syntax: Summary
137
Updating Operations
138
INSERT
or
139
INSERT: Examples
142
Deleting Tuples: some Examples
143
Deleting Tuples: Discussion
144
Updating Tuples
UPDATE TableName
SET Attribute = < Expr |
SET Attribute = < SELECT … |
SET Attribute = < NULL |
SET Attribute = < DEFAULT >
SE[ WHERE Condition ]
145
Updating Tuples (1)
PEOPLE
Name Age Income
BEFORE Jim 27 30
James 25 15
Bob 55 36
UPDATE PEOPLE
SET Income = 45
WHERE Name = Bob
PEOPLE
Name Age Income
AFTER Jim 27 30
James 25 15
Bob 55 45
146
Updating Tuples (2)
PEOPLE
Name Age Income
BEFORE Jim 27 30
James 25 15
Bob 55 36
UPDATE PEOPLE
SET Income = Income*1.1
WHERE Age < 30
PEOPLE
Name Age Income
AFTER Jim 27 33
James 25 16.5
Bob 55 36
147
Updating Tuples (3)
PEOPLE
Name Age Income
BEFORE Jim 27 30
James 25 15
UPDATE PEOPLE Bob 55 36
SET Income =
(SELECT Income FROM
(PEOPLE WHERE Name=Jim)
WHERE Name = Bob PEOPLE
Name Age Income
AFTER Jim 27 30
James 25 15
Bob 55 30
148
Updating Tuples (4)
PEOPLE
Name Age Income
BEFORE Jim 27 30
James 25 15
Bob 55 36
UPDATE PEOPLE
SET Income = NULL
WHERE Age < 30
PEOPLE
Name Age Income
AFTER Jim 27 NULL
James 25 NULL
Bob 55 36
149
Updating Tuples (5)
PEOPLE
Name Age Income
BEFORE Jim 27 30
James 25 15
Bob 55 36
UPDATE PEOPLE
SET Income = DEFAULT
WHERE Age < 30
PEOPLE
Name Age Income
AFTER Jim 27 0
James 25 0
Assuming that in CREATE TABLE
we specified 0 as the DEFAULT Bob 55 36
value for Income 150