Oracle 常用 SQL 命令集合

以下是一份全面的 Oracle 数据库常用 SQL 命令集合,涵盖数据库管理、对象操作、数据查询优化等核心功能:


一、数据库连接与基本信息

sql复制代码

sql 复制代码
-- 连接到数据库
CONNECT username/password@service_name

-- 查看当前用户
SHOW USER

-- 查看数据库版本
SELECT * FROM v$version;

-- 查看实例状态
SELECT instance_name, status, database_status FROM v$instance;

二、表空间管理

sql复制代码

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复制代码

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复制代码

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复制代码

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复制代码

sql 复制代码
-- 重命名表
RENAME employees TO staff;

-- 截断表
TRUNCATE TABLE temp_data;

-- 删除表
DROP TABLE employees PURGE;  -- 彻底删除

五、数据操作 (CRUD)

1. 插入数据

sql复制代码

sql 复制代码
-- 插入单行
INSERT INTO employees (first_name, last_name, salary)
VALUES ('John', 'Doe', 5000);

-- 插入多行
INSERT ALL
  INTO 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复制代码

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复制代码

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复制代码

sql 复制代码
-- 关联删除
DELETE FROM employees e
WHERE dept_id IN (
  SELECT dept_id FROM departments 
  WHERE location = 'CLOSED'
);

六、索引管理

sql复制代码

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复制代码

sql 复制代码
-- 匿名块
DECLARE
  v_count NUMBER;
BEGIN
  SELECT COUNT(*) INTO v_count FROM employees;
  DBMS_OUTPUT.PUT_LINE('Total employees: ' || v_count);
  
  -- 异常处理
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('No data found');
END;
/

-- 创建存储过程
CREATE OR REPLACE PROCEDURE increase_salary (
  p_dept_id IN NUMBER, 
  p_percent IN NUMBER
) AS
BEGIN
  UPDATE employees 
  SET salary = salary * (1 + p_percent/100)
  WHERE dept_id = p_dept_id;
  COMMIT;
END increase_salary;
/

八、性能优化

sql复制代码

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调优顾问
DECLARE
  tune_task VARCHAR2(30);
BEGIN
  tune_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复制代码

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复制代码

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复制代码

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 特色功能提醒:

  1. 高级分区 :支持范围、列表、哈希、复合分区

    sql复制代码

    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)
    );
  2. 虚拟列

    sql复制代码

    sql 复制代码
    ALTER TABLE employees ADD (name_caps VARCHAR2(100) 
        GENERATED ALWAYS AS (UPPER(first_name || ' ' || last_name)));
  3. 闪回技术

    sql复制代码

    sql 复制代码
    -- 查询历史数据
    SELECT * FROM employees AS OF TIMESTAMP SYSTIMESTAMP - INTERVAL '1' HOUR;
    
    -- 恢复被删除的表
    FLASHBACK TABLE employees TO BEFORE DROP;
  4. 结果缓存

    sql复制代码

    sql 复制代码
    SELECT /*+ RESULT_CACHE */ AVG(salary) FROM employees;

重要提示

  1. Oracle 区分大小写(除非使用双引号)
  2. 使用 COMMIT 提交事务,ROLLBACK 回滚
  3. 生产环境操作前建议使用 SAVEPOINT
  4. 使用 SQL*Plus 时,以分号 ;/ 结束语句
  5. 注意 Oracle 中的空值处理(NULL 参与运算结果通常为 NULL
相关推荐
小白银子7 分钟前
零基础从头教学Linux(Day 60)
linux·数据库·mysql·oracle
瀚高PG实验室26 分钟前
数据库安全配置指导
服务器·数据库·瀚高数据库
憋问我,我也不会30 分钟前
MYSQL 命令
数据库·mysql
24K老游1 小时前
postgres15 flink cdc同步测试
数据库
无泡汽水2 小时前
MySQL入门练习50题
数据库·mysql
JIngJaneIL2 小时前
助农惠农服务平台|助农服务系统|基于SprinBoot+vue的助农服务系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·毕设·助农惠农服务平台
云外天ノ☼2 小时前
待办事项全栈实现:Vue3 + Node.js (Koa) + MySQL深度整合,构建生产级任务管理系统的技术实践
前端·数据库·vue.js·mysql·vue3·koa·jwt认证
小光学长3 小时前
基于Vue的智慧楼宇报修平台设计与实现066z15wb(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
CodeBlossom3 小时前
Spring Cache快速入门
java·数据库·spring
tuokuac3 小时前
ps -ef | grep redis
数据库·redis·缓存