CMT221/CMM222:: Database Organization and Design

Download as pdf or txt
Download as pdf or txt
You are on page 1of 54

CMT221/CMM222:

Database Organization and


Design

Week 10: Introduction to Structured Query


Language (SQL)

Dr. Jasy Liew Suet Yan


School of Computer Sciences
Credit to UKY and WLP
Outline

• SQL
▪ Data definition commands: CREATE
TABLE, CREATE INDEX
▪ Data manipulation commands: INSERT,
COMMIT, UPDATE, DELETE, ROLLBACK
▪ SELECT queries: WHERE
Cool Hardware Co
Business rules
• A customer may generate zero or many invoices. Each
invoice is generated by one customer.
• An invoice contains one or more invoice lines. Each
invoice line is associated with one invoice.
• Each invoice line references one product. A product may
be found in many invoice lines.
• A vendor may supply many products. Some vendors do
not yet supply products.
• If a product is vendor supplied, it is supplied by only a
single vendor.
• Some products are not supplied by a vendor. Some
products may be produced in-house or bought on the open
market.
Database Model
Database Structure
Structured Query Language (SQL)

CREATE TABLE

CREATE INDEX, DROP INDEX


Data Definition Language (DDL)
ALTER TABLE

DROP TABLE
SQL

INSERT

SELECT

COMMIT
Data Manipulation Language (DML)
UPDATE

ROLLBACK

DELETE
Data Dictionary
Table Name Attribute Contents Data Type Format Range Required PK or FK FK
Name Referenced
Table
PRODUCT P_CODE Product Code VARCHAR(10) XXXXXXXXXX NA Y PK
Data Types
Data Type Format Comments
Numeric NUMBER(L,D) The declaration NUMBER(7,2) indicates that numbers will be
stored with 2 decimal places and may be up to 7 digits long,
including the sign and the decimal places (e.g., 12.32 or -134.99).
INTEGER May be abbreviated as INT. Integers are (whole) counting
numbers, so they cannot be used if you want to store numbers
that require decimal places.
SMALLINT Like INT but limited to integer values up to 6 digits.
DECIMAL(L,D) LIKE NUMBER but storage length is a minimum specification.
Character CHAR(L) Fixed-length character data for up to 255 characters.
VARCHAR(L) Variable-length character data.
Date DATE Stores dates in Julian data format.
Data Definition Commands
• Create the database structure
• Create the tables to hold data
CREATE TABLE

CREATE INDEX, DROP INDEX


Data Definition Language (DDL)
ALTER TABLE

DROP TABLE
SQL

INSERT

SELECT

COMMIT
Data Manipulation Language (DML)
UPDATE

ROLLBACK

DELETE
CREATE TABLE

CREATE TABLE tableName


(
column1 data type [constraint],
column2 data_type [constraint],
PRIMARY KEY (columnN),
FOREIGN KEY (columnN) REFERENCES tableName,
CONSTRAINT [constraint]
);
CREATE TABLE
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
CREATE TABLE PRODUCT (
P_CODE VARCHAR(10) NOT NULL UNIQUE,
P_DESCRIPT VARCHAR(35) NOT NULL,
P_INDATE DATE NOT NULL,
P_QOH SMALLINT NOT NULL,
P_MIN SMALLINT NOT NULL,
P_PRICE NUMBER(8,2) NOT NULL,
P_DISCOUNT NUMBER(5,2) NOT NULL,
V_CODE INTEGER,
PRIMARY KEY (P_CODE), entity integrity
FOREIGN KEY (V_CODE) REFERENCES VENDOR (V_CODE)
); referential integrity
SQL Constraints: Foreign Key
FOREIGN KEY (V_CODE) REFERENCES VENDOR (V_CODE)
ON UPDATE CASCADE
• ON UPDATE CASCADE (not supported by the Oracle)
• Example: When updating VENDOR’s V_CODE, that
change is automatically applied to all foreign key
references in PRODUCT
FOREIGN KEY (V_CODE) REFERENCES VENDOR (V_CODE)
ON DELETE CASCADE
• ON DELETE CASCADE (supported by the Oracle)
• Example: When deleting a VENDOR’s row, all the
rows corresponds to that V_CODE in the PRODUCT
will be deleted.
SQL Constraints

