CS122_SUMMER_2009_LECTURE_09a

Download Report

Transcript CS122_SUMMER_2009_LECTURE_09a

Using Relational Databases and SQL
Lecture 9:
Data Manipulation Language
Steven Emory
Department of Computer Science
California State University, Los Angeles
Data Manipulation Language
DML for short
Contains commands for modifying table data
Insertion commands (INSERT INTO)
Deletion commands (DELETE)
Update commands (UPDATE)
Not a query
Queries extract data from the database
Commands do not extract data from the database
Before We Start
When modifying the database data, you are going
to mess up because nobody is perfect
If you mess up there are two ways to restore the
original database:
Remove and restore the tables
Use transactions (use BEGIN and ROLLBACK)
I prefer using BEGIN and ROLLBACK
Use BEGIN before entering DML commands
Use ROLLBACK to undo all changes
USE COMMIT to accept all changes
Transactions
ACID
Atomicity
Consistency
Isolation
Durability
SQL Keywords
BEGIN/START TRANSACTION
COMMIT
ROLLBACK
Inserting Records
Two syntaxes:
INSERT INTO
Insert one record at a time
INSERT SELECT
Insert one or more records at a time
Inserting Records
INSERT INTO Syntax
-- Form #1: Insert whole record.
INSERT INTO tablename
VALUES(value1, value2, ..., valuen);
-- Form #2: Insert partial record. Non-specified
fieldnames are assigned default values.
INSERT INTO tablename(field1, field2, ..., fieldn)
VALUES(value1, value2, ..., valuen);
IGNORE
You can use the IGNORE keyword between INSERT
and INTO to suppress duplicate error messages.
Inserting Records
INSERT SELECT Syntax
-- Form #1: Insert whole record.
INSERT INTO destination_table
SELECT field1, field2, ..., fieldn
FROM source_tables
WHERE conditions;
-- Form #2: Insert partial record. Non-specified
fieldnames are assigned default values.
INSERT INTO destination_table(df1, df2, ..., dfn)
SELECT sf1, sf2, ..., sfn
FROM source_tables
WHERE conditions;
INSERT INTO Example
Example:
Add Kung Fu Panda into the database.
INSERT INTO Movies
VALUES(7, 'Kung Fu Panda', '2008-06-06', 'G', 92,
'USA', 'English', (SELECT CompanyID FROM
Companies WHERE Name = 'Dreamworks
Pictures'));
INSERT INTO and Subqueries
As in the previous example, subqueries in the
INSERT command work, but only if the update
table and the subquery table are different.
This rule only applies to MySQL, other database
management systems may behave differently.
INSERT SELECT Example
Example:
Associate all movies that have ‘The X Files’ anywhere
in the title with the romance genre.
INSERT IGNORE INTO XRefGenresMovies
SELECT MovieID, 'Romance'
FROM Movies
WHERE Title LIKE '%The X Files%';
Deleting Records
Deletes one or more rows from a table
Deletes all rows without WHERE condition
Two syntaxes
Single-Table DELETE Syntax
Multi-Table DELETE Syntax
Single-Table DELETE Syntax
Deletes one or more rows from a table
Deletes all rows without WHERE condition
Syntax:
DELETE
FROM tablename
WHERE conditions;
Single-Table DELETE Syntax
Examples:
Delete all ratings.
Delete all ratings by semory.
Single-Table DELETE Syntax
Solutions:
-- Delete all ratings.
DELETE FROM Ratings;
-- Delete all ratings by semory.
DELETE FROM Ratings
WHERE MemberID = (SELECT MemberID
FROM Members WHERE Username = 'semory');
Multi-Table DELETE Syntax
Deletes rows from multiple tables
You must be very cautious or else you may delete
something you didn’t want to delete
Syntax:
DELETE T1, T2, ..., Tn
FROM T1 JOIN T2 JOIN ... JOIN Tn
WHERE conditions;
Note: If you use table alias in the FROM clause, you
must use the alias in the DELETE clause as well (see
examples later on).
Multi-Table DELETE Syntax
Examples:
-- Delete all ratings by semory (use multi-table delete
syntax instead of using single-table delete syntax with
a subquery).
-- Delete all directors from the database (from both
the People and XRefDirectorsMovies tables).
Multi-Table DELETE Syntax
Examples:
-- Delete all ratings by semory.
DELETE Ratings FROM Members JOIN Ratings
USING(MemberID) WHERE Username = 'semory';
-- Delete all ratings by semory (alternate).
DELETE R
FROM Members A JOIN Ratings R
USING(MemberID) WHERE Username = 'semory';
-- Delete all directors from the database.
DELETE P, D
FROM People P JOIN XRefDirectorsMovies D
ON P.PersonID = D.DirectorID;
Multi-Table DELETE Syntax
There is a big problem in the last example.
Multi-table delete can lead to orphaned records if
misused (a foreign key with no primary key).
DELETE P, D
FROM People P JOIN XRefDirectorsMovies D
ON P.PersonID = D.DirectorID;
Jonathan Frakes is both an actor and a director.
If we delete him from the People and
XRefDirectorsMovies tables, we orphan him in the
XRefActorsMovies and Spouses table!
Multi-Table DELETE Syntax
Therefore, be careful what you delete!
If you delete a record, and that record is referenced
somewhere else, you have an orphaned record!
Best solution is to only delete records from the
XRefDirectorsMovies table and leave the People
table alone since these people may be referenced
somewhere else.
DELETE FROM XRefDirectorsMovies;
Updating Records
To update existing records, you may use one of
the following syntaxes:
Single-table syntax.
Multi-table equi-join syntax.
Only equi-join is supported.
You may not use any other join syntax (JOIN ON, JOIN
USING, etc.)
Updating Records
To update existing records:
-- Single-table syntax.
UPDATE [IGNORE] tablename
SET field1 = value1, field2 = value2, ...
WHERE conditions;
-- Multi-table equi-join syntax.
UPDATE [IGNORE] tablename1, tablename2, ...
SET field1 = value1, field2 = value2, ...
WHERE conditions;
-- Multi-table subquery syntax.
UPDATE [IGNORE] tablename
SET field1 = subquery1, field2 = subquery2, ...
WHERE conditions;
Updating Records
You may use the IGNORE keyword immediately
after UPDATE to ignore errors when an update
produces duplicate primary keys.
Example:
-- ERROR! BEEP!
UPDATE Movies
SET MovieID = 1
WHERE MovieID = 2;
-- Error will be ignored!
UPDATE IGNORE Movies
SET MovieID = 1
WHERE MovieID = 2;
Updating Records
Examples:
-- The user ojisan has decided to change his
username to uncle_steve. Update the database to
reflect this change.
-- The user colderstone has decided to change his
username and password to jackstone and
slsev0812z3, respectively. Update the database to
reflect this change.
-- Dreamworks Pictures went bankrupt and was
bought out by Paramount Pictures. Modify all
CompanyIDs in the Movies table to reflect this
change.
Updating Records
Examples:
-- The user ojisan has decided to change his
username to uncle_steve. Update the database to
reflect this change.
UPDATE Members
SET Username = 'uncle_steve'
WHERE Username = 'ojisan';
Updating Records
Examples:
-- The user colderstone has decided to change his
username and password to jackstone and slsev0812z3,
respectively. Update the database to reflect this change.
UPDATE Accounts
SET Username = 'jackstone', Password = 'slsev0812z3'
WHERE Username = 'colderstone';
Updating Records
Examples:
-- Dreamworks Pictures went bankrupt and was
bought out by Paramount Pictures. Modify all
CompanyIDs in the Movies table to reflect this
change.
UPDATE Movies
SET CompanyID = (SELECT CompanyID FROM
Companies WHERE Name = 'Paramount Pictures')
WHERE CompanyID = (SELECT CompanyID
FROM Companies WHERE Name = 'Dreamworks
Pictures');