0% found this document useful (0 votes)
3 views

lecture-sql QUERY

The document provides an introduction to SQL, detailing its components such as Data Definition Language (DDL) and Data Manipulation Language (DML). It covers creating and using databases, creating tables, inserting data, and performing queries including joins and selections. Additionally, it explains SQL syntax, data types, and the importance of keys and foreign keys in relational databases.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
3 views

lecture-sql QUERY

The document provides an introduction to SQL, detailing its components such as Data Definition Language (DDL) and Data Manipulation Language (DML). It covers creating and using databases, creating tables, inserting data, and performing queries including joins and selections. Additionally, it explains SQL syntax, data types, and the importance of keys and foreign keys in relational databases.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 95

SQL Introduction

Standard language for querying and manipulating data

Structured Query Language


SQL
• Data Definition Language (DDL)
– Create/alter/delete tables and their attributes
• Data Manipulation Language (DML)
– Query one or more tables – discussed next !
– Insert/delete/modify tuples in tables
Creating the database
• CREATE DATABASE <database name>;

• CREATE DATABASE username;

• On the course server you have only been


granted permission to create a database
whose name is your username.
Using a database
• USE <database name>;

• USE username;

• DROP <database name>;

• DROP username;
Deleting a database
• DROP DATABASE [IF EXISTS]
<databasename>;

• DROP DATABASE databasename;

• This deletes the database and all tables and


contents. Use with caution.
Create Table
Example

CREATE TABLE Parts


(
PartID INT NOT NULL,
PartName VARCHAR(40) NOT NULL,
CatID INT NOT NULL,
PRIMARY KEY (PartID)
);
Special Note
• you can copy & paste the SQL commands
from the PowerPoint slides into MySQL.
TABLE Parts
PartID PartName CatiID
Inserting elements

INSERT INTO Parts


(PartID, PartName, CatID)
VALUES
(1001,'Guy wire assembly',503),
(1002,'Magnet',504);

INSERT INTO Parts


VALUES
(1003,'Regulator',505);
TABLE Parts
PartID PartName CatiID
1001 Guy wire assembly 503
1002 Magnet 504
1003 Regulator 505
1004 Brushes 504
1006 Generator 506
1006 Dump load system 506
1007 Power assembly 501
SELECT Examples
SELECT * FROM Parts;

SELECT PartID, PartName FROM Parts;

SELECT PartID, PartName FROM Parts


WHERE
CatiID = 504;
Create Books Table
CREATE TABLE Books
(
BookID SMALLINT NOT NULL PRIMARY
KEY,
BookTitle VARCHAR(60) NOT NULL,
Copyright YEAR NOT NULL
);
Create Example Tables
• Books
• Authors
• AuthorBook
Insert data into Books
INSERT INTO Books
VALUES (12786, 'Letters to a Young Poet', 1934),
(13331, 'Winesburg, Ohio', 1919),
(14356, 'Hell\'s Angels', 1966),
(15729, 'Black Elk Speaks', 1932),
(16284, 'Noncomformity', 1996),
(17695, 'A Confederacy of Dunces', 1980),
(19264, 'Postcards', 1992),
(19354, 'The Shipping News', 1993);
Create Authors Table
CREATE TABLE Authors
(
AuthID SMALLINT NOT NULL PRIMARY
KEY,
AuthFN VARCHAR(20),
AuthMN VARCHAR(20),
AuthLN VARCHAR(20)
);
Insert data into Books
INSERT INTO Authors
VALUES (1006, 'Hunter', 'S.', 'Thompson'),
(1007, 'Joyce', 'Carol', 'Oates'),
(1008, 'Black', NULL, 'Elk'),
(1009, 'Rainer', 'Maria', 'Rilke'),
(1010, 'John', 'Kennedy', 'Toole'),
(1011, 'John', 'G.', 'Neihardt'),
(1012, 'Annie', NULL, 'Proulx'),
(1013, 'Alan', NULL, 'Watts'),
(1014, 'Nelson', NULL, 'Algren');
Create AuthorBook Table
CREATE TABLE AuthorBook
(
AuthID SMALLINT NOT NULL,
BookID SMALLINT NOT NULL,
PRIMARY KEY (AuthID, BookID),
FOREIGN KEY (AuthID) REFERENCES Authors
(AuthID),
FOREIGN KEY (BookID) REFERENCES Books
(BookID)
);
Insert Data into AuthorBook
INSERT INTO AuthorBook
VALUES (1006, 14356), (1008, 15729),
(1009, 12786), (1010, 17695),
(1011, 15729), (1012, 19264),
(1012, 19354), (1014, 16284);
Basic Join
SELECT BookTitle, Copyright, Authors.AuthID
FROM Books, AuthorBook, Authors
WHERE
Books.BookID=AuthorBook.BookID
AND
AuthorBook.AuthID=Authors.AuthID
ORDER BY Books.BookTitle;
Basic Join
SELECT BookTitle, Copyright,
Authors.AuthID
FROM Books, AuthorBook, Authors
ORDER BY BookTitle;

