Vous êtes sur la page 1sur 15

Chapter 7 SQL Introduction.txt /* INTRO TO SQL - SQL EXAMPLES */ /* SQL-TEXT-1.

TXT */ /* Most commands here are for MS SQL Server or MS ACCESS where indicated. */ /* ======== CHANGING YOUR PASSWORD */ EXEC SP_PASSWORD NULL, 'abc', 'userid' -======== CREATING TABLE STRUCTURES CREATE TABLE VENDOR ( V_CODE INTEGER NOT NULL UNIQUE, V_NAME VARCHAR(35) NOT NULL, V_CONTACT VARCHAR(15) NOT NULL, V_AREACODE CHAR(3) NOT NULL, V_PHONE CHAR(8) NOT NULL, V_STATE CHAR(2) NOT NULL, V_ORDER CHAR(1) NOT NULL, PRIMARY KEY (V_CODE)) CREATE TABLE PRODUCT ( P_CODE VARCHAR(10) NOT NULL UNIQUE, P_DESCRIPT VARCHAR(35) NOT NULL, P_INDATE DATETIME NOT NULL, P_QOH SMALLINT NOT NULL, P_MIN SMALLINT NOT NULL, P_PRICE NUMERIC(8,2) NOT NULL, P_DISCOUNT NUMERIC(4,2) NOT NULL, V_CODE INTEGER, PRIMARY KEY (P_CODE), FOREIGN KEY (V_CODE) REFERENCES VENDOR) -- Checking table structure in SQL Server SP_HELP VENDOR SP_HELP PRODUCT -======== CONSTRAINTS, CHECKS and DEFAULTS CREATE TABLE CUSTOMER( CUS_CODE INTEGER PRIMARY KEY, CUS_LNAME VARCHAR(15) NOT NULL, CUS_FNAME VARCHAR(15) NOT NULL, CUS_INITIAL CHAR(1), CUS_AREACODE CHAR(3) DEFAULT '615' NOT NULL CHECK(CUS_AREACODE IN ('615','713','931')), CUS_PHONE CHAR(8) NOT NULL, CUS_BALANCE NUMERIC(9,2) DEFAULT 0.00, CONSTRAINT CUS_UI1 UNIQUE(CUS_LNAME,CUS_FNAME)) CREATE TABLE INVOICE ( INV_NUMBER INTEGER PRIMARY KEY, CUS_CODE INTEGER NOT NULL Page 1

Chapter 7 SQL Introduction.txt REFERENCES CUSTOMER(CUS_CODE), INV_DATE DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CONSTRAINT INV_CK1 CHECK (INV_DATE > '01-01-2008')) CREATE TABLE LINE ( INV_NUMBER INTEGER NOT NULL, LINE_NUMBER NUMERIC(2,0) NOT NULL, 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, PRIMARY KEY (INV_NUMBER,LINE_NUMBER), FOREIGN KEY (INV_NUMBER) REFERENCES INVOICE ON DELETE CASCADE, FOREIGN KEY (P_CODE) REFERENCES PRODUCT(P_CODE), CONSTRAINT LINE_UI1 UNIQUE(INV_NUMBER, P_CODE)) --======== INDEXES -- Q: Create index on P_INDATE CREATE INDEX P_INDATEX ON PRODUCT(P_INDATE) -- Q: Create composite index on V_CODE and P_CODE CREATE INDEX VENPRODX ON PRODUCT(V_CODE,P_CODE) -- Q: Create index on P_PRICE descendent order CREATE INDEX PROD_PRICEX ON PRODUCT(P_PRICE DESC) -- Q: Delete the PROD_PRICEX index DROP INDEX PRODUCT.PROD_PRICEX --======== DATA ENTRY BEGIN TRANSACTION INSERT INTO VENDOR VALUES (21225,'Bryson, Inc.','Smithson','615','223-3234','TN','Y') SELECT * FROM VENDOR INSERT INTO VENDOR VALUES (21226,'Superloo, Inc.','Flushing','904','215-8995','FL','N') SELECT * FROM VENDOR INSERT INTO PRODUCT VALUES ('11QER/31','Power painter, 15 psi., 3-nozzle','11-03-07',8,5,109.99,0.00,21225) Page 2

