视图
- 视图不存数据(普通视图),只存查询定义,每次访问都重新执行
- 视图能简化复杂查询,也能用来做权限隔离(只暴露部分列)
- WITH READ ONLY 明确禁止通过视图修改数据
- 物化视图(MATERIALIZED VIEW)会实际存数据,适合昂贵的统计查询
-- 1) 简单视图:可增删改(若底层可推导)
CREATE OR REPLACE VIEW v_emp_basic AS
SELECT employee_id, last_name, salary, department_id
FROM employees
WHERE department_id IS NOT NULL;
-- 2) 复杂视图:含聚合,只读
CREATE OR REPLACE VIEW v_dept_stats AS
SELECT d.department_id,
d.department_name,
COUNT(e.employee_id) AS headcount,
ROUND(AVG(e.salary), 2) AS avg_salary
FROM departments d
LEFT JOIN employees e ON e.department_id = d.department_id
GROUP BY d.department_id, d.department_name;
-- 3) 带检查选项:通过视图插入的数据必须满足视图条件
CREATE OR REPLACE VIEW v_emp_dept60 AS
SELECT * FROM employees WHERE department_id = 60
WITH CHECK OPTION;只作示例阅读:5 行写入限制下只开放单独创建普通空表;CTAS、删表、清空表、改结构、触发器和存储程序不允许执行。请在独立学习数据库中练习。
序列与自增主键
CREATE SEQUENCE seq_emp_id
START WITH 1000
INCREMENT BY 1
NOCACHE -- 开发环境便于观察;生产建议 CACHE 提高性能
NOCYCLE;
-- 取下一个值(每调用一次自增)
SELECT seq_emp_id.NEXTVAL FROM dual;
-- 取当前值(同一会话必须先调用过 NEXTVAL)
SELECT seq_emp_id.CURRVAL FROM dual;
INSERT INTO employees_demo (employee_id, last_name)
VALUES (seq_emp_id.NEXTVAL, 'Zhang');只作示例阅读:5 行写入限制下只开放单独创建普通空表;CTAS、删表、清空表、改结构、触发器和存储程序不允许执行。请在独立学习数据库中练习。
CREATE TABLE t_order (
order_id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
order_no VARCHAR2(30),
created_at DATE DEFAULT SYSDATE
);
INSERT INTO t_order (order_no) VALUES ('SO-2024-001');
-- 无需指定主键
SELECT * FROM t_order;只作示例阅读:5 行写入限制下只开放单独创建普通空表;CTAS、删表、清空表、改结构、触发器和存储程序不允许执行。请在独立学习数据库中练习。
同义词
- 同义词常用于屏蔽 schema 名,便于应用迁移时改指向
- 同义词只是别名,不占额外存储,但会增加一层解析开销
- 注意:同义词不改变权限,用户仍需对底层对象有权限
-- 私有同义词:只有当前用户能用
CREATE SYNONYM emp FOR hr.employees;
-- 公共同义词:所有用户都能用(需要权限)
CREATE PUBLIC SYNONYM employees FOR hr.employees;
-- 删除
DROP SYNONYM emp;私有同义词 CREATE SYNONYM 普通用户就能做;但这行 CREATE PUBLIC SYNONYM 需要 DBA 权限,否则报 ORA-01031: insufficient privileges。
只作示例阅读:公共同义词。请在独立学习数据库中练习。