What happens when we leave off the WHERE


clause?
Basic Join
SELECT BookTitle, Copyright, AuthID
FROM Books AS b, AuthorBook AS ab
WHERE b.BookID=ab.BookID
ORDER BY BookTitle;
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


– Hence tables are flat
– Why ?
SQL Query

Basic form: (plus many many more bells and whistles)


SELECT STATEMENT.

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
DISTINCTPerson.pname,
Person.pname,Company.address
Company.address
FROM
FROM Person,
Person,Company
Company
WHERE
WHERE Person.worksfor
Person.worksfor==Company.cname
Company.cname
SELECT
SELECT DISTINCT
DISTINCTx.pname,
x.pname,y.address
y.address
FROM
FROM Person
PersonAS
ASx,x,Company
CompanyAS ASyy
WHERE
WHERE x.worksfor
x.worksfor==y.cname
y.cname
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

What does it compute ?

Computes R  (S  T) But what if S =  ?


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 Company.city
Company.city
FROM
FROM Company
Company
WHERE
WHERE Company.name
Company.name ININ
(SELECT
(SELECTProduct.maker
Product.maker
FROM
FROM Purchase
Purchase,,Product
Product
WHERE
WHEREProduct.pname=Purchase.product
Product.pname=Purchase.product
AND
ANDPurchase
Purchase.buyer
.buyer==‘Joe
‘JoeBlow‘);
Blow‘);
Subqueries Returning Relations
Is it equivalent to this ?

SELECT
SELECT Company.city
Company.city
FROM
FROM Company,
Company,Product,
Product,Purchase
Purchase
WHERE
WHERE Company.name=
Company.name=Product.maker
Product.maker
AND
AND Product.pname
Product.pname ==Purchase.product
Purchase.product
AND
AND Purchase.buyer
Purchase.buyer==‘Joe
‘JoeBlow’
Blow’

Beware of duplicates !
Removing Duplicates
SELECT
SELECTDISTINCT
DISTINCTCompany.city
Company.city
FROM
FROM Company
Company
WHERE
WHERE Company.name
Company.name IN
IN
(SELECT
(SELECTProduct.maker
Product.maker
FROM
FROM Purchase
Purchase,,Product
Product
WHERE
WHEREProduct.pname=Purchase.product
Product.pname=Purchase.product
AND
ANDPurchase
Purchase.buyer
.buyer==‘Joe
‘JoeBlow‘);
Blow‘);

SELECT
SELECTDISTINCT
DISTINCTCompany.city
Company.city Now
FROM
FROM Company,
Company,Product,
Product,Purchase
Purchase they are
WHERE
WHERE Company.name=
Company.name=Product.maker
Product.maker equivalent
AND
AND Product.pname
Product.pname ==Purchase.product
Purchase.product
AND
AND Purchase.buyer
Purchase.buyer==‘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’)
Question for Database Fans
and their Friends
• Can we express this query as a single
SELECT-FROM-WHERE query, without
subqueries ?
Question for Database Fans
and their Friends
• Answer: all SFW queries are
monotone (figure out what this means).
A query with ALL is not monotone
Correlated Queries
Movie (title, year, director, length)
Find movies whose title appears more than once.
correlation