NOT NULL constraint


• Ensures that column does not accept nulls

UNIQUE constraint
• Ensures that all values in column are unique

DEFAULT constraint
• Assigns value to attribute when a new row is added to table

CHECK constraint
• Validates data when attribute value is entered
CREATE TABLE
• Create table CUSTOMER
▪ Assign CUS_AREACODE a default value of ‘615’.
▪ Check to ensure CUS_AREACODE are restricted to values 615, 713
and 931.
▪ Assign CUS_BALANCE a default value of 0.00.
▪ Create a UNIQUE constraint named CUS_UI1 on CUS_LNAME and
CUS_FNAME.
CREATE TABLE CUSTOMER
(
CUS_CODE NUMBER 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 NUMBER(9,2) DEFAULT 0.00,
CONSTRAINT CUS_UI1 UNIQUE(CUS_LNAME,CUS_FNAME)
);
CREATE TABLE
• Create table INVOICE
▪ INV_DATE is set to a default date (e.g. today’s date).
▪ check the INV_DATE is greater than 1 Jan 2014.

CREATE TABLE INVOICE


(
INV_NUMBER NUMBER PRIMARY KEY,
CUS_CODE NUMBER NOT NULL REFERENCES CUSTOMER(CUS_CODE),
INV_DATE DATE DEFAULT SYSDATE NOT NULL,
CONSTRAINT INV_CK1 CHECK
(INV_DATE > TO_DATE('01-JAN-2014','DD-MON-YYYY'))
);
CREATE TABLE
• Create table LINE
▪ Create a composite primary key (INV_NUMBER, LINE_NUMBER).
▪ Assign LINE_UNITS and LINE_PRICE default values of 0.00.
▪ Create a UNIQUE constraint named LINE_UI1 on INV_NUMBER and
P_CODE.
▪ Set INV_NUMBER as the foreign key referencing INVOICE.
▪ Set P_CODE as the foreign key referencing PRODUCT.
▪ Enforce referential integrity to ensure that the deletion of a row in the
INVOICE entity automatically triggers the deletion of corresponding rows in
the LINE entity.
CREATE TABLE LINE
(
INV_NUMBER NUMBER NOT NULL,
LINE_NUMBER NUMBER(2,0) NOT NULL,
P_CODE VARCHAR(10) NOT NULL,
LINE_UNITS NUMBER(9,2) NOT NULL,
LINE_PRICE NUMBER(9,2) NOT NULL
);
CREATE TABLE

CREATE TABLE LINE


(
INV_NUMBER NUMBER NOT NULL,
LINE_NUMBER NUMBER(2,0) NOT NULL,
P_CODE VARCHAR(10) NOT NULL,
LINE_UNITS NUMBER(9,2) DEFAULT 0.00 NOT NULL,
LINE_PRICE NUMBER(9,2) DEFAULT 0.00 NOT NULL,
PRIMARY KEY (INV_NUMBER, LINE_NUMBER),
FOREIGN KEY (INV_NUMBER) REFERENCES INVOICE(INV_NUM)
ON DELETE CASCADE,
FOREIGN KEY (P_CODE) REFERENCES PRODUCT(P_CODE),
CONSTRAINT LINE_UI1 UNIQUE(INV_NUMBER, P_CODE)
);
DESCRIBE TABLE

• Describe table structure

DESCRIBE TABLE;

DESCRIBE VENDOR;

DESCRIBE PRODUCT;
CREATE INDEX
CREATE [UNIQUE] INDEX indexName
ON tableName(columnN);
Create index named CREATE INDEX P_INDATEX ON
P_INDATEX on P_INDATE in PRODUCT(P_INDATE);
PRODUCT
Create composite index named CREATE INDEX VENPRODX ON
VENPRODX on V_CODE and PRODUCT(V_CODE,P_CODE);
P_CODE in PRODUCT
Create index named CREATE INDEX PROD_PRICEX ON
PROD_PRICEX on P_PRICE PRODUCT(P_PRICE DESC);
in PRODUCT in descending
order
Delete the PROD_PRICEX DROP INDEX PROD_PRICEX;
index
Data Manipulation Commands

CREATE TABLE

CREATE INDEX, DROP INDEX


