SQL DATABASE
The Many-to-Many
Relationship
Fearful concatenation of circumstances
Daniel Webster
2
3
A sales form
4
The many-to-many
relationship Create a third entity to map an m:m relationship
An associative entity
The + on the crow's foot indicates that LINEITEM is identified by concatenating saleno and lineno
LINEITEM is known as a weak entity, and it has an identifying
relationship with SALE
Preference settings
5
Foreign key same name as primary key
Associative table name of form tableA_tableB
6
The many-to-many
relationship
MySQL Workbench
m:m
symbol
7
The many-to-many
relationship
MySQL Workbench
Identifying
relationship
Non-identifying
relationship
8
Why a third entity?
Store data about the relationship
Think of an m:m as two 1:m relationships
9
Creating a relational
database
Same rules apply
The associative table has two foreign keys
One for each of the entities in the m:m relationship
A foreign key can also be part of the primary key of an associative entity
lineitem
lineno lineqty lineprice saleno itemno
1 1 4.50 1 2
1 1 25.00 2 6
2 1 20.00 2 16
3 1 25.00 2 19
10
Creating a relational
database
CREATE TABLE sale (
saleno INTEGER,
saledate DATE NOT NULL,
saletext VARCHAR(50),
PRIMARY KEY(saleno));
CREATE TABLE item (
itemno INTEGER,
itemname VARCHAR(30) NOT NULL,
itemtype CHAR(1) NOT NULL,
itemcolor VARCHAR(10),
PRIMARY KEY(itemno));
CREATE TABLE lineitem (
lineno INTEGER,
lineqty INTEGER NOT NULL,
lineprice DECIMAL(7,2) NOT NULL,
saleno INTEGER,
itemno INTEGER,
PRIMARY KEY(lineno,saleno),
CONSTRAINT fk_has_sale FOREIGN KEY(saleno) REFERENCES sale(saleno),
CONSTRAINT fk_has_item FOREIGN KEY(itemno) REFERENCES item(itemno));
Exercise
A keen field hockey fan wants to keep track of which countries won which medals in the various summer Olympics for both the men’s and women’s events
Design a data model
Create the database
Populate with data for the last two Olympics
• http://en.wikipedia.org/wiki/Field_hockey_at _the_Summer_Olympics
11
12
A three table join
Specify two matching conditions with the associative table in both join conditions
SELECT * FROM sale JOIN lineitem
ON sale.saleno = lineitem.saleno
JOIN item ON item.itemno = lineitem.itemno;
13
A three table join
List the names of items, quantity, and value of items sold on January 16, 2011
SELECT itemname, lineqty, lineprice, lineqty*lineprice
AS total FROM sale JOIN lineitem
ON lineitem.saleno = sale.saleno
JOIN item ON item.itemno = lineitem.itemno
WHERE saledate = '2011-01-16';
itemname lineqty lineprice total
Pocket knife—Avon 1 0.00 0.00
Safari chair 50 36.00 1800.00
Hammock 50 40.50 2025.00
Tent—8 person 8 153.00 1224.00
Tent—2 person 1 60.00 60.00
14
EXISTS
Existential quantifier
Returns true or false
Returns true if the table contains at least one row satisfying the specified condition
Report all clothing items (type “C”) for which a sale is recorded
SELECT itemname, itemcolor FROM item
WHERE itemtype = 'C'
AND EXISTS (SELECT * FROM lineitem
WHERE lineitem.itemno = item.itemno);
itemname itemcolor Hat—Polar Explorer Red
Boots—snake proof Black
Pith helmet White
Stetson Black
15
lineno lineqty lineprice saleno itemno
1 1 4.5 1 2
1 1 25 2 6
2 1 20 2 16
3 1 25 2 19
4 1 2.25 2 2
1 1 500 3 4
2 1 2.25 3 2
1 1 500 4 4
2 1 65 4 9
3 1 60 4 13
4 1 75 4 14
5 1 10 4 3
6 1 2.25 4 2
1 50 36 5 10
2 50 40.5 5 11
3 8 153 5 12
4 1 60 5 13
5 1 0 5 2
itemno itemname itemtype itemcolor
1 Pocket knife — Nile E Brown
2 Pocket knife — Avon E Brown
3 Compass N —
4 Geopositioning system N —
5 Map measure N —
6 Hat — Polar Explorer C Red
7 Hat — Polar Explorer C White
8 Boots — snake proof C Green
9 Boots — snake proof C Black
10 Safari chair F Khaki
11 Hammock F Khaki
12 Tent — 8 person F Khaki
13 Tent — 2 person F Khaki
14 Safari cooking kit E —
15 Pith helmet C Khaki
16 Pith helmet C White
17 Map case N Brown
18 Sextant N —
19 Stetson C Black
20 Stetson C Brown
SELECT itemname,
itemcolor FROM item
WHERE itemtype = 'C’
AND EXISTS (SELECT *
FROM lineitem
WHERE lineitem.itemno
= item.itemno);
itemname itemcolor
Hat—Polar Explorer Red
Boots—snake proof Black
Pith helmet White
Stetson Black
16
NOT EXISTS
Returns true if the table contains no rows satisfying the specified condition
Report all clothing items (type “C”) that have not been sold
SELECT itemname, itemcolor FROM item
WHERE itemtype = 'C'
AND NOT EXISTS
(SELECT * FROM lineitem
WHERE item.itemno = lineitem.itemno);
itemname itemcolor
Hat—Polar Explorer White
Boots—snake proof Green
Pith helmet Khaki
Stetson Brown
17
lineno lineqty lineprice saleno itemno
1 1 4.5 1 2
1 1 25 2 6
2 1 20 2 16
3 1 25 2 19
4 1 2.25 2 2
1 1 500 3 4
2 1 2.25 3 2
1 1 500 4 4
2 1 65 4 9
3 1 60 4 13
4 1 75 4 14
5 1 10 4 3
6 1 2.25 4 2
1 50 36 5 10
2 50 40.5 5 11
3 8 153 5 12
4 1 60 5 13
5 1 0 5 2
itemno itemname itemtype itemcolor
1 Pocket knife — Nile E Brown
2 Pocket knife — Avon E Brown
3 Compass N —
4 Geopositioning system N —
5 Map measure N —
6 Hat — Polar Explorer C Red
7 Hat — Polar Explorer C White
8 Boots — snake proof C Green
9 Boots — snake proof C Black
10 Safari chair F Khaki
11 Hammock F Khaki
12 Tent — 8 person F Khaki
13 Tent — 2 person F Khaki
14 Safari cooking kit E —
15 Pith helmet C Khaki
16 Pith helmet C White
17 Map case N Brown
18 Sextant N —
19 Stetson C Black
20 Stetson C Brown
SELECT itemname, itemcolor
FROM item
WHERE itemtype = 'C'
AND NOT EXISTS
(SELECT * FROM lineitem
WHERE item.itemno =
lineitem.itemno);
itemname itemcolor
Hat—Polar Explorer White
Boots—snake proof Green
Pith helmet Khaki
Stetson Brown
Exercise
Report all brown items that have been sold
Report all brown items that have not been sold
18
19
Divide
The universal quantifier
forall
Not directly mapped into SQL
Implement using NOT EXISTS
Find all items that have appeared in all sales
becomes
Find items such that there does not exist a sale in which this item does not appear
20
Divide
Find the items that have appeared in all sales
SELECT itemname FROM item
WHERE NOT EXISTS
(SELECT * FROM sale
WHERE NOT EXISTS
(SELECT * FROM lineitem
WHERE lineitem.itemno = item.itemno
AND lineitem.saleno = sale.saleno));
itemname
Pocket knife—Thames See the book’s web site for a detailed explanation of how divide works (Support/SQL
Divide)
21
A template for divide
Find the target1 that have appeared in all sources
SELECT target1 FROM target
WHERE NOT EXISTS
(SELECT * FROM source
WHERE NOT EXISTS
(SELECT * FROM target-source
WHERE target-source.target# = target.target#
AND target-source.source# = source.source#));
22
Beyond the great divide
Find the items that have appeared in all sales can be rephrased as
Find all the items for which the number of sales that include this item is equal to the total number of sales.
SELECT item.itemno, item.itemname
FROM item JOIN lineitem
ON item.itemno = lineitem.itemno
GROUP BY item. itemno, item.itemname
HAVING COUNT(DISTINCT saleno)
= (SELECT COUNT(DISTINCT saleno) FROM sale);
First determine the number of sales in which an item has appeared
Second compare the number of sales to the total number of sales
23
Set operations
UNION
Equivalent to OR
INTERSECT
Equivalent to AND
24
UNION
List all items that were sold on January 16, 2011, or are brown.
SELECT itemname FROM item JOIN lineitem
ON item.itemno = lineitem.itemno
JOIN sale ON lineitem.saleno = sale.saleno
WHERE saledate = '2011-01-16'
UNION
SELECT itemname FROM item WHERE itemcolor = 'Brown';
itemname
Hammock
Map case
Pocket knife—Avon
Pocket knife—Nile
Safari chair
Stetson
Tent—2 person
Tent—8 person
25
INTERSECT
List all items that were sold on January 16, 2011, and are brown.
SELECT itemname FROM item JOIN lineitem
ON item.itemno = lineitem.itemno
JOIN sale ON lineitem.saleno = sale.saleno
WHERE saledate = '2011-01-16'
INTERSECT
SELECT itemname FROM item WHERE itemcolor = 'Brown';
itemname
Pocket knife—Avon INTERSECT not supported by MySQL
26
Conclusion
Introduced
m:m relationship
Associative entity
Weak entity
EXISTS
Divide
Set operations