/* INTRO TO SQL - SQL EXAMPLES */ CUS_AREACODE CHAR(3) DEFAULT '615' NOT NULL /* SQL-TEXT-1.TXT */ CHECK(CUS_AREACODE IN ('615','713','931')), /* Most commands here are for MS SQL Server or MS ACCESS CUS_PHONE CHAR(8) NOT NULL, where indicated. */ CUS_BALANCE NUMERIC(9,2) DEFAULT 0.00, CONSTRAINT CUS_UI1 UNIQUE(CUS_LNAME,CUS_FNAME)) /* ======CHANGING YOUR PASSWORD */ EXEC SP_PASSWORD NULL, 'abc', 'userid' CREATE TABLE INVOICE ( INV_NUMBER INTEGER PRIMARY KEY, -======CREATING TABLE STRUCTURES CUS_CODE INTEGER NOT NULL REFERENCES CUSTOMER(CUS_CODE), CREATE TABLE VENDOR ( INV_DATE DATETIME DEFAULT CURRENT_TIMESTAMP NOT V_CODE INTEGER NOT NULL UNIQUE, NULL, V_NAME VARCHAR(35) NOT NULL, CONSTRAINT INV_CK1 CHECK (INV_DATE > '01-01-2008')) V_CONTACT VARCHAR(15) NOT NULL, V_AREACODE CHAR(3) NOT NULL, V_PHONE CHAR(8) NOT NULL, CREATE TABLE LINE ( V_STATE CHAR(2) NOT NULL, INV_NUMBER INTEGER NOT NULL, V_ORDER CHAR(1) NOT NULL, LINE_NUMBER NUMERIC(2,0) NOT NULL, PRIMARY KEY (V_CODE)) P_CODE VARCHAR(10) NOT NULL, LINE_UNITS NUMERIC(9,2) DEFAULT 0.00 NOT NULL, LINE_PRICE NUMERIC(9,2) DEFAULT 0.00 NOT NULL, CREATE TABLE PRODUCT ( PRIMARY KEY (INV_NUMBER,LINE_NUMBER), P_CODE VARCHAR(10) NOT NULL UNIQUE, FOREIGN KEY (INV_NUMBER) P_DESCRIPT VARCHAR(35) NOT NULL, REFERENCES INVOICE ON DELETE CASCADE, P_INDATE DATETIME NOT NULL, FOREIGN KEY (P_CODE) REFERENCES PRODUCT(P_CODE), P_QOH SMALLINT NOT NULL, CONSTRAINT LINE_UI1 UNIQUE(INV_NUMBER, P_CODE)) P_MIN SMALLINT NOT NULL, P_PRICE NUMERIC(8,2) NOT NULL, P_DISCOUNT NUMERIC(4,2) NOT NULL, --======INDEXES V_CODE INTEGER, PRIMARY KEY (P_CODE), -- Q: Create index on P_INDATE FOREIGN KEY (V_CODE) REFERENCES VENDOR) CREATE INDEX P_INDATEX ON PRODUCT(P_INDATE)

-- Checking table structure in SQL Server SP_HELP VENDOR -- Q: Create composite index on V_CODE and P_CODE SP_HELP PRODUCT CREATE INDEX VENPRODX ON PRODUCT(V_CODE,P_CODE)

