lecture 05: sql
DESCRIPTION
Lecture 05: SQL. Wednesday, January 12, 2005. Outline. Two examples Nulls (6.1.6) Outer joins (6.3.8) Database Modifications (6.5) Defining Relation Schema in SQL (6.6). Two Examples. Store(sid, sname) Product(pid, pname, price, sid). - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/1.jpg)
1
Lecture 05: SQL
Wednesday, January 12, 2005
![Page 2: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/2.jpg)
2
Outline
• Two examples
• Nulls (6.1.6)
• Outer joins (6.3.8)
• Database Modifications (6.5)
• Defining Relation Schema in SQL (6.6)
![Page 3: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/3.jpg)
3
Two Examples
Store(sid, sname)Product(pid, pname, price, sid)
Find all stores that sell only products with price > 100(Equivalent formulation: find all stores s.t. all their products have price > 100)
![Page 4: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/4.jpg)
4
SELECT Store.nameFROM Store, ProductWHERE Store.sid = Product.sidGROUP BY Store.sid, Store.nameHAVING 100 < min(Product.price)
SELECT Store.nameFROM Store, ProductWHERE Store.sid = Product.sidGROUP BY Store.sid, Store.nameHAVING 100 < min(Product.price)
SELECT Store.nameFROM StoreWHERE Store.sid NOT IN (SELECT Product.sid FROM Product WHERE Product.price <= 100)
SELECT Store.nameFROM StoreWHERE Store.sid NOT IN (SELECT Product.sid FROM Product WHERE Product.price <= 100)
SELECT Store.nameFROM StoreWHERE 100 < ALL (SELECT Product.price FROM product WHERE Store.sid = Product.sid)
SELECT Store.nameFROM StoreWHERE 100 < ALL (SELECT Product.price FROM product WHERE Store.sid = Product.sid)
Your pick…
![Page 5: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/5.jpg)
5
Two Examples
Store(sid, sname)Product(pid, pname, price, sid)
For each store, find the Product ID of its most expensive product
![Page 6: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/6.jpg)
6
Two Examples
SELECT Store.name, max(Product.price)FROM Store, ProductWHERE Store.sid = Product.sidGROUP BY Store.sid
SELECT Store.name, max(Product.price)FROM Store, ProductWHERE Store.sid = Product.sidGROUP BY Store.sid
SELECT Store.name, x.pidFROM Store, Product xWHERE Store.sid = x.sid and x.price >= ALL (SELECT y.price FROM Product y WHERE Store.sid = y.sid)
SELECT Store.name, x.pidFROM Store, Product xWHERE Store.sid = x.sid and x.price >= ALL (SELECT y.price FROM Product y WHERE Store.sid = y.sid)
This is easy but doesn’t do what we want:
Better:
But mayreturnmultiple pids
![Page 7: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/7.jpg)
7
Two Examples
SELECT Store.name, max(x.pid)FROM Store, Product xWHERE Store.sid = x.sid and x.price >= ALL (SELECT y.price FROM Product y WHERE Store.sid = y.sid)GROUP BY Store.name
SELECT Store.name, max(x.pid)FROM Store, Product xWHERE Store.sid = x.sid and x.price >= ALL (SELECT y.price FROM Product y WHERE Store.sid = y.sid)GROUP BY Store.name
Finally, choose some pid arbitrarily, if there are manywith highest price:
![Page 8: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/8.jpg)
8
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 ?
![Page 9: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/9.jpg)
9
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
![Page 10: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/10.jpg)
10
Null Values• C1 AND C2 = min(C1, C2)
• C1 OR C2 = max(C1, C2)
• NOT C1 = 1 – C1
Rule in SQL: include only tuples that yield TRUE
SELECT *FROM PersonWHERE (age < 25) AND (height > 6 OR weight > 190)
SELECT *FROM PersonWHERE (age < 25) AND (height > 6 OR weight > 190)
E.g.age=20heigth=NULLweight=200
![Page 11: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/11.jpg)
11
Null Values
Unexpected behavior:
Some Persons are not included !
SELECT *FROM PersonWHERE age < 25 OR age >= 25
SELECT *FROM PersonWHERE age < 25 OR age >= 25
![Page 12: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/12.jpg)
12
Null Values
Can test for NULL explicitly:– x IS NULL– x IS NOT NULL
Now it includes all Persons
SELECT *FROM PersonWHERE age < 25 OR age >= 25 OR age IS NULL
SELECT *FROM PersonWHERE age < 25 OR age >= 25 OR age IS NULL
![Page 13: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/13.jpg)
13
OuterjoinsExplicit joins in SQL:
Product(name, category) Purchase(prodName, store)
Same as:
But Products that never sold will be lost !
SELECT Product.name, Purchase.storeFROM Product JOIN Purchase ON Product.name = Purchase.prodName
SELECT Product.name, Purchase.storeFROM Product JOIN Purchase ON Product.name = Purchase.prodName
SELECT Product.name, Purchase.storeFROM Product, PurchaseWHERE Product.name = Purchase.prodName
SELECT Product.name, Purchase.storeFROM Product, PurchaseWHERE Product.name = Purchase.prodName
![Page 14: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/14.jpg)
14
Outerjoins
Left outer joins in SQL:Product(name, category)
Purchase(prodName, store)
SELECT Product.name, Purchase.store FROM Product LEFT OUTER JOIN Purchase ON Product.name = Purchase.prodName
SELECT Product.name, Purchase.store FROM Product LEFT OUTER JOIN Purchase ON Product.name = Purchase.prodName
![Page 15: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/15.jpg)
15
Name Category
Gizmo gadget
Camera Photo
OneClick Photo
ProdName Store
Gizmo Wiz
Camera Ritz
Camera Wiz
Name Store
Gizmo Wiz
Camera Ritz
Camera Wiz
OneClick NULL
Product Purchase
![Page 16: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/16.jpg)
16
Application
Compute, for each product, the total number of sales in ‘September’Product(name, category)
Purchase(prodName, month, store)
SELECT Product.name, count(*) FROM Product, Purchase WHERE Product.name = Purchase.prodName and Purchase.month = ‘September’ GROUP BY Product.name
SELECT Product.name, count(*) FROM Product, Purchase WHERE Product.name = Purchase.prodName and Purchase.month = ‘September’ GROUP BY Product.name
What’s wrong ?
![Page 17: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/17.jpg)
17
Application
Compute, for each product, the total number of sales in ‘September’Product(name, category)
Purchase(prodName, month, store)
SELECT Product.name, count(*) FROM Product LEFT OUTER JOIN Purchase ON Product.name = Purchase.prodName and Purchase.month = ‘September’ GROUP BY Product.name
SELECT Product.name, count(*) FROM Product LEFT OUTER JOIN Purchase ON Product.name = Purchase.prodName and Purchase.month = ‘September’ GROUP BY Product.name
Now we also get the products who sold in 0 quantity
![Page 18: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/18.jpg)
18
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
![Page 19: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/19.jpg)
19
Modifying the Database
Three kinds of modifications
• Insertions
• Deletions
• Updates
Sometimes they are all called “updates”
![Page 20: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/20.jpg)
20
InsertionsGeneral form:
Missing attribute NULL.May drop attribute names if give them in order.
INSERT INTO R(A1,…., An) VALUES (v1,…., vn) INSERT INTO R(A1,…., An) VALUES (v1,…., vn)
INSERT INTO Purchase(buyer, seller, product, store) VALUES (‘Joe’, ‘Fred’, ‘wakeup-clock-espresso-machine’, ‘The Sharper Image’)
INSERT INTO Purchase(buyer, seller, product, store) VALUES (‘Joe’, ‘Fred’, ‘wakeup-clock-espresso-machine’, ‘The Sharper Image’)
Example: Insert a new purchase to the database:
![Page 21: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/21.jpg)
21
Insertions
INSERT INTO PRODUCT(name)
SELECT DISTINCT Purchase.product FROM Purchase WHERE Purchase.date > “10/26/01”
INSERT INTO PRODUCT(name)
SELECT DISTINCT Purchase.product FROM Purchase WHERE Purchase.date > “10/26/01”
The query replaces the VALUES keyword.Here we insert many tuples into PRODUCT
![Page 22: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/22.jpg)
22
Insertion: an Example
prodName is foreign key in Product.name
Suppose database got corrupted and we need to fix it:
name listPrice category
gizmo 100 gadgets
prodName buyerName price
camera John 200
gizmo Smith 80
camera Smith 225
Task: insert in Product all prodNames from Purchase
Product
Product(name, listPrice, category)Purchase(prodName, buyerName, price)
Product(name, listPrice, category)Purchase(prodName, buyerName, price)
Purchase
![Page 23: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/23.jpg)
23
Insertion: an Example
INSERT INTO Product(name)
SELECT DISTINCT prodName FROM Purchase WHERE prodName NOT IN (SELECT name FROM Product)
INSERT INTO Product(name)
SELECT DISTINCT prodName FROM Purchase WHERE prodName NOT IN (SELECT name FROM Product)
name listPrice category
gizmo 100 Gadgets
camera - -
![Page 24: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/24.jpg)
24
Insertion: an Example
INSERT INTO Product(name, listPrice)
SELECT DISTINCT prodName, price FROM Purchase WHERE prodName NOT IN (SELECT name FROM Product)
INSERT INTO Product(name, listPrice)
SELECT DISTINCT prodName, price FROM Purchase WHERE prodName NOT IN (SELECT name FROM Product)
name listPrice category
gizmo 100 Gadgets
camera 200 -
camera ?? 225 ?? - Depends on the implementation
![Page 25: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/25.jpg)
25
Deletions
DELETE FROM PURCHASE
WHERE seller = ‘Joe’ AND product = ‘Brooklyn Bridge’
DELETE FROM PURCHASE
WHERE seller = ‘Joe’ AND product = ‘Brooklyn Bridge’
Factoid about SQL: there is no way to delete only a single
occurrence of a tuple that appears twice
in a relation.
Example:
![Page 26: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/26.jpg)
26
Updates
UPDATE PRODUCTSET price = price/2WHERE Product.name IN (SELECT product FROM Purchase WHERE Date =‘Oct, 25, 1999’);
UPDATE PRODUCTSET price = price/2WHERE Product.name IN (SELECT product FROM Purchase WHERE Date =‘Oct, 25, 1999’);
Example:
![Page 27: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/27.jpg)
27
Data Definition in SQLSo far we have see the Data Manipulation Language, DMLNext: Data Definition Language (DDL)
Data types: Defines the types.
Data definition: defining the schema.
• Create tables• Delete tables• Modify table schema
Indexes: to improve performance
![Page 28: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/28.jpg)
28
Data Types in SQL
• Characters: – CHAR(20) -- fixed length– VARCHAR(40) -- variable length
• Numbers:– INT, REAL plus variations
• Times and dates: – DATE, DATETIME (SQL Server only)
• To reuse domains:CREATE DOMAIN address AS VARCHAR(55)
![Page 29: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/29.jpg)
29
Creating Tables
CREATE TABLE Person(
name VARCHAR(30), social-security-number INT, age SHORTINT, city VARCHAR(30), gender BIT(1), Birthdate DATE
);
CREATE TABLE Person(
name VARCHAR(30), social-security-number INT, age SHORTINT, city VARCHAR(30), gender BIT(1), Birthdate DATE
);
Example:
![Page 30: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/30.jpg)
30
Deleting or Modifying a TableDeleting:
ALTER TABLE Person ADD phone CHAR(16);
ALTER TABLE Person DROP age;
ALTER TABLE Person ADD phone CHAR(16);
ALTER TABLE Person DROP age;
Altering: (adding or removing an attribute).
What happens when you make changes to the schema?
Example:
DROP Person; DROP Person; Example: Exercise with care !!
![Page 31: Lecture 05: SQL](https://reader035.vdocuments.site/reader035/viewer/2022062518/5681461a550346895db3258f/html5/thumbnails/31.jpg)
31
Default Values
Specifying default values:
CREATE TABLE Person( name VARCHAR(30), social-security-number INT, age SHORTINT DEFAULT 100, city VARCHAR(30) DEFAULT ‘Seattle’, gender CHAR(1) DEFAULT ‘?’, Birthdate DATE
CREATE TABLE Person( name VARCHAR(30), social-security-number INT, age SHORTINT DEFAULT 100, city VARCHAR(30) DEFAULT ‘Seattle’, gender CHAR(1) DEFAULT ‘?’, Birthdate DATE
The default of defaults: NULL