SQL
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:
Example:
create table branch
(branch_name char(15),
branch_city char(30),
assets integer)
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.
Integrity Constraints on Tables
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.
∏ A ,A ,
1 2 , An (σ P (r1 × r2 × × rm ))
The result of an SQL query is a relation.
The select Clause
The select clause list the attributes desired in the result of a query
corresponds to the projection operation of the relational algebra
Example: find the names of all branches in the loan relation:
select branch_name
from loan
In the relational algebra, the query would be:
∏branch_name (loan)
NOTE: SQL names are case insensitive (i.e., you may use upper- or
lower-case letters.)
E.g. Branch_Name ≡ BRANCH_NAME ≡ branch_name
Some people use upper case wherever we use bold font.
The select Clause (Cont.)
SQL allows duplicates in relations as well as in query results.
To force the elimination of duplicates, insert the keyword distinct after
select.
Find the names of all branches in the loan relations, and remove
duplicates
select distinct branch_name
from loan
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
Some database such as Oracle require as to be omitted
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:
∏ A ,A ,
1 2 , An
(σ P (r1 × r2 × × rm ))
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.
Find the names of all branches that have assets greater than those of at
least one 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
0
(5 ≠ some 5 ) = true (since 0 ≠ 5)
(= some) ≡ in
However, (≠ some) is not equivalent to not in
Branch relation
select branch_name
from branch
where assets > all
(select assets
from branch
where branch_city = 'Brooklyn')
Definition of all Clause
0
(5 < all 5 ) = false
6
6
(5 < all 10 ) = true
4
(5 = all 5 ) = false
4
(5 ≠ all 6 ) = true (since 5 ≠ 4 and 5 ≠ 6)
(≠ all) ≡ not in
However, (= all) is not equivalent to in
“Exists” Construct
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
Absence of Duplicate Tuples
The unique construct tests whether a subquery has any duplicate
tuples in its result.
Find all customers who have at most one account at the Perryridge
branch.
select T.customer_name
from depositor as T
where unique (
select R.customer_name
from account, depositor as R
where T.customer_name = R.customer_name and
R.account_number = account.account_number and
account.branch_name = 'Perryridge')
Example Query
Find all customers who have at least two accounts at the Perryridge
branch.
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
Motivation: insert into table1 select * from table1
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
More Features
Joined Relations**
Join operations take two relations and return as a result another
relation.
These additional operations are typically used as subquery
expressions in the from clause
Join condition – defines which tuples in the two relations match, and
what attributes are present in the result of the join.
Join type – defines how tuples in each relation that do not match any
tuple in the other relation (based on the join condition) are treated.
Joined Relations – Datasets for Examples
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
Joined Relations – Examples
Natural join can get into trouble if two relations have an attribute with
same name that should not affect the join condition
e.g. an attribute such as remarks may be present in many tables
Solution:
loan full outer join borrower using (loan_number)
Derived Relations
SQL allows a subquery expression to be used in the from clause
Find the average account balance of those branches where the average
account balance is greater than $1200.
select branch_name, avg_balance
from (select branch_name, avg (balance)
from account
group by branch_name )
as branch_avg ( branch_name, avg_balance )
where avg_balance > 1200
Note that we do not need to use the having clause, since we compute
the temporary (view) relation branch_avg in the from clause, and the
attributes of branch_avg can be used directly in the where clause.
View Definition
A relation that is not of the conceptual model but is made visible to
a user as a “virtual relation” is called a view.
A view is defined using the create view statement which has the
form
Index created.
Index Creation Guidelines
Removing an Index
Remove an index from the data dictionary by using the DROP
INDEX command:
DROP INDEX index;
Remove the UPPER_LAST_NAME_IDX index from the data
dictionary:
DROP INDEX emp_last_name_idx;
Index dropped.
To drop an index, you must be the owner of the index or have
the DROP ANY INDEX privilege.