DB1 is for lecture and quiz; since this is simplest DB3 is for your own exercise as it has explained in the text book DB2 is for exam, it is complicated enough for interesting but not too hard questions SQL Classifications Simple query Join Query; temp join query, subquery (in, =, exists) Advanced Features (wild card, null values, ordered, distinct Relational Algebra (marked red; Cartesian Product, Projection, Selection, Union, Intersect, Minus SQL -39 SQL SELECT General format : SELECT [DISTINCT] field(s) FROM table(s) [WHERE predicate] [GROUP BY field(s) [HAVING predicate]] [ORDER BY field(s)]; SQL -40 Simple Queries Example 1: SELECT * FROM SUPPLIERS; SELECT * FROM EMPLOYEE; SELECT * FROM MOVIE; Example 2 : ** use projection and selection (two operators from RelatonalAlgebra) SELECT SNUM, STATUS FROM SUPPLIERS SQL -41 WHERE CITY = 'PARIS' ORDER BY SUPPLIERS.STATUS DESC; SELECT LNAME, MINIT, FNAME FROM EMPLOYEE WHERE DNO = 4 AND SALARY >20000; SELECT TITLE,LENGTH FROM Movie WHERE studioName = ‘Lucas Films’ AND year = 1980; Advanced Feature Example 3 (Wild Card): SQL -42 In the Movie Schema Lets search for all movies with a possessive(S) in their titles. SELECT TITLE FROM MOVIE WHERE TITLE LIKE 'S%'; SELECT P.* FROM PARTS P WHERE P.PNAME LIKE 'C%'; SELECT DISTINCT STARNAME FROM STARSIN; SQL -43 Null Value Join Queries Example 4 :( Cartesian Produt; EquiJoin) Get all supplier and part information such that the supplier and part in question are located in the same city. Cartesian Produt SELECT SUPPLIERS.*, PARTS.* FROM SUPPLIERS, PARTS SELECT * FROM MOVIESTAR, MOVIEEXEC SQL -44 EquiJoin SELECT SUPPLIERS.*, PARTS.* FROM SUPPLIERS, PARTS WHERE SUPPLIERS.CITY=PARTS.CITY; SELECT * FROM MovieStar, MovieExec WHERE MovieStar.address = MovieExec.address; Natural Join SELECT SUPPLIERS.SNUM, SUPPLIERS.SNAME, SUPPLIERS.STATUS, SUPPLIERS.CITY, PARTS.PNUM, PARTS.PNAME, PARTS.COLOR, PARTS.WEIGHT SQL -45 FROM SUPPLIERS, PARTS WHERE SUPPLIERS.CITY = PARTS.CITY Join Queries SELECT FROM WHERE MovieStar.name, MovieExec.name MovieStar, MovieExec MovieStar.address = MovieExec.address; Built-in Function and Group by Example For Project Remark: COPY A REALATION IN ORACLE SQL -46 For each part supplied, get the part number and the total quantity supplied of that part, and save the result in the database. CREATE TABLE TEMP (PNUM TOTQTY CHAR(6), INTEGER); INSERT INTO TEMP (PNUM, TOTQTY) SELECT PNUM, SUM(QTY) FROM SHIPMENT SQL -47 GROUP BY PNUM; Example For Project Remark: If there is output, then there is no Functional dependency SELECT FROM GROUP HAVING INDEP, COUNT(DISTICT DEP) RELATION_NAME BY INDEP COUNT(DISTICT DEP) > 1 ; SELECT studioName, SUM(length) FROM Movie SQL -48 GROUP BY studioName; Full-Time worker SELECT FROM GROUP HAVING WSSN, SUM(HOURS) WORKS_ON BY WSSN SUM(HOURS) >= 40; SubQueries and JoinQuerries #1) SQL -49 SELECT S. SNAME FROM SUPPLIERS S, SHIPMENTS SP WHERE S.SNUM=SP.SNUM and PNUM='P2'; #2) SELECT FROM S.SNAME SUPPLIERS S, (SELECT SNUM FROM SHIPMENTS WHERE PNUM='P2' ) T WHERE S.SNUM = T.SNUM; SQL -50 #3) SELECT FROM WHERE SNAME SUPPLIERS SNUM IN (SELECT SNUM FROM SHIPMENTS WHERE PNUM='P2'); #4) SELECT SNUM FROM SUPPLIER WHERE CITY = (SELECT FROM CITY SUPPLIER SQL -51 WHERE SNUM='S1'); #5) SELECT SNAME FROM SUPPLIERS WHERE EXISTS (SELECT * FROM SHIPMENTS WHERE SNUM = Suppliers.Snum AND PNUM = 'P2'); #6) SELECT SNAME FROM SUPPLIER SQL -52 WHERE NOT EXISTS (SELECT FROM * SHIPMENT WHERE SNUM=S.Snum AND PNUM='P2'); #7) SELECT name FROM MovieExec WHERE cert# = (SELECT producerC# FROM Movie WHERE title = 'Lord of rings'); SQL -53 #8) SELECT name FROM MovieExec WHERE cert# IN (SELECT producerC# FROM Movie WHERE (title,year) IN (SELECT movietitle, movieyear FROM StarsIn WHERE starName = 'Samuel Henry') ); #9) SELECT name SQL -54 FROM MovieExec, (SELECT producerC# FROM Movie, StarsIn WHERE title = movieTitle AND year = movieyear AND starName = 'Leonardo Dicaprio' ) Prod WHERE cert# = Prod.producerC#; Relational Algebra SELECT PNUM FROM PARTS WHERE WEIGHT > 16 SQL -55 UNION/INTERSECT/MINUS SELECT PNUM FROM SHIPMENTS WHERE SNUM = 'S2'; SQL -56 Update Operations Update General format : UPDATE TABLE SET field = expression, [field = expression]... [WHERE predicate]; Example 8 : Change Movieyear to 1998 from Starsin where movietitle is ‘Down to Bone’ Update Starsin SQL -57 Set Movieyear=1998 where Movietitle='Down to Bone'; SQL> Update Starsin set Movieyear=1998 where Movietitle='Down to Bone'; 1 row updated. SQL> select * from Starsin; MOVIETITLE MOVIEYEAR STARNAME ------------------------- ---------- -----------------------------Blood Diamond 2006 Leonardo Dicaprio The Quick and the Dead 1995 Leonardo Dicaprio Titanic 1997 Leonardo Dicaprio The Departed 2006 Leonardo Dicaprio Body of lies 2008 Leonardo Dicaprio Inception 2010 Leonardo Dicaprio Somersault 2004 Samuel Henry Macbeth 2006 Samuel Henry Love my Way 2006 Samuel Henry The Great Raid 2005 Samuel Henry Terminator Salvation 2009 Samuel Henry MOVIETITLE MOVIEYEAR STARNAME ------------------------- ---------- -----------------------------Avatar 2009 Samuel Henry Perseus 2010 Samuel Henry Return to Paradise 1998 Vera A Farmiga Autumn in New York 2000 Vera A Farmiga Dust 2001 Vera A Farmiga Down to Bone 1998 Vera A Farmiga Mind the Gap 2004 Vera A Farmiga Breaking and Entering 2005 Vera A Farmiga The Departed 2006 Vera A Farmiga Never Forever 2007 Vera A Farmiga Nothing but the Truth 2008 Vera A Farmiga MOVIETITLE MOVIEYEAR STARNAME ------------------------- ---------- -----------------------------Orphan 2008 Vera A Farmiga SQL -58 Up Source Code 2009 Vera A Farmiga 2010 Vera A Farmiga 25 rows selected. DELETE General format : DELETE FROM [WHERE table predicate]; SQL -59 Example 9 : Delete Movie Title ‘ Avatar’ from Movie DELETE FROM Movie WHERE Title = 'Avatar'; What type of problems may arise due to this delete operation (if any)? SQL> DELETE FROM Movie WHERE Title = 'StarWars'; DELETE FROM Movie WHERE Title = 'StarWars' * ERROR at line 1: ORA-02292: integrity constraint (SYSTEM.SYS_C0011564) violated - child record found Example 10 : SQL -60 Delete all Movies Released in year 1998. SQL> Delete from Starsin where Movieyear=1998; 2 rows deleted. SQL> select * from starsin; MOVIETITLE MOVIEYEAR STARNAME ------------------------- ---------- ----------------------Blood Diamond 2006 Leonardo Dicaprio The Quick and the Dead 1995 Leonardo Dicaprio Titanic 1997 Leonardo Dicaprio The Departed 2006 Leonardo Dicaprio Body of lies 2008 Leonardo Dicaprio Inception 2010 Leonardo Dicaprio Somersault 2004 Samuel Henry Macbeth 2006 Samuel Henry Love my Way 2006 Samuel Henry The Great Raid 2005 Samuel Henry Terminator Salvation 2009 Samuel Henry MOVIETITLE MOVIEYEAR STARNAME ------------------------- ---------- ----------------------Avatar 2009 Samuel Henry Perseus 2010 Samuel Henry Autumn in New York 2000 Vera A Farmiga Dust 2001 Vera A Farmiga Mind the Gap 2004 Vera A Farmiga Breaking and Entering 2005 Vera A Farmiga The Departed 2006 Vera A Farmiga SQL -61 Never Forever Nothing but the Truth Orphan Up 2007 2008 2008 2009 Vera Vera Vera Vera A A A A Farmiga Farmiga Farmiga Farmiga MOVIETITLE MOVIEYEAR STARNAME ------------------------- ---------- ----------------------Source Code 2010 Vera A Farmiga 23 rows selected. Insert General format 1 : INSERT INTO table [(field [,field]...)] VALUES (constant [,constant]...); SQL -62 general format 2 : INSERT INTO table [(field[,field])] SELECT FROM WHERE SQL -63 Example 11 : Add Values to the column of table Movie SQL> insert into movie(title, year,length,incolor,Studioname,producerC#) values ('Inception',2010,109,'color','Warner bros Pictures','Mov0901'); 1 row created. SQL -64 SQL - Data Definition From the user's point of view, the principal data definition language (DDL) statements are as follow : CREATE TABLE DROP TABLE CREATE VIEW DROP VIEW CREATE INDEX DROP INDEX ALTER TABLE Base Tables SQL -65 A base table is a named table that exists in its own rightunlike a view which does not exist in its own right, but is derived from one or more base tables. A view is an alternative way of looking at base tables. SQL -66 Create Table General format : CREATE TABLE base-table-name (column-definition [,column-definition]...) Where a "column-definition" takes the form : column-name data-type [NOT NULL] Alter Table General format : SQL -67 ALTER TABLE base-table-name ADD column-name data type; Example : ALTER TABLE Movie ADD Releasedate Date; Drop Table General format : DROP TABLE base-table-name; The specified table is removed from the system catalog. All indexes and views defined on that base table are automatically dropped also. SQL -68 Create Index General format : CREATE[UNIQUE] INDEX index-name ON base - table - name (column - name[order] [,column name[order]...) [cluster] ; Each "order' specification is either ASC (ascending) or DESC (descending). Default is ASC. The left-to-right sequence of naming columns in the CREATE INDEX statement corresponds to major-tominor ordering. The UNIQUE option in CREATE INDEX specifies SQL -69 that no two records in the indexed base table will be allowed to take on the same value for the indexed field(s) at the same time. Notice that the only statements that refer to indexes are CREATE INDEX and DROP INDEX. The decision as to whether or not to use an index is make by the system optimizer, not the user. Example : CREATE INDEX MovieExec# ON MovieExec (Cert# DESC); Drop Index General format : DROP INDEX index-name; SQL -70