Chapter 7 SQL Introduction.txt INSERT INTO PRODUCT VALUES ('13-Q2/P2','7.25-in. pwr. Saw blade', '12-13-07',32,15,14.99, 0.05,21225) SELECT * FROM PRODUCT -- Insert with null attribute INSERT INTO PRODUCT VALUES ('BRT-345','Titanium drill bit', '10-18-07', 75, 10, 4.50, 0.06, NULL) -- Insert with optional attributes INSERT INTO PRODUCT (P_CODE, P_DESCRIPT) VALUES ('BRT-345','Titanium drill bit') --======== COMMIT COMMIT --======== LISTING TABLE CONTENTS - SELECT QUERIES SELECT * FROM PRODUCT SELECT P_CODE, P_DESCRIPT, P_INDATE, P_QOH, P_MIN, P_PRICE, P_DISCOUNT, V_CODE FROM PRODUCT --======== UPDATE TABLE ROWS UPDATE PRODUCT SET P_INDATE = '01-18-2008' WHERE P_CODE = '13-Q2/P2' SELECT * FROM PRODUCT UPDATE PRODUCT SET P_INDATE = '01-18-2008', P_PRICE = 16.99, P_MIN = 10 WHERE P_CODE = '13-Q2/P2' SELECT * FROM PRODUCT --======== ROLLBACK BEGIN TRANSACTION ROLLBACK SELECT * FROM PRODUCT Page 3

Chapter 7 SQL Introduction.txt --======== DELETE TABLE ROWS BEGIN TRANSACTION DELETE FROM PRODUCT WHERE P_CODE = '13-Q2/P2' DELETE FROM PRODUCT WHERE P_MIN = 5 -- NOTE: use rollback to restore table rows ROLLBACK -======== INSERTING ROWS WITH SELECT SUBQUERY /* Run script to create P and V tables (CREATE_P_V.SQL) */ /* Use: isql or osql from the command-line DELETE FROM PRODUCT DELETE FROM VENDOR INSERT INTO VENDOR SELECT * FROM V INSERT INTO PRODUCT SELECT * FROM P SELECT * FROM VENDOR SELECT * FROM PRODUCT -======== CREATE ALL DATABASE TABLES /* Use: run the CH07DBINIT.sql file --======== SELECT WITH WHERE CLAUSE SELECT P_DESCRIPT, P_INDATE, P_PRICE, V_CODE FROM PRODUCT WHERE V_CODE = 21344 -- Other comparison operators >, >=, <, <=, <> SELECT P_DESCRIPT, P_INDATE, P_PRICE, V_CODE FROM PRODUCT WHERE V_CODE < > 21344 -- Access user <> w/o spaces */ */

SELECT P_DESCRIPT, P_QOH, P_MIN, P_PRICE FROM PRODUCT WHERE P_PRICE <= 10 Page 4

Chapter 7 SQL Introduction.txt -- Using comparison operators in character attributes SELECT P_CODE, P_DESCRIPT, P_QOH, P_MIN, P_PRICE FROM PRODUCT WHERE P_CODE < '1558-QW1' -- Using comparison operators on dates SELECT P_DESCRIPT, P_QOH, P_MIN, P_PRICE, P_INDATE FROM PRODUCT WHERE P_INDATE >= '01-20-2008' -- Using computed columns and aliases SELECT P_DESCRIPT, P_QOH, P_PRICE, P_QOH*P_PRICE FROM PRODUCT SELECT P_DESCRIPT, P_QOH, P_PRICE, P_QOH*P_PRICE AS TOTVALUE FROM PRODUCT

SELECT P_CODE, P_INDATE, CURRENT_TIMESTAMP - 90 AS CUTDATE FROM PRODUCT WHERE P_INDATE <= CURRENT_TIMESTAMP - 90 SELECT P_CODE, P_INDATE, P_INDATE + 90 AS EXPDATE FROM PRODUCT -- Logical operators AND, OR, NOT SELECT P_DESCRIPT, P_INDATE, P_PRICE, V_CODE FROM PRODUCT WHERE V_CODE = 21344 OR V_CODE = 24288 SELECT P_DESCRIPT, P_INDATE, P_PRICE, V_CODE FROM PRODUCT WHERE P_PRICE < 50 AND P_INDATE > '01-15-2008' SELECT P_DESCRIPT, P_INDATE, P_PRICE, V_CODE FROM PRODUCT WHERE (P_PRICE < 50 AND P_INDATE > '01-15-2008') OR V_CODE = 24288 SELECT * Page 5

FROM WHERE

Chapter 7 SQL Introduction.txt PRODUCT NOT (V_CODE = 21344)

