Professional Documents
Culture Documents
SQL Notes
SQL Notes
() (Database Management
System) (software package),
(storage), (retrieval)
(maintenance) .
""
, .
(users) ,
, ,
, .
, .
,
4 : (data),
(hardware), (software) (users).
()
. ,
' . ,
(integrated) (shared).
.
(redundant) .
, .
, ( Hard Disks), (random
access).
.
,
,
(). ,
,
.
2
,
,
. ' ,
.
.
' ,
.
(entities) (objects).
, (.. ,
, .
.
(attributes).
(entity set)
(entity category) (entity class).
'
,
( )
. ,
. .
( )
(key) .
(..
, )
,
, .
, , (relationships)
. ,
. - , . -
.
,
.
(data models)
. ,
.
:
(structure):
,
(manipulation):
, , ,
(integrity):
,
. ,
.
.
. .
,
.
.
3
,
(relational model).
.
,
.
: (, ) (,
) .
, : (B
, , 10/01/2005) ( ,
, 10/01/2005)
,
,
.
,
(. 2). (relation).
,
(..
, ).
10/01/2005
10/01/2005
() .
,
B
10/01/2005
10/01/2005
(, , .).
:
.
1
B 10/01/2005
2
10/01/2005
(relations)
. ,
.
, .
_ .. .
1
1
1
2
1
3
2
3
2
4
, ,
, .
.
(.. - create, -update,
-delete .).
4 SQL
SQL ANSI
.
SQL ORACLE :
) . (GRANT)
(REVOKE) ,
) .
(TRANSACTION)
(COMMIT)
(ROLLBACK) ,
(SAVEPOINT).
) , , , (CREATE),
(ALTER)
(DROP).
(RENAME),
(TRUNCATE).
) . (INSERT),
(UPDATE), (DELETE) (MERGE)
.
E) (SELECT) .
Employees,
Departments JOB_GRADES
5 CREATE
:
: ( )
:
:
:
:
5.1
.
.
:
: ,
30 , -, a-z, 0-9, _, $, #,
.
,
:
[] :
schema
table
DEFAULT expr
column
datatype
expr (,
, )
.
5.1.1
:
DESC[RIBE] dept
DESCRIBE employees
5.2
(..
).
:
CREATE TABLE table
[(column, column...)]
AS subquery;
5.2.1
:
5.3
,
. data dictionaries
4 .
. :
USER_ :
ALL_ :
DBA_ :
V$ :
(dynamic performance views, database server performance, memory,
locking)
5.3.1
:
SELECT table_name
FROM user_tables;
:
SELECT DISTINCT object_type
FROM user_objects;
, , :
SELECT *
FROM user_catalog;
5.4
ORACLE
:
VARCHAR2(size)
(1..4000)
CHAR(size)
NUMBER(p,s)
DATE
TIMESTAMP
INTERVAL YEAR TO MONTH
INTERVAL DAY TO SECOND
LONG
(1..2000)
p (1..38) s (84..127)
January 1, 4712
B.C., December 31, 9999 A.D.
, ,
( 2 Gbytes)
CLOB
( 4 Gbytes)
ROWID
5.4.1
6
CREATE TABLE new_employees
(employee_id NUMBER,
first_name VARCHAR2(15),
last_name VARCHAR2(15),
...
start_date TIMESTAMP(7),
...);
DROP (column);
:
ALTER TABLE table
DROP UNUSED COLUMNS;
5.5.1
.
:
ALTER TABLE dept80
ADD (job_id VARCHAR2(9));
:
ALTER TABLE dept80
MODIFY (last_name VARCHAR2(30));
:
ALTER TABLE dept80
DROP COLUMN job_id;
5.7 RENAME
RENAME oldname TO newname
- TRUNCATE
.
.
TRUNCATE TABLE detail_dept;
6 (SELECT)
6.1
SELECT
SELECT *|{[DISTINCT] column|expression [alias],...}
FROM table;
6.1.1
1. Departments
SELECT *
FROM departments;
2.
. DISTINCT
SELECT LOCATION_ID
SELECT DISTINCT LOCATION_ID
FROM departments;
FROM departments
3.
SELECT DISTINCT LOCATION_ID place, DEPARTMENT_ID name
FROM departments
4.
SELECT last_name, salary, 12*salary+100,12*(salary+100)
FROM employees;
5.
SELECT last_name ||' is a '||job_id
AS "Employee Details"
FROM employees;
6.2
() ,
.
SELECT *|{[DISTINCT] column|expression [alias],...}
FROM table
[WHERE condition(s)];
6.2.1
1.
SELECT employee_id, last_name, job_id, department_id
FROM employees
WHERE department_id = 90;
2.
SELECT last_name, job_id, department_id
FROM employees
WHERE last_name = 'Goyal';
3.
SELECT last_name, job_id, department_id
FROM employees
WHERE hire_date = '01-SEP-2005';
6.2.2
=, >, >=, <=, <, <>, !=, ^=
SELECT last_name, salary
FROM employees
5.
BETWEEN...AND...
( )
IN(set)
SET
LIKE
_ :
%:
\:
IS NULL
NULL: IS NULL IS NOT NULL
SELECT last_name
FROM employees
WHERE last_name LIKE '_o%';
6.2.3
AND, OR, NOT
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary >=10000
AND job_id LIKE '%MAN%';
( )
SELECT last_name, job_id, salary
FROM employees
WHERE (job_id = 'SA_REP'
OR job_id = 'AD_PRES')
AND salary > 15000;
6.2.4
() (ASCending)
(DESCending) .
.
ORDER BY. ,
.
SELECT *|{[DISTINCT] column|expression [alias],...}
FROM table
[WHERE condition(s)]
[ORDER BY {column, expr} [ASC|DESC]];
SELECT last_name, job_id, department_id, hire_date
FROM employees
ORDER BY hire_date;
SELECT employee_id, last_name, salary*12 annsal
FROM employees
ORDER BY annsal;
( ).
SELECT last_name, department_id, salary
FROM employees
ORDER BY department_id, salary DESC;
.
6.3 SQL
6.3.1
.
1.
LOWER ( ), UPPER ( ),
INITCAP ( )
2.
CONCAT('Hello', 'World')
SUBSTR('HelloWorld',1,5)
LENGTH('HelloWorld')
INSTR('HelloWorld', 'W')
()
HelloWorld
Hello
10
6
LPAD(salary,10,'*')
RPAD(salary, 10, '*')
TRIM('H' FROM 'HelloWorld')
*****24000
24000*****
elloWorld
: , , ,
, 'a'
job_id , 3 , REP
SELECT employee_id, CONCAT(first_name, last_name) NAME, job_id,
LENGTH (last_name), INSTR(last_name, 'a') "Contains 'a'?"
FROM employees
WHERE SUBSTR(job_id, 4) = 'REP';
3.
ROUND(column|expression,n)
TRUNC(column|expression,n)
MOD(m,n)
n
n
m/n
DUAL ORACLE
SELECT ROUND(45.923,2), ROUND(45.923,0),
ROUND(45.923,-1)
FROM DUAL;
4.
ORACLE :
CENTURY YEAR
MONTH
DAY
HOUR
MINUTE
SECOND
20
07
06
SYSDATE
date+number
date-number
date-date
date+number/24
MONTHS_BETWEEN (date1, date2)
ADD_MONTHS(date, n)
NEXT_DAY(date, 'char')
LAST_DAY (date)
ROUND(date[,'fmt'])
TRUNC(date[, 'fmt'])
07
10
43
Date ( )
Date ( )
Date ( )
Number ( )
Date ( )
'char'
date (..
)
format
format
SELECT SYSDATE
FROM DUAL;
5.
VARCHAR2 CHAR NUMBER
VARCHAR2 CHAR DATE
) DATE CHAR
TO_CHAR(date, 'format_model')
format_model
YYYY
YEAR
MM
MONTH
3
DY
3
DAY
DD
SELECT last_name,
TO_CHAR(hire_date, 'fmDD Month YYYY') HIREDATE
FROM employees;
SELECT last_name,
TO_CHAR(hire_date,
'fmDdspth "of" Month YYYY fmHH:MI:SS AM')
HIREDATE
FROM employees;
B) NUMBER CHAR
TO_CHAR(number, 'format_model')
9
0
0
$
$
L
.
(.)
,
(,)
SELECT TO_CHAR(salary, '$99,999.00') SALARY
FROM employees
WHERE last_name = 'Ernst';
)
TO_NUMBER(char[, 'format_model'])
)
TO_DATE(char[, 'format_model'])
SELECT last_name, TO_CHAR(hire_date, 'DD-Mon-YYYY')
FROM employees
WHERE hire_date < TO_DATE('01-Jan-90', 'DD-Mon-RR');
6.
NVL (expr1, expr2)
NVL2 (expr1, expr2, expr3)
NULLIF (expr1, expr2)
COALESCE (expr1, expr2, ..., exprn)
null expr1
expr2
null expr1
expr3
expr2
null expr1 expr2
not null
SELECT last_name,
COALESCE(commission_pct, salary, 10) comm
FROM employees
ORDER BY commission_pct;
7.
CASE DECODE
(If, ElseIf, Else)
SELECT last_name, job_id, salary,
CASE job_id WHEN 'IT_PROG' THEN 1.10*salary
WHEN 'ST_CLERK' THEN 1.15*salary
WHEN 'SA_REP' THEN 1.20*salary
ELSE salary END "REVISED_SALARY"
FROM employees;
8.
7
.
xB:
. 20 30,
600 .
Employees Departments.
.
Last_Name
Department_ID
Department_ID
Department_Name
Location_ID
100
100
100
100
101
101
101
101
King
King
King
King
Kochhar
Kochhar
Kochhar
Kochhar
90
90
90
90
90
90
90
90
10
20
50
190
10
20
50
190
Administration
Marketing
Shipping
Contracting
Administration
Marketing
Shipping
Contracting
1700
1800
1500
1700
1700
1800
1500
1700
7.1
SQL-99, :
(Cross joins)
(Natural joins)
(Using clause)
(full or two sided outer join)
(Arbitrary join conditions for
outer joins)
Oracle
(Equijoin)
(Non-equijoin)
(Outer join)
(Self join)
JOIN ORACLE :
SELECT table1.column, table2.column
FROM table1, table2
7.2
.
.
Employees Departments
.
WHERE
( Departments
Employees).
SELECT *
FROM employees, departments
WHERE employees.department_id = departments.department_id;
SELECT
SELECT last_name, employees.department_id, department_name
FROM employees, departments
WHERE employees.department_id = departments.department_id;
AND WHERE
(alias)
:
-
- ,
- (aliases)
SELECT e.employee_id emp_id, e.last_name emp_name,
e.department_id dept_id, d.location_id dept_loc
FROM employees e, departments d
WHERE e.department_id = d.department_id;
-1
:
7.3
.
( )
,
:
.
:
. .
Job_Grades. .
7.4
,
.
. LEFT RIGHT ""
.
outer join:
- .
-
IN OR.
OUTER JOIN
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column(+) = table2.column;
.
SELECT e.last_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id;
7.5
.
.
(
EMPLOYEES)
SELECT worker.last_name || ' works for '
|| manager.last_name
FROM employees worker, employees manager
WHERE worker.manager_id = manager.employee_id;
7.6 SQL-1999
:
SELECT table1.column, table2.column
FROM table1
[CROSS JOIN table2] |
[NATURAL JOIN table2] |
[JOIN table2 USING (column_name)] |
[JOIN table2
ON(table1.column_name = table2.column_name)] |
[LEFT|RIGHT|FULL OUTER JOIN table2
ON (table1.column_name = table2.column_name)];
ORACLE.
7.7
.
.
SELECT last_name, department_name
FROM employees
CROSS JOIN departments;
:
SELECT last_name, department_name
FROM employees, departments;
7.8
.
.
, .
( where)
.
location_id
SELECT department_id, department_name,
location_id, city
FROM departments
NATURAL JOIN locations;
SELECT department_id, department_name,
departments.location_id, city
FROM departments, locations
WHERE departments.location_id = locations.location_id;
7.9 USING
.
:
.
(alias) .
SELECT e.employee_id, e.last_name, d.location_id
FROM employees e JOIN departments d
USING (department_id);
SELECT employee_id, last_name,
employees.department_id, location_id
ON
.
ON :
SELECT employee_id, city, department_name
FROM employees e
JOIN departments d
ON d.department_id = e.department_id
JOIN locations l
ON d.location_id = l.location_id;
SELECT employee_id, city, department_name
7.10
,
(left outer)
(right outer) (full outer)
LEFT-OUTER
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id);
RIGHT-OUTER
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id);
FULL-OUTER
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
FULL OUTER JOIN departments d
ON (e.department_id = d.department_id);
SQL-99
8
()
. (aggregate functions)
, (, ,
)
AVG([DISTINCT|ALL]n)
COUNT({*|[DISTINCT|ALL]expr})
MAX([DISTINCT|ALL]expr)
MIN([DISTINCT|ALL]expr)
STDDEV([DISTINCT|ALL]x
SUM([DISTINCT|ALL]n
VARIANCE([DISTINCT|ALL]x
Null
expr
null (
null-
*)
expr
null
expr
null
x,
null
n,
null
n,
null
SELECT [column,] group_function(column), ...
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
null
SELECT AVG(commission_pct)
FROM employees;
null ( NVL)
0.
SELECT AVG(NVL(commission_pct, 0))
FROM employees;
( )
WHERE
(HAVING)
SELECT department_id, COUNT(last_name)
FROM employees;
*
ERROR at line 3:
ORA-00934: group function is not allowed here
:
SELECT department_id, AVG(salary)
FROM employees
HAVING AVG(salary) > 8000
GROUP BY department_id;
9
( )
.
.
:
- WHERE ()
- HAVING
- FROM
9.1
WHERE WHERE.
- .
- .
-
: MIN .
.
9.2
WHERE WHERE.
:
-
()
-
(NoT IN)
- ( )
(> )
- ( )
(> LL)
(-ANY)
(ALL)
10
10.1
:
INSERT INTO table [(column [, column...])]
VALUES (value [, value...]);
(..
INSERT INTO departments (department_id,department_name )
VALUES (30, 'Purchasing');
1) NULL: NULL
INSERT INTO departments
VALUES (100, 'Finance', NULL, NULL);
2) SYSDATE:
INSERT INTO employees (employee_id,first_name, last_name,
email, phone_number, hire_date, job_id, salary,
commission_pct, manager_id, department_id)
VALUES (113, 'Louis', 'Popp', 'LPOPP', '515.124.4567',
SYSDATE, 'AC_ACCOUNT', 6900, NULL, 205, 100);
3) TO_DATE: format
INSERT INTO employees
VALUES (114, 'Den', 'Raphealy', 'DRAPHEAL',
'515.127.4561', TO_DATE('FEB 3, 1999', 'MON DD, YYYY'),
'AC_ACCOUNT', 11000, NULL, 100, 30);
1 row created.