ch03 SQL
ch03 SQL
ch03 SQL
Chapter 3: SQL
● Data Definition
● Basic Query Structure
● Set Operations
● Aggregate Functions
● Null Values
● Nested Subqueries
● Complex Queries
● Views
● Modification of the Database
● Joined Relations**
History
● IBM Sequel language developed as part of System R project at the
IBM San Jose Research Laboratory
● Renamed Structured Query Language (SQL)
● ANSI and ISO standard SQL:
● SQL-86
● SQL-89
● SQL-92
● SQL:1999 (language name became Y2K compliant!)
● SQL:2003
● Commercial systems offer most, if not all, SQL-92 features, plus
varying feature sets from later standards and special proprietary
features.
● Not all examples here may work on your particular system.
Data Definition Language
Allows the specification of not only a set of relations but also
information about each relation, including:
● The schema for each relation.
● The domain of values associated with each attribute.
● Integrity constraints
● The set of indices to be maintained for each relations.
● Security and authorization information for each relation.
● The physical storage structure of each relation on disk.
Domain Types in SQL
● char(n). Fixed length character string, with user-specified length n.
● varchar(n). Variable length character strings, with user-specified
maximum length n.
● int. Integer (a finite subset of the integers that is machine-dependent).
● smallint. Small integer (a machine-dependent subset of the integer
domain type).
● numeric(p,d). Fixed point number, with user-specified precision of p
digits, with n digits to the right of decimal point.
● real, double precision. Floating point and double-precision floating point
numbers, with machine-dependent precision.
● float(n). Floating point number, with user-specified precision of at least n
digits.
● More are covered in Chapter 4.
Create Table Construct
● An SQL relation is defined using the create table command:
create table r (A1 D1, A2 D2, ..., An Dn,
(integrity-constraint1),
...,
(integrity-constraintk))
● r is the name of the relation
● each Ai is an attribute name in the schema of relation r
● Di is the data type of values in the domain of attribute Ai
● Example:
create table branch
(branch_name char(15) not null,
branch_city char(30),
assets integer)
Integrity Constraints in Create Table
● not null
● primary key (A1, ..., An )
● Ai represents an attribute
● Ri represents a relation
● P is a predicate.
● This query is equivalent to the relational algebra expression.
● Find the names of all branches that have greater assets than
some branch located in Brooklyn.
select distinct T.branch_name
from branch as T, branch as S
where T.assets > S.assets and S.branch_city = 'Brooklyn'
●Keyword as is optional and may be omitted
borrower as T ≡ borrower T
String Operations
● SQL includes a string-matching operator for comparisons on character
strings. The operator “like” uses patterns that are described using two
special characters:
● percent (%). The % character matches any substring.
● underscore (_). The _ character matches any character.
● Find the names of all customers whose street includes the substring
“Main”.
select customer_name
from customer
where customer_street like '% Main%'
● Match the name “Main%”
like 'Main\%' escape '\'
● SQL supports a variety of string operations such as
● concatenation (using “||”)
● converting from upper to lower case (and vice versa)
● finding string length, extracting substrings, etc.
Ordering the Display of Tuples
● List in alphabetic order the names of all customers having a loan in
Perryridge branch
select distinct customer_name
from borrower, loan
where borrower loan_number = loan.loan_number and
branch_name = 'Perryridge'
order by customer_name
● We may specify desc for descending order or asc for ascending
order, for each attribute; ascending order is the default.
● Example: order by customer_name desc
Duplicates
● In relations with duplicates, SQL can define how many copies of
tuples appear in the result.
● Multiset versions of some of the relational algebra operators – given
multiset relations r1 and r2:
1. σθ (r1): If there are c1 copies of tuple t1 in r1, and t1 satisfies
selections σθ,, then there are c1 copies of t1 in σθ (r1).
2. ΠA (r ): For each copy of tuple t1 in r1, there is a copy of tuple
ΠA (t1) in ΠA (r1) where ΠA (t1) denotes the projection of the single
tuple t1.
3. r1 x r2 : If there are c1 copies of tuple t1 in r1 and c2 copies of
tuple t2 in r2, there are c1 x c2 copies of the tuple t1. t2 in r1 x r2
Duplicates (Cont.)
● Example: Suppose multiset relations r1 (A, B) and r2 (C) are as
follows:
r1 = {(1, a) (2,a)} r2 = {(2), (3), (3)}
● Then ΠB(r1) would be {(a), (a)}, while ΠB(r1) x r2 would be
{(a,2), (a,2), (a,3), (a,3), (a,3), (a,3)}
● SQL duplicate semantics:
select A1,, A2, ..., An
from r1, r2, ..., rm
where P
is equivalent to the multiset version of the expression:
Set Operations
● The set operations union, intersect, and except operate on relations
and correspond to the relational algebra operations ∪, ∩, −.
● Each of the above operations automatically eliminates duplicates; to
retain all duplicates use the corresponding multiset versions union
all, intersect all and except all.
● Find the names of all branches where the average account balance is
more than $1,200.
● Find all customers who have a loan at the bank but do not have
an account at the bank
● Find all branches that have greater assets than some branch located
in Brooklyn.
select branch_name
from branch
where assets > some
(select assets
from branch
where branch_city = 'Brooklyn')
Definition of Some Clause
0
(5 < some 5 ) = true
(read: 5 < some tuple in the relation)
6
0
(5 < some 5 ) = false
0
(5 = some 5 ) = true
0
(5 ≠ some 5 ) = true (since 0 ≠ 5)
(= some) ≡ in
However, (≠ some) ≡ not in
Example Query
● Find the names of all branches that have greater assets than all
branches located in Brooklyn.
select branch_name
from branch
where assets > all
(select assets
from branch
where branch_city = 'Brooklyn')
Definition of all Clause
● F <comp> all r ⇔ ∀ t ∈ r (F <comp> t)
0
(5 < all 5 ) = false
6
61
(5 < all ) = true
0
4
(5 = all 5 ) = false
4
(5 ≠ all 6 ) = true (since 5 ≠ 4 and 5 ≠ 6)
(≠ all) ≡ not in
However, (= all) ≡ in
Test for Empty Relations
● The exists construct returns the value true if the argument subquery is
nonempty.
● exists r ⇔ r ≠ Ø
● not exists r ⇔ r = Ø
Example Query
● Find all customers who have an account at all branches located in
Brooklyn.
● Note that X – Y = Ø ⇔ X ⊆ Y
● Note: Cannot write this query using = all and its variants
Test for Absence of Duplicate Tuples
● Find all branches where the total account deposit is greater than the
average of the total account deposits at all branches.
or equivalently
● Provide as a gift for all loan customers of the Perryridge branch, a $200
savings account. Let the loan number serve as the account number for
the new savings account
insert into account
select loan_number, branch_name, 200
from loan
where branch_name = 'Perryridge'
insert into depositor
select customer_name, loan_number
from loan, borrower
where branch_name = 'Perryridge'
and loan.account_number = borrower.account_number
● The select from where statement is evaluated fully before any of its
results are inserted into the relation (otherwise queries like
insert into table1 select * from table1
would cause problems)
Modification of the Database – Updates
● Increase all accounts with balances over $10,000 by 6%, all other
accounts receive 5%.
● Write two update statements:
update account
set balance = balance * 1.06
where balance > 10000
update account
set balance = balance * 1.05
where balance ≤ 10000
● The order is important
● Can be done better using the case statement (next slide)
Case Statement for Conditional Updates
update account
set balance = case
when balance <= 10000 then balance *1.05
else balance * 1.06
end
Update of a View
● Create a view of all loan data in the loan relation, hiding the amount
attribute
create view loan_branch as
select loan_number, branch_name
from loan
● Add a new tuple to branch_loan
insert into branch_loan
values ('L-37‘, 'Perryridge‘)
This insertion must be represented by the insertion of the tuple
('L-37', 'Perryridge', null )
into the loan relation
Updates Through Views (Cont.)
● Relation loan
● Relation borrower
● Find all customers who have either an account or a loan (but not
both) at the bank.
select customer_name
from (depositor natural full outer join borrower )
where account_number is null or loan_number is null
End of Chapter 3
Figure 3.1: Database Schema
branch (branch_name, branch_city, assets)
customer (customer_name, customer_street, customer_city)
loan (loan_number, branch_name, amount)
borrower (customer_name, loan_number)
account (account_number, branch_name, balance)
depositor (customer_name, account_number)
Figure 3.3: Tuples inserted into loan and
borrower
Figure 3.4:
The loan and borrower relations