SELECT
SELECTDISTINCT
DISTINCTtitle
title
FROM
FROM Movie
MovieAS
ASxx
WHERE
WHERE year
year<>
<>ANY
ANY
(SELECT
(SELECT year
year
FROM
FROM Movie
Movie
WHERE
WHERE title
title== x.title);
x.title);

Note (1) scope of variables (2) this can still be expressed as single SFW
Complex Correlated Query
Product ( pname, price, category, maker, year)
• Find products (and their manufacturers) that are more expensive
than all products made by the same manufacturer before 1972

SELECT
SELECTDISTINCT
DISTINCT pname,
pname,maker
maker
FROM
FROM Product
ProductAS
ASxx
WHERE
WHERE price
price>>ALL
ALL (SELECT
(SELECT price
price
FROM
FROM Product
ProductAS
ASyy
WHERE
WHERE x.maker
x.maker==y.maker
y.makerAND
ANDy.year
y.year<<1972);
1972);

Very powerful ! Also much harder to optimize.


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 x.product,
x.product,(SELECT
(SELECTSum(y.price*y.quantity)
Sum(y.price*y.quantity)
FROM
FROM Purchase
Purchaseyy
WHERE
WHEREx.product
x.product==y.product
y.product
AND
ANDy.date
y.date>>‘10/1/2005’)
‘10/1/2005’)
AS
ASTotalSales
TotalSales
FROM
FROM Purchase
Purchasexx
WHERE
WHERE x.date
x.date>>‘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


INTERSECT and EXCEPT: not in SQL Server

1. INTERSECT and EXCEPT: If R, S have no


duplicates, then can
write without
subqueries
(SELECT
(SELECTR.A,
R.A,R.B
R.B SELECT
SELECTR.A,
R.A,R.B
R.B (HOW ?)
FROM
FROM R) R) FROM
FROM RR
INTERSECT
INTERSECT WHERE
WHERE
(SELECT
(SELECTS.A,
S.A,S.B
S.B EXISTS(SELECT
EXISTS(SELECT**
FROM
FROM S) S) FROM
FROMSS
WHERE
WHERER.A=S.A
R.A=S.Aand
andR.B=S.B)
R.B=S.B)

(SELECT
(SELECTR.A,
R.A,R.B
R.B SELECT
SELECTR.A,
R.A,R.B
R.B
FROM
FROM R)R) FROM
FROM RR
EXCEPT
EXCEPT WHERE
WHERE
(SELECT
(SELECTS.A,
S.A,S.B
S.B NOT
NOT EXISTS(SELECT
EXISTS(SELECT**
FROM
FROM S)S) FROM
FROMSS
WHERE
WHERER.A=S.A
R.A=S.Aand
andR.B=S.B)
R.B=S.B)
2. Quantifiers
Product ( pname, price, company)
Company( cname, city)

Find all companies that make some products with price < 100

SELECT
SELECTDISTINCT
DISTINCT Company.cname
Company.cname
FROM
FROM Company,
Company,Product
Product
WHERE
WHERE Company.cname
Company.cname==Product.company
Product.companyand
andProduct.price
Product.price<<100
100

Existential: easy ! 
2. Quantifiers
Product ( pname, price, company)
Company( cname, city)

Find all companies that make only products with price < 100
same as:
Find all companies s.t. all of their products have price < 100

