Using the same table more than once in a query
To begin this module, the first reading shows how a table can be
joined to itself to answer queries that need data from more than one
row in a table. As well as illustrating a new technique, this reading
also provides a review of using the SELECT
statement.
Subqueries
Subqueries is another method to retrieve information from multiple tables. Two readings are provided:
- The first reading, subqueries and Correlated Subqueries explains subqueries
-
The second reading provides a brief summary of subqueries.
As you read think about the processing order of the query execution.
If you wish, you can now complete questions 1-4 of Getting your hands dirty.
Combining queries
The reading Using Derived Tables, Combining Queries, Conditional Expressions and More Complicated SQL Queries cover:
- Constructing a temporary table to use in a query, and
- Combining the output of different queries together.
The following reading in Derived Tables provides a summary
of the UNION
Statement.
Another viewpoint
Writing SQL queries is a knack and does take time and practice. To help you, an additional reading is included:
- Elmasri provides an alternative explanation of the
SELECT
statement. As you work through, you might wish to try
and write the queries before looking at the answers.
Alternatively, jump in the deep end and start working on the queries in the Getting Your Hands Dirty section.
INVOICE database 1
These activities are similar to the PowerPoint Presentation “advanced Queries” refer to “Try this”
1. Find the customer numbers and names that have invoices dated 16-Sep-2004
(Hint: InvDate = DATE '2004-9-16')
CUSTABN | CUSTNAME |
---|---|
31002054803 | Mellow Yellow Lighting |
2. Find the customers numbers and names that have invoices dated 13-April-2005
CUSTABN | CUSTNAME |
---|---|
15234556678 | Victor Panels |
18335775224 | Genna Bear |
31002054803 | Mellow Yellow Lighting |
3. Find the customers numbers and names that have invoices dated 16-Sep-2004 or 13-April-2005
CUSTABN | CUSTNAME |
---|---|
15234556678 | Victor Panels |
18335775224 | Genna Bear |
31002054803 | Mellow Yellow Lighting |
31002054803 | Mellow Yellow Lighting |
4. Find the customer numbers that have invoices dated 16-Sep-2004 and 13-April-2005
CUSTABN |
---|
31002054803 |
Check
The Answers to these will be available in Weekly Tasks advanced queries.
The specific day is mentioned in announcements.
Try these
1. Find the name of the most expensive item
ITEMDESC |
---|
EarWorks Super |
2. Find the invoice numbers of invoices that bought the most expensive item
INVOICENO |
---|
6 |
3. Find the name of customers that bought the most expensive item
CUSTNAME |
---|
Genna Bear |
4. Find the name of all the customers who live in the same state as Genna Bear
CUSTNAME |
---|
Frederick Jones & Con |
Xylon Zipper & Co |
5. Find the average value for quantity
AVG (QUANTITY) |
---|
3.8024691358024691358024691358024691358 |
6. Find the average quantity for each invoice
INVOICENO | AVG (QUANTITY) |
---|---|
3 | 4 |
4 | 2 |
5 | 3.85714285714285714285714285714285714285714286 |
6 | 2.33333333333333333333333333333333333333333333 |
7 | 7.33333333333333333333333333333333333333333333 |
8 | 3 |
9 | 4.5 |
10 | 5.4 |
11 | 2 |
12 | 3.66666666666666666666666666666666666666666667 |
13 | 3 |
14 | 3.66666666666666666666666666666666666666666667 |
15 | 10 |
16 | 4.5 |
17 | 4.75 |
18 | 2.2 |
19 | 7 |
20 | 3 |
21 | 3.8 |
22 | 4 |
7. Find all those invoices whose average quantity is less than the average quantity for all invoices
INVOICENO | AVG (QUANTITY) |
---|---|
6 | 2.33333333333333333333333333333333333333333333 |
11 | 2 |
13 | 3 |
14 | 3.16666666666666666666666666666666666666666667 |
20 | 3 |
21 | 3.8 |
4 | 2 |
8 | 3 |
18 | 2.2 |
12 | 3.66666666666666666666666666666666666666666667 |
10 rows selected |
Check
The Answers to these will be available in Weekly Tasks advanced queries.
The specific day is mentioned in announcements.
INVOICE
database 2
Try the following queries on the INVOICE
database
.
1. Find the items that have a price that is greater than the average item price
2. Find the most common item sold
3. Find all the customers that have not had an invoice. (Note: This is the opposite of an earlier query that finds all the customers that have an invoice against them.)
4. Find all the products that have never been sold.
5. Find the items that have a price less than the average item price.
6. Find the product descriptions and item price of the most expensive and least expensive items stocked
7. Find all the items that have prices greater than one of the freezers (like '%Freeze%')
ITEMDESC |
---|
EarWorks Super |
National 20 cm |
20 cm Thin Tube |
Family Freeze Deluxe |
CoolRoom |
EarWorks Deluxe |
SpinWash |
Dishwasher Virtuoso |
National 18 cm |
FridgeRight |
Family Freeze |
Frosty Freeze |
Dishwasher Freestyle |
National 16 cm |
EarWorks Family |
16cm Thin Tube |
Compact Music |
National 14 cm |
Dishwasher Silhouette |
FrostFreeze Deluxe |
SpinRight |
Wide Screen |
14 cm Thin Tube |
National 12 cm |
The Edge 14 cm |
Music Maze |
EarWorks Lite |
Natural Colour |
DryUp |
Sonic Ears |
12 cm ThinTube |
Big Screen |
National 10 cm |
10 cm ThinTube |
8. Find all the items that have prices greater than all freezers (like '%Freeze%')
ITEMDESC |
---|
National 20 cm |
EarWorks Super |
9. Find all invoices that have an item in common with invoice 3.
Hint: Find the items on invoice 3.
Find the invoice(s) with one of these items
INVOICENO |
---|
13 |
14 |
21 |
4 |
8 |
17 |
3 |
9 |
8 rows selected |
10. Find all the items which do not have a quantity 1
ITEMNO | ITEMDESC | ITEMPRICE |
---|---|---|
1100-2301 | Diswasher Silhouette | 543 |
1100-2302 | Diswasher Freestyle | 650 |
1100-2303 | Diswasher Virtuoso | 750 |
1200-2234 | FrostFreeze | 123 |
1200-2236 | FrostFreeze Deluxe | 523 |
1200-2250 | Frosty Freeze | 650 |
1200-2251 | FridgeRight | 670 |
1200-2255 | Family Freeze | 655 |
1200-2256 | Family Freeze Deluxe | 899 |
1300-2200 | The Edge 14 cm | 345 |
1300-2201 | Big screen | 299 |
1300-2202 | Wide Screen | 455 |
1300-2205 | Natural Colour | 342 |
1300-5000 | 10 cm ThinTube | 233 |
1300-5001 | 12 cm Thin Tube | 322 |
1300-5002 | 14 cm Thin Tube | 450 |
1300-5003 | 16 cm Thin Tube | 600 |
1300-5004 | 20 cm Thin Tube | 899 |
1300-6001 | National 10 cm | 233 |
1300-6002 | National 12 cm | 355 |
1300-6003 | National 14 cm | 544 |
1300-6004 | National 16 cm | 650 |
1300-6005 | National 18 cm | 690 |
1300-6006 | National 20 cm | 900 |
1400-2100 | Boom Box | 120 |
1400-2101 | Sonic Ears | 340 |
1400-2102 | Compact Music | 566 |
1400-2104 | Music Maze | 345 |
1400-3100 | EarWorks Lite | 344 |
1400-3101 | EarWorks Family | 600 |
1400-3102 | EarWorks Deluxe | 780 |
1400-3103 | EarWorks Super | 980 |
1500-2100 | SpinWash | 760 |
1500-2200 | SpinRight | 466 |
Check
1. Find the items that have a price that is greater than the average item price
SELECT ItemNo, ItemDesc,
ItemPrice
FROM ITEM
WHERE ItemPrice > (SELECT
AVG(ItemPrice)
FROM ITEM);
The inner query is executed first and returns a single row:
The outer query is then executed, the value returned is placed in each row of the table created by the outer query and evaluated (as we know, SQL can only compare a single row at a time). The rows that match the criteria are returned.
2. Find the most common item sold
SELECT init.ItemNo, ItemDesc
FROM InvoiceItem init, Item it
WHERE init.ItemNo = it.ItemNo
GROUP BY init.ItemNo, ItemDesc
HAVING SUM(Quantity) >= ALL (SELECT
SUM(Quantity)
FROM InvoiceItem
GROUP BY ItemNo);
If we used the ANY
operator in the above query, all of
the values from the inner query will be evaluated as true in the outer
query and displayed. Try it and see.
The inner query returns:
This is then evaluated by the outer query.
3. Find all the customers that have not had an invoice. (Note: This is the opposite of an earlier query that finds all the customers that have an invoice against them.)
This is the opposite of an earlier query that finds all the customers that have an invoice against them.
SELECT CustABN AS ABN, CustName
AS Name
FROM CUSTOMER
WHERE CustABN NOT IN (SELECT c.CustABN
FROM CUSTOMER c, INVOICE i
WHERE c.CustABN = i.CustABN);
Here the logical NOT
operator is used with the IN
operator. The inner query is the earlier query that found all customers
with an invoice against them. Using NOT IN
will now
finds all the records that weren’t retuned by the inner query.
4. Find all the products that have never been sold.
SELECT i.ItemNo, ItemDesc
FROM ITEM i
WHERE NOT EXISTS (SELECT *
FROM
INVOICEITEM ii
WHERE i.ItemNo = ii.ItemNo);
5. Find the items that have a price less than the average item price.
SELECT ItemDesc, ItemPrice,
AvgPrice
FROM (SELECT AVG(ItemPrice) AS AvgPrice
FROM ITEM), ITEM
WHERE ItemPrice < AvgPrice;
6. Find the product descriptions and item price of the most expensive and least expensive items stocked.
In an earlier exercise we had found the most expensive and least expensive items stocked using:
SELECT MAX(ItemPrice) AS
Dearest, MIN(ItemPrice) AS Cheapest
FROM ITEM;
To now include the product descriptions:
(SELECT ItemDesc AS Item, ItemPrice
FROM ITEM
WHERE ItemPrice IN (SELECT MAX(ItemPrice)
FROM ITEM))
UNION
(SELECT ItemDesc AS Item, ItemPrice
FROM ITEM
WHERE ItemPrice IN (SELECT MIN(ItemPrice)
FROM ITEM));
7. Find all the items that have prices greater than one of the freezers (like '%Freeze%').
ITEMDESC |
---|
EarWorks Super |
National 20 cm |
20 cm Thin Tube |
Family Freeze Deluxe |
CoolRoom |
EarWorks Deluxe |
SpinWash |
Dishwasher Virtuoso |
National 18 cm |
FridgeRight |
Family Freeze |
Frosty Freeze |
Dishwasher Freestyle |
National 16 cm |
EarWorks Family |
16cm Thin Tube |
Compact Music |
National 14 cm |
Dishwasher Silhouette |
FrostFreeze Deluxe |
SpinRight |
Wide Screen |
14 cm Thin Tube |
National 12 cm |
The Edge 14 cm |
Music Maze |
EarWorks Lite |
Natural Colour |
DryUp |
Sonic Ears |
12 cm ThinTube |
Big Screen |
National 10 cm |
10 cm ThinTube |
SELECT itemdesc
FROM item
WHERE itemprice > ALL (SELECT itemprice
FROM item
WHERE itemdesc LIKE '%Freeze%');
8. Find all the items that have prices greater than all freezers (like '%Freeze%').
ITEMDESC |
---|
National 20 cm |
EarWorks Super |
SELECT itemdesc
FROM item
WHERE itemprice > ANY (SELECT itemprice
FROM item
WHERE itemdesc LIKE '%Freeze%');
9. Find all invoices that have an item in common with invoice 3. Hint: Find the items on invoice 3.
Find the invoice(s) with one of these items.
INVOICENO |
---|
13 |
14 |
21 |
4 |
8 |
17 |
3 |
9 |
8 rows selected |
SELECT DISTINCT i.invoiceno
FROM invoice i, invoiceitem ii
WHERE i.INvoiceNo= ii.InvoiceNo
AND ii.itemno IN (SELECT Itemno
FROM invoiceitem
WHERE invoiceno = 3);
10. Find all the items which do not have a quantity 1.
ITEMNO | ITEMDESC | ITEMPRICE |
---|---|---|
1100-2301 | Diswasher Silhouette | 543 |
1100-2302 | Diswasher Freestyle | 650 |
1100-2303 | Diswasher Virtuoso | 750 |
1200-2234 | FrostFreeze | 123 |
1200-2236 | FrostFreeze Deluxe | 523 |
1200-2250 | Frosty Freeze | 650 |
1200-2251 | FridgeRight | 670 |
1200-2255 | Family Freeze | 655 |
1200-2256 | Family Freeze Deluxe | 899 |
1300-2200 | The Edge 14 cm | 345 |
1300-2201 | Big screen | 299 |
1300-2202 | Wide Screen | 455 |
1300-2205 | Natural Colour | 342 |
1300-5000 | 10 cm ThinTube | 233 |
1300-5001 | 12 cm Thin Tube | 322 |
1300-5002 | 14 cm Thin Tube | 450 |
1300-5003 | 16 cm Thin Tube | 600 |
1300-5004 | 20 cm Thin Tube | 899 |
1300-6001 | National 10 cm | 233 |
1300-6002 | National 12 cm | 355 |
1300-6003 | National 14 cm | 544 |
1300-6004 | National 16 cm | 650 |
1300-6005 | National 18 cm | 690 |
1300-6006 | National 20 cm | 900 |
1400-2100 | Boom Box | 120 |
1400-2101 | Sonic Ears | 340 |
1400-2102 | Compact Music | 566 |
1400-2104 | Music Maze | 345 |
1400-3100 | EarWorks Lite | 344 |
1400-3101 | EarWorks Family | 600 |
1400-3102 | EarWorks Deluxe | 780 |
1400-3103 | EarWorks Super | 980 |
1500-2100 | SpinWash | 760 |
1500-2200 | SpinRight | 466 |
SELECT *
FROM item
WHERE itemno <> ALL (SELECT itemno
FROM invoiceitem
WHERE quantity = 1)
ORDER BY itemno;
OR alternatively
SELECT *
FROM item
WHERE itemno NOT IN (SELECT itemno
FROM invoiceitem
WHERE quantity = 1)
ORDER BY itemno;
INVOICE database 3
These activities are similar to the PowerPoint Presentation “advanced Queries”
1. Find the custabn of all the customers who have an invoice
CUSTABN |
---|
88552244765 |
65486624153 |
15234556678 |
88556223771 |
44885522447 |
66558877441 |
67985658147 |
54957758985 |
95258963741 |
31002054803 |
44112233445 |
87357951456 |
18335775224 |
17652258874 |
44778899001 |
10203054031 |
16 rows selected |
2. Find the custabn of all the customers who do not have an invoice
CUSTABN |
---|
59682431469 |
53445665221 |
55456789123 |
55123456789 |
3. Find all the custABNs for people who live in the NT or do not have an invoice
CUSTABN |
---|
53445665221 |
55123456789 |
55456789123 |
59682431469 |
4. Find the cost of the most expensive item
DEAREST |
---|
980 |
5. Find the cost of the cheapest item
CHEAPEST |
---|
12 |
6. Find the description of the most expensive item
ITEMDESC | ITEMPRICE |
---|---|
EarWorks Super | 980 |
7. Find the description of the cheapest item
ITEMDESC | ITEMPRICE |
---|---|
2 | 12 |
8. Find the description of the cheapest and most expensive item
ITEMDESC | ITEMPRICE |
---|---|
2 | 12 |
EarWorks Super | 980 |
9. Find the number of invoices for each customer
CUSTABN | NUMINVOICES |
---|---|
88552244765 | 1 |
65486624153 | 1 |
15234556678 | 2 |
88556223771 | 1 |
44885522447 | 1 |
66558877441 | 1 |
67985658147 | 1 |
54957758985 | 1 |
95258963741 | 1 |
31002054803 | 3 |
44112233445 | 2 |
87357951456 | 1 |
18335775224 | 1 |
17652258874 | 1 |
44778899001 | 1 |
10203054031 | 1 |
16 rows selected |
10-1. Find the maximum number of invoices for all customers
NUMINVOICES |
---|
3 |
10-2. Find the maximum number of invoices for any customers
NUMINVOICES |
---|
1 |
1 |
2 |
1 |
1 |
1 |
1 |
1 |
1 |
3 |
2 |
1 |
1 |
1 |
1 |
1 |
16 rows selected |
Check
The Answers to these will be available in Weekly Tasks advanced queries.
The specific day is mentioned in announcements.STUDENT
database
1. For students that took both HIT999 and HIT232, find their grades in both units?
2. Find all students who have the same coordinator as Donald Duck?
3. Find all students whose coordinator has no other students?
4. Find students who have coord no 23 or who did HIT999
5. Which Coordinators advise more than 10 students?
6. Find the number of students advised by coordinators who advise a student in 3rd year (completed more than 160 credit points) or advise a student taking HIT232
Check
1. For students that took both HIT999 and HIT232, find their grades in both units?
SELECT g1.student_No,
g1.Course_No, g1.Grade, g2.Course_No, g2.Grade
FROM Grade g1, Grade g2
WHERE g1.student_No = g2.student_No
AND g1.Course_No = 'HIT232'
AND g2.Course_No = 'HIT999';
2. Find all students who have the same coordinator as Donald Duck?
SELECT Name
FROM Students
WHERE Coordinator_No = (SELECT
Coordinator_No
FROM Students
WHERE Name = 'Donald Duck');
In this query the subquery only returned a single value and so the = operator could be used. Had the subquery returned more than one row or no rows and = still be used there would have been a runtime error.
In cases where a subquery could return no value, one value or many values, ANY or ALL should be used. This query could be rewritten as:
SELECT Name
FROM Students
WHERE Coordinator_No = ANY (SELECT
Coordinator_No
FROM Students
WHERE Name = 'Donald
Duck');
3. Find all students whose coordinator has no other students?
SELECT name
FROM student s1
WHERE NOT EXISTS ( SELECT *
FROM
student s2
WHERE s1.
name <> s2.name
AND
s1.coordinator_no = s2.coordinator_no);
4. Find students who have coord no 23 or who did HIT999
(SELECT Student_No
FROM student;
WHERE Coord_No = 23)
UNION
(SELECT Student_No
FROM Grade
WHERE Course_No='HIT999' );
5. Which Coordinators advise more than 10 students?
SELECT Name
FROM Coordinator
WHERE (SELECT Count(*)
FROM
Student
WHERE
Student.coord_no=Coordinator.coord_no) >10;
6. Find the number of students advised by coordinators who advise a student in 3rd year (completed more than 160 credit points) or advise a student taking HIT232
SELECT coord_no, Count(*)
FROM Student
GROUP BY coord_no
HAVING max(total_units) > 160
OR coord_no IN (SELECT coord_no
FROM
grade, student
WHERE
course_no = 'HIT232'
AND
student.student_no = grade.student_no);
PRODUCT
database
For those of you who want or need some more practice, here are some additional queries based on a product database. If you are feeling confident you may wish to skip or skim through these.
First read the description of the product database.
Then try the following queries.
1. Find the manufacturers that sell printers but not PCs.
2. Find those hard disk sizes that occur in two or more PCs
3. Find those PC models that have both the same speed and RAM as at least one other PC. A PC should only be listed once.
4. Find those manufacturers of at least two different computers (Pcs or laptops) with speeds of at least 1000. Note the two computers could be a pc and laptop or 2 pcs or 2 laptops.
5. Find the PCs whose speed is slower than that of all Laptops?
6. Find the model number of the item (PC, laptop, or printer) with the highest price.
7. Find the maker(s) of the PC(s) with the fastest processor among all those PC's that have the smallest amount of RAM.
Check
1. Find the manufacturers that sell printers but not PCs.
(SELECT maker
FROM Product p, printer pr
WHERE p.model=pr.model)
MINUS
(SELECT maker
FROM Product p, pc
WHERE p.model=pc.model);
2. Find those hard disk sizes that occur in two or more PCs.
SELECT hd
FROM pc
GROUP by hd
HAVING count(*) >=2;
3. Find those PC models that have both the same speed and RAM as at least one other PC. A PC should only be listed once.
SELECT DISTINCT pc1.model
FROM pc pc1, pc pc2
WHERE pc1.speed = pc2.speed
AND pc1.ram = pc2.ram
AND pc1.model <> pc2.model;
4. Find those manufacturers of at least two different computers (Pcs or laptops) with speeds of at least 1000. Note the two computers could be a pc and laptop or 2 pcs or 2 laptops.
SELECT maker
FROM (SELECT maker, p.model, pc.speed
FROM
product p, pc
WHERE
p.model=pc.model
AND
pc.speed >= 1000
UNION
SELECT
maker, p.model, l.speed
FROM
product p, laptop l
WHERE
p.model=l.model
AND
l.speed >= 1000)
GROUP BY maker
HAVING count(*) >= 2;
5. Find the PCs whose speed is slower than that of all Laptops?
SELECT *
FROM pc
WHERE speed <= ALL (select speed from
laptop);
OR
SELECT *
FROM pc
WHERE speed < (SELECT min(speed) FROM
laptop);
6. Find the model number of the item (PC, laptop, or printer) with the highest price.
SELECT model
FROM
(SELECT
model, price FROM pc
UNION
SELECT
model, price FROM laptop
UNION
SELECT
model, price FROM printer)
WHERE price = (SELECT max(price)
FROM
(SELECT model, price FROM pc
UNION
SELECT model, price FROM laptop
UNION
SELECT model, price FROM printer));
7. Find the maker(s) of the PC(s) with the fastest processor among all those PC's that have the smallest amount of RAM.
SELECT p.maker
FROM pc pc1, product p
WHERE pc1.model = p.model
AND ram = (SELECT min(ram) FROM pc)
AND speed >= ALL( SELECT speed
FROM pc
WHERE
ram=pc1.ram);
SELECT p.model, p.maker
FROM pc, product p
WHERE pc.model = p.model
AND (ram, speed) IN (SELECT ram,
max(speed)
FROM pc
GROUP BY ram
HAVING ram = (SELECT min(ram) FROM pc)
);