Oracle 常用 SQL 命令集合

发布于:2025-07-24 ⋅ 阅读:(15) ⋅ 点赞:(0)

以下是一份全面的 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 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复制代码

-- 分页查询 (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复制代码

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

-- 执行计划分析
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复制代码

-- 查看锁信息
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 特色功能提醒:

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

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

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

    sql复制代码

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

    sql复制代码

    SELECT /*+ RESULT_CACHE */ AVG(salary) FROM employees;
    

重要提示

  1. Oracle 区分大小写(除非使用双引号)
  2. 使用 COMMIT 提交事务,ROLLBACK 回滚
  3. 生产环境操作前建议使用 SAVEPOINT
  4. 使用 SQL*Plus 时,以分号 ; 或 / 结束语句
  5. 注意 Oracle 中的空值处理(NULL 参与运算结果通常为 NULL

网站公告

今日签到

点亮在社区的每一天
去签到