Universal: hard ! 
2. Quantifiers
1. Find the other companies: i.e. s.t. some product  100
SELECT
SELECTDISTINCT
DISTINCT Company.cname
Company.cname
FROM
FROM Company
Company
WHERE
WHERE Company.cname
Company.cnameIN
IN(SELECT
(SELECTProduct.company
Product.company
FROM
FROMProduct
Product
WHERE
WHEREProduc.price
Produc.price>=
>=100
100

2. Find all companies s.t. all their products have price < 100
SELECT
SELECTDISTINCT
DISTINCT Company.cname
Company.cname
FROM
FROM Company
Company
WHERE
WHERE Company.cname
Company.cnameNOT
NOTIN IN(SELECT
(SELECTProduct.company
Product.company
FROM Product
FROM Product
WHERE
WHEREProduc.price
Produc.price>=
>=100
100
3. Group-by v.s. Nested Query
Author(login,name)
Wrote(login,url)
• Find authors who wrote  10 documents: This is
• Attempt 1: with nested queries SQL by
a novice
SELECT
SELECTDISTINCT
DISTINCTAuthor.name
Author.name
FROM
FROM Author
Author
WHERE
WHERE count(SELECT
count(SELECTWrote.url
Wrote.url
FROM
FROMWrote
Wrote
WHERE
WHEREAuthor.login=Wrote.login)
Author.login=Wrote.login)
>>10
10
3. Group-by v.s. Nested Query
• Find all authors who wrote at least 10
documents:
• Attempt 2: SQL style (with GROUP BY)

SELECT
SELECT Author.name
Author.name This is
FROM
FROM Author,
Author,Wrote
Wrote SQL by
WHERE
WHERE Author.login=Wrote.login
Author.login=Wrote.login an expert
GROUP
GROUPBYBYAuthor.name
Author.name
HAVING
HAVING count(wrote.url)
count(wrote.url)>>10
10

No need for DISTINCT: automatically from GROUP BY


3. Group-by v.s. Nested Query
Author(login,name)
Wrote(login,url)
Mentions(url,word)

Find authors with vocabulary  10000


words:
SELECT
SELECT Author.name
Author.name
FROM
FROM Author,
Author,Wrote,
Wrote,Mentions
Mentions
WHERE
WHERE Author.login=Wrote.login
Author.login=Wrote.loginAND
ANDWrote.url=Mentions.url
Wrote.url=Mentions.url
GROUP
GROUPBYBY Author.name
Author.name
HAVING
HAVING count(distinct
count(distinctMentions.word)
Mentions.word)>>10000
10000
Two Examples

Store(sid, sname)
Product(pid, pname, price, sid)

Find all stores that sell only products with price > 100

same as:

Find all stores s.t. all their products have price > 100)
SELECT
SELECTStore.name
Store.name
FROM
FROM Store,
Store,Product
Product
WHERE
WHERE Store.sid
Store.sid==Product.sid
Product.sid Why both ?
GROUP
GROUPBYBY Store.sid,
Store.sid,Store.name
Store.name
HAVING
HAVING100
100<<min(Product.price)
min(Product.price)
SELECT
SELECTStore.name
Store.name
FROM
FROM Store
Store
Almost equivalent… WHERE
WHERE
100
100<<ALL
ALL(SELECT
(SELECTProduct.price
Product.price
FROM
FROMproduct
product
WHERE
WHEREStore.sid
Store.sid==Product.sid)
Product.sid)
SELECT
SELECTStore.name
Store.name
FROM
FROM Store
Store
WHERE
WHERE Store.sid
Store.sidNOT
NOTININ
(SELECT
(SELECTProduct.sid
Product.sid
FROM
FROMProduct
Product
WHERE
WHERE Product.price
Product.price<=
<=100)
100)
Two Examples

Store(sid, sname)
Product(pid, pname, price, sid)

For each store,


find its most expensive product
Two Examples
This is easy but doesn’t do what we want:
SELECT
SELECTStore.sname,
Store.sname,max(Product.price)
max(Product.price)
FROM
FROM Store,
Store,Product
Product
WHERE
WHERE Store.sid
Store.sid==Product.sid
Product.sid
GROUP
GROUPBY BY Store.sid,
Store.sid,Store.sname
Store.sname

Better:
SELECT
SELECTStore.sname,
Store.sname,x.pname
x.pname
FROM
FROM Store,
Store,Product
Productxx
But may WHERE
WHERE Store.sid
Store.sid==x.sid
x.sidand
and
return x.price
x.price>=
>=
multiple ALL
ALL(SELECT
(SELECTy.price
y.price
product names FROM
FROMProduct
Productyy
per store WHERE
WHEREStore.sid
Store.sid==y.sid)
y.sid)
Two Examples
Finally, choose some pid arbitrarily, if there are many
with highest price:

SELECT
SELECTStore.sname,
Store.sname,max(x.pname)
max(x.pname)
FROM
FROM Store,
Store,Product
Productxx
WHERE
WHERE Store.sid
Store.sid==x.sid
x.sidand
and
x.price
x.price>=
>=
ALL
ALL(SELECT
(SELECTy.price
y.price
FROM
FROMProduct
Productyy
WHERE
WHEREStore.sid
Store.sid==y.sid)
y.sid)
GROUP
GROUPBYBYStore.sname
Store.sname
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
Null Values
• C1 AND C2 = min(C1, C2)
• C1 OR C2 = max(C1, C2)
• NOT C1 = 1 – C1

SELECT
SELECT ** E.g.
FROM
FROM Person
Person age=20
WHERE
WHERE (age (age << 25)
25) AND
AND heigth=NULL
weight=200
(height >> 66 OR weight >> 190)
Rule in SQL:(height
include onlyOR weight
tuples 190)
that yield TRUE
Null Values
Unexpected behavior:

SELECT
SELECT **
FROM
FROM Person
Person
WHERE
WHERE age
age << 25
25 OR
OR age
age >=
>= 25
25

Some Persons are not included !


Null Values
Can test for NULL explicitly:
– x IS NULL
– x IS NOT NULL

SELECT
SELECT **
FROM
FROM Person
Person
WHERE
WHERE age
age << 25
25 OR
OR age
age >=
>= 25
25 OR
OR age
age IS
IS NULL
NULL

Now it includes all Persons


Outerjoins
Explicit joins in SQL = “inner joins”:
Product(name, category)
Purchase(prodName, store)

SELECT
SELECTProduct.name,
Product.name,Purchase.store
Purchase.store
FROM
FROM Product
ProductJOIN
JOINPurchase
PurchaseONON
Product.name
Product.name==Purchase.prodName
Purchase.prodName

Same as: SELECT


SELECTProduct.name,
Product.name,Purchase.store
Purchase.store
FROM
FROM Product,
Product,Purchase
Purchase
WHERE
WHERE Product.name
Product.name==Purchase.prodName
Purchase.prodName
But Products that never sold will be lost !
Outerjoins
Left outer joins in SQL:
Product(name, category)
Purchase(prodName, store)

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

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
SELECTProduct.name,
Product.name,count(*)
count(*)
FROM
FROM Product,
Product,Purchase
Purchase
WHERE
WHERE Product.name
Product.name==Purchase.prodName
Purchase.prodName
and
and Purchase.month
Purchase.month==‘September’
‘September’
GROUP
GROUPBY BYProduct.name
Product.name

What’s wrong ?
Application
Compute, for each product, the total number of sales in ‘September’
Product(name, category)
Purchase(prodName, month, store)

SELECT
SELECTProduct.name,
Product.name,count(*)
count(*)
FROM
FROM Product
ProductLEFT
LEFTOUTER
OUTERJOINJOINPurchase
PurchaseON
ON
Product.name
Product.name==Purchase.prodName
Purchase.prodName
and
and Purchase.month
Purchase.month==‘September’
‘September’
GROUP
GROUPBYBYProduct.name
Product.name

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 Purchase.product
Purchase.product
FROM
FROM Purchase
Purchase
WHERE
WHERE Purchase.date
Purchase.date>>“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 Product.name

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 Product.name
Product.name ININ
(SELECT
(SELECTproduct
product
FROM
FROM Purchase
Purchase
WHERE
WHERE DateDate=‘Oct,
=‘Oct,25,
25,1999’);
1999’);

You might also like