Data Definition Language (DDL)
ALTER TABLE

DROP TABLE
SQL

INSERT

SELECT

COMMIT
Data Manipulation Language (DML)
UPDATE

ROLLBACK

DELETE
INSERT

INSERT INTO tableName


[(column1, column2, ...,
column3)]
VALUES (value1, value2, ...,
valueN);
INSERT
INSERT INTO VENDOR
VALUES (21225,'Bryson, Inc.','Smithson','615','223-
3234','TN','Y');

TABLE ATTRIBUTE CONTENTS TYPE FORMAT RANGE REQ PK OR FK REF


NAME NAME FK TABLE
VENDOR V_CODE Vendor code INTEGER ##### 1000-9999 Y PK
V_NAME Vendor name VARCHAR(35) Xxx xxx NA Y
V_CONTACT Contact person VARCHAR(25) Xxx xxx NA Y
V_AREACODE Area code CHAR(3) 999 NA Y
V_PHONE Phone number CHAR(8) 999-9999 NA Y
V_STATE State CHAR(2) XX NA Y
V_ORDER Previous order CHAR(1) X Y or N Y
INSERT
INSERT INTO VENDOR
VALUES (21226,'Superloo, Inc.','Flushing','904','215-
8995','FL','N');
INSERT
INSERT INTO PRODUCT
VALUES ('11QER/31','Power painter, 15 psi., 3-nozzle','03-
NOV-11',8,5,109.99,0.00,21225);

INSERT INTO PRODUCT


VALUES ('13-Q2/P2','7.25-in. pwr. saw blade','13-DEC-
11',32,15,14.99,0.05,21225);
TABLE ATTRIBUTE CONTENTS TYPE FORMAT RANGE REQ PK FK REF TABLE
NAME NAME OR FK
PRODUCT P_CODE Product code VARCHAR(10) XXXXXXXXXX NA Y PK
P_DESCRIPT Product description VARCHAR(35) Xxx xxx NA Y
P_INDATE Stocking date DATE DD-MON-YYYY NA Y

P_QOH Units available SMALLINT #### 0-9999 Y


P_MIN Minimum units SMALLINT #### 0-9999 Y
P_PRICE Product price NUMBER(8,2) ####.## 0.00-9999.00 Y
P_DISCOUNT Discount rate NUMBER(5,2) 0.## 0.00-0.20 Y
V_CODE Vendor code INTEGER ### 100-999 FK VENDOR
INSERT
INSERT INTO PRODUCT
VALUES ('BRT-345','Titanium drill bit', '18-OCT-11', 75, 10,
4.50, 0.06, NULL);

Inserting rows with optional attributes


INSERT INTO PRODUCT(P_CODE, P_DESCRIPT)
VALUES ('BRT-345','Titanium drill bit');
SELECT
• List table rows
SELECT columnList
FROM tableName;
Show all attributes
SELECT * FROM PRODUCT;

Show selected attributes


SELECT P_CODE, P_DESCRIPT, P_INDATE, P_QOH,
P_MIN, P_PRICE, P_DISCOUNT, V_CODE
FROM PRODUCT;
INSERT + SELECT Subquery
• Inserts multiple rows from another table (source)
INSERT INTO tableName
SELECT columnList
FROM tableName
Subquery – Nested or inner
query always executed first
INSERT + SELECT Subquery
CREATE TABLE VENDOR1 ( CREATE TABLE VENDOR2 (
V_CODE INTEGER NOT NULL, V_CODE INTEGER NOT NULL,
V_NAME VARCHAR(35) NOT NULL, V_NAME VARCHAR(35) NOT NULL,
V_CONTACT VARCHAR(15) NOT NULL, V_CONTACT VARCHAR(15) NOT NULL,
V_AREACODE CHAR(3) NOT NULL, V_AREACODE CHAR(3) NOT NULL,
V_PHONE CHAR(8) NOT NULL, V_PHONE CHAR(8) NOT NULL,
V_STATE CHAR(2) NOT NULL, V_STATE CHAR(2) NOT NULL,
V_ORDER CHAR(1) NOT NULL, V_ORDER CHAR(1) NOT NULL,
PRIMARY KEY (V_CODE) PRIMARY KEY (V_CODE)
); );

INSERT INTO VENDOR2 VALUES(21225,'Bryson,


Inc.','Smithson','615','223-3234','TN','Y');
INSERT INTO VENDOR2 VALUES(21226,'SuperLoo,
Inc.','Flushing','904','215-8995','FL','N');
INSERT INTO VENDOR2 VALUES(21231,'DnE Supply','Singh','615','228-
3245','TN','Y');

INSERT INTO VENDOR1 SELECT * FROM VENDOR2;


INSERT INTO VENDOR1 SELECT * FROM VENDOR2 WHERE V_CODE = 21225;
UPDATE
• Modify data in a table
UPDATE tablename
SET columnName = expression
[WHERE conditionList];
UPDATE

UPDATE PRODUCT
SET P_INDATE = '18-JAN-12'
WHERE P_CODE = '13-Q2/P2';
Before UPDATE:

After UPDATE:
UPDATE
UPDATE PRODUCT
SET P_INDATE = '18-JAN-12',
P_PRICE = 17.99,
P_MIN = 10
WHERE P_CODE = '13-Q2/P2';
Before UPDATE:

After UPDATE:
DELETE
• Deletes a table row
DELETE FROM tableName
[WHERE conditionList];
Delete row where P_CODE = ‘BRT-345’ from PRODUCT
DELETE FROM PRODUCT
WHERE P_CODE = 'BRT-345';
Delete rows where P_MIN is equals to 5
DELETE FROM PRODUCT
WHERE P_MIN = 5;
COMMIT
• Permanently saves all changes

COMMIT [WORK];

COMMIT;
ROLLBACK
• Undo changes since last COMMIT
• Bring data back to values before change

ROLLBACK;
COMMIT & ROLLBACK
• COMMIT and ROLLBACK only work with
commands to add, modify, or delete table rows
CREATE TABLE NAMELIST
(
NL_CODE NUMBER PRIMARY KEY,
NL_NAME VARCHAR(15) NOT NULL
);

INSERT INTO NAMELIST VALUES (1, 'WONG LI PEI');


INSERT INTO NAMELIST VALUES (2, 'ROSNAH IDRUS);

DELETE FROM NAMELIST WHERE NL_CODE = 1;

COMMIT;

ROLLBACK;
COMMIT & ROLLBACK
CREATE TABLE NAMELIST
(
NL_CODE NUMBER PRIMARY KEY,
NL_NAME VARCHAR(15) NOT NULL
);

INSERT INTO NAMELIST VALUES (1, 'WONG LI PEI');


INSERT INTO NAMELIST VALUES (2, 'ROSNAH IDRUS);

DELETE FROM NAMELIST WHERE NL_CODE = 1;

ROLLBACK;
SELECT Queries

SELECT columnList
FROM tableName;

Adding restrictions to search criteria


▪ Conditional restrictions
▪ Arithmetic operators
▪ Logical operators
▪ Special operators
SELECT Queries
• Select rows with conditional restrictions
SELECT columnList
FROM tableName
[WHERE conditionList];
Examples:
• What products were supplied by vendor with code 21344?
• Which products are priced below $10?
• How many products supplied by vendor with code 21344 were
sold between January 5, 2014 and March 20, 2014?
SELECT Queries
• What products were supplied by vendor
with code 21344?
▪ Show the product description, stocking date, price and vendor
code.
SELECT P_DESCRIPT, P_INDATE, P_PRICE, V_CODE
FROM PRODUCT
WHERE V_CODE = 21344;
SELECT Queries

• Comparison operators can be used on


• Number
• Character
• Date
SELECT Queries
• What products were NOT supplied by
vendor with code 21344?
▪ Show the product description, stocking date, price and vendor
code.
SELECT P_DESCRIPT, P_INDATE, P_PRICE, V_CODE
FROM PRODUCT
WHERE V_CODE <> 21344;
SELECT Queries
• Which products are priced below $10?
▪ Show the product description, units available,
minimum units and price.
SELECT P_DESCRIPT, P_QOH, P_MIN, P_PRICE
FROM PRODUCT
WHERE P_PRICE < 10;
SELECT Queries
• Show the code, description, units available, minimum
units and price of products in which code is less than
1558-QW1.
SELECT P_CODE, P_DESCRIPT, P_QOH, P_MIN,
P_PRICE
FROM PRODUCT
WHERE P_CODE < '1558-QW1';
SELECT Queries
• List all rows in which inventory stock dates occur
on or after January 20, 2014
▪ Show the product description, units available,
minimum units, price and stocking date
SELECT P_DESCRIPT, P_QOH, P_MIN, P_PRICE,
P_INDATE
FROM PRODUCT
WHERE P_INDATE >= '20-JAN-14';
SELECT Queries
• Determine the total value of each product currently
held in inventory
▪ Show product description, units available, price and
total value of each product
▪ Multiply each product’s quantity on hand by its current
price
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 [alias: alternate name given to a column or table]
FROM PRODUCT;
SELECT Queries
• Get a list of out-of-warranty products that have
been stored more than 90 days
▪ P_INDATE is at least 90 days less than current
(system date)
SELECT P_CODE, P_INDATE, SYSDATE - 90 AS CUTDATE
FROM PRODUCT
WHERE P_INDATE <= SYSDATE - 90;

• List the dates and warranty expiration date (90


days from receiving the product) of all products
SELECT P_CODE, P_INDATE, P_INDATE + 90 AS EXPDATE
FROM PRODUCT;
SELECT Queries

• Arithmetic operators: Rules of precedence


• Perform operations within parentheses
• Perform power operations [Oracle: power(x, y)]
• Perform multiplications and divisions
• Perform additions and subtractions
SELECT Queries

• Logical operators
▪ AND
▪ OR
▪ NOT
• Example: Get a list of products supplied by
vendor with code 21344 or 24288.
SELECT P_DESCRIPT, P_INDATE, P_PRICE, V_CODE
FROM PRODUCT
WHERE V_CODE = 21344 OR V_CODE = 24288;
SELECT Queries
• Get a list of products that are less than $50 and are
stocked after January 15, 2014
▪ Show product description, stocking date, price and vendor code
SELECT P_DESCRIPT, P_INDATE, P_PRICE, V_CODE
FROM PRODUCT
WHERE P_PRICE < 50
AND P_INDATE > '15-JAN-14';

• Other examples
SELECT P_DESCRIPT, P_INDATE, P_PRICE, V_CODE
FROM PRODUCT
WHERE (P_PRICE < 50 AND P_INDATE > '15-JAN-14')
OR V_CODE = 24288;

SELECT *
FROM PRODUCT
WHERE NOT (V_CODE = 21344);
SELECT Queries

• Special operators
▪ BETWEEN: checks whether attribute value is within a
range
▪ IS NULL: checks whether attribute value is null
▪ LIKE: checks whether attribute value matches given string
pattern
▪ IN: checks whether attribute value matches any value
within a value list
▪ EXISTS: checks if subquery returns any rows, if yes, run
the main query, otherwise, do not
SELECT Queries
SELECT * List all products with
FROM PRODUCT prices between $50 and
WHERE P_PRICE BETWEEN 50.00 AND 100.00; $100

SELECT P_CODE, P_DESCRIPT, V_CODE List all products that


FROM PRODUCT do not have a vendor
WHERE V_CODE IS NULL; assigned (V_CODE is
null

SELECT * List all products


FROM PRODUCT supplied by vendors
WHERE V_CODE IN (21344, 24288); with codes 21344 and
24288
SELECT Queries
Wildcard Characters
%: Any and all following or preceding characters are eligible
_: Any one character may be substituted for the underscore

Find all vendor whose last names begin with Smith


SELECT V_NAME, V_CONTACT, V_AREACODE, V_PHONE
FROM VENDOR
WHERE UPPER(V_CONTACT) LIKE 'SMITH%';

Find vendors whose last name is Johnson or Johnsen


SELECT V_NAME, V_CONTACT, V_AREACODE, V_PHONE
FROM VENDOR
WHERE V_CONTACT LIKE ‘Johns_n';
SELECT Queries
SELECT * FROM VENDOR
WHERE EXISTS (SELECT * FROM PRODUCT WHERE P_QOH < P_MIN * 2);

SELECT * FROM VENDOR


WHERE EXISTS (SELECT * FROM PRODUCT WHERE P_QOH = 0);

You might also like