Oracle 常用 SQL 命令集合
以下是一份全面的 Oracle 数据库常用 SQL 命令集合,涵盖数据库管理、对象操作、数据查询优化等核心功能:
一、数据库连接与基本信息
sql复制代码
-- 连接到数据库
CONNECT username/password@service_name-- 查看当前用户
SHOW USER-- 查看数据库版本
SELECT * FROM v$version;-- 查看实例状态
SELECT instance_name, status, database_status FROM v$instance;
二、表空间管理
sql复制代码
-- 查看表空间
SELECT tablespace_name, status, contents FROM dba_tablespaces;-- 创建表空间
CREATE TABLESPACE my_ts
DATAFILE '/u01/oradata/mydb/my_ts01.dbf' SIZE 100M
AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;-- 扩展表空间
ALTER TABLESPACE my_ts ADD DATAFILE
'/u01/oradata/mydb/my_ts02.dbf' SIZE 50M;-- 修改用户默认表空间
ALTER USER scott DEFAULT TABLESPACE my_ts;
三、用户与权限
sql复制代码
-- 创建用户
CREATE USER dev_user IDENTIFIED BY "Str0ngP@ss"
DEFAULT TABLESPACE users
QUOTA UNLIMITED ON users;-- 授予权限
GRANT CREATE SESSION, CREATE TABLE TO dev_user;
GRANT SELECT, INSERT ON hr.employees TO dev_user;-- 创建角色
CREATE ROLE data_analyst;
GRANT SELECT ANY TABLE, CREATE VIEW TO data_analyst;-- 查看用户权限
SELECT * FROM dba_sys_privs WHERE grantee = 'DEV_USER';
四、表管理
1. 创建表
sql复制代码
CREATE TABLE employees (emp_id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,first_name VARCHAR2(50) NOT NULL,last_name VARCHAR2(50),hire_date DATE DEFAULT SYSDATE,salary NUMBER(10,2),dept_id NUMBER,CONSTRAINT fk_dept FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
) TABLESPACE users;
2. 修改表结构
sql复制代码
-- 添加列
ALTER TABLE employees ADD (phone VARCHAR2(15));-- 修改列
ALTER TABLE employees MODIFY (salary NUMBER(12,2));-- 重命名列
ALTER TABLE employees RENAME COLUMN phone TO mobile;-- 删除列
ALTER TABLE employees DROP COLUMN mobile;
3. 表维护
sql复制代码
-- 重命名表
RENAME employees TO staff;-- 截断表
TRUNCATE TABLE temp_data;-- 删除表
DROP TABLE employees PURGE; -- 彻底删除
五、数据操作 (CRUD)
1. 插入数据
sql复制代码
-- 插入单行
INSERT INTO employees (first_name, last_name, salary)
VALUES ('John', 'Doe', 5000);-- 插入多行
INSERT ALLINTO employees (first_name, last_name) VALUES ('Alice', 'Smith')INTO employees (first_name, last_name) VALUES ('Bob', 'Johnson')
SELECT 1 FROM dual;-- 从查询插入
INSERT INTO managers
SELECT * FROM employees WHERE salary > 8000;
2. 查询数据
sql复制代码
-- 分页查询 (12c+)
SELECT * FROM employees
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;-- 正则表达式查询
SELECT * FROM employees
WHERE REGEXP_LIKE(first_name, '^Ste(v|ph)en$');-- 层次查询
SELECT LPAD(' ', 2*(LEVEL-1)) || last_name AS org_chart
FROM employees
START WITH manager_id IS NULL
CONNECT BY PRIOR emp_id = manager_id;-- 分析函数
SELECT dept_id, AVG(salary) AS avg_sal,RANK() OVER (ORDER BY AVG(salary) DESC) dept_rank
FROM employees
GROUP BY dept_id;
3. 更新数据
sql复制代码
-- 关联更新
UPDATE employees e
SET salary = salary * 1.1
WHERE EXISTS (SELECT 1 FROM departments d WHERE d.dept_id = e.dept_id AND d.location = 'NEW YORK'
);-- 使用MERGE更新或插入
MERGE INTO bonuses b
USING (SELECT emp_id, salary, dept_id FROM employees WHERE hire_date > DATE '2020-01-01'
) e
ON (b.emp_id = e.emp_id)
WHEN MATCHED THEN UPDATE SET b.bonus = e.salary * 0.1
WHEN NOT MATCHED THEN INSERT (b.emp_id, b.bonus)
VALUES (e.emp_id, e.salary * 0.15);
4. 删除数据
sql复制代码
-- 关联删除
DELETE FROM employees e
WHERE dept_id IN (SELECT dept_id FROM departments WHERE location = 'CLOSED'
);
六、索引管理
sql复制代码
-- 创建B-tree索引
CREATE INDEX idx_emp_name ON employees(last_name);-- 创建位图索引
CREATE BITMAP INDEX idx_emp_dept ON employees(dept_id);-- 创建函数索引
CREATE INDEX idx_emp_upper ON employees(UPPER(first_name));-- 重建索引
ALTER INDEX idx_emp_name REBUILD ONLINE;-- 监控索引使用
SELECT * FROM v$object_usage WHERE index_name = 'IDX_EMP_NAME';
七、PL/SQL 基础
sql复制代码
-- 匿名块
DECLAREv_count NUMBER;
BEGINSELECT COUNT(*) INTO v_count FROM employees;DBMS_OUTPUT.PUT_LINE('Total employees: ' || v_count);-- 异常处理EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('No data found');
END;
/-- 创建存储过程
CREATE OR REPLACE PROCEDURE increase_salary (p_dept_id IN NUMBER, p_percent IN NUMBER
) AS
BEGINUPDATE employees SET salary = salary * (1 + p_percent/100)WHERE dept_id = p_dept_id;COMMIT;
END increase_salary;
/
八、性能优化
sql复制代码
-- 执行计划分析
EXPLAIN PLAN FOR
SELECT * FROM employees WHERE dept_id = 10;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);-- 收集统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS('HR', 'EMPLOYEES');-- SQL调优顾问
DECLAREtune_task VARCHAR2(30);
BEGINtune_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_text => 'SELECT * FROM employees WHERE salary > :1',bind_list => sql_binds(anydata.ConvertNumber(5000)),user_name => 'HR',scope => 'COMPREHENSIVE',time_limit => 60);DBMS_SQLTUNE.EXECUTE_TUNING_TASK(tune_task);
END;
/
九、系统管理
sql复制代码
-- 查看锁信息
SELECT * FROM v$locked_object;-- 查看会话
SELECT sid, serial#, username, status FROM v$session;-- 终止会话
ALTER SYSTEM KILL SESSION '123,4567'; -- sid, serial#-- 表空间使用情况
SELECT tablespace_name, ROUND(SUM(bytes) / 1024/1024) total_mb,ROUND(SUM(bytes - NVL(free_bytes,0)) / 1024/1024) used_mb
FROM dba_data_files
LEFT JOIN (SELECT tablespace_name ts, SUM(bytes) free_bytes FROM dba_free_space GROUP BY tablespace_name)
USING (tablespace_name)
GROUP BY tablespace_name;
十、数据字典视图
sql复制代码
-- 查看表结构
DESC user_tab_columns;
SELECT column_name, data_type, nullable
FROM user_tab_columns
WHERE table_name = 'EMPLOYEES';-- 查看约束
SELECT constraint_name, constraint_type
FROM user_constraints
WHERE table_name = 'EMPLOYEES';-- 查看索引
SELECT index_name, column_name
FROM user_ind_columns
WHERE table_name = 'EMPLOYEES';-- 查看对象依赖
SELECT * FROM user_dependencies
WHERE referenced_name = 'EMPLOYEES';
十一、备份与恢复
sql复制代码
-- 数据泵导出 (命令行)
expdp system/password DIRECTORY=data_pump_dir DUMPFILE=hr.dmp SCHEMAS=hr-- 数据泵导入
impdp system/password DIRECTORY=data_pump_dir DUMPFILE=hr.dmp REMAP_SCHEMA=hr:new_hr-- RMAN备份 (命令行)
rman TARGET /
BACKUP DATABASE PLUS ARCHIVELOG;
Oracle 特色功能提醒:
- 高级分区:支持范围、列表、哈希、复合分区
sql复制代码
CREATE TABLE sales (sale_id NUMBER,sale_date DATE,amount NUMBER ) PARTITION BY RANGE (sale_date) (PARTITION p2022 VALUES LESS THAN (DATE '2023-01-01'),PARTITION p2023 VALUES LESS THAN (MAXVALUE) );
- 虚拟列:
sql复制代码
ALTER TABLE employees ADD (name_caps VARCHAR2(100) GENERATED ALWAYS AS (UPPER(first_name || ' ' || last_name)));
- 闪回技术:
sql复制代码
-- 查询历史数据 SELECT * FROM employees AS OF TIMESTAMP SYSTIMESTAMP - INTERVAL '1' HOUR;-- 恢复被删除的表 FLASHBACK TABLE employees TO BEFORE DROP;
- 结果缓存:
sql复制代码
SELECT /*+ RESULT_CACHE */ AVG(salary) FROM employees;
重要提示:
- Oracle 区分大小写(除非使用双引号)
- 使用
COMMIT
提交事务,ROLLBACK
回滚- 生产环境操作前建议使用
SAVEPOINT
- 使用 SQL*Plus 时,以分号
;
或/
结束语句- 注意 Oracle 中的空值处理(
NULL
参与运算结果通常为NULL
)