Enhanced Guide to Oracle 10g Chapter 3: Using SQL Queries to Insert, Update, Delete, and View Data Guide to Oracle 10g 1 Queries and action queries Queries are the DML commands that allow users to retrieve database data, because the retrieved data are answers to questions. Action queries are the DML commands that insert, update, or delete database data, because the commands perform an action that change the data value. Guide to Oracle 10g 2 SQL Scripts Script: text file that contains a sequence of SQL commands. Usually have .sql extension Running a script: SQL> START path_to_script_file; OR SQL> @ path_to_script_file; Path cannot contain any blank spaces Guide to Oracle 10g 3 Inserting a Value Into Every Field in a Record Syntax: INSERT INTO tablename VALUES (column1_value, column2_value, …); You must insert a value or a NULL placeholder for every field. Fields must be entered in the order they appear in the table when you issue the DESCRIBE command. Guide to Oracle 10g 4 Inserting a Value Into Every Field in a Record Example: Guide to Oracle 10g 5 Inserting Selected Table Fields Command to insert values for selected record fields: INSERT INTO tablename (column1_name, column2_name, …) VALUES (column1_value, column2_value, …); Guide to Oracle 10g 6 Inserting Selected Table Fields Example: Guide to Oracle 10g 7 Format Models (Masks) All data is stored in the database in a standard binary format Format masks are alphanumeric text strings that specify the format of input and output data Table 3-1: Number format masks Table 3-2: Date format masks Guide to Oracle 10g 8 Inserting Date Values Date values must be converted from characters to dates using the TO_DATE function and a format mask Example: Guide to Oracle 10g 9 Inserting Text Data Must be enclosed in single quotes Is case-sensitive To insert a string with a single quote, type the single quote twice Example: 'Mike''s Motorcycle Shop' Guide to Oracle 10g 10 Inserting Interval Values Year To Month Interval: TO_YMINTERVAL(‘years-months’) e.g. TO_YMINTERVAL(‘3-2’) Day To Second Interval: TO_DSINTERVAL(‘days HH:MI:SS.99’) e.g. TO_DSINTERVAL(‘-0 01:15:00’) Guide to Oracle 10g 11 Inserting LOB Column Locators Oracle stores LOB data in a separate physical location from other types of data in a row. Before inserting data in a LOB column, a locator must be inserted first. A locator is a structure that contains information that identifies the LOB data type and points to the alternate memory location. After that a program or a utility is needed to insert the data into the DB (chapter 10). Ex. To create a locator for a BLOB data: EMPTY_BLOB(); Another example page 96. Guide to Oracle 10g 12 Transactions Transaction Logical unit of work consisting of one or more SQL DML commands INSERT, UPDATE, DELETE All transaction commands must succeed or none can succeed Transaction results are not visible to other users until they are “committed” to the database (this is not the case with DDL commands) Until a transaction is committed, it can easily be “rolled back” (undone) Guide to Oracle 10g 13 Transactions A transaction starts when you type one or more DML commands in SQL*Plus A transaction ends when you issue either the COMMIT or ROLLBACK command SQL>COMMIT; SQL>ROLLBACK; Guide to Oracle 10g 14 Committing and Rolling Back Data COMMIT Makes transaction command changes permanent in the database and visible to other users ROLLBACK Rolls back transaction command changes and restores database to its state before the transaction Guide to Oracle 10g 15 Savepoints Used to mark individual sections of a transaction You can roll back a transaction to a savepoint Guide to Oracle 10g 16 Search Conditions Format: WHERE fieldname operator expression Operators Equal (=) Greater than, Less than (>, <) Greater than or Equal to (>=) Less than or Equal to (<=) Not equal (< >, !=, ^=) LIKE BETWEEN IN NOT IN Guide to Oracle 10g 17 Search Condition Examples WHERE s_name = ‘Sarah’ WHERE s_age > 18 WHERE s_class <> ‘SR’ Text in single quotes is case sensitive Guide to Oracle 10g 18 Updating Records Syntax: UPDATE tablename SET column1 = new_value, column2 = new_value, … WHERE search_condition; Each update statement can update row(s) in one table only Can update multiple records if they all match the search condition Guide to Oracle 10g 19 Deleting Records Syntax: DELETE FROM tablename WHERE search_condition; Deletes multiple records if search condition specifies multiple records If search condition is omitted, all table records are deleted You can’t delete a record if it contains a primary key value that is referenced as a foreign key Guide to Oracle 10g 20 Truncating Tables Removes ALL table data WITHOUT saving any rollback information (DELETE needs to save a copy of all the deleted records for a rollback possibility) Advantage: fast way to delete table data Disadvantage: can’t be undone (rollback) Syntax: TRUNCATE TABLE tablename; Guide to Oracle 10g 21 Truncating Tables You can not truncate a table that has an enabled foreign key constrain. So you need to disable the constraint first: Syntax: TRUNCATE TABLE tablename DISABLE CONSTRAINT constraint_name; Guide to Oracle 10g 22 Sequences Sequential list of numbers that is automatically generated by the database Used to generate unique values for surrogate keys Guide to Oracle 10g 23 Creating Sequences Syntax: CREATE SEQUENCE sequence_name [optional parameters]; Example: CREATE SEQUENCE f_id_sequence START WITH 200; Guide to Oracle 10g 24 Viewing Sequence Information Query the SEQUENCE Data Dictionary View: (user_sequences) see table 2.3 p.69 Guide to Oracle 10g 25 Pseudocolumns To use sequences, psedocolumns should be understood first. Psedocolumns acts like a column in a database table, but it is actually a command that returns a specific value. Used to retrieve: Current system date Name of the current database user Next or Current values of a sequence Guide to Oracle 10g 26 Pseudocolumn Examples Pseudocolumn Output Name CURRVAL Most recently retrieved sequence value NEXTVAL Next value in a sequence SYSDATE Current system date from database server USER Username of current user Guide to Oracle 10g 27 Using Pseudocolumns Retrieving the current system date: SELECT SYSDATE FROM DUAL; Retrieving the name of the current user: SELECT USER FROM DUAL; DUAL is a system table that is used with pseudocolumns. It contains one column. Its value can not be deleted or modified. (P.110) Guide to Oracle 10g 28 Using Pseudocolumns With Sequences Accessing the next value in a sequence: sequence_name.NEXTVAL (Can you know the retrieved value before using it?) see next slide. Inserting a new record using a sequence: INSERT INTO my_faculty VALUES (f_id_sequence.nextval, ‘Professor Jones’); Guide to Oracle 10g 29 Seeing value of sequences The following command shows the NEXT value of the sequence: SELECT sequence_name.NEXTVAL FROM DUAL; The following command shows the current value of the sequence: SELECT sequence_name.CURRVAL FROM DUAL; See example page 111. Accessing CURRVAL without NEXTVAL in advance cause an error. See example page 112. Guide to Oracle 10g 30 Deleting Sequencing The following DDL command drops sequences from a DB: DROP SEQUENCE sequence_name; No need for commit with DDL commands. Guide to Oracle 10g 31 Object Privileges Permissions that you can grant to other users to allow them to access or modify your database objects Object Type Privilege Description Table, Sequence ALTER Allows user to change object’s structure using the ALTER command Table, Sequence DROP Allows user to drop object Table, Sequence SELECT Allows user to view object Table INSERT, UPDATE, DELETE Allows user to insert, update, delete table data Any database object ALL Allows user to perform any operation on object Guide to Oracle 10g 32 Syntax Granting object privileges: GRANT privilege1, privilege2, … ON object_name TO user1, user 2, …; Revoking (cancel) object privileges: REVOKE privilege1, privilege2, … ON object_name FROM user1, user 2, …; Guide to Oracle 10g 33 Granting and Revoking Object Privileges Guide to Oracle 10g 34 Retrieving Data From a Single Table Syntax: SELECT column1, column2, … FROM tablename WHERE search_condition; Guide to Oracle 10g 35 Retrieving Data From a Single Table To retrieve every column in a table: SELECT * FROM … To retrieve every record in a table, omit the search condition SELECT column1, column2, … FROM tablename; Guide to Oracle 10g 36 Qualifying Table Names If you retrieve data from a table that is owned by another user, you must qualify the table name by prefacing it with the owner’s name. (we will study it again when joining multiple tables P.159) Guide to Oracle 10g 37 Suppressing Duplicate Records Sometimes queries retrieve duplicate records To suppress duplicate outputs, use the DISTINCT qualifier: SELECT DISTINCT column1, column2, … FROM ... Guide to Oracle 10g 38 Using Multiple Search Conditions Use the search condition (where) to retrieve rows matching specific criteria. Combining search conditions AND: both conditions must be true OR: either condition can be true Combining AND and OR in a single operation AND comparisons are evaluated first Always use parentheses to force conditions to be evaluated in the correct order Guide to Oracle 10g 39 Example SQL> SELECT room 2. FROM location 3. WHERE bldg_code = ‘BUS’ 4. AND capacity >= 40; Guide to Oracle 10g 40 Searching for NULL Records NULL: not defined Use IS NULL search condition SELECT s_name, s_class FROM my_students WHERE s_class IS NULL; Guide to Oracle 10g 41 Searching for NOT NULL Records Use IS NOT NULL operator SELECT s_name, s_age FROM my_students WHERE s_class IS NOT NULL; Guide to Oracle 10g 42 Using the IN and NOT IN Operators IN retrieves all values where the search column value matches a set of values SELECT * FROM enrollment WHERE grade IN (‘A’, ‘B’); Either A or B. Guide to Oracle 10g 43 Using the IN and NOT IN Operators NOT IN retrieves all values where the search column value matches a set of values SELECT * FROM enrollment WHERE grade NOT IN (‘A’, ‘B’); Neither A or B. Guide to Oracle 10g 44 Using the LIKE Operator Performs inexact searches by matching part of a character string WHERE fieldname LIKE character_string; Guide to Oracle 10g 45 Using the LIKE Operator Character string must be in single quotes and use wildcard characters (%) represents multiple wildcard characters (_) Underscore represents a single wildcard character ‘%2006’ Exact search of a string its right characters same as ‘2006’, it ignores anything on the left (no matter how many characters are there). ‘FALL%’ all rows in which the first 4 characters are FALL. ‘_R’ retrieve all values its first character can be any value, but the second must be ‘R’. Wildcard characters can be placed at beginning or end of string Guide to Oracle 10g 46 Examples Using the LIKE Operator SELECT * from term WHERE term_desc LIKE ‘Fall%’; SELECT course_no FROM course WHERE course_no LIKE ‘%1__’; Two underscores Guide to Oracle 10g 47 Sorting Query Output Use the ORDER BY clause Specify sort key, which is the column used as a basis for ordering the output data SELECT s_name, s_age FROM my_students ORDER BY s_age; Guide to Oracle 10g 48 Sorting Query Data Default sort order Numerical: ascending Character: A - Z Date: oldest - newest To force the sort order: use ASC or DESC Example SELECT s_name, s_age FROM my_students ORDER BY s_age DESC; You can specify multiple sort keys. Example P. 131. Guide to Oracle 10g 49 Using Calculations in Queries Calculation using SQL directly is efficient, because the result is returned to the client calculated. Arithmetic operations on retrieved data Addition (+) Subtraction (-) Multiplication (*) Division (/) Calculations are performed on NUMBER, DATE, and INTERVAL data types. Guide to Oracle 10g 50 Example Calculations in Queries SELECT inv_id, inv_qoh * inv_price FROM inventory; Date calculations involve the current date. To retrieve the current date from the server use: SELECT SYSDATE FROM DUAL; And then use it in equations: SYSDATE – o_date Guide to Oracle 10g 51 Example Calculations in Queries Remember that time_enrolled is an INTERVAL data type in STUDENT table. SELECT s_id, s_last, SYSDATE – time_enrolled FROM student; Remember to use SELECT SYSDATE FROM DUAL first. Guide to Oracle 10g 52 Single-Row Number Functions Called so, because they return a single result for each row of data retrieved. ABS - absolute value CEIL – rounds a number up to the next integer FLOOR – rounds a number down to the previous integer MOD – returns the remainder of a number and a divisor POWER - raises a number to an exponent ROUND - rounds a number SQRT – returns the square root of a value TRUNC - truncates a number to the nearest whole number Table 3-7 P. 137. Guide to Oracle 10g 53 Using Single-Row Number Functions Example: SELECT s_name, TRUNC((SYSDATE - s_dob)/365) FROM my_students; Guide to Oracle 10g 54 Single-Row Character Functions CONCAT – joins 2 character strings INITCAP – returns a string with the initial letter only uppercase LENGTH – returns the length of a string LPAD, RPAD – returns a string with a specific number of characters added on the left or right side LTRIM, RTRIM – returns a string with all instances of a specific character trimmed from the left or right side REPLACE – replaces all instances of a character with another character UPPER/LOWER – returns a string in all upper/lower case letters Table 3-8 P. 139 Guide to Oracle 10g 55 Using Single-Row Character Functions Example: SELECT UPPER(s_name) FROM my_students; Guide to Oracle 10g 56 Date Arithmetic To find a date that is a specific number of days before or after a known date, add or subtract the number from the known date Example: SELECT order_date + 30 FROM cust_order; Guide to Oracle 10g 57 Date Arithmetic To find the number of days between two known dates, subtract the later date from the earlier date Example: SELECT SYSDATE – s_dob FROM my_students; Guide to Oracle 10g 58 Single-row Date Functions ADD_MONTHS returns a date that is a specific number of months after a given date Example: SELECT ADD_MONTHS(SYSDATE, 6) FROM dual; Guide to Oracle 10g 59 Date Functions LAST_DATE Returns the date that is the last day of the month specified in the current date Example: SELECT LAST_DATE(order_date) FROM cust_order WHERE order_id = 1057; Guide to Oracle 10g 60 Date Functions MONTHS_BETWEEN Returns the number of months between two input dates Example: SELECT MONTHS_BETWEEN(order_date, SYSDATE) FROM cust_order WHERE order_id = 1057; Guide to Oracle 10g 61 Group Functions Used to perform an operation on a field from a group of retrieved records AVG (average of all retrieved values) COUNT (number of records retrieved) MAX (maximum value retrieved) MIN (minimum value retrieved) SUM (sum of all retrieved values) Guide to Oracle 10g 62 Group Function Examples SELECT SELECT SELECT SELECT AVG MAX MIN SUM (s_age) (s_age) (s_age) (s_age) FROM FROM FROM FROM Guide to Oracle 10g my_students; my_students; my_students; my_students; 63 Using the GROUP BY Clause Group the output by the column with duplicate values and apply group functions to the grouped data. Example: SELECT bldg_code, SUM(capacity) FROM location GROUP BY bldg_code; The bldg_code has 3 values(CR,BUS,LIB) see page 31. Each value has several occurrences, BUS=7 times. So the query group the occurrences of each value and AVG the capacity of each. See result page 145. Note that AVG(capacity)without group by gives different results. NOT as desired. THINK! Guide to Oracle 10g 64 Using the HAVING Clause Is used to filter grouped data. It can be used to place condition on the results of queries that display group function calculation. Example: SELECT bldg_code, SUM(capacity) FROM location HAVING SUM(capacity) >= 100 GROUP BY bldg_code; Here we are interested in the total capacity of more than 99 for each building. Guide to Oracle 10g 65 Creating Alternate Column Headings in SQL*Plus Formatting output: did you notice the output of the queries? the column name appeared as it is in the DB or the calculation formula. To display a different headings: Syntax: SELECT column1 “heading1”, column2 “heading2”, … Example: SELECT bldg_code “Building”, SUM(capacity) “Building Capacity” FROM location GROUP BY bldg_code; Might contain spaces. Example (Building Capacity) See output page 147. Guide to Oracle 10g 66 Creating a Column Alias Column alias: is an alternate column name that can be referenced in the ORDER BY and GROUP BY clauses Syntax: SELECT column1 AS alias1 … Example: SELECT (SYSDATE – s_dob) AS age_alias ORDER BY age_alias Can NOT contain space. Guide to Oracle 10g 67 SQL* Plus Environment Options Environment Linessize Custom 120 (char/line) Pagesize Custom 40 (line/page) OK Guide to Oracle 10g 68 Formatting Data Using the TO_CHAR Function Used to display NUMBER and DATE values using a specific format mask (model table 3-2 page 92) Syntax: TO_CHAR(fieldname, ‘format_mask’); Note the single quote. Example SELECT c_sec_id, sec_num,c_sec_day, TO_CHAR(c_sec_time, ‘HH:M1 AM’) FROM course_section; See output page 152. See example page 152 for currency format. Guide to Oracle 10g 69 Join Queries Retrieve data from multiple tables by joining tables using foreign key references Syntax SELECT col1, col2, … FROM table1, table2 WHERE table1.joincol = table2.joincol AND search_condition(s); Qualify a column by specifying the table that contains the column followed by a period and then the column name. The WHERE clause contains the join condition, which contains the foreign key reference and the primary key in the other table. Search condition is added using AND or OR operators. Guide to Oracle 10g 70 Join Queries Types Join query types: Inner (equality) Outer Self Inequality Guide to Oracle 10g 71 Inner Joins Occurs when joining two tables based on values in one table being equal to values in another table. Guide to Oracle 10g 72 Inner Joins Syntax: SELECT column1, column2, … FROM table1, table2 WHERE table1.join_column = table2.join_column Join condition You must include a join condition for every link between 2 tables Guide to Oracle 10g 73 Inner Joins Example: SELECT s_name, f_name FROM student, faculty WHERE student.f_id = faculty.f_id; If you have N tables in the FROM clause, you must have (N - 1) join conditions Guide to Oracle 10g 74 Inner Joins If the tables have a single commonly named and defined column, you can use the NATURAL JOIN keywords to join the tables. See example figure 3 43 page 161. Example SELECT s_name, f_name FROM student NATURAL JOIN faculty; Note: No commas between table names, just the key words. No qualifiers are needed. Guide to Oracle 10g 75 Qualifying Field Names If a field in the SELECT clause exists in multiple tables in the FROM clause, you must qualify the field name by prefacing it with either table’s name Guide to Oracle 10g 76 Process for Designing Complex Inner Join Queries 1. Identify all of the tables involved in the query, and label: Display fields Join fields Search fields 2. Write the query List List List List all all all all display fields in the SELECT clause table names in the FROM clause join condition links in the WHERE clause search fields in the WHERE clause Guide to Oracle 10g 77 Process for Designing Complex Inner Join Queries 1. What happens if you omit a join condition in a multiple-table query? The output retrieves more rows than expected. (Cartesian product). See example page 166. Guide to Oracle 10g 78 Outer Joins Limitation of inner joins: some records may be omitted if corresponding records don’t exist in one of the tables Example: retrieve records for all students, along with their corresponding ENROLLMENT information Guide to Oracle 10g 79 Outer Joins Student 105 (Michael Connoly) does not have any ENROLLMENT records. So no information about 105 will be retrieved when using inner join. Guide to Oracle 10g 80 Outer Joins No records retrieved for Michael: Guide to Oracle 10g 81 Outer Joins To include records in first (inner) table, even when they do not have matching records in second (outer) table: place outer join marker (+) beside outer table name in join clause The (+) signals the DBMS to insert a NULL value for the columns in the outer table that do not have matching rows in the inner table. Guide to Oracle 10g 82 Outer Joins Guide to Oracle 10g Outer join marker 83 Self Joins Used to join a table to itself when the table has a foreign key that references a column in the same table. Guide to Oracle 10g 84 Self Joins To create a self-join, you need to create a table alias, which gives an alternate name to the table so you can create a join condition Syntax to create table alias in FROM clause: FROM table1 alias1, table2 alias2 Guide to Oracle 10g 85 PARENT_PROJECT P_ID Self Joins PROJECT_NAME 1 Hardware Support Intranet CLIENT_ID MGR_ID PARENT_P_ID 2 105 2 Hardware Support Interface 2 103 1 3 Hardware Support Database 2 102 1 4 T eller Support System 4 105 5 Internet Advertising 6 105 6 Network Design 6 104 7 Exploration Database 5 102 5 SUB_PROJECT P_ID PROJECT_NAME 1 Hardware Support Intranet CLIENT_ID MGR_ID PARENT_P_ID 2 105 2 Hardware Support Interface 2 103 1 3 Hardware Support Database 2 102 1 4 T eller Support System 4 105 5 Internet Advertising 6 105 6 Network Design 6 104 7 Exploration Database 5 102 Alias 1 Alias 2 5 PROJECT P_ID PROJECT_NAME 1 Hardware Support Intranet CLIENT_ID MGR_ID PARENT_P_ID 2 105 2 Hardware Support Interface 2 103 1 3 Hardware Support Database 2 102 1 4 T eller Support System 4 105 5 Internet Advertising 6 105 6 Network Design 6 104 7 Exploration Database 5 102 Guide to Oracle 10g 5 86 Self Join Example Note: the table alias is used in the select clause and in join conditions. NOT the table name. Guide to Oracle 10g 87 Inequality Joins Join created by placing making join condition satisfy an inequality condition(< , > , !=) Only makes sense when primary/foreign key values are not surrogate keys Guide to Oracle 10g 88 Inequality Joins Guide to Oracle 10g 89 Nested Queries Created when a subquery is nested within a main query Main query: first query listed in SELECT command Subquery: retrieves one or more values that specify the main query’s search condition Guide to Oracle 10g 90 Nested Query Where Subquery Returns a Single Value Syntax: SELECT column1, column2, … FROM table1, table2, … WHERE join conditions AND search_column1 = (SELECT column1 FROM table1, table2, … Subquery WHERE search and that returns join conditions) one value Guide to Oracle 10g 91 Nested Query Where Subquery Returns Multiple Values Syntax: SELECT column1, column2, … FROM table1, table2, … WHERE join conditions AND search_column1 IN (SELECT column1 FROM table1, table2, … Subquery WHERE search and that returns join conditions) multiple values Guide to Oracle 10g 92 Using Set Operators in Queries Performs set operations on outputs of two unrelated queries Both queries must have: same number of display fields corresponding display fields must have same data type Guide to Oracle 10g 93 Query Set Operators UNION: combines results, suppresses duplicate rows UNION ALL: combines results, displays duplicates INTERSECT: finds matching rows MINUS: returns the difference between returned record sets Guide to Oracle 10g 94 Database Views Logical table based on a query Does not physically exist in the database Presents data in a different format from underlying tables Uses: Security Simplifying complex queries Guide to Oracle 10g 95 Database Views Creating a view: CREATE VIEW view_name AS SQL_command; Views can be queried just like tables: SELECT * FROM view_name; Guide to Oracle 10g 96 Simple Views Based on SQL query that retrieves data from only one table View can support all table DML operations: INSERT UPDATE DELETE Guide to Oracle 10g 97 Complex Views Based on query that retrieves data from multiple tables Can only be used to support SELECT operations No DML operations supported Guide to Oracle 10g 98 Synonyms Alternate name for a table Allows you to not have to preface table with owner’s username when you are querying a table that belongs to another user Guide to Oracle 10g 99 Public Synonyms Can only be created by a DBA Syntax: CREATE PUBLIC SYNONYM synonym_name FOR owner_name.tablename; All users with privileges to use table can then use synonym instead of owner_name.tablename Guide to Oracle 10g 100 Private Synonyms You can create private synonyms for any tables that you have privileges to use Only you can use the synonym Syntax: CREATE SYNONYM synonym_name FOR table_name.table_name; Guide to Oracle 10g 101 Dynamic SQL Queries Queries that allow users to specify search conditions at runtime Approaches Substitution Values Runtime Variables Guide to Oracle 10g 102 Using Substitution Values Created when search expression is prefaced with an ampersand (&) System then prompts user for value Guide to Oracle 10g 103 Using Runtime Variables Runtime variable: variable defined in SQL*Plus environment Syntax: DEFINE variable_name = variable_value; You can then substitute the variable name for a query search condition value Guide to Oracle 10g 104 Using Runtime Variables Example: Guide to Oracle 10g 105