All Powder Board and Ski Oracle 9i Workbook Chapter 5: Advanced Queries Jerry Post Copyright © 2003
Primary Tables
Find Best Customers: 1 Total sales by customer.
Average Customer Sales
Best Customers Subquery
INNER JOIN: Sales and Rentals
Left Join: Sales + Rental Left Join Sale+Customer to Rental Sales without rentals
Inner Join: Same Customer and Day
NOT IN Not In subquery to list those who did NOT rent
Model Quantity On Hand
Categories
Inequality Join Inequality (theta) joins assign the proper category name
Sales Categories Find the number of models in each sales category
UNION Query List customers who bought items in January or in March. Note: it could be done with simple conditions, but it is good practice for UNION.
CREATE TABLE Query CREATE TABLE Contacts ( ContactID INTEGER, ManufacturerID INTEGER, LastName NVARCHAR2(25), FirstName NVARCHAR2(25), Phone NVARCHAR2 (15), Email NVARCHAR2 (120), CONSTRAINT pk_Contacts PRIMARY KEY (ContactID), CONSTRAINT fk_ContactsManufacturer FOREIGN KEY (ManufacturerID) REFERENCES Manufacturer(ManufacturerID) ) ;
Create a Temporary Table CREATE TABLE MyTemp ( ID INTEGER, LName NVARCHAR2(25), FName NVARCHAR2(25), CONSTRAINT pk_MyTemp PRIMARY KEY (ID) );
INSERT INTO (One Row) INSERT INTO Customer (CstomerID, LastName, FirstName, City, Gender) VALUES (4000, 'Jones', 'Jack', 'Nowhere', 'Male'); Lab 7 shows how to create sequences so CustomerID is generated automatically.
INSERT INTO (Copy Rows) INSERT INTO MyTemp (ID, LName, FName) SELECT CustomerID, LastName, FirstName FROM Customer WHERE City='Sacramento' ;
UPDATE Board Cost Test query to see new values. Delete it before running second query Query to change data in the Cost column
DELETE Rows First write a SELECT query to see the rows Second change the SELECT row to DELETE Execute the Commit; statement to permanently save changes
DROP TABLE DROP TABLE MyTemp;
Query Parameters SELECT Category, Sum(RentFee) AS SumOfRentFee FROM Rental INNER JOIN RentItem INNER JOIN Inventory INNER JOIN ItemModel ON Inventory.ModelID=ItemModel.ModelID ON RentItem.SKU=Inventory.SKU ON Rental.RentID=RentItem.RentID WHERE RentDate Between ’01-Jan-2004’ And ’31-Mar-2004’ GROUP BY Category; Need to replace fixed dates with parameters that can be entered by a manager
Query Parameters: Package CREATE PACKAGE pckCategoryFees AS TYPE typeCategoryFees IS RECORD ( Category NVARCHAR2(15), SumOfRentFees NUMBER(8,2) ); TYPE typeCursorFees IS REF CURSOR RETURN typeCategoryFees; PROCEDURE GetCategoryFees ( dateStart IN DATE, dateEnd IN DATE, cvFees IN OUT typeCursorFees END; /
Package Body CREATE PACKAGE BODY pckCategoryFees AS PROCEDURE GetCategoryFees ( dateStart IN DATE, dateEnd IN DATE, cvFees IN OUT typeCursorFees ) IS BEGIN OPEN cvFees FOR SELECT Category, Sum(RentFee) AS SumOfRentFee FROM Rental INNER JOIN RentItem INNER JOIN Inventory INNER JOIN ItemModel ON Inventory.ModelID=ItemModel.ModelID ON RentItem.SKU=Inventory.SKU ON Rental.RentID=RentItem.RentID WHERE RentDate Between dateStart And dateEnd GROUP BY Category; END;
Query Parameters Parameters: dateStart and dateEnd