Chapter 6
Chapter 6
SELECT
SELECT attributes
attributes
FROM
FROM relations
relations(possibly
(possiblymultiple)
multiple)
WHERE
WHERE conditions
conditions(selections)
(selections)
10
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”
11
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
12
A Notation for SQL Queries
Input Schema
SELECT
SELECT PName,
PName,Price,
Price,Manufacturer
Manufacturer
FROM
FROM Product
Product
WHERE
WHERE Price
Price>>100
100
Answer(PName, Price, Manfacturer)
Output Schema 13
Details
• Case insensitive:
– Same: SELECT Select select
– Same: Product product
– Different: ‘Seattle’ ‘seattle’
• Constants:
– ‘abc’ - yes
– “abc” - no
Selections
What goes in the WHERE clause:
• x = y, x < y, x <= y, etc
– For number, they have the usual meanings
– For CHAR and VARCHAR: lexicographic ordering
• Expected conversion between CHAR and VARCHAR
– For dates and times, what you expect...
• Pattern matching on strings...
15
The LIKE operator
• s LIKE p: pattern matching on strings
• p may contain two special symbols:
– % = any sequence of characters
– _ = any single character
SELECT
SELECT **
FROM
FROM Products
Products
WHERE
WHERE PName
PNameLIKE
LIKE‘%gizmo%’
‘%gizmo%’
16
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
17
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.
18
Ordering the Results
SELECT
SELECT category
category
FROM
FROM Product
Product
ORDER
ORDERBYBY pname
pname
?
Gizmo $19.99 Gadgets GizmoWorks
Powergizmo $29.99 Gadgets GizmoWorks
SingleTouch $149.99 Photography Canon
MultiTouch $203.99 Household Hitachi
19
Ordering the Results
Category
SELECT
SELECT DISTINCT
DISTINCTcategory
category Gadgets
FROM
FROM Product
Product Household
ORDER
ORDERBYBYcategory
category Photography
Compare to:
SELECT
SELECT category
?
category
FROM
FROM Product
Product
ORDER
ORDERBYBYpname
pname
20
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 in SQL
• Connect two or more tables:
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
GizmoWorks 25 USA
What is
the connection Canon 65 Japan
between
them ? Hitachi 15 Japan 22
Joins
Product (pname, price, category, manufacturer)
Company (cname, stockPrice, country)
23
Joins in SQL
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=cnameAND
manufacturer=cname ANDcountry=‘Japan’
country=‘Japan’
AND price <= 200
AND price <= 200
PName Price
SingleTouch $149.99
24
Joins
Product (pname, price, category, manufacturer)
Company (cname, stockPrice, country)
SELECT
SELECT country
country
FROM
FROM Product,
Product,Company
Company
WHERE
WHERE manufacturer=cname
manufacturer=cnameAND
ANDcategory=‘Gadgets’
category=‘Gadgets’
25
Joins in SQL
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,
Product,Company
Company
WHERE
WHERE manufacturer=cname
manufacturer=cnameAND
ANDcategory=‘Gadgets’
category=‘Gadgets’
Country
What is ??
the problem ? ??
What’s the
solution ? 26
Joins
Product (pname, price, category, manufacturer)
Purchase (buyer, seller, store, product)
Person(persname, phoneNumber, city)
SELECT
SELECT DISTINCT
DISTINCTpersname,
persname,store
store
FROM
FROM Person,
Person,Purchase,
Purchase,Product
Product
WHERE
WHERE persname=buyer
persname=buyerAND ANDproduct
product==pname
pnameAND
AND
city=‘Seattle’
city=‘Seattle’ AND
ANDcategory=‘Gadgets’
category=‘Gadgets’ 27
Disambiguating Attributes
• Sometimes two relations have the same attr:
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
DISTINCTPerson.pname,
Person.pname,Company.address
Company.address
FROM
FROM Person,
Person,Company
Company
WHERE
WHERE Person.worksfor
Person.worksfor==Company.cname
Company.cname
28
Meaning (Semantics) of SQL
Queries
SELECT
SELECTaa11,,aa22,,…,
…,aakk
FROM
FROM RR11AS ASxx11,,RR22AS
ASxx22,,…,
…,RRnnAS
ASxxnn
WHERE
WHERE Conditions
Conditions
Answer
Answer=={} {}
for
forxx11in
inRR11do
do
for
forxx22in
inRR22dodo
…..
…..
for
forxxnnin
inRRnndo
do
ififConditions
Conditions
then
thenAnswer Answer
Answer==Answer {(a
{(a11,…,a
,…,akk)}
)}
return
returnAnswer
Answer
An Unintuitive Query
SELECT
SELECT DISTINCT
DISTINCTR.A
R.A
FROM
FROM R,R,S,
S,TT
WHERE
WHERE R.A=S.A
R.A=S.A OR
OR R.A=T.A
R.A=T.A
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
SELECT
SELECT Count(category)
Count(category) same as Count(*)
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
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)
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
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
General form of Grouping and
Aggregation
SELECT S
FROM R1,…,Rn
WHERE C1
GROUP BY a1,…,ak Why ?
HAVING C2
SELECT
SELECTProduct.name,
Product.name,Purchase.store
Purchase.store
FROM
FROM Product
ProductJOIN
JOINPurchase
PurchaseONON
Product.name
Product.name==Purchase.prodName
Purchase.prodName
SELECT
SELECTProduct.name,
Product.name,Purchase.store
Purchase.store
FROM
FROM Product
ProductLEFT
LEFTOUTER
OUTERJOIN
JOINPurchase
PurchaseON
ON
Product.name
Product.name==Purchase.prodName
Purchase.prodName
Product Purchase
Name Category ProdName Store
Name Store
Gizmo Wiz
Camera Ritz
Camera Wiz
OneClick NULL
Modifying the Database
Three kinds of modifications
• Insertions
• Deletions
• Updates
INSERT
INSERT INTO
INTO R(A1,….,
R(A1,….,An)
An) VALUES
VALUES (v1,….,
(v1,….,vn)
vn)
SELECT
SELECT DISTINCT
DISTINCT Purchase.product
Purchase.product
FROM
FROM Purchase
Purchase
WHERE
WHERE Purchase.date
Purchase.date>>“10/26/01”
“10/26/01”
SELECT
SELECT DISTINCT
DISTINCT prodName
prodName
FROM
FROM Purchase
Purchase
WHERE
WHERE prodName
prodName NOT
NOTININ(SELECT
(SELECT name
nameFROM
FROM Product)
Product)
camera - -
Deletions
Example:
DELETE
DELETE FROM
FROM PURCHASE
PURCHASE
WHERE
WHERE seller
seller==‘Joe’
‘Joe’ AND
AND
product
product==‘Brooklyn
‘BrooklynBridge’
Bridge’
UPDATE
UPDATE PRODUCT
PRODUCT
SET
SET price
price==price/2
price/2
WHERE
WHERE Product.name
Product.name ININ
(SELECT
(SELECTproduct
product
FROM
FROM Purchase
Purchase
WHERE
WHERE DateDate=‘Oct,
=‘Oct,25,
25,1999’);
1999’);