-- Special operators : BETWEEN, IS NULL, LIKE, IN, EXITS SELECT * FROM PRODUCT WHERE P_PRICE BETWEEN 50.00 AND 100.00 SELECT P_CODE, P_DESCRIPT FROM PRODUCT WHERE P_INDATE IS NULL SELECT P_CODE, P_DESCRIPT FROM PRODUCT WHERE V_CODE IS NULL -- Note: MS Access and SQL Server are case insensitive -- Note: MS Access uses * and %, SQL Server uses % and _ SELECT V_NAME, V_CONTACT, V_AREACODE, V_PHONE FROM VENDOR WHERE V_CONTACT LIKE 'Smith%' -- or use this version if case sensitive SELECT V_NAME, V_CONTACT, V_AREACODE, V_PHONE FROM VENDOR WHERE UPPER(V_CONTACT) LIKE 'SMITH%' SELECT V_NAME, V_CONTACT, V_AREACODE, V_PHONE FROM VENDOR WHERE V_CONTACT NOT LIKE 'Smith%' SELECT * FROM VENDOR WHERE V_CONTACT LIKE 'Johns_n' SELECT * FROM PRODUCT WHERE V_CODE IN (21344, 24288) -- EXISTS /* Returns true if the inner query returns at least 1 row, otherwise it returns false */ Page 6

Chapter 7 SQL Introduction.txt /* Q: List all vendors but only if there are products to order (P_QOH <= P_MIN) */ SELECT * FROM VENDOR WHERE EXISTS (SELECT * FROM PRODUCT WHERE P_QOH <= P_MIN) -- Q: List all vendors but only if there are products with the qty on hand less than double the min qty SELECT * FROM VENDOR WHERE EXISTS (SELECT * FROM PRODUCT WHERE P_QOH < P_MIN*2) -- Q: List the products that are supplied by a vendor SELECT * FROM PRODUCT WHERE V_CODE IS NOT NULL -- Q: List the v_code of vendors that provide products SELECT V_CODE FROM PRODUCT -- includes duplicates and Nulls -- includes Nulls

SELECT DISTINCT V_CODE FROM PRODUCT

-- Q: List the V_CODE and V_NAME of vendors that provide products SELECT V_CODE, V_NAME FROM VENDOR WHERE V_CODE IN (SELECT DISTINCT V_CODE FROM PRODUCT) /* Three value logic (NULL) problem ? Null values in FK cause problems */ /* Q: List the V_CODE and V_NAME of vendors that do not provide products */ SELECT V_CODE, V_NAME FROM VENDOR WHERE V_CODE NOT IN (SELECT DISTINCT V_CODE FROM PRODUCT) -- will list no rows! -- Correct answer SELECT V_CODE, V_NAME FROM VENDOR Page 7

Chapter 7 SQL Introduction.txt WHERE V_CODE NOT IN (SELECT DISTINCT V_CODE FROM PRODUCT WHERE V_CODE IS NOT NULL) --======== ADVANCED DATA MGMT /* ALTER DATA TYPE /* Will not run unless column is empty ? only increasing size will work */ -- Q: Change the V_CODE data type to CHAR ALTER TABLE PRODUCT ALTER COLUMN V_CODE VARCHAR(5) -- Q: Increase the width of P_PRICE column to nine digits ALTER TABLE PRODUCT ALTER COLUMN P_PRICE NUMERIC(9,2) -- ADD A COLUMN TO TABLE ALTER TABLE PRODUCT ADD P_SALECODE CHAR(1) -- DROPING A COLUMN FROM TABLE ALTER TABLE VENDOR DROP COLUMN V_ORDER -- UPDATE COMMANDS UPDATE PRODUCT SET P_SALECODE = '2' WHERE P_CODE = '1546-QQ2' UPDATE PRODUCT SET P_SALECODE = '1' WHERE P_CODE IN ('2232/QWE', '2232/QTY') UPDATE PRODUCT SET P_SALECODE = '2' WHERE P_INDATE < '12-25-2007' UPDATE SET WHERE AND PRODUCT P_SALECODE = '1' P_INDATE >= '01-16-2008' P_INDATE < '02-10-2008' */

UPDATE PRODUCT SET P_QOH = P_QOH + 20, P_PRICE = P_QOH*10 WHERE P_CODE = '2232/QWE' UPDATE PRODUCT Page 8

SET WHERE

Chapter 7 SQL Introduction.txt P_PRICE = P_PRICE*1.10 P_PRICE < 50.00

