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
相关推荐
钊兵2 小时前
mysql时间处理函数和操作笔记
数据库·笔记·mysql
掘根2 小时前
【MySQL数据库备份与恢复1】二进制日志,mysqlbinlog
数据库·mysql
技术卷3 小时前
详解力扣高频SQL50题之1148. 文章浏览 I【入门】
sql·leetcode·oracle
编程爱好者熊浪3 小时前
Navicat 远程连接SQLlite数据库
数据库
保护我方hair5 小时前
行业分类表sql
数据库·sql
烙印6015 小时前
MySQL的底层原理--InnoDB记录存储结构
数据库·mysql
范纹杉想快点毕业6 小时前
基于C语言的Zynq SOC FPGA嵌入式裸机设计和开发教程
c语言·开发语言·数据库·嵌入式硬件·qt·fpga开发·嵌入式实时数据库
我命由我123458 小时前
PostgreSQL 保留关键字冲突问题:语法错误 在 “user“ 或附近的 LINE 1: CREATE TABLE user
数据库·后端·sql·mysql·postgresql·问题·数据库系统
书唐瑞9 小时前
Percona pt-archiver 出现长事务
java·服务器·数据库
!chen9 小时前
Linux dd命令 数据备份、转换与磁盘操作的终极工具
linux·数据库·tomcat