Oracle SQL |
Отличие
Oracle SQL и ANSI SQL
|
-
NULL значения
В Oracle нельзя вставить пустую строку, так как она будет рассматриваться как
NULL
-
Оператор UPDATE
1.использование табличных алиасов для ссылок на обновляемую таблицу в
подзапросах
2.подзапросы в правой части предложения SET в отличие от только выражений в
ANSI SQL
3.список обновляемых колонок в левой части предложения SET, в отличии от одной
колонки в ANSI SQL
4.подзапросы в предложении SET или WHERE могут ссылаться на обновляемую таблицу
5.Оператор UPDATE поддерживает обновление подзапросов
UPDATE emp aaa
SET deptno =(SELECT deptno FROM dept WHERE loc='Москва'),
SET (sal,comm)=(SELECT 1.1*AVG(sal),1.5*AVG(comm)
FROM emp bbb WHERE aaa.deptno=bbb.deptno)
-
Внешние соединения
SELECT * FROM tab1 LEFT JOIN tab2 ON col1=col2 - аналогичен запросу:
SELECT * FROM tab,tab2 WHERE col1=col2 (+)
SELECT * FROM tab1 RIGHT JOIN tab2 ON col1=col2 - аналогичен запросу:
SELECT * FROM tab,tab2 WHERE col1 (+)=col2
-
Древовидные запросы
SELECT LPAD(' ',2*(LEVEL-1)) || ename org_chart, empno, mgr, job
FROM emp
START WITH job = 'PRESIDENT'
CONNECT BY PRIOR empno = mgr;
ORG_CHART EMPNO MGR JOB
------------ ---------- ---------- ---------
KING 7839 PRESIDENT
JONES 7566 7839 MANAGER
SCOTT 7788 7566 ANALYST
ADAMS 7876 7788 CLERK
FORD 7902 7566 ANALYST
SMITH 7369 7902 CLERK
BLAKE 7698 7839 MANAGER
ALLEN 7499 7698 SALESMAN
WARD 7521 7698 SALESMAN
-
Оператор SELECT
1.NULL в списке выборки
2.Запрос из запроса (SELECT FROM (SELECT….))
3.Левая часть оператора IN может быть списком выражений в отличии от одиночного
выражения в ANSI SQL
4.Не только столбец, а любое выражение может быть использовано с оператором
LIKE
5.Любое выражение, а не только отдельный столбец может быть использован в
операторах сравнения IS NULL и IS NOT NULL
6.В предложении ORDER BY может быть использовано любое выражение содержащее
любые столбцы любых таблиц предложения FROM в отличии от только имен, алиасов,
номеров позиций столбцов списка выборки
7.В предложении GROUP BY может быть использовано любое выражение содержащее
любые столбцы любых таблиц предложения FROM в отличии от только имен, алиасов
столбцов списка выборки
8.Вложенные агрегатные функции MIN(MAX(col1)) (уровень вложенности не более 2)
|
CONDITIONS |
Приоритет операций
- Arithmetic operators
- Concatention operator
- Comparison conditions
- IS NOT NULL, LIKE, NOT IN
- NOT BETWEEN
- NOT logical condition
- AND logical condition
- OR logical condition
A AND NULL
- TRUE, NULL = NULL
- FALSE, NULL = FALSE
- NULL, NULL = NULL< /li >
A OR NULL
- TRUE, NULL = TRUE
- FALSE, NULL = NULL
- NULL, NULL = NULL< /li >
|
LIKE:WHERE job_id LIKE '%SA\_%' ESCAPE '\'; |
JOINS |
- Equijoins - равенство в where
- NonEquijoins - другая операция соединения
- outer joins - для отображения рядов не удовлетворяющих условию. Таблица у колонки которой не стоит (+) будут отображены все записи
- Self joins - соединение таблицы самой с собой
- CROSS JOIN - каждая запись одной таблицы с каждой записью другой
- NATUARAL JOIN - аналогично inner join, но связь по одноименным колонкам
- JOIN table USING(column) - аналогично с указанием колонки
- JOIN table ON condition - с указанием условия связи
- LEFT JOIN table ON condition - все записи основной таблицы
- RIGHT JOIN table ON condition - все записи связанной таблицы
- FULL JOIN table ON condition - все записи
обоих таблиц
|
CREATE USER, SCHEMA |
логинишься как system/manager@your_db_alias и создаешь:
CREATE USER your_schema IDENTIFIED BY your_password
default tablespace STREAM_LOTTERY // tablespace для схемы
temporary tablespace TEMP
profile DEFAULT
quota unlimited on STREAM_LOTTERY // права на tablespace
quota unlimited on USERS;
GRANT CONNECT TO your_schema;
|
Изменение пароля пользователем:
ALTER USER scott IDENTIFIED BY lion;
|
Security |
GRANT:ALTER USER scott IDENTIFIED BY lion;
GRANT priv[(columns)] ON object TO user|role|PUBLIC
[WITH GRANT OPTION];
GRANT SELECT,INSERT,UPDATE,DELETE (ALL)
ON object
TO role (user); GRANT update(dep_id,loc_id)
ON depart
TO scott, manager; REVOKE:REVOKE priv|ALL
ON object
FROM user|role|PUBLIC
[CASCASE CONSTRAINTS]; Привелегии данные другому пользователю при этом так-же будут удалены.
CASCADE может быть использовано при удалении REFERENCES привилегии.
|
Контроль привелегий
Data Dictionary Table | Description |
ROLE_SYS_PRIVS | System privileges granted to roles |
ROLE_TAB_PRIVS | Table privileges granted to roles |
USER_ROLE_PRIVS | Roles accessible by the user |
USER_TAB_PRIVS_MADE | Object privileges granted on the user’s objects |
USER_TAB_PRIVS_RECD | Object privileges granted to the user |
USER_COL_PRIVS_MADE | Object privileges granted on the columns of the user’s objects |
USER_COL_PRIVS_RECD | Object privileges granted to the user on specific columns |
USER_SYS_PRIVS | Lists system privileges granted to the user |
|
AGGREGATING |
Список функций
AVG([DISTINCT|ALL]n) |
Среднее значение n, игнорирует NULL |
COUNT(*|[DISTINCT|ALL]n) |
Число рядов, где n не NULL. * - Все ряды, включая NULL |
MAX([DISTINCT|ALL]n)
|
Максимальное значение n, игнорирует NULL |
MIN([DISTINCT|ALL]n) |
Минимальное значение n, игнорирует NULL |
STDDEV([DISTINCT|ALL]n) |
Стандартное отклонение n, игнорирует NULL |
SUM([DISTINCT|ALL]n) |
Сумма n, игнорирует NULL |
VARIANCE([DISTINCT|ALL]n) |
Дисперсия n, игнорирует NULL |
DISTINCT - исключает дублирующие значения |
НаследованиеSELECT MAX(AVG(salary)) FROM emp
GROUP BY department_id -максимальная средняя зарплата по отделам. |
ОграниченияSELECT job_id, SUM(salary) FROM
emp WHERE
job_id NOT LIKE '%REP%' GROUP
BY job_id HAVING
SUM(salary) > 13000
ORDER BY SUM(salary); |
SUBQUERY ANY, ALL |
ANY:WHERE salary < ANY (...) < - означает меньше максимума > - означает больше минимума.
ALL:WHERE salary < ALL (...) < - означает меньше минимума > - означает больше максимума.
|
TABLE |
Создать таблицу из подзапросаCREATE TABLE table
[(column,..)]
AS subquery; |
Модификация таблицыALTER TABLE table
ADD (column datatype [DEFAULT expr],
...);
ALTER TABLE table
MODIFY (...); |
Удаление, отключение колонокALTER TABLE table
DROP (column) [CASCADE CONSTRAINTS];
ALTER TABLE table
SET UNUSED (column);
ALTER TABLE table
DROP UNUSED COLUMNS;
|
Удаление, очистка таблицыDROP TABLE table;
TRUNCATE TABLE table; |
ПереименованиеRENAME table_old TO table_new; |
КомментарийCOMMENT ON TABLE table
IS 'text'; |
VIEW |
CREATE:CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias, alias)]
AS query
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];
|
Constraints |
Определение констрейна при создании таблицы
Column ...,
CONSTRAINT name constraint_type (column,..) |
Типы констрейновNOT NULL
UNIQUE(column,...)
PRIMARY KEY(column,...)
FOREIGN KEY(column,...) REFERENCES table(column,...)
CHECK(condition) |
ДобавлениеALTER TABLE table
ADD [CONSTRAINT name] constraint_type (column,..) |
УдалениеALTER TABLE table
DROP CONSTRAINT name |
ВыключениеALTER TABLE table
DISABLE|ENABLE CONSTRAINT name [CASCADE];
|
TRANSACTION |
- COMMIT - завершает транзакцию
- SAVEPOINT name - фиксирует точку
- ROLLBACK - откат всей транзакции
- SEROLLBACK TO SAVEPOINT name - откат до точки
Примечания
- Создание SAVEPOINT с таким же именем удаляет предыдущую точку
- Авто commit - после DDL и DCL команд, выход из SQL PLUS
- Авто rollback - после аварийного выхода из SQL PLUS
|
LOCK TABLE tbl
IN lockmode MODE [NOWAIT]
- ROW SHARE
- ROW EXCLUSIVE
- SHARE UPDATE
- SHARE
- SHARE ROW EXCLUSIVE
- EXCLUSIVE
|
External tables
|
CREATE DIRECTORY emp_dir AS '/flat_files'
CREATE TABLE oldemp (
empno NUMBER, empname CHAR(20), birthdate DATE)
ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER
DEFAULT DIRECTORY emp_dir
ACCESS PARAMETERS
(RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY ','
(empno CHAR,
empname CHAR,
birthdate CHAR date_format date mask "dd-mon-yyyy""))
LOCATION ('emp1.txt))
PARALLEL 5
REJECT LIMIT 200;
|
INDEX
|
CREATE INDEX name
ON table(column,...); |
DEPENDENCIES
|
Просмотрselect * from user_dependencies
- name, varchar2(30) - name of the object,
- type, varchar2(17) - type of the object,
- referenced_owner, varchar2(30) - owner of referenced object (remote owner if remote object),
- referenced_name, varchar2(64) - name of referenced object,
- referenced_type, varchar2(17) - type of referenced object,
- referenced_link_name, varchar2(128) - name of dblink if this is a remote object,
- schemaid, number
- dependency_type
Для просмотра все цепочки следует загрузить скрипт ultdtree.sql.
Теперь можно выполнить процедуру DEPTREE_FILL('TYPE','OWNER','OBJECT')
после чего использовать view DEPTREE или IDEPTREE (то-же но с отступом).
|
Установка режима перекомпеляции для удаленных объектовALTER SYSTEM SET
REMOTE_DEPENDENCIES_MODE
ALTER SESSION SET
REMOTE_DEPENDENCIES_MODE Значения
|
Автоматическая перекомпиляция
- Для локальных перед выполнением
- Для зависимых от удаленных процедур при повторном выполнении
- Для зависимых от удаленных таблиц и пр. перекомпиляция не производится
|
Явная перекомпилеяция
ALTER PROCEDURE name COMPILE
ALTER PACKAGE name COMPILE [PACKAGE]
ALTER PACKAGE name COMPILE BODY
ALTER TRIGGER name [COMPILE[DEBUG]] |
TABELSPACE
|
- Создаем
CREATE TABLESPACE MYTAB
DATAFILE '/usr/oracle/dbs/streams_tbs.dbf'
SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
- Удаляем
ALTER TABLESPACE MYTAB OFFLINE;
DROP TABLESPACE MYTAB including contents and datafiles;
- Просмотр существующих
select * from DBA_TABLESPACES;
select * from DBA_DATA_FILES;
- Перемещаем файл
ALTER TABLESPACE MYTAB OFFLINE;
ALTER TABLESPACE MYTAB
rename datafile '...dbf' to '...dbf';
ALTER TABLESPACE MYTAB ONLINE;
- Добавление файла
ALTER TABLESPACE MYTAB
add datafile '...dbf' size 100M autoextend on;
|
Перемещение таблиц и индексов на нужный tablespace:
DECLARE
sql_text VARCHAR2(1000);
BEGIN
FOR rec IN (SELECT * FROM ALL_TABLES
where owner= 'LOTTERY_LOCAL1' AND (tablespace_name is null OR NVL(tablespace_name,'') != 'STREAM_LOTTERY') )
LOOP
sql_text := 'ALTER TABLE LOTTERY_LOCAL1.' || rec.table_name || ' MOVE TABLESPACE ' || 'STREAM_LOTTERY';
Dbms_Output.put_line( sql_text );
begin
EXECUTE IMMEDIATE sql_text;
exception
when others then
Dbms_Output.put_line('Unknown error:(' || SQLCODE || ')' || SQLERRM);
end;
END LOOP;
END;
DECLARE
sql_text VARCHAR2(1000);
BEGIN
FOR rec IN (SELECT * FROM ALL_INDEXES
where owner= 'LOTTERY_LOCAL1' AND (tablespace_name is null OR NVL(tablespace_name,'') != 'STREAM_LOTTERY') )
LOOP
sql_text := 'ALTER INDEX LOTTERY_LOCAL1.' || rec.index_name || ' REBUILD TABLESPACE ' || 'STREAM_LOTTERY';
Dbms_Output.put_line( sql_text );
begin
EXECUTE IMMEDIATE sql_text;
Dbms_Output.put_line(sql_text);
exception
when others then
Dbms_Output.put_line('Unknown error:(' || SQLCODE || ')' || SQLERRM);
end;
END LOOP;
END; |
AUDIT
|
- Установка параметра
alter system set AUDIT_TRAIL='DB' SCOPE=spfile;
- Назначение аудита для объекта:
AUDIT INSERT,UPDATE,DELETE
ON object
BY ACCESS
WHENEVER SUCCESSFUL;
- Назначение аудита для сессии:
AUDIT SESSION WHENEVER SUCCESSFUL;
- Просмотр
select * from AUD$;
select * from DBA_AUDIT_OBJECT;
select * from DBA_AUDIT_SESSION;
|