Database Administration ISQA 436 SQL Review, Oracle Objects and Data Types, SQL*Plus SQL • Structured Query Language • Declaritive language vs. procedural • Three types of SQL statements – Data Manipulation Language (DML) – SELECT, INSERT, UPDATE, DELETE – Data Definition Language (DDL) – CREATE/ALTER/DROP TABLE, VIEW, INDEX – Data Control Language (DCL) – GRANT, REVOKE Data Manipulation Commands (DML) • SELECT – Retrieve data from the database • INSERT – Add new rows to the database • UPDATE – Modify data in the database • DELETE – Remove rows from the database SELECT • SELECT, columns, FROM and table names are mandatory. The rest are optional. • SELECT * will select all columns. SELECT col1, col2, … FROM table1, table2, … [ WHERE search_condition AND search_condition OR search_condition] [ GROUP BY group_by_expression ] [ HAVING search_condition ] [ ORDER BY order_expression [ ASC | DESC ]] Joins • Joins are queries that select from two or more tables • A table may be joined with itself in a selfjoin • Tables are joined on one or more columns to combine similar rows from each • The join is done in the WHERE clause of the SELECT statement Join - Example SELECT first_name, last_name, department_name FROM employees, departments WHERE employees.department_id = departments.department_id; FIRST_NAME -----------Nancy Daniel John Ismael Jose Manuel Luis Shelley William LAST_NAME -----------Greenberg Faviet Chen Sciarra Urman Popp Higgins Gietz DEPARTMENT_NAME --------------Finance Finance Finance Finance Finance Finance Accounting Accounting Join Example select a.first_name, a.last_name, b.last_name as manager from employees a, employees b where a.manager_id = b.employee_id order by b.last_name; FIRST_NAME -----------William Elizabeth Sundita Alexander Clara Danielle LAST_NAME -----------Smith Bates Kumar Hunold Vishney Greene MANAGER ------------------------Cambrault Cambrault Cambrault De Haan Errazuriz Errazuriz Subqueries • Subquery is a query within a query • Subqueries are necessary when a condition can’t be adequately defined in the WHERE clause • Example, find employee with the highest salary: select first_name, last_name, salary from employees where salary = (select max(salary) from employees); Correlated Subquery • A correlated subquery joins the subquery (inner query) with the outer query. • Example, find employees making more than their department average: SELECT first_name, last_name, salary FROM employees a WHERE a.salary > (select avg(salary) FROM employees e, departments d WHERE e.department_id = d.department_id AND e.department_id = a.department_id); Subquery Exists Example • Combine subquery with EXISTS to determine conditions of existence or nonexistence • Find all products that have not sold: SELECT product_id, product_name FROM product_information p WHERE NOT EXISTS (SELECT order_id FROM order_items o WHERE o.product_id = p.product_id); Inline View • Oracle provides an optimization to the subquery • The query can be included in the FROM clause as an inline view. SELECT first_name, last_name, salary FROM employees e, (SELECT avg(salary) avg_sal, d.department_id FROM departments d, employees e where d.department_id = e.department_id GROUP BY d.department_id) dept_avg WHERE e.salary > dept_avg.avg_sal AND e.department_id = dept_avg.department_id; • INSERT INSERT INTO table (col1, col2,…) VALUES (val1, val2, …) • UPDATE UPDATE table SET col1 = val1, col2 = val2, … WHERE [condition] • DELETE DELETE FROM table WHERE [condition] INSERT • Two styles: with or without column names: • Style 1 – insert values in order of columns – as defined by CREATE TABLE – see object browser. – All columns must be included or NULL INSERT INTO item VALUES (21, 'Camoflage Pants', 'C', 'Khaki'); • Style 2 – indicate columns explicitly. (Not all columns need appear, but must match up with values) INSERT INTO item (itemno, itemname, itemtype) VALUES (22, 'Hunting Vest', 'C'); UPDATE • Modify data in a table • UPDATE locks rows during update • Without a WHERE clause, updates ALL rows! – Give all employees a 10% raise: UPDATE emp SET empsalary = 1.10*(empsalary); – Move all employees in Personnel to Marketing: UPDATE emp SET deptname = 'Marketing' WHERE deptname = 'Personnel'; DELETE • Remove entire rows from table • Again, without WHERE clause, deletes ALL rows! DELETE FROM employees; DELETE FROM employees WHERE employee_id = 195; Three options for deleting a table 1. DELETE FROM emp; – Safest: Logs the delete transactions in a log file for undo – Does not delete the table – Does not reclaim space 2. TRUNCATE TABLE emp; – Faster than delete, does not log transactions – Does not delete the table – Reclaims space 3. DROP TABLE emp; – Fast, does not log deletions – Deletes the table as well as the rows – Reclaims all space Data Definition Language (DDL) • CREATE – TABLE – VIEW – INDEX • ALTER – TABLE – VIEW – INDEX • DROP – TABLE – VIEW – INDEX CREATE TABLE • Creates a base table CREATE TABLE table_name (col1_name col1_type DEFAULT constraints, col2_name col2_type DEFAULT constraints, …, PRIMARY KEY (pk_col1, pk_col2, …), FOREIGN KEY (fk_col1, fk_col2, …) REFERENCES ref_table (ref_col1, ref_col2,…), CHECK (check conditions)); Constraints • Primary key CONSTRAINT pk_stock PRIMARY KEY(stkcode) • Foreign key CONSTRAINT fk_stock_nation FOREIGN KEY(natcode) REFERENCES nation • Unique CONSTRAINT unq_stock_stkname UNIQUE(stkname) • Check CONSTRAINT item_color_cons CHECK (itemcolor IN ('White', 'Brown', 'Khaki')) Index • An index is a sorted list of rows from a table • Only a subset of one or more columns is stored, along with the address of each row. • Data retrieval is much faster with an index. • Types of index – – – – – B-tree (most common) bitmap reverse hash cluster Views - virtual tables • An imaginary table constructed by the DBMS when required – not a base table. • Only the definition of the view is stored, not the result • Usually can’t be updated except in special circumstances CREATE VIEW view_name (col1, col2, …) AS select statement; Create View example CREATE VIEW emp_sal AS (SELECT first_name, last_name, salary FROM employees); SELECT * FROM emp_sal; FIRST_NAME -------------------Donald Douglas Jennifer Michael Pat Susan Hermann LAST_NAME SALARY ------------------------- ---------OConnell 2600 Grant 2600 Whalen 4400 Hartstein 13000 Fay 6000 Mavris 6500 Baer 10000 ORACLE DATABASE OBJECTS • • • • • • • • • • Table Index View Materialized View Synonym Sequence Procedure Function Package Trigger Tables • Tables contain rows of data with a column for each datum. • Each column is of a specific data type • Columns without data are NULL • Each table has a primary key – a column that has unique values that identify rows • Columns may have foreign key references to a column in another table. The value in the foreign table must exist and be identical. DUAL Table • ORACLE provides a special dummy table for using select on data not contained in a table, such as SYSDATE SELECT SYSDATE FROM DUAL; SYSDATE --------08-FEB-04 SELECT 'This is a test' AS message FROM DUAL; MESSAGE -------------This is a test DUAL Table • The DUAL table has just one row with one column, who’s value is ‘X’; SELECT * FROM DUAL; D X SYSDATE Function • The SYSDATE function returns the current date and time: SELECT SYSDATE FROM DUAL; SYSDATE --------08-FEB-04 ROWNUM Column • Every Oracle query has a pseudo-column named “rownum” • rownum can be used to limit output to a certain number of rows SELECT * FROM customers WHERE rownum < 5; CUST_ID CUST_FIRST_NAME CUST_LAST_NAME ---------- -------------------- -------------------10 Abigail Kessel 20 Abner Everett 30 Abraham Odenwalld 40 Absolom Sampson 4 rows selected. Materialized Views • Oracle has an object called a materialized view. It is a view that actually contains data. • Data is updated periodically • Useful for derived data, such as statistical data SYNONYMS • • Synonyms are aliases for objects, a name that can be referred to without the schema name. Synonyms are public or private – – – public = all users can use it private = only the owner can use it Example: CREATE PUBLIC SYNONYM employees FOR employees; – Now anyone can select from the employees table SELECT * FROM employees; Sequence • A sequence generates a sequential integer value • Note – sequence numbers may be skipped. • Useful for serial numbers CREATE SEQUENCE customers_seq START WITH 1000 INCREMENT BY 1; • Use nextval to get the next incremental number INSERT INTO employees VALUES (employees_seq.nextval, 'John', 'Doe', 'jdoe', '555-1212', TO_DATE(SYSDATE), 'PU_CLERK', 2500, null, null, 30); SCHEMA • Generally: A data model diagram • Oracle: a collection of database objects belonging to a single user • The schema has the name of the owner • Normally, only the owner has access to the schema • Other users can access using the user name prefix if they have been granted privileges: select * from hr.employees; Miscellaneous SQL notes • In Oracle, SQL statements are terminated with a semi-colon ; • By convention, uppercase SQL reserved words and lowercase data-specific words (not mandatory): SELECT last_name FROM employees WHERE employee_id = 197; • Object names are not case-sensitive, but string literals are: SELECT employee_id FROM EMPLOYEES WHERE last_name = ‘Smith’; ORACLE DATATYPES CHAR(size) Fixed-length character string VARCHAR2(size) Variable-length character string NUMBER(p,s) Floating point number with precision = p and scale = s DATE A date and time CLOB Large character string, up to 4GB BLOB Large binary object, up to 4GB BFILE Pointer to an external file ROWID Internal row address ORACLE DATATYPES - NUMBER • NUMBER(p,s) – precision is number of digits to store – scale is number of digits to the right of the decimal place – p is an integer between 1 and 38 (inclusive) – s is an integer between -84 and 127 (inclusive) – s = 0 is a decimal integer – negative s pads zeroes to the left of the decimal point – specifying neither p nor s assumes maximum values NUMBER EXAMPLES Actual Data Specified as Stored as 1234567.89 NUMBER 1234567.89 NUMBER(9) 1234568 NUMBER(9,2) 1234567.89 NUMBER(9,1) 1234567.9 NUMBER(6,2) Exceeds precision NUMBER(9, -2) 1234600 NUMBER(6,8) .00123456 NUMBER(6,6) .001235 NUMBER(4,6) Exceeds precision .00123456 ORACLE DATE • Dates and times are stored internally as a number in Oracle • To insert or select a date or time in a way that is readable, it has to be converted to or from a string using a date format. – Example: 09-FEB-2004 is in date format DDMON-YYYY ORACLE DATE • You can insert a date as a literal string – Use date format DD-MON-YYYY (day-monthyear) – Can’t insert the time this way – Time will be 12:00:00 am INSERT INTO employees (employee_id, first_name, last_name, email, hire_date, job_id) VALUES (208, 'Brown', 'John', 'jbrown@yahoo.com', '28-JAN-2004', 'SA_REP'); ORACLE DATE • DATE type includes date and time information. • To insert a date, use the TO_DATE function and specify the date, time and date format as strings: TO_DATE(’08-FEB-2004’, ‘DD-MON-YYYY’) TO_DATE(’08-FEB-2004 13:44:00’, ‘DD-MON-YYYY HH24:MI:SS’) insert into employees (employee_id, first_name, last_name, email, hire_date, job_id) values (207, 'Brown', 'John', 'jb@yahoo.com', TO_DATE('27-JAN-2004', 'DD-MON-YYYY'), 'SA_REP'); ORACLE DATE • Likewise, when selecting a date from a table, you can display the date in different formats using the TO_CHAR function. select TO_CHAR(SYSDATE, 'DD/MM/YY HH:MI:SS PM') as "current time" FROM DUAL current time -------------------08/02/04 02:37:05 PM DATE FORMAT ELEMENTS Element Meaning DD Two-digit day DAY Day of week spelled out MM Two-digit month MON Three-character month, i.e. JAN MONTH Month spelled out, i.e. January YY Two-digit year – beware: 98 = 2098 YYYY Four-digit year – safest! RR Two-digit year in 20th century, i.e. 98 = 1998 HH Hour, 11 am and 11 pm are the same HH24 Military hour, i.e. 14:00 = 2pm MI Minutes SS Seconds PM Show PM or AM for HH See Table 8-6 on page 224 of textbook for complete listing DATE FORMAT ELEMENTS • Examples SELECT TO_CHAR(SYSDATE, 'DAY MONTH DD, YYYY HH:MI:SS PM') AS "current time" FROM DUAL; current time ---------------------------------------SUNDAY FEBRUARY 08, 2004 04:38:05 PM SELECT TO_CHAR(SYSDATE, 'MM+DD+RR HH24:MI:SS') AS "current time" FROM DUAL; current time ----------------02+08+04 16:40:16 Oracle Date Functions • TO_CHAR converts date to a character string • TO_DATE converts a character string to a date • TRUNC returns date with no time (time is set to 00:00:00. Use this when you want to compare the date and not the time • ADD_MONTHS, returns date incremented by a specified number of monts • Addition: adding integers to a date adds that many days to the date See Table 8-5 on page 220 for complete list TRUNC example insert into emp (first_name, last_name, email, job_id, hire_date) values ('Mark', 'Freeman', 'markf@pdx.edu', 50, '06-OCT2004'); 1 row created. SELECT * FROM emp WHERE hire_date = SYSDATE; no rows selected SELECT * FROM emp WHERE hire_date = trunc(SYSDATE); FIRST_NAME LAST_NAME… -------------------- ------------------------Mark Freeman… 1 row selected. SELECT SYSDATE FROM DUAL; SYSDATE --------06-OCT-04 Date Arithmetic Examples SELECT ADD_MONTHS(SYSDATE, 3) FROM DUAL; ADD_MONTH --------06-JAN-05 SELECT SYSDATE + 7 AS "Next Week" FROM DUAL; Next Week --------13-OCT-04 PL/SQL Procedures • PL/SQL stands for procedural language. • A procedures is a group of SQL statements with programming logic • A function is a procedure that returns a value • A trigger is a procedure that fires when a database event occurs, such as an insert or update • A package is a named group of procedures and functions SQL*Plus • Oracle’s command-line SQL interpreter • Two kinds of commands – SQL commands – SQL*Plus commands • SQL*Plus commands are special formatting and control commands that are not part of SQL • SQL*Plus commands are not case-sensitive and can be abbreviated SQL*Plus Transactions • By default SQL*Plus does not run in autocommit mode. • DELETE’s, UPDATE’s and INSERT’s do not become permanent until a COMMIT statement is explicitely executed • This means you can use ROLLBACK to undo changes • If you end a session with out committing, Oracle will automatically rollback your changes • Autocommit can be enaabled with the SET AUTOCOMMIT ON comand SQL*Plus Commands - DESCRIBE • DESCRIBE – Lists the description of an Oracle object – Can be abbreviated as ‘DESC’ desc move_ccuser PROCEDURE move_ccuser Argument Name Type -------------- ----------------------CCUSER VARCHAR2 TSPACE VARCHAR2 In/Out Default? ------ -------IN IN SQL*Plus Commands - DESCRIBE DESCRIBE employees Name ---------------EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL PHONE_NUMBER HIRE_DATE JOB_ID SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID Null? Type -------- ------------NOT NULL NUMBER(6) VARCHAR2(20) NOT NULL VARCHAR2(25) NOT NULL VARCHAR2(25) VARCHAR2(20) NOT NULL DATE NOT NULL VARCHAR2(10) NUMBER(8,2) NUMBER(2,2) NUMBER(6) NUMBER(4) SQL*Plus Commands - spool • spool opens a file and sends all output to the file • Filename cannot contain spaces spool h:\test.out • Turn off with the spool off command SQL*Plus Commands - SET • The SET command sets certain parameters affecting the output display • SET ECHO [ON/OFF] – Controls display of SQL commands in reports • SET HEADING [ON/OFF] – Control display of column headings • SET LINESIZE int – Width of a line before wrapping • SET PAGESIZE int – Number of lines to print between headers – Set to 0 turns off all heading and page breaks • SET UNDERLINE char – Sets the underline character at column headings to char SQL*Plus Commands - SHOW • The SHOW command displays parameter settings • SHOW SGA – Shows memory configuration • SHOW PARAMETER parameter name – Shows setting of an init.ora parameter • SHOW ERROR – Displays PL/SQL error messages • SHOW USER • SHOW SPOOL • SHOW ALL SQL*Plus Commands - HELP • HELP topic displays information about other commands help spool SPOOL ----Stores query results in an operating system file, or sends the file to a printer. In iSQL*Plus, output can be directed to a file. SPO[OL] [file_name[.ext] | OFF | OUT] Not available in iSQL*Plus