-======CONSTRAINTS, CHECKS and DEFAULTS -- Q: Create index on P_PRICE descendent order CREATE TABLE CUSTOMER( CREATE INDEX PROD_PRICEX ON PRODUCT(P_PRICE DESC) CUS_CODE INTEGER PRIMARY KEY, CUS_LNAME VARCHAR(15) NOT NULL, -- Q: Delete the PROD_PRICEX index CUS_FNAME VARCHAR(15) NOT NULL, DROP INDEX PRODUCT.PROD_PRICEX CUS_INITIAL CHAR(1), 1 --======DATA ENTRY P_PRICE, P_DISCOUNT, V_CODE FROM PRODUCT BEGIN TRANSACTION --======UPDATE TABLE ROWS INSERT INTO VENDOR VALUES (21225,'Bryson, Inc.','Smithson','615','223-3234','TN','Y') UPDATE PRODUCT SET P_INDATE = '01-18-2008' SELECT * FROM VENDOR WHERE P_CODE = '13-Q2/P2'

INSERT INTO VENDOR SELECT * FROM PRODUCT VALUES (21226,'Superloo, Inc.','Flushing','904','215-8995','FL','N')

SELECT * FROM VENDOR UPDATE PRODUCT SET P_INDATE = '01-18-2008', INSERT INTO PRODUCT P_PRICE = 16.99, VALUES ('11QER/31','Power painter, 15 psi., 3-nozzle','11-03- P_MIN = 10 07',8,5,109.99,0.00,21225) WHERE P_CODE = '13-Q2/P2'

INSERT INTO PRODUCT VALUES ('13-Q2/P2','7.25-in. pwr. Saw blade', '12-13- SELECT * FROM PRODUCT 07',32,15,14.99, 0.05,21225) --======ROLLBACK SELECT * FROM PRODUCT BEGIN TRANSACTION ROLLBACK -- Insert with null attribute

INSERT INTO PRODUCT VALUES ('BRT-345','Titanium drill bit', '10- SELECT * FROM PRODUCT 18-07', 75, 10, 4.50, 0.06, NULL) --======DELETE TABLE ROWS -- Insert with optional attributes BEGIN TRANSACTION INSERT INTO PRODUCT (P_CODE, P_DESCRIPT) VALUES ('BRT-345','Titanium drill bit') DELETE FROM PRODUCT WHERE P_CODE = '13-Q2/P2' --======COMMIT DELETE FROM PRODUCT COMMIT WHERE P_MIN = 5

--======LISTING TABLE CONTENTS - SELECT QUERIES -- NOTE: use rollback to restore table rows

SELECT * FROM PRODUCT ROLLBACK

SELECT P_CODE, P_DESCRIPT, P_INDATE, P_QOH, P_MIN, -======INSERTING ROWS WITH SELECT SUBQUERY 2 -- Using comparison operators on dates /* Run script to create P and V tables (CREATE_P_V.SQL) */ /* Use: isql or osql from the command-line */ SELECT P_DESCRIPT, P_QOH, P_MIN, P_PRICE, P_INDATE FROM PRODUCT DELETE FROM PRODUCT WHERE P_INDATE >= '01-20-2008'

DELETE FROM VENDOR -- Using computed columns and aliases

INSERT INTO VENDOR SELECT * FROM V SELECT P_DESCRIPT, P_QOH, P_PRICE, P_QOH*P_PRICE FROM PRODUCT INSERT INTO PRODUCT SELECT * FROM P SELECT P_DESCRIPT, P_QOH, P_PRICE, SELECT * FROM VENDOR P_QOH*P_PRICE AS TOTVALUE FROM PRODUCT SELECT * FROM PRODUCT

-======CREATE ALL DATABASE TABLES /* Use: run the CH07DBINIT.sql file */ SELECT P_CODE, P_INDATE, CURRENT_TIMESTAMP - 90 AS CUTDATE --======SELECT WITH WHERE CLAUSE FROM PRODUCT WHERE P_INDATE <= CURRENT_TIMESTAMP - 90 SELECT P_DESCRIPT, P_INDATE, P_PRICE, V_CODE FROM PRODUCT WHERE V_CODE = 21344 SELECT P_CODE, P_INDATE, P_INDATE + 90 AS EXPDATE FROM PRODUCT -- Other comparison operators >, >=, <, <=, <> -- Logical operators AND, OR, NOT SELECT P_DESCRIPT, P_INDATE, P_PRICE, V_CODE FROM PRODUCT WHERE V_CODE < > 21344 SELECT P_DESCRIPT, P_INDATE, P_PRICE, V_CODE FROM PRODUCT -- Access user <> w/o spaces WHERE V_CODE = 21344 OR V_CODE = 24288

SELECT P_DESCRIPT, P_QOH, P_MIN, P_PRICE FROM PRODUCT SELECT P_DESCRIPT, P_INDATE, P_PRICE, V_CODE WHERE P_PRICE <= 10 FROM PRODUCT WHERE P_PRICE < 50 AND P_INDATE > '01-15-2008' -- Using comparison operators in character attributes

SELECT P_CODE, P_DESCRIPT, P_QOH, P_MIN, P_PRICE SELECT P_DESCRIPT, P_INDATE, P_PRICE, V_CODE FROM PRODUCT FROM PRODUCT WHERE P_CODE < '1558-QW1' WHERE (P_PRICE < 50 AND P_INDATE > '01-15-2008') OR V_CODE = 24288 3 SELECT * FROM PRODUCT SELECT * WHERE NOT (V_CODE = 21344) FROM PRODUCT WHERE V_CODE IN (21344, 24288) -- Special operators : BETWEEN, IS NULL, LIKE, IN, EXITS

SELECT * -- EXISTS FROM PRODUCT /* Returns true if the inner query returns at least 1 row, WHERE P_PRICE BETWEEN 50.00 AND 100.00 otherwise it returns false */

/* Q: List all vendors but only if there are products to order SELECT P_CODE, P_DESCRIPT (P_QOH <= P_MIN) */ FROM PRODUCT WHERE P_INDATE IS NULL SELECT * FROM VENDOR WHERE EXISTS (SELECT * FROM PRODUCT SELECT P_CODE, P_DESCRIPT WHERE P_QOH <= P_MIN) FROM PRODUCT WHERE V_CODE IS NULL -- Q: List all vendors but only if there are products with the qty on hand less than double the min qty -- Note: MS Access and SQL Server are case insensitive -- Note: MS Access uses * and %, SQL Server uses % and _ SELECT * FROM VENDOR WHERE EXISTS (SELECT * FROM PRODUCT SELECT V_NAME, V_CONTACT, V_AREACODE, V_PHONE WHERE P_QOH < P_MIN*2) FROM VENDOR WHERE V_CONTACT LIKE 'Smith%' -- Q: List the products that are supplied by a vendor -- or use this version if case sensitive SELECT * FROM PRODUCT SELECT V_NAME, V_CONTACT, V_AREACODE, V_PHONE WHERE V_CODE IS NOT NULL FROM VENDOR WHERE UPPER(V_CONTACT) LIKE 'SMITH%' -- Q: List the v_code of vendors that provide products

SELECT V_NAME, V_CONTACT, V_AREACODE, V_PHONE SELECT V_CODE FROM PRODUCT -- includes duplicates and Nulls FROM VENDOR WHERE V_CONTACT NOT LIKE 'Smith%' SELECT DISTINCT V_CODE FROM PRODUCT -- includes Nulls

SELECT * FROM VENDOR -- Q: List the V_CODE and V_NAME of vendors that provide WHERE V_CONTACT LIKE 'Johns_n' products 4 SELECT V_CODE, V_NAME -- DROPING A COLUMN FROM TABLE FROM VENDOR WHERE V_CODE IN (SELECT DISTINCT V_CODE FROM PRODUCT) ALTER TABLE VENDOR DROP COLUMN V_ORDER

/* Three value logic (NULL) problem – -- UPDATE COMMANDS Null values in FK cause problems */ /* Q: List the V_CODE and V_NAME of vendors that do not UPDATE PRODUCT provide products */ SET P_SALECODE = '2' WHERE P_CODE = '1546-QQ2' SELECT V_CODE, V_NAME FROM VENDOR UPDATE PRODUCT WHERE V_CODE NOT IN SET P_SALECODE = '1' (SELECT DISTINCT V_CODE FROM PRODUCT) WHERE P_CODE IN ('2232/QWE', '2232/QTY') -- will list no rows! UPDATE PRODUCT -- Correct answer SET P_SALECODE = '2' WHERE P_INDATE < '12-25-2007' SELECT V_CODE, V_NAME FROM VENDOR UPDATE PRODUCT WHERE V_CODE NOT IN (SELECT DISTINCT V_CODE FROM SET P_SALECODE = '1' PRODUCT WHERE V_CODE IS NOT NULL) WHERE P_INDATE >= '01-16-2008' AND P_INDATE < '02-10-2008'

--======ADVANCED DATA MGMT UPDATE PRODUCT SET P_QOH = P_QOH + 20, P_PRICE = P_QOH*10 /* ALTER DATA TYPE */ WHERE P_CODE = '2232/QWE' /* Will not run unless column is empty – only increasing size will work */ UPDATE PRODUCT SET P_PRICE = P_PRICE*1.10 -- Q: Change the V_CODE data type to CHAR WHERE P_PRICE < 50.00 ALTER TABLE PRODUCT ALTER COLUMN V_CODE VARCHAR(5) /* COPYING PARTS OF TABLES */ /* Q: Create a PART table with only using the code, description -- Q: Increase the width of P_PRICE column to nine digits and price columns of PRODUCT */ ALTER TABLE PRODUCT ALTER COLUMN P_PRICE NUMERIC(9,2) CREATE TABLE PART ( PART_CODE CHAR(8) NOT NULL UNIQUE, -- ADD A COLUMN TO TABLE PART_DESCRIPT CHAR(35), PART_PRICE DECIMAL(8,2), ALTER TABLE PRODUCT PRIMARY KEY (PART_CODE)) ADD P_SALECODE CHAR(1) 5 INSERT INTO PART (PART_CODE, PART_DESCRIPT, PART_PRICE) SELECT P_CODE, P_DESCRIPT, P_PRICE FROM PRODUCT

SELECT P_CODE, P_DESCRIPT, P_PRICE INTO PART FROM PRODUCT

-- ADDING PK AND FK WITH THE ALTER TABLE COMMAND

ALTER TABLE PART ADD PRIMARY KEY(PART_CODE)

ALTER TABLE PRODUCT ADD PRIMARY KEY(P_CODE)

ALTER TABLE PRODUCT ADD FOREIGN KEY(V_CODE) REFERENCES VENDOR

------OR

ALTER TABLE PRODUCT ADD PRIMARY KEY(P_CODE), FOREIGN KEY (V_CODE) REFERENCES VENDOR

-- DROPING A TABLE

DROP TABLE PART /*======END PART I */

6 /* INTRO TO SQL - SQL EXAMPLES */ /* SQL-TEXT-2.TXT */ --== COUNT /* ======PART II ADVANCED QUERIES */ -- Q: How many vendors provide products?

--== SELECT WITH ORDER BY -- COUNT(column) counts the not null values in column SELECT COUNT(DISTINCT V_CODE) FROM PRODUCT SELECT P_CODE, P_DESCRIPT, P_INDATE, P_PRICE FROM PRODUCT ORDER BY P_PRICE -- COUNT(*) counts the number of rows returned SELECT COUNT(*) FROM (SELECT DISTINCT V_CODE FROM PRODUCT) SELECT P_CODE, P_DESCRIPT, P_INDATE, P_PRICE FROM PRODUCT ORDER BY P_PRICE DESC SELECT COUNT(*) FROM (SELECT DISTINCT V_CODE FROM PRODUCT WHERE V_CODE IS NOT NULL)

SELECT EMP_LNAME, EMP_FNAME, EMP_INITIAL, EMP_AREACODE, EMP_PHONE -- Q: How many vendors (unique vendors) have products with FROM EMPLOYEE price < 10? ORDER BY EMP_LNAME, EMP_FNAME, EMP_INITIAL SELECT COUNT(DISTINCT V_CODE) FROM PRODUCT WHERE P_PRICE <= 10.00 SELECT P_DESCRIPT, V_CODE, P_INDATE, P_PRICE FROM PRODUCT WHERE P_INDATE < '01-21-2008' -- Q: How many products with price < 10? AND P_PRICE <= 50.00 SELECT COUNT(*) FROM PRODUCT ORDER BY V_CODE, P_PRICE DESC WHERE P_PRICE <= 10.00

--== LISTING UNIQUE VALUES (ROWS!) --== MAX AND MIN

SELECT DISTINCT V_CODE FROM PRODUCT SELECT MAX(P_PRICE) FROM PRODUCT

SELECT DISTINCT V_STATE FROM VENDOR SELECT MIN(P_PRICE) FROM PRODUCT

-- Q: What product(s) have a price equal to the maximum product --== UNIQUE ROWS (VALUES COMBINATIONS) price? SELECT P_CODE, P_DESCRIPT, P_PRICE SELECT DISTINCT V_STATE, V_NAME FROM VENDOR FROM PRODUCT WHERE P_PRICE = (SELECT MAX(P_PRICE) FROM PRODUCT) SELECT DISTINCT V_STATE, V_AREACODE FROM VENDOR

- Q: What product(s) have the highest inventory value? --== AGGREGATE FUNCTIONS: COUNT, MIN, MAX, SUM AND AVG SELECT * 7 FROM PRODUCT -- GROUP BY must be used with aggregation functions WHERE P_QOH * P_PRICE = SELECT V_CODE, P_CODE, P_DESCRIPT,P_PRICE (SELECT MAX(P_QOH * P_PRICE) FROM PRODUCT) FROM PRODUCT GROUP BY V_CODE

--== SUM -- Q: How much is the total customer balance? -- How many products each vendor provides? SELECT SUM(CUS_BALANCE) AS TOTBALANCE SELECT V_CODE, COUNT(DISTINCT P_CODE) FROM CUSTOMER FROM PRODUCT GROUP BY V_CODE

-- Q: How much is the total value of our product inventory? SELECT SUM(P_QOH*P_PRICE) AS TOTVALUE --== GROUP BY WITH HAVING CLAUSE FROM PRODUCT --Q: List the number of products by vendor with the average price, include only the rows with price below 10.00. SELECT V_CODE, COUNT(DISTINCT P_CODE), AVG(P_PRICE) --== AVG FROM PRODUCT -- Q: What is the average product price? GROUP BY V_CODE SELECT AVG(P_PRICE) FROM PRODUCT;

SELECT V_CODE, COUNT(DISTINCT P_CODE), AVG(P_PRICE) -- Q: What products have a price that exceeds the average product FROM PRODUCT price? GROUP BY V_CODE SELECT P_CODE, P_DESCRIPT, P_QOH, P_PRICE, V_CODE HAVING AVG(P_PRICE) < 10 FROM PRODUCT WHERE P_PRICE > (SELECT AVG(P_PRICE) FROM PRODUCT) /* Q: The following SQL command will: */ ORDER BY P_PRICE DESC /* 1 - Aggregate the total cost of products group by vendor */ /* 2 - Select only the rows having a total cost greater than 50 */ /* 3 - List the results in descending order by total cost */ --== GROUP BY -- Q: What is the minimum price for each sale code? SELECT V_CODE, SUM(P_QOH * P_PRICE) AS TOTCOST SELECT P_SALECODE, MIN(P_PRICE) FROM PRODUCT FROM PRODUCT GROUP BY V_CODE GROUP BY P_SALECODE HAVING (SUM(P_QOH * P_PRICE)>500) ORDER BY SUM(P_QOH * P_PRICE) DESC

-- Q: What is the average price for each sale code? SELECT P_SALECODE, AVG(P_PRICE) --======VIEW FROM PRODUCT -- Q: Create a view to list all products with price greater than 50? GROUP BY P_SALECODE CREATE VIEW PRICEGT50 AS SELECT P_DESCRIPT, P_QOH, P_PRICE FROM PRODUCT -- The following will generate an error WHERE P_PRICE > (50.00) 8 WHERE PRODUCT.V_CODE = VENDOR.V_CODE ORDER BY P_PRICE SELECT * FROM PRICEGT50;

-- Q: List products with vendor data for products purchased after -- Q: Create a view to list all products to order, that is the quantity SELECT P_DESCRIPT, P_PRICE, V_NAME, V_CONTACT, on hand is less that the minimum qty plus 10. V_AREACODE, V_PHONE CREATE VIEW PROD_TO_ORDER AS FROM PRODUCT, VENDOR SELECT P_CODE, P_DESCRIPT, P_QOH, P_PRICE WHERE PRODUCT.V_CODE = VENDOR.V_CODE FROM PRODUCT AND P_INDATE > '01-15-2008' WHERE P_QOH < (P_MIN +10)

SELECT * FROM PROD_TO_ORDER

-- Q: Create a view to show the total product cost and quantity on -- Q: List all invoice data for customer number 10014 hand statistics grouped by vendor. CREATE VIEW PROD_STATS AS SELECT CUS_LNAME, INVOICE.INV_NUMBER, INV_DATE, SELECT V_CODE, P_DESCRIPT SUM(P_QOH * P_PRICE) AS TOTCOST, FROM CUSTOMER, INVOICE, LINE, PRODUCT MAX(P_QOH) AS MAXQTY, WHERE CUSTOMER.CUS_CODE = INVOICE.CUS_CODE MIN(P_QOH) AS MINQTY, AND INVOICE.INV_NUMBER = LINE.INV_NUMBER AVG(P_QOH) AS AVGQTY AND LINE.P_CODE = PRODUCT.P_CODE FROM PRODUCT AND CUSTOMER.CUS_CODE = 10014 GROUP BY V_CODE; ORDER BY INVOICE.INV_NUMBER

SELECT * FROM PROD_STATS --== USING ALIAS SELECT P_DESCRIPT, P_PRICE, V_NAME, V_CONTACT, --======JOINS V_AREACODE, V_PHONE -- Q: List the product description, price, vendor code, name, FROM PRODUCT P, VENDOR V contact, area code and phone for each product WHERE P.V_CODE = V.V_CODE SELECT P_DESCRIPT, P_PRICE, VENDOR.V_CODE, V_NAME, ORDER BY P_PRICE V_CONTACT, V_AREACODE, V_PHONE FROM PRODUCT, VENDOR WHERE PRODUCT.V_CODE = VENDOR.V_CODE /*== RECURSIVE QUERIES */ /* List all employees with their manager's name */ /* Using EMP table */ -- Q: Ordered by P_PRICE SELECT P_DESCRIPT, P_PRICE, VENDOR.V_CODE, V_NAME, SELECT E.EMP_MGR, M.EMP_LNAME,E.EMP_NUM, V_CONTACT, V_AREACODE, V_PHONE E.EMP_LNAME FROM PRODUCT, VENDOR FROM EMP E, EMP M 9 WHERE E.EMP_MGR=M.EMP_NUM ORDER BY E.EMP_MGR

/*== OUTER JOIN */ /* LEFT */ /* List all vendor rows (including the ones that have no matching products) and all matching product rows */

SELECT P_CODE, VENDOR.V_CODE, V_NAME FROM VENDOR LEFT JOIN PRODUCT ON VENDOR.V_CODE = PRODUCT.V_CODE

/* RIGHT */ /* List all product rows (including the ones that have no matching vendors) and all matching vendor rows*/

SELECT PRODUCT.P_CODE, VENDOR.V_CODE, V_NAME FROM VENDOR RIGHT JOIN PRODUCT ON VENDOR.V_CODE = PRODUCT.V_CODE

/*======END SQL-TEXT-2.TXT */

10