当前位置: 首页 > news >正文

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

  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
http://www.dtcms.com/a/293590.html

相关文章:

  • 将 `knife4j` 和 `springdoc-openapi` 集成到你的 Spring Boot 应用
  • 微软Fabric重塑数据管理:Forrester报告揭示高ROI
  • 一次Oracle集群脑裂问题分析处理
  • 前端实现类浏览器的 Ctrl+F 全局搜索功能(Vue2 + mark.js,用于Electron 、QT等没有浏览器Ctrl+F全局搜索功能的壳子中)
  • Oracle迁移到高斯,查询字段默认小写,解决办法
  • Qt 常用控件 - 1
  • 分布式风电分散式风电
  • Qt内存管理的核心点
  • 技术速递|使用 Semantic Kernel 与 A2A 协议构建多智能体解决方案
  • MCP:UVX的安装
  • 计算机组成原理(一)
  • 架构师--缓存场景
  • 利用DeepSeek编写一个使用lzav算法的文件压缩工具
  • 什么是LLMs.txt?如何在线生成?robots.txt一键转LLMs.txt
  • 第九讲:C++中的list与forward_list
  • OpenCV 零基础到项目实战 | DAY 2:图像预处理全解析
  • 基于STM32驱动ADS1118实现电压采样并输出到串口
  • PetaLinux 使用技巧与缓存配置
  • 从零搭建 OpenCV 项目(新手向)-- 第二天 OpenCV图像预处理(一)
  • 第四章 Freertos物联网实战DHT11温湿度模块
  • 嵌入式学习-(李宏毅)机器学习(1)-day28
  • 本地电脑映射端口到外网访问的开启方法和注意事项,内网服务提供跨网使用简单操作实现
  • 神经网络和机器学习的一些基本概念
  • 某种物联网SIM卡流量查询方法
  • BQ4050RSMR DIOTEC高精度锂电池保护与电量监测芯片 集成保护+计量+通信
  • 2025年Zigbee技术白皮书:全球物联网无线通信的关键创新
  • 【Linux | 网络】应用层(HTTPS)
  • 如何在 Ubuntu 20.04 Linux 上安装 TeamSpeak 客户端
  • SparkSQL 聚合函数 MAX 对 NULL 值的处理
  • AWS Lambda IoT数据处理异常深度分析:从告警到根因的完整排查之路