/* COPYING PARTS OF TABLES */ /* Q: Create a PART table with only using the code, description and price columns of PRODUCT */ CREATE TABLE PART ( PART_CODE CHAR(8) NOT NULL UNIQUE, PART_DESCRIPT CHAR(35), PART_PRICE DECIMAL(8,2), PRIMARY KEY (PART_CODE)) 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 */ */ */

/* INTRO TO SQL - SQL EXAMPLES /* SQL-TEXT-2.TXT */ /* ======== PART II ADVANCED QUERIES --== SELECT WITH ORDER BY SELECT P_CODE, P_DESCRIPT, P_INDATE, P_PRICE Page 9

Chapter 7 SQL Introduction.txt FROM ORDER PRODUCT BY P_PRICE

SELECT P_CODE, P_DESCRIPT, P_INDATE, P_PRICE FROM PRODUCT ORDER BY P_PRICE DESC SELECT EMP_LNAME, EMP_FNAME, EMP_INITIAL, EMP_AREACODE, EMP_PHONE FROM EMPLOYEE ORDER BY EMP_LNAME, EMP_FNAME, EMP_INITIAL SELECT P_DESCRIPT, V_CODE, P_INDATE, P_PRICE FROM PRODUCT WHERE P_INDATE < '01-21-2008' AND P_PRICE <= 50.00 ORDER BY V_CODE, P_PRICE DESC --== LISTING UNIQUE VALUES (ROWS!) SELECT DISTINCT V_CODE FROM PRODUCT SELECT DISTINCT V_STATE FROM VENDOR --== UNIQUE ROWS (VALUES COMBINATIONS) SELECT DISTINCT V_STATE, V_NAME FROM VENDOR SELECT DISTINCT V_STATE, V_AREACODE FROM VENDOR --== AGGREGATE FUNCTIONS: COUNT, MIN, MAX, SUM AND AVG --== COUNT -- Q: How many vendors provide products? -- COUNT(column) counts the not null values in column SELECT COUNT(DISTINCT V_CODE) FROM PRODUCT -- COUNT(*) counts the number of rows returned SELECT COUNT(*) FROM (SELECT DISTINCT V_CODE FROM PRODUCT) SELECT COUNT(*) FROM (SELECT DISTINCT V_CODE FROM PRODUCT WHERE V_CODE IS NOT NULL) -- Q: How many vendors (unique vendors) have products with price < Page 10

Chapter 7 SQL Introduction.txt 10? SELECT COUNT(DISTINCT V_CODE) FROM PRODUCT WHERE P_PRICE <= 10.00 -- Q: How many products with price < 10? SELECT COUNT(*) FROM PRODUCT WHERE P_PRICE <= 10.00 --== MAX AND MIN SELECT MAX(P_PRICE) FROM PRODUCT SELECT MIN(P_PRICE) FROM PRODUCT -- Q: What product(s) have a price equal to the maximum product price? SELECT P_CODE, P_DESCRIPT, P_PRICE FROM PRODUCT WHERE P_PRICE = (SELECT MAX(P_PRICE) FROM PRODUCT) - Q: What product(s) have the highest inventory value? SELECT * FROM PRODUCT WHERE P_QOH * P_PRICE = (SELECT MAX(P_QOH * P_PRICE) FROM PRODUCT) --== SUM -- Q: How much is the total customer balance? SELECT SUM(CUS_BALANCE) AS TOTBALANCE FROM CUSTOMER -- Q: How much is the total value of our product inventory? SELECT SUM(P_QOH*P_PRICE) AS TOTVALUE FROM PRODUCT --== AVG -- Q: What is the average product price? SELECT AVG(P_PRICE) FROM PRODUCT; -- Q: What products have a price that exceeds the average product price? SELECT P_CODE, P_DESCRIPT, P_QOH, P_PRICE, V_CODE FROM PRODUCT WHERE P_PRICE > (SELECT AVG(P_PRICE) FROM PRODUCT) ORDER BY P_PRICE DESC Page 11

Chapter 7 SQL Introduction.txt --== GROUP BY -- Q: What is the minimum price for each sale code? SELECT P_SALECODE, MIN(P_PRICE) FROM PRODUCT GROUP BY P_SALECODE -- Q: What is the average price for each sale code? SELECT P_SALECODE, AVG(P_PRICE) FROM PRODUCT GROUP BY P_SALECODE -- The following will generate an error -- GROUP BY must be used with aggregation functions SELECT V_CODE, P_CODE, P_DESCRIPT,P_PRICE FROM PRODUCT GROUP BY V_CODE -- How SELECT FROM GROUP many products each vendor provides? V_CODE, COUNT(DISTINCT P_CODE) PRODUCT BY V_CODE

--== GROUP BY WITH HAVING CLAUSE --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) FROM PRODUCT GROUP BY V_CODE SELECT V_CODE, COUNT(DISTINCT P_CODE), AVG(P_PRICE) FROM PRODUCT GROUP BY V_CODE HAVING AVG(P_PRICE) < 10 /* /* /* /* Q: The following SQL command will: */ 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 */ V_CODE, SUM(P_QOH * P_PRICE) AS TOTCOST PRODUCT BY V_CODE (SUM(P_QOH * P_PRICE)>500) BY SUM(P_QOH * P_PRICE) DESC Page 12

