43. 数据类型的隐式转换 NUMBER VARCHAR2 or CHAR DATE VARCHAR2 or CHAR To From VARCHAR2 or CHAR NUMBER VARCHAR2 or CHAR DATE To From … where hire_date > '01-JAN-90' … where name_varchar > 2345 不建议使用隐式转换,可能导致 SQL 的性能下降
63. 使用 ON 进行 join 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; …
64.
65.
66. 非对等连接 Nonequijoins SELECT e.last_name, e.salary, j.grade_level FROM employees e JOIN job_grades j ON e.salary BETWEEN j.lowest_sal AND j.highest_sal; …
67. 外连接 Outer Joins EMPLOYEES DEPARTMENTS There are no employees in department 190. …
68.
69. 左外连接 Left Outer Join 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) ; …
70. 全外连接 Left Outer Join SELECT e.last_name, d.department_id, d.department_name FROM employees e FULL OUTER JOIN departments d ON (e.department_id = d.department_id) ; …
80. UNION SELECT employee_id, job_id FROM employees UNION SELECT employee_id, job_id FROM job_history; … …
81. UNION ALL SELECT employee_id, job_id, department_id FROM employees UNION ALL SELECT employee_id, job_id, department_id FROM job_history ORDER BY employee_id; … …
88. 成对比较子查询 返回与名字为 John 的员工在同一个部门,且同一个领导的员工 SELECT employee_id, manager_id, department_id FROM empl_demo WHERE (manager_id, department_id) IN (SELECT manager_id, department_id FROM empl_demo WHERE first_name = 'John') AND first_name <> 'John';
89. 不成对比较子查询 返回与名字为 John 的员工中任意一个领导相符和任意一个部门相符的员工 当名字为 John 多于一人时,与成对比较子查询的返回结果不同。 SELECT employee_id, manager_id, department_id FROM empl_demo WHERE manager_id IN (SELECT manager_id FROM empl_demo WHERE first_name = 'John') AND department_id IN (SELECT department_id FROM empl_demo WHERE first_name = 'John') AND first_name <> 'John';
92. 使用关联子查询 SELECT column1 , column2 , ... FROM table1 WHERE column1 operator (SELECT column1, column2 FROM table2 WHERE expr1 = .expr2 ); outer outer SELECT e.employee_id, last_name,e.job_id FROM employees e WHERE 2 <= (SELECT COUNT(*) FROM job_history WHERE employee_id = e.employee_id );
93.
94. WITH 示例 WITH dept_costs AS ( SELECT d.department_name, SUM(e.salary) AS dept_total FROM employees e JOIN departments d ON e.department_id = d.department_id GROUP BY d.department_name), avg_cost AS ( SELECT SUM(dept_total)/COUNT(*) AS dept_avg FROM dept_costs ) SELECT * FROM dept_costs WHERE dept_total > (SELECT dept_avg FROM avg_cost ) ORDER BY department_name;
97. INSERT INSERT INTO departments VALUES (100, 'Finance', NULL, NULL); INSERT INTO departments (department_id, department_name) VALUES (30, 'Purchasing'); INSERT INTO sales_reps(id, name, salary, commission_pct) SELECT employee_id, last_name, salary, commission_pct FROM employees INSERT INTO employees (employee_id,hire_date) VALUES (113,SYSDATE);
98.
99. Unconditional INSERT ALL INSERT ALL INTO sal_history VALUES(EMPID,HIREDATE,SAL) INTO mgr_history VALUES(EMPID,MGR,SAL) SELECT employee_id EMPID, hire_date HIREDATE, salary SAL, manager_id MGR FROM employees WHERE employee_id > 200;
100. Unconditional INSERT ALL INSERT ALL INTO sal_history VALUES(EMPID,HIREDATE,SAL) INTO mgr_history VALUES(EMPID,MGR,SAL) SELECT employee_id EMPID, hire_date HIREDATE, salary SAL, manager_id MGR FROM employees WHERE employee_id > 200;
101. Conditional INSERT ALL INSERT ALL WHEN HIREDATE < ' 01-JAN-95 ' THEN INTO emp_history VALUES(EMPID,HIREDATE,SAL) WHEN COMM IS NOT NULL THEN INTO emp_sales VALUES(EMPID,COMM,SAL) SELECT employee_id EMPID, hire_date HIREDATE, salary SAL, commission_pct COMM FROM employees
102. Conditional INSERT FIRST INSERT FIRST WHEN salary < 5000 THEN INTO sal_low VALUES (employee_id, last_name, salary) WHEN salary between 5000 and 10000 THEN INTO sal_mid VALUES (employee_id, last_name, salary) ELSE INTO sal_high VALUES (employee_id, last_name, salary) SELECT employee_id, last_name, salary FROM employees
103.
104. Pivoting INSERT INSERT ALL INTO sales_info VALUES (employee_id,week_id,sales_MON) INTO sales_info VALUES (employee_id,week_id,sales_TUE) INTO sales_info VALUES (employee_id,week_id,sales_WED) INTO sales_info VALUES (employee_id,week_id,sales_THUR) INTO sales_info VALUES (employee_id,week_id, sales_FRI) SELECT EMPLOYEE_ID, week_id, sales_MON, sales_TUE, sales_WED, sales_THUR,sales_FRI FROM sales_source_data;
105. UPDATE UPDATE employees SET department_id = 50 WHERE employee_id = 113; UPDATE copy_emp SET department_id = 110; UPDATE employees SET department_id = 50 WHERE employee_id = null; UPDATE employees SET job_id = (SELECT job_id FROM employees WHERE employee_id = 205) WHERE employee_id = 113;
106. UPDATE 中的关联子查询 UPDATE table1 alias1 SET column = (SELECT expression FROM table2 alias2 WHERE alias1.column = alias2.column );
107. DELETE DELETE FROM departments WHERE department_name = ‘Finance'; DELETE FROM copy_emp; DELETE FROM employees WHERE department_id = (SELECT department_id FROM departments WHERE department_name LIKE '%Public%');
108. DELETE 中的关联子查询 DELETE FROM table1 alias1 WHERE column operator (SELECT expression FROM table2 alias2 WHERE alias1.column = alias2.column);
109.
110.
111.
112. 事务的显式控制 SAVEPOINT B SAVEPOINT A DELETE INSERT UPDATE INSERT COMMIT 时间轴 Transaction ROLLBACK to SAVEPOINT B ROLLBACK to SAVEPOINT A ROLLBACK
113.
114.
115.
116.
117.
118. 读一致性的实现 SELECT * FROM userA.employees; UPDATE employees SET salary = 7000 WHERE last_name = 'Grant'; Data blocks Undo segments Changed and unchanged data Before change (“old” data) 用户 A 用户 B Read- consistent image
124. CREATE TABLE DESCRIBE dept CREATE TABLE dept (deptno NUMBER(2), dname VARCHAR2(14), loc VARCHAR2(13), create_date DATE DEFAULT SYSDATE );
125. 引用其他用户的表 USERB USERA SELECT * FROM userB.employees; SELECT * FROM userA.employees;
126. CTAS (Create Table As Select) CREATE TABLE dept80 AS SELECT employee_id, last_name, salary*12 ANNSAL, hire_date FROM employees WHERE department_id = 80; DESCRIBE dept80
127. 数据类型 未经处理的类型 RAW and LONG RAW 二进制数据类型 (up to 4 GB) BLOB 存储在外部文件的二进制数据类型 (up to 4 GB) BFILE 日期类型 DATE 变长的字符类型 (up to 2 GB) LONG 字符类型 (up to 4 GB) CLOB 代表表中数据行的唯一地址 ROWID 定长的字符数据 CHAR( size ) 变长的数值类型 NUMBER( p , s) 变长的字符类型 VARCHAR2( size ) 描述 Data Type
128. 数据类型 存储时间间隔的类型 INTERVAL YEAR TO MONTH 存储时间间隔的类型 INTERVAL DAY TO SECOND 较精细的日期类型 TIMESTAMP 描述 Data Type
141. 创建视图 CREATE [OR REPLACE] [FORCE| NOFORCE ] VIEW view [( alias [, alias ]...)] AS subquery [WITH CHECK OPTION [CONSTRAINT constraint ]] [WITH READ ONLY [CONSTRAINT constraint ]]; CREATE OR REPLACE VIEW empvu80 (id_number, name, sal, department_id) AS SELECT employee_id, first_name || ' ' || last_name, salary, department_id FROM employees WHERE department_id = 80;
142.
143.
144.
145.
146.
147.
148.
149. 创建序列 CREATE SEQUENCE sequence [INCREMENT BY n ] [START WITH n ] [{MAXVALUE n | NOMAXVALUE }] [{MINVALUE n | NOMINVALUE }] [{CYCLE | NOCYCLE }] [{CACHE n | NOCACHE}];