oracle database administration lecture 2 sql language
TRANSCRIPT
Types of SQL statements• DDL (Data Definition Language) : create, drop, alter, for example: CREATE TABLE
• DML (Data Modification Language): select, update, delete, insert
• Transaction control statements: commit, rollback, savepoint
• Session control statements: alter session• System control statements: alter system
DML Statements: SELECT• SELECT
– query data, – does not modify tables– does not lock (unless FOR UPDATE)
SELECT * FROM users
WHERE id = 1 FOR UPDATE
– does not wait for any locks (unless FOR UPDATE)
DML Statements: UPDATE• UPDATE
– update data in one table (any number of rows)– locks updated data (until transaction end)– waits for locks if data is locked (can cause
deadlock)– syntax:
UPDATE table
SET col1 = value1, col2 = value2
[ WHERE ...]
DML Statements: DELETE• DELETE
– deletes rows from one table (any number of rows)
– locks deleted data (update will wait)– waits for locks if data is locked (can cause
deadlock)– syntax: DELETE FROM table [ WHERE ... ]
DML Statements: INSERT• INSERT
– inserts one row or multiple rows – can sometimes wait for a lock
Syntax:INSERT INTO table (col1, col2)
VALUES (val1, val2)or
INSERT INTO table VALUES (val1, val2)or
INSERT INTO table (col1, col2)
SELECT val1, val2 FROM ... (regular select statement)
SELECT – basic syntax• Simple version:SELECT column_list FROM table
[WHERE condition]
• Example with table alias:SELECT u.last_name, u.first_name
FROM users u
– u is an alias for table users• Column alias:SELECT count(*) AS cnt
FROM users cnt is column alias for function count(*)
SELECT – all columns• Select all columns from a table using “*”• The following statements are identical:
– SELECT * FROM users– SELECT users.* FROM users– SELECT u.* FROM users u
To select all columns and more, use the following syntax:SELECT u.*, UPPER(last_name) FROM users
SELECT – other user tables• To select data from some other user:SELECT users.first_name, users.last_name
FROM user_name.users
• Note: user_name cannot be used in column list, the following is illegal:
SELECT user_name.table1.col1,
user_name.table1.col2
FROM user_name.table1
• To select data from other user’s table current must have one of the following:• SELECT privilege on the table• SELECT ANY TABLE system privilige
WHERE condition• WHERE clause specifies what records to include• There can be any number of conditions combined with AND, OR, NOT
• There also can be conditions:– EXISTS (subquery), NOT EXISTS (subquery)
– value IN (subquery), value NOT IN (subquery)
• SQL functions can be used: SELECT * FROM users WHERE
hire_date > SYSDATE – 10
SELECT * FROM users WHERE
LENGTH(last_name) > 20
WHERE condition examplesSELECT * FROM departments WHERE
EXISTS(SELECT * FROM employees
WHERE employees.dept_id = departments.id)
SELECT * FROM departments WHERE
id IN (SELECT dept_id FROM employees)
SQL Joins• Joining tables – selecting data from two or more
tables at the same time.• Types of joins:
– Inner joins – typical – Outer joins– Cross joins – rarely used, sometimes used by
accident by writing incorrect SELECT statement
INNER JOIN• Explicit syntax: use INNER JOIN keywords• Implicit syntax:
– provide more than one table in FROM clause– provide join condition (in WHERE clause)– Joins without join condition produce Cross
join
Joins• Simple explicit join:SELECT student.id, group.id,
student.name, group.name
FROM student
INNER JOIN group
ON student.group_id = group.id
• Implicit join:SELECT student.id, group.id,
student.name, group.name
FROM student, group
WHERE student.group_id = group.id
Cross join• Explicit notation:SELECT student.id, group.id,
student.name, group.name
FROM student
CROSS JOIN group
• Implicit notation:SELECT student.id, group.id,
student.name, group.name
FROM student, group
in both cases: number of rows returned = number of students * number of groups
Complex join select• Any number of tables can appear in SELECT
statement, example:SELECT student.id, group.id,
course.id, grade.grade
student.name, group.name
FROM student, group, course, grade,
student_courses courses
WHERE student.group_id = group.id
AND courses.student_id = student.id
AND courses.course_id = course.id
AND grade.course_id = course.id
AND student.id = grade.student_id
Inner Joins• Statement:SELECT student.id, group.id,
student.name, group.name
FROM student, group WHERE
student.group_id = group.id
does not return empty groups.
Outer joins• To return records with no matching join condition use outer join statement:SELECT student.id, group.id,
student.name, group.name
FROM student
LEFT OUTER JOIN group
ON student.group_id = group.idLeft outer join always returns results from the “left” table (student), even if there are no matching rows in the right table (group)If there is no matching group: group.id IS NULL and group.name IS NULL
Outer joins• RIGHT OUTER JOIN always returns results from the right table even if there are no matching rows in the left table• FULL OUTER JOIN returns results from both tables
Oracle syntax for outer joins• Statement:SELECT student.id, group.id,
student.name, group.name
FROM student, group WHERE
student.group_id (+) = group.id
returns one record for each student and one record for empty group (student.id and student.name are NULL)
Outer join• (+) operator can be on either side of the = operator:SELECT student.id, group.id,
student.name, group.name
FROM student, group WHERE
student.group_id = group.id (+)
returns all students including ones with no group• (+) operator cannot be on both sides of the = operator:WHERE student.group_id (+) = group.id (+)
is illegal
Self join• Table can be joined to itself – self join. • One of the tables must be aliased in the FROM clause:SELECT dept.id, parent_dept.id,
FROM dept, dept as parent_dept
WHERE dept.parent_id = parent_dept.id
Group functions• Select statement can include group function(s) in the
column clause:SELECT max(salary), min(salary)
FROM employers
WHERE employers.dept = 2
• Select statement with no GROUP BY clause return one record
• Group functions:• count, sum• avg, min, max• stddev, variance (Oracle specific)
Group functions• Statement with group function and no GROUP BY
clause cannot have “regular” columns in SELECT list. The following is illegal:
SELECT max(salary), min(salary), name
FROM employers
WHERE employers.dept = 2
Group by clause• Records can be grouped using specified columns:SELECT max(salary), min(salary), dept
FROM employers
WHERE dept != 2
GROUP BY dept
• Select clause can only include:• group functions• columns from the GROUP BY clause
Having clause• HAVING clause is used with GROUP BY statement• HAVING clause filters records returned after grouping • WHERE clause filters records before groupingSELECT max(salary), min(salary), dept
FROM employers
WHERE dept != 2
GROUP BY dept
HAVING min(salary) > 100
UNION• UNION, UNION ALL, MINUS, INTERSECT combine
results of two independent SELECT statements• Both statements must return the same number of
columns with the same data types• Column names are taken from the first SELECT
statement• MINUS and INTERSECT statements can be resource
consuming SELECT student.name FROM student
UNION ALL
SELECT teacher.name FROM teacher
ORDER BY• ORDER BY specifies how records are sorted• ORDER BY clause can include:
• column name or column index (1-based)• sort order (ASC or DESC)
SELECT name, salary
FROM employers
ORDER BY salary DESC, 1 ASC
SELECT name as personName, salary
FROM employers
ORDER BY salary DESC, personName ASC
Sub-selectsSELECT name, salary
FROM employers
WHERE salary =
(SELECT MIN(salary)
FROM employers)
• In Oracle sub selects can be used in:• WHERE clause• FROM clause• SELECT clause• ORDER BY clause
Sub-selects• FROM clause sub-selectSELECT COUNT(*) FROM
(SELECT MAX(salary) FROM employers)
• SELECT clauseSELECT ID, (SELECT MAX (salary)
FROM employers
WHERE employers.ID = dept.ID)
FROM dept
Sub-selects• ORDER BY clause sub-selectSELECT ID
FROM dept
ORDER BY (SELECT MAX (salary)
FROM employers
WHERE employers.dept = dept.ID)
WITH clause• WITH clause lets you assign a name to a subquery
block. The query can be then referenced in many places by specifying query name
WITH w AS (
SELECT id
FROM emp
WHERE emp.status = 'ACTIVE')
SELECT * FROM w emp1 WHERE EXISTS
(SELECT * FROM w emp2 WHERE
emp1.id = emp2.boss_id)
Oracle extensions• ROWID pseudo column – unique identifier of a row in
entire database. Will not change when the row is updated
SELECT ROWID, ID FROM student
.......
DELETE FROM student WHERE ROWID = ‘....’
Oracle extensions• ROWNUM pseudo column – numbers rows (starting
from 1) that are returned in a query. • Can be used to limit the number of rows returned:SELECT * FROM student WHERE ROWNUM <= 100
returns at most 100 rowsDELETE FROM student WHERE ROWNUM <= 100
deletes at most 100 rows• ROWNUMs are assigned before the rows are orderedSELECT * FROM student
WHERE ROWNUM <= 100
ORDER BY student.name DESC
Oracle extensions• To get first 100 students in alphabetical order use the
following statement:SELECT *
FROM (SELECT *
FROM students student
ORDER BY NAME DESC)
WHERE ROWNUM <= 100
Oracle extensions• Hierarchical queries: for table that references itself• Special CONNECT BY clauseSELECT *
FROM employers
CONNECT BY boss_id = PRIOR id
START WITH id = 1;
• Selects all employers who’s boss (direct or not) is employer with ID = 1
Hierarchical queries• Special LEVEL pseudo-column is available in hierarchical
queries:SELECT level, e.* FROM employers eCONNECT BY e.boss_id = PRIOR e.idSTART WITH e.id = 1;
Practice SQL statementscreate table employees ( id number, name varchar2(100), boss_id number, dept_id number, salary number );
create table departments ( id number, name varchar2(100)); • Select total number of employees• Select total salary paid to all employees• Select department name, total salary, average salary, number of
employees in each department (including departments with no employees)
• Select employees with highest salary in each department• Select employees that earn more than their direct boss
Practice SQL statements• Select employees that earn more than their direct or indirect boss• Select department where works the employee with the lowest
salary• Select five employees with the highest salaries• Select employees from 6 - 10 on the salary list (from 6th to 10th
person sorting by salary) (!)• Select employers that earn more than average in their
department• Select departments with average salary higher than total average
salary in the company• Select employees that have more than 5 subordinates (direct or
indirect)