SELECT FROM GROUP HAVING ORDER

Chapter 7 SQL Introduction.txt --======== VIEW -- Q: Create a view to list all products with price greater than 50? CREATE VIEW PRICEGT50 AS SELECT P_DESCRIPT, P_QOH, P_PRICE FROM PRODUCT WHERE P_PRICE > (50.00) SELECT * FROM PRICEGT50; -- Q: Create a view to list all products to order, that is the quantity on hand is less that the minimum qty plus 10. CREATE VIEW PROD_TO_ORDER AS SELECT P_CODE, P_DESCRIPT, P_QOH, P_PRICE FROM PRODUCT WHERE P_QOH < (P_MIN +10) SELECT * FROM PROD_TO_ORDER -- Q: Create a view to show the total product cost and quantity on hand statistics grouped by vendor. CREATE VIEW PROD_STATS AS SELECT V_CODE, SUM(P_QOH * P_PRICE) AS TOTCOST, MAX(P_QOH) AS MAXQTY, MIN(P_QOH) AS MINQTY, AVG(P_QOH) AS AVGQTY FROM PRODUCT GROUP BY V_CODE; SELECT * FROM PROD_STATS --======== JOINS -- Q: List the product description, price, vendor code, name, contact, area code and phone for each product SELECT P_DESCRIPT, P_PRICE, VENDOR.V_CODE, V_NAME, V_CONTACT, V_AREACODE, V_PHONE FROM PRODUCT, VENDOR WHERE PRODUCT.V_CODE = VENDOR.V_CODE -- Q: Ordered by P_PRICE SELECT P_DESCRIPT, P_PRICE, VENDOR.V_CODE, V_NAME, V_CONTACT, V_AREACODE, V_PHONE FROM PRODUCT, VENDOR WHERE PRODUCT.V_CODE = VENDOR.V_CODE Page 13

Chapter 7 SQL Introduction.txt ORDER BY P_PRICE

-- Q: List products with vendor data for products purchased after SELECT P_DESCRIPT, P_PRICE, V_NAME, V_CONTACT, V_AREACODE, V_PHONE FROM PRODUCT, VENDOR WHERE PRODUCT.V_CODE = VENDOR.V_CODE AND P_INDATE > '01-15-2008'

-- Q: List all invoice data for customer number 10014 SELECT FROM WHERE AND AND AND ORDER CUS_LNAME, INVOICE.INV_NUMBER, INV_DATE, P_DESCRIPT CUSTOMER, INVOICE, LINE, PRODUCT CUSTOMER.CUS_CODE = INVOICE.CUS_CODE INVOICE.INV_NUMBER = LINE.INV_NUMBER LINE.P_CODE = PRODUCT.P_CODE CUSTOMER.CUS_CODE = 10014 BY INVOICE.INV_NUMBER

--== USING ALIAS SELECT P_DESCRIPT, P_PRICE, V_NAME, V_CONTACT, V_AREACODE, V_PHONE FROM PRODUCT P, VENDOR V WHERE P.V_CODE = V.V_CODE ORDER BY P_PRICE /*== RECURSIVE QUERIES /* List all employees with their manager's name /* Using EMP table SELECT FROM WHERE ORDER */ */ */

E.EMP_MGR, M.EMP_LNAME,E.EMP_NUM, E.EMP_LNAME EMP E, EMP M E.EMP_MGR=M.EMP_NUM 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

Page 14

Chapter 7 SQL Introduction.txt /* 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, FROM VENDOR RIGHT JOIN PRODUCT ON VENDOR.V_CODE = PRODUCT.V_CODE /*======== END SQL-TEXT-2.TXT V_NAME

*/

Page 15

Vous aimerez peut-être aussi