SQL
Dr. Hlomani
SQL Introduction
Standard language for querying and manipulating data
Structured Query Language
Many standards out there:
• ANSI SQL, SQL92 (a.k.a. SQL2), SQL99 (a.k.a. SQL3), ….
• Vendors support various subsets
SQL
• Data Definition Language (DDL)
– Create/alter/delete tables and their attributes
– Following lectures...
• Data Manipulation Language (DML)
– Query one or more tables – discussed next !
– Insert/delete/modify tuples in tables
Table name Attribute names
Tables in SQL
Product
PName Price Category Manufacturer
Gizmo $19.99 Gadgets GizmoWorks
Powergizmo $29.99 Gadgets GizmoWorks
SingleTouch $149.99 Photography Canon
MultiTouch $203.99 Household Hitachi
Tuples or rows
Tables Explained
• The schema of a table is the table name and
its attributes:
Product(PName, Price, Category, Manfacturer)
• A key is an attribute whose values are unique;
we underline a key
Product(PName, Price, Category, Manfacturer)
Data Types in SQL
• Atomic types:
– Characters: CHAR(20), VARCHAR(50)
– Numbers: INT, BIGINT, SMALLINT, FLOAT
– Others: MONEY, DATETIME, …
• Every attribute must have an atomic type
Tables Explained
• A tuple = a record
– Restriction: all attributes are of atomic type
• A table = a set of tuples
– Like a list…
– …but it is unorderd:
no first(), no next(), no last().
SQL Query
Basic form: (plus many many more bells and whistles)
SELECT
SELECT <attributes>
<attributes>
FROM
FROM <one
<oneorormore
morerelations>
relations>
WHERE
WHERE <conditions>
<conditions>
Simple SQL Query
Product PName Price Category Manufacturer
Gizmo $19.99 Gadgets GizmoWorks
Powergizmo $29.99 Gadgets GizmoWorks
SingleTouch $149.99 Photography Canon
MultiTouch $203.99 Household Hitachi
SELECT
SELECT **
FROM
FROM Product
Product
WHERE
WHERE category=‘Gadgets’
category=‘Gadgets’
PName Price Category Manufacturer
Gizmo $19.99 Gadgets GizmoWorks
Powergizmo $29.99 Gadgets GizmoWorks
“selection”
Simple SQL Query
Product PName Price Category Manufacturer
Gizmo $19.99 Gadgets GizmoWorks
Powergizmo $29.99 Gadgets GizmoWorks
SingleTouch $149.99 Photography Canon
MultiTouch $203.99 Household Hitachi
SELECT
SELECT PName,
PName,Price,
Price,Manufacturer
Manufacturer
FROM
FROM Product
Product
WHERE
WHERE Price
Price>>100
100
PName Price Manufacturer
“selection” and SingleTouch $149.99 Canon
“projection” MultiTouch $203.99 Hitachi
Notation
Input Schema
Product(PName, Price, Category, Manfacturer)
SELECT
SELECT PName,
PName,Price,
Price,Manufacturer
Manufacturer
FROM
FROM Product
Product
WHERE
WHERE Price
Price>>100
100
Answer(PName, Price, Manfacturer)
Output Schema
Details
• Case insensitive:
– Same: SELECT Select select
– Same: Product product
– Different: ‘Seattle’ ‘seattle’
• Constants:
– ‘abc’ - yes
– “abc” - no
The LIKE operator
SELECT
SELECT **
FROM
FROM Products
Products
WHERE
WHERE PName
PName LIKE
LIKE ‘%gizmo%’
‘%gizmo%’
• s LIKE p: pattern matching on strings
• p may contain two special symbols:
– % = any sequence of characters
– _ = any single character
Eliminating Duplicates
Category
SELECT
SELECT DISTINCT
DISTINCTcategory
category Gadgets
FROM
FROM Product
Product Photography
Household
Compare to:
Category
Gadgets
SELECT
SELECT category
category Gadgets
FROM
FROM Product
Product Photography
Household
Ordering the Results
SELECT
SELECT pname,
pname,price,
price,manufacturer
manufacturer
FROM
FROM Product
Product
WHERE
WHERE category=‘gizmo’
category=‘gizmo’AND
ANDprice
price>>50
50
ORDER
ORDERBYBY price,
price,pname
pname
Ties are broken by the second attribute on the ORDER BY list, etc.
Ordering is ascending, unless you specify the DESC keyword.
PName Price Category Manufacturer
Gizmo $19.99 Gadgets GizmoWorks
Powergizmo $29.99 Gadgets GizmoWorks
SingleTouch $149.99 Photography Canon
MultiTouch $203.99 Household Hitachi
SELECT
SELECT DISTINCT
DISTINCTcategory
category
FROM
FROM Product
ORDER
ORDERBY
Product
BYcategory
category ?
?
SELECT
SELECT Category
Category
FROM
FROM Product
Product
ORDER
ORDERBYBY PName
PName
?
SELECT
SELECT DISTINCT
DISTINCTcategory
category
FROM
FROM Product
Product
ORDER
ORDERBYBYPName
PName
Keys and Foreign Keys
Company
CName StockPrice Country
GizmoWorks 25 USA
Key
Canon 65 Japan
Hitachi 15 Japan
Product
PName Price Category Manufacturer
Foreign
Gizmo $19.99 Gadgets GizmoWorks
key
Powergizmo $29.99 Gadgets GizmoWorks
SingleTouch $149.99 Photography Canon
MultiTouch $203.99 Household Hitachi
Joins
Product (pname, price, category, manufacturer)
Company (cname, stockPrice, country)
Find all products under $200 manufactured in Japan;
return their names and prices.
Join
between Product
SELECT
SELECT PName,
PName,Price
Price and Company
FROM
FROM Product,
Product,Company
Company
WHERE
WHERE Manufacturer=CName
Manufacturer=CNameANDANDCountry=‘Japan’
Country=‘Japan’
AND
ANDPrice
Price<=
<=200
200
Joins
Product
Company
PName Price Category Manufacturer Cname StockPrice Country
Gizmo $19.99 Gadgets GizmoWorks GizmoWorks 25 USA
Powergizmo $29.99 Gadgets GizmoWorks Canon 65 Japan
SingleTouch $149.99 Photography Canon Hitachi 15 Japan
MultiTouch $203.99 Household Hitachi
SELECT
SELECT PName,
PName,Price
Price
FROM
FROM Product,
Product,Company
Company
WHERE
WHERE Manufacturer=CName
Manufacturer=CNameAND
ANDCountry=‘Japan’
Country=‘Japan’
AND
ANDPrice
Price<=
<=200
200
PName Price
SingleTouch $149.99
More Joins
Product (pname, price, category, manufacturer)
Company (cname, stockPrice, country)
Find all Chinese companies that manufacture products
both in the ‘electronic’ and ‘toy’ categories
SELECT
SELECT cname
cname
FROM
FROM
WHERE
WHERE
A Subtlety about Joins
Product (pname, price, category, manufacturer)
Company (cname, stockPrice, country)
Find all countries that manufacture some product in the
‘Gadgets’ category.
SELECT
SELECT Country
Country
FROM
FROM Product,
Product,Company
Company
WHERE
WHERE Manufacturer=CName
Manufacturer=CNameAND
ANDCategory=‘Gadgets’
Category=‘Gadgets’
Unexpected duplicates
A Subtlety about Joins
Product
Company
Name Price Category Manufacturer Cname StockPrice Country
Gizmo $19.99 Gadgets GizmoWorks GizmoWorks 25 USA
Powergizmo $29.99 Gadgets GizmoWorks Canon 65 Japan
SingleTouch $149.99 Photography Canon Hitachi 15 Japan
MultiTouch $203.99 Household Hitachi
SELECT
SELECT Country
Country
FROM
FROM Product,Company
Product, Company
WHERE
WHERE Manufacturer=CNameAND
Manufacturer=CName ANDCategory=‘Gadgets’
Category=‘Gadgets’
Country
What is ??
the problem ? ??
What’s the
solution ?
Tuple Variables
Person(pname, address, worksfor)
Company(cname, address)
Which
SELECT
SELECT DISTINCT
DISTINCTpname,
pname,address
address address ?
FROM
FROM Person,
Person,Company
Company
WHERE
WHERE worksfor
worksfor==cname
cname
SELECT
SELECT DISTINCT
[Link],
[Link],[Link]
[Link]
FROM
FROM Person,
Person,Company
Company
WHERE
WHERE [Link]
[Link]==[Link]
[Link]
SELECT
SELECT DISTINCT
[Link],
[Link],[Link]
[Link]
FROM
FROM Person
PersonAS
ASx,x,Company
CompanyAS ASyy
WHERE
WHERE [Link]
[Link]==[Link]
[Link]
Subqueries Returning Relations
Company(name, city)
Product(pname, maker)
Purchase(id, product, buyer)
Return cities where one can find companies that manufacture
products bought by Joe Blow
SELECT
SELECT [Link]
[Link]
FROM
FROM Company
Company
WHERE
WHERE [Link]
[Link] ININ
(SELECT
([Link]
[Link]
FROM
FROM Purchase
Purchase,,Product
Product
WHERE
[Link]=[Link]
[Link]=[Link]
AND
ANDPurchase
[Link]
.buyer==‘Joe
‘JoeBlow‘);
Blow‘);
Subqueries Returning Relations
Is it equivalent to this ?
SELECT
SELECT [Link]
[Link]
FROM
FROM Company,
Company,Product,
Product,Purchase
Purchase
WHERE
WHERE [Link]=
[Link]=[Link]
[Link]
AND
AND [Link]
[Link] ==[Link]
[Link]
AND
AND [Link]
[Link]==‘Joe
‘JoeBlow’
Blow’
Beware of duplicates !
Removing Duplicates
SELECT
SELECTDISTINCT
[Link]
[Link]
FROM
FROM Company
Company
WHERE
WHERE [Link]
[Link] IN
IN
(SELECT
([Link]
[Link]
FROM
FROM Purchase
Purchase,,Product
Product
WHERE
[Link]=[Link]
[Link]=[Link]
AND
ANDPurchase
[Link]
.buyer==‘Joe
‘JoeBlow‘);
Blow‘);
SELECT
SELECTDISTINCT
[Link]
[Link] Now
FROM
FROM Company,
Company,Product,
Product,Purchase
Purchase they are
WHERE
WHERE [Link]=
[Link]=[Link]
[Link] equivalent
AND
AND [Link]
[Link] ==[Link]
[Link]
AND
AND [Link]
[Link]==‘Joe
‘JoeBlow’
Blow’
Subqueries Returning Relations
You can also use: s > ALL R
s > ANY R
EXISTS R
Product ( pname, price, category, maker)
Find products that are more expensive than all those produced
By “Gizmo-Works”
SELECT
SELECT name
name
FROM
FROM Product
Product
WHERE
WHERE price
price>> ALL
ALL(SELECT
(SELECTprice
price
FROM
FROM Purchase
Purchase
WHERE
WHERE maker=‘Gizmo-Works’)
maker=‘Gizmo-Works’)
Food for Thought!!
• Can we express this query as a single
SELECT-FROM-WHERE query, without
subqueries ?
Aggregation
SELECT
SELECT avg(price)
avg(price) SELECT
SELECT count(*)
count(*)
FROM
FROM Product
Product FROM
FROM Product
Product
WHERE
WHERE maker=“Toyota”
maker=“Toyota” WHERE
WHERE year
year>>1995
1995
SQL supports several aggregation operations:
sum, count, min, max, avg
Except count, all aggregations apply to a single attribute
Aggregation: Count
COUNT applies to duplicates, unless otherwise stated:
SELECT same as Count(*)
SELECT Count(category)
Count(category)
FROM
FROM Product
Product
WHERE
WHERE year
year>>1995
1995
We probably want:
SELECT
SELECT Count(DISTINCT
Count(DISTINCTcategory)
category)
FROM
FROM Product
Product
WHERE
WHERE year
year>>1995
1995
More Examples
Purchase(product, date, price, quantity)
SELECT
SELECT Sum(price
Sum(price**quantity)
quantity)
FROM
FROM Purchase
Purchase
What do
they mean ?
SELECT
SELECT Sum(price
Sum(price**quantity)
quantity)
FROM
FROM Purchase
Purchase
WHERE
WHERE product
product==‘bagel’
‘bagel’
Purchase
Simple Aggregations
Product Date Price Quantity
Bagel 10/21 1 20
Banana 10/3 0.5 10
Banana 10/10 1 10
Bagel 10/25 1.50 20
SELECT
SELECT Sum(price
Sum(price**quantity)
quantity)
FROM
FROM Purchase
Purchase 50 (= 20+30)
WHERE
WHERE product
product==‘bagel’
‘bagel’
Grouping and Aggregation
Purchase(product, date, price, quantity)
Find total sales after 10/1/2005 per product.
SELECT
SELECT product,
product,Sum(price*quantity)
Sum(price*quantity)AS
ASTotalSales
TotalSales
FROM
FROM Purchase
Purchase
WHERE
WHERE date
date>>‘10/1/2005’
‘10/1/2005’
GROUP
GROUPBYBY product
product
Let’s see what this means…
Grouping and Aggregation
1. Compute the FROM and WHERE clauses.
2. Group by the attributes in the GROUPBY
3. Compute the SELECT clause: grouped attributes and aggregates.
1&2. FROM-WHERE-GROUPBY
Product Date Price Quantity
Bagel 10/21 1 20
Bagel 10/25 1.50 20
Banana 10/3 0.5 10
Banana 10/10 1 10
3. SELECT
Product Date Price Quantity Product TotalSales
Bagel 10/21 1 20
Bagel 10/25 1.50 20 Bagel 50
Banana 10/3 0.5 10
Banana 15
Banana 10/10 1 10
SELECT
SELECT product,
product,Sum(price*quantity)
Sum(price*quantity)AS
ASTotalSales
TotalSales
FROM
FROM Purchase
Purchase
WHERE
WHERE date
date>>‘10/1/2005’
‘10/1/2005’
GROUP
GROUPBYBY product
product
GROUP BY v.s. Nested Quereis
SELECT
SELECT product,
product,Sum(price*quantity)
Sum(price*quantity)AS
ASTotalSales
TotalSales
FROM
FROM Purchase
Purchase
WHERE
WHERE datedate>>‘10/1/2005’
‘10/1/2005’
GROUP
GROUPBYBY product
product
SELECT
SELECTDISTINCT
DISTINCT [Link],
[Link],(SELECT
(SELECTSum([Link]*[Link])
Sum([Link]*[Link])
FROM
FROM Purchase
Purchaseyy
WHERE
[Link]
[Link]==[Link]
[Link]
AND
[Link]
[Link]>>‘10/1/2005’)
‘10/1/2005’)
AS
ASTotalSales
TotalSales
FROM
FROM Purchase
Purchasexx
WHERE
WHERE [Link]
[Link]>>‘10/1/2005’
‘10/1/2005’
Another Example
What does
it mean ?
SELECT
SELECT product,
product,
sum(price
sum(price**quantity)
quantity)AS
ASSumSales
SumSales
max(quantity)
max(quantity)AS
ASMaxQuantity
MaxQuantity
FROM
FROM Purchase
Purchase
GROUP
GROUPBY
BYproduct
product
HAVING Clause
Same query, except that we consider only products that had
at least 100 buyers.
SELECT
SELECT product,
product,Sum(price
Sum(price**quantity)
quantity)
FROM
FROM Purchase
Purchase
WHERE
WHERE datedate>>‘10/1/2005’
‘10/1/2005’
GROUP
GROUPBYBYproduct
product
HAVING
HAVING Sum(quantity)
Sum(quantity)>>3030
HAVING clause contains conditions on aggregates.
General form of Grouping and
Aggregation
SELECT S
FROM R1,…,Rn
WHERE C1
GROUP BY a1,…,ak Why ?
HAVING C2
S = may contain attributes a1,…,ak and/or any aggregates but NO OTHER
ATTRIBUTES
C1 = is any condition on the attributes in R 1,…,Rn
C2 = is any condition on aggregate expressions
General form of Grouping and
Aggregation
SELECT
SELECT SS
FROM
FROM RR11,…,R
,…,Rnn
WHERE
WHERE C1C1
GROUP
GROUPBYBYaa11,…,a
,…,akk
HAVING
HAVING C2 C2
Evaluation steps:
1. Evaluate FROM-WHERE, apply condition C1
2. Group by the attributes a1,…,ak
3. Apply condition C2 to each group (may have
aggregates)
4. Compute aggregates in S and return the result
Advanced SQLizing
1. Getting around INTERSECT and EXCEPT
2. Quantifiers
3. Aggregation v.s. subqueries
NULLS in SQL
• Whenever we don’t have a value, we can put a NULL
• Can mean many things:
– Value does not exists
– Value exists but is unknown
– Value not applicable
– Etc.
• The schema specifies for each attribute if can be null
(nullable attribute) or not
• How does SQL cope with tables that have NULLs ?
Null Values
• If x= NULL then 4*(3-x)/7 is still NULL
• If x= NULL then x=“Joe” is UNKNOWN
• In SQL there are three boolean values:
FALSE = 0
UNKNOWN = 0.5
TRUE = 1
Outerjoins
Explicit joins in SQL = “inner joins”:
Product(name, category)
Purchase(prodName, store)
SELECT
[Link],
[Link],[Link]
[Link]
FROM
FROM Product
ProductJOIN
JOINPurchase
PurchaseONON
[Link]
[Link]==[Link]
[Link]
Same as: SELECT
[Link],
[Link],[Link]
[Link]
FROM
FROM Product,
Product,Purchase
Purchase
WHERE
WHERE [Link]
[Link]==[Link]
[Link]
But Products that never sold will be lost !
Outerjoins
Left outer joins in SQL:
Product(name, category)
Purchase(prodName, store)
SELECT
[Link],
[Link],[Link]
[Link]
FROM
FROM Product
ProductLEFT
LEFTOUTER
OUTERJOIN
JOINPurchase
PurchaseON
ON
[Link]
[Link]==[Link]
[Link]
Product Purchase
Name Category ProdName Store
Gizmo gadget Gizmo Wiz
Camera Photo Camera Ritz
OneClick Photo Camera Wiz
Name Store
Gizmo Wiz
Camera Ritz
Camera Wiz
OneClick NULL
Application
Compute, for each product, the total number of sales in ‘September’
Product(name, category)
Purchase(prodName, month, store)
SELECT
[Link],
[Link],count(*)
count(*)
FROM
FROM Product,
Product,Purchase
Purchase
WHERE
WHERE [Link]
[Link]==[Link]
[Link]
and
and [Link]
[Link]==‘September’
‘September’
GROUP
GROUPBY [Link]
[Link]
What’s wrong ?
Application
Compute, for each product, the total number of sales in ‘September’
Product(name, category)
Purchase(prodName, month, store)
SELECT
[Link],
[Link],count(*)
count(*)
FROM
FROM Product
ProductLEFT
LEFTOUTER
OUTERJOINJOINPurchase
PurchaseON
ON
[Link]
[Link]==[Link]
[Link]
and
and [Link]
[Link]==‘September’
‘September’
GROUP
[Link]
[Link]
Now we also get the products who sold in 0 quantity
Outer Joins
• Left outer join:
– Include the left tuple even if there’s no match
• Right outer join:
– Include the right tuple even if there’s no match
• Full outer join:
– Include the both left and right tuples even if there’s no
match
Modifying the Database
Three kinds of modifications
• Insertions
• Deletions
• Updates
Sometimes they are all called “updates”
Insertions
General form:
INSERT
INSERT INTO
INTO R(A1,….,
R(A1,….,An)
An) VALUES
VALUES (v1,….,
(v1,….,vn)
vn)
Example: Insert a new purchase to the database:
INSERT
INSERT INTO
INTO Purchase(buyer,
Purchase(buyer,seller,
seller,product,
product,store)
store)
VALUES
VALUES (‘Joe’,
(‘Joe’,‘Fred’,
‘Fred’,‘wakeup-clock-espresso-machine’,
‘wakeup-clock-espresso-machine’,
‘The
‘TheSharper
SharperImage’)
Image’)
Missing attribute NULL.
May drop attribute names if give them in order.
Insertions
INSERT
INSERT INTO
INTO PRODUCT(name)
PRODUCT(name)
SELECT
SELECT DISTINCT
DISTINCT [Link]
[Link]
FROM
FROM Purchase
Purchase
WHERE
WHERE [Link]
[Link]>>“10/26/01”
“10/26/01”
The query replaces the VALUES keyword.
Here we insert many tuples into PRODUCT
Insertion: an Example
Product(name,
Product(name,listPrice,
listPrice,category)
category)
Purchase(prodName,
Purchase(prodName,buyerName,
buyerName,price)
price)
prodName is foreign key in [Link]
Suppose database got corrupted and we need to fix it:
Purchase
Product
prodName buyerName price
name listPrice category
camera John 200
gizmo 100 gadgets gizmo Smith 80
camera Smith 225
Task: insert in Product all prodNames from Purchase
Insertion: an Example
INSERT
INSERT INTO
INTO Product(name)
Product(name)
SELECT
SELECT DISTINCT
DISTINCT prodName
prodName
FROM
FROM Purchase
Purchase
WHERE
WHERE prodName
prodName NOT
NOTININ(SELECT
(SELECT name
nameFROM
FROM Product)
Product)
name listPrice category
gizmo 100 Gadgets
camera - -
Insertion: an Example
INSERT
INSERT INTO
INTO Product(name,
Product(name,listPrice)
listPrice)
SELECT
SELECT DISTINCT
DISTINCT prodName,
prodName,price
price
FROM
FROM Purchase
Purchase
WHERE
WHERE prodName
prodName NOT
NOTININ(SELECT
(SELECT name
nameFROM
FROM Product)
Product)
name listPrice category
gizmo 100 Gadgets
camera 200 -
camera ?? 225 ?? - Depends on the implementation
Deletions
Example:
DELETE
DELETE FROM
FROM PURCHASE
PURCHASE
WHERE
WHERE seller
seller==‘Joe’
‘Joe’ AND
AND
product
product==‘Brooklyn
‘BrooklynBridge’
Bridge’
Factoid about SQL: there is no way to delete only a single
occurrence of a tuple that appears twice
in a relation.
Updates
Example:
UPDATE
UPDATE PRODUCT
PRODUCT
SET
SET price
price==price/2
price/2
WHERE
WHERE [Link]
[Link] ININ
(SELECT
(SELECTproduct
product
FROM
FROM Purchase
Purchase
WHERE
WHERE DateDate=‘Oct,
=‘Oct,25,
25,1999’);
1999’);