Oracle 基础语句大全:从数据定义到复杂查询

一、DDL(数据定义语言):定义数据库结构
1. 创建表(CREATE TABLE)
-- 语法格式
CREATE TABLE [schema.]table_name (column1 datatype [CONSTRAINT constraint1],column2 datatype [DEFAULT default_value],-- 表级约束[CONSTRAINT primary_key PRIMARY KEY (column1)],[CONSTRAINT foreign_key FOREIGN KEY (column2) REFERENCES ref_table(ref_col)]
);-- 示例:创建员工表
CREATE TABLE hr.employees (emp_id NUMBER(6) PRIMARY KEY,emp_name VARCHAR2(50) NOT NULL,salary NUMBER(10,2) CHECK (salary > 0),hire_date DATE DEFAULT SYSDATE,dept_id NUMBER(4) REFERENCES hr.departments(dept_id)
);-- Oracle 特有数据类型
-- VARCHAR2(n):可变长度字符串,n为最大长度
-- NUMBER(p,s):数值型,p总位数,s小数位
-- DATE:日期时间类型,包含年月日时分秒
-- CLOB:大文本类型(最大4GB)
-- BLOB:二进制大对象
2. 修改表(ALTER TABLE)
-- 添加列
ALTER TABLE table_name ADD (new_column datatype [CONSTRAINT]);
ALTER TABLE hr.employees ADD (email VARCHAR2(100) UNIQUE);-- 修改列定义
ALTER TABLE table_name MODIFY (column_name datatype [NULL|NOT NULL]);
ALTER TABLE hr.employees MODIFY (salary NUMBER(12,2));-- 删除列
ALTER TABLE table_name DROP COLUMN column_name;
ALTER TABLE hr.employees DROP COLUMN email;-- 添加约束
ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY/UNIQUE/CHECK/Foreign KEY (...);
ALTER TABLE hr.employees ADD CONSTRAINT uk_emp_name UNIQUE (emp_name);
3. 删除表(DROP TABLE)
-- 普通删除
DROP TABLE table_name [CASCADE CONSTRAINTS]; -- 级联删除外键
DROP TABLE hr.temp_employees;-- 清空表数据但保留结构
TRUNCATE TABLE table_name; -- 比DELETE更快,不记录日志
TRUNCATE TABLE hr.employees;
4. 创建索引(CREATE INDEX)
-- 普通索引
CREATE INDEX idx_table_column ON table_name(column1, column2);
CREATE INDEX idx_emp_salary ON hr.employees(salary);-- 唯一索引
CREATE UNIQUE INDEX idx_unique ON table_name(unique_column);-- 函数索引(Oracle 特有)
CREATE INDEX idx_emp_upper ON hr.employees(UPPER(emp_name));
5. 创建序列(CREATE SEQUENCE)
-- 语法
CREATE SEQUENCE [schema.]sequence_nameSTART WITH nINCREMENT BY nMINVALUE n | NOMINVALUEMAXVALUE n | NOMAXVALUECYCLE | NOCYCLECACHE n | NOCACHE;-- 示例:创建员工ID序列
CREATE SEQUENCE hr.emp_seqSTART WITH 1001INCREMENT BY 1MINVALUE 1NOMAXVALUENOCYCLECACHE 20;-- 使用序列
INSERT INTO hr.employees(emp_id, emp_name) 
VALUES (hr.emp_seq.NEXTVAL, '张三');
SELECT hr.emp_seq.CURRVAL FROM DUAL; -- 查询当前值
二、DML(数据操作语言):操作表数据
1. 插入数据(INSERT)
-- 标准插入
INSERT INTO table_name (column1, column2) VALUES (value1, value2);
INSERT INTO hr.employees(emp_id, emp_name, salary) 
VALUES (1001, '张三', 8000);-- 插入查询结果
INSERT INTO target_table SELECT * FROM source_table;
INSERT INTO hr.emp_backup SELECT * FROM hr.employees;-- 批量插入(Oracle 特有)
INSERT ALLINTO dept_emp VALUES (1001, 10)INTO dept_emp VALUES (1002, 20)
SELECT * FROM DUAL;
2. 更新数据(UPDATE)
-- 单表更新
UPDATE table_name SET column1 = value1, column2 = value2
WHERE condition;
UPDATE hr.employees SET salary = salary * 1.1
WHERE dept_id = 10 AND hire_date < '2020-01-01';-- 多表更新(Oracle 特有)
UPDATE hr.employees e
SET e.salary = (SELECT avg(salary) FROM hr.employees WHERE dept_id = e.dept_id)
WHERE e.salary < (SELECT avg(salary) FROM hr.employees WHERE dept_id = e.dept_id);
3. 删除数据(DELETE)
-- 删除符合条件的记录
DELETE FROM table_name WHERE condition;
DELETE FROM hr.employees WHERE hire_date < '2015-01-01';-- 清空表(与TRUNCATE区别:DELETE可回滚,TRUNCATE不可回滚)
DELETE FROM hr.employees;
4. 查询数据(SELECT)
-- 基础查询
SELECT column1, column2 FROM table_name WHERE condition;
SELECT emp_name, salary FROM hr.employees WHERE dept_id = 10;-- 去重与别名
SELECT DISTINCT dept_id FROM hr.employees;
SELECT emp_name AS "员工姓名", salary * 12 AS "年薪" FROM hr.employees;-- 排序与限制(Oracle 12c+支持LIMIT,传统用ROWNUM)
SELECT * FROM hr.employees ORDER BY salary DESC, emp_name ASC;
SELECT * FROM hr.employees WHERE ROWNUM <= 10; -- 前10条-- 多表连接
-- 内连接
SELECT e.emp_name, d.dept_name
FROM hr.employees e INNER JOIN hr.departments d
ON e.dept_id = d.dept_id;-- 外连接
SELECT e.emp_name, d.dept_name
FROM hr.employees e LEFT JOIN hr.departments d
ON e.dept_id = d.dept_id;-- 子查询
SELECT emp_name, salary
FROM hr.employees
WHERE salary > (SELECT avg(salary) FROM hr.employees);
三、TCL(事务控制语言):管理事务
-- 开始事务(隐式开始,无需命令)
BEGIN TRANSACTION; -- 非Oracle语法,Oracle自动开始事务-- 提交事务
COMMIT; -- 永久保存数据变更-- 回滚事务
ROLLBACK; -- 撤销未提交的变更-- 设置保存点
SAVEPOINT savepoint_name;
UPDATE hr.employees SET salary = salary * 1.1 WHERE dept_id = 10;
SAVEPOINT dept10_updated;
UPDATE hr.employees SET salary = salary * 1.2 WHERE dept_id = 20;
ROLLBACK TO dept10_updated; -- 回滚到dept10_updated点,保留dept10的更新-- 自动提交(会话级设置)
SET AUTOCOMMIT ON; -- 每条DML后自动提交
四、DCL(数据控制语言):管理权限
1. 用户管理
-- 创建用户
CREATE USER username IDENTIFIED BY passwordDEFAULT TABLESPACE tablespace_nameQUOTA nG ON tablespace_name;
CREATE USER hr_user IDENTIFIED BY hr123DEFAULT TABLESPACE usersQUOTA 500M ON users;-- 修改密码
ALTER USER username IDENTIFIED BY new_password;
ALTER USER hr_user IDENTIFIED BY hr456;-- 删除用户
DROP USER username [CASCADE]; -- CASCADE删除用户所有对象
DROP USER hr_user CASCADE;
2. 权限管理
-- 授予权限
-- 系统权限(如创建表、删除用户)
GRANT CREATE TABLE, ALTER USER TO username;
GRANT CREATE SESSION TO hr_user; -- 允许登录数据库-- 对象权限(表、视图等)
GRANT SELECT, INSERT, UPDATE ON hr.employees TO hr_user;
GRANT ALL PRIVILEGES ON hr.departments TO hr_user;-- 授予角色
GRANT DBA, CONNECT TO username; -- DBA角色拥有全部权限-- 回收权限
REVOKE CREATE TABLE FROM username;
REVOKE UPDATE ON hr.employees FROM hr_user;
五、常用函数与表达式
1. 字符串函数
-- 拼接:CONCAT或||
SELECT CONCAT(emp_name, ' works in ') || dept_name
FROM hr.employees e, hr.departments d
WHERE e.dept_id = d.dept_id;-- 长度:LENGTH
SELECT emp_name, LENGTH(emp_name) FROM hr.employees;-- 大小写转换:UPPER, LOWER, INITCAP
SELECT UPPER(emp_name) FROM hr.employees;
SELECT INITCAP(emp_name) FROM hr.employees; -- 首字母大写-- 截取:SUBSTR(start, length)
SELECT SUBSTR(emp_name, 1, 3) FROM hr.employees; -- 前3个字符-- 替换:REPLACE
SELECT REPLACE(emp_name, '张', '王') FROM hr.employees;
2. 数值函数
-- 四舍五入:ROUND(n, decimal)
SELECT ROUND(salary, -3) FROM hr.employees; -- 四舍五入到千位-- 取整:FLOOR, CEIL
SELECT FLOOR(3.7), CEIL(3.1) FROM DUAL; -- 3, 4-- 绝对值:ABS
SELECT ABS(-100) FROM DUAL; -- 100-- 幂运算:POWER(n, m)
SELECT POWER(2, 3) FROM DUAL; -- 8
3. 日期函数
-- 获取当前日期:SYSDATE
SELECT SYSDATE FROM DUAL; -- 格式:2025-06-18 15:30:00-- 日期运算:加减天数
SELECT SYSDATE + 7 FROM DUAL; -- 一周后
SELECT hire_date, SYSDATE - hire_date AS "入职天数"
FROM hr.employees;-- 提取部分日期:EXTRACT
SELECT EXTRACT(YEAR FROM hire_date) AS "入职年份"
FROM hr.employees;-- 日期格式化:TO_CHAR(date, '格式')
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL; -- 2025-06-18 15:30:00
4. 转换函数
-- 字符串转日期:TO_DATE
SELECT TO_DATE('2025-01-01', 'YYYY-MM-DD') FROM DUAL;-- 数字转字符串:TO_CHAR
SELECT TO_CHAR(salary, 'L999,999.00') FROM hr.employees; -- 带货币符号格式化-- 日期转数字:TO_NUMBER
SELECT TO_NUMBER(TO_CHAR(SYSDATE, 'YYYY')) FROM DUAL; -- 获取年份数字
六、PL/SQL 基础语句
1. 存储过程(PROCEDURE)
-- 创建存储过程:计算员工平均工资
CREATE OR REPLACE PROCEDURE hr.get_avg_salary(p_dept_id IN NUMBER,p_avg_salary OUT NUMBER
) AS
BEGINSELECT AVG(salary) INTO p_avg_salaryFROM hr.employeesWHERE dept_id = p_dept_id;IF p_avg_salary IS NULL THENp_avg_salary := 0;END IF;
END;
/-- 调用存储过程
DECLAREv_avg_salary NUMBER;
BEGINhr.get_avg_salary(10, v_avg_salary);DBMS_OUTPUT.PUT_LINE('部门10平均工资:' || v_avg_salary);
END;
/
2. 函数(FUNCTION)
-- 创建函数:返回员工姓名
CREATE OR REPLACE FUNCTION hr.get_emp_name(p_emp_id IN NUMBER)
RETURN VARCHAR2 ASv_emp_name VARCHAR2(50);
BEGINSELECT emp_name INTO v_emp_nameFROM hr.employeesWHERE emp_id = p_emp_id;RETURN v_emp_name;
EXCEPTIONWHEN NO_DATA_FOUND THENRETURN '员工不存在';
END;
/-- 调用函数
SELECT hr.get_emp_name(1001) FROM DUAL;
3. 触发器(TRIGGER)
-- 创建触发器:记录员工工资变更日志
CREATE OR REPLACE TRIGGER hr.log_salary_change
AFTER UPDATE OF salary ON hr.employees
FOR EACH ROW
BEGININSERT INTO hr.salary_log (emp_id, old_salary, new_salary, update_time)VALUES (:OLD.emp_id, :OLD.salary, :NEW.salary, SYSDATE);
END;
/
七、Oracle 特有功能语句
1. 分区表操作
-- 创建分区表(范围分区)
CREATE TABLE hr.sales_history (sale_id NUMBER,sale_date DATE,amount NUMBER
)
PARTITION BY RANGE (sale_date) (PARTITION p_2024 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD')),PARTITION p_2025 VALUES LESS THAN (TO_DATE('2026-01-01', 'YYYY-MM-DD')),PARTITION p_other VALUES LESS THAN (MAXVALUE)
);-- 新增分区
ALTER TABLE hr.sales_history ADD PARTITION p_2026 VALUES LESS THAN (TO_DATE('2027-01-01', 'YYYY-MM-DD'));
2. 物化视图(Materialized View)
-- 创建物化视图(自动刷新)
CREATE MATERIALIZED VIEW hr.dept_salary_summary
REFRESH COMPLETE ON DEMAND
AS
SELECT dept_id, AVG(salary) avg_sal, COUNT(*) emp_count
FROM hr.employees
GROUP BY dept_id;-- 手动刷新物化视图
REFRESH MATERIALIZED VIEW hr.dept_salary_summary;
3. 闪回查询(Flashback Query)
-- 查询过去时间点的数据
SELECT * FROM hr.employees
AS OF TIMESTAMP SYSDATE - 1 -- 24小时前的数据-- 闪回删除的表(回收站功能)
FLASHBACK TABLE hr.employees TO BEFORE DROP;
八、常用系统视图与查询
-- 查看用户所有表
SELECT table_name FROM user_tables;-- 查看表结构
DESCRIBE hr.employees;
SELECT column_name, data_type, nullable
FROM user_tab_columns
WHERE table_name = 'EMPLOYEES';-- 查看用户权限
SELECT * FROM user_sys_privs;
SELECT * FROM user_tab_privs;-- 查看数据库性能视图(需要DBA权限)
SELECT * FROM v$session;
SELECT * FROM v$instance;

总结:Oracle 基础语句核心要点

  • DDL:掌握表、索引、序列的创建与修改,注意 Oracle 特有数据类型(如 VARCHAR2、NUMBER)和约束机制。
  • DML:查询语句是核心,多表连接、子查询和 ROWNUM 分页是高频场景。
  • TCL:事务控制是数据一致性的关键,SAVEPOINT 可实现部分回滚。
  • PL/SQL:存储过程和函数用于封装业务逻辑,触发器实现数据变更自动化。
  • 特有功能:序列、分区表、物化视图等是 Oracle 企业级能力的体现,需结合业务场景使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85527.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【学习笔记】锁+死锁+gdb调试死锁

【学习笔记】锁死锁gdb调试死锁 一、互斥锁&#xff08;std::mutex&#xff09; 最基本的锁类型&#xff0c;提供排他性访问&#xff0c;同一时间仅允许一个线程持有锁。 #include <iostream> #include <mutex> #include <thread>std::mutex mtx; // 全局…

Flutter中将bytes转换成XFile对象上传

在Flutter中将字节数据(bytes)转换为XFile对象并上传可以通过以下步骤实现&#xff1a; 1.字节数据转临时文件 首先需要将字节数据写入临时文件&#xff0c;可以使用dart的File类实现&#xff1a; final tempDir await getTemporaryDirectory(); final file File(${tempDi…

饼图:数据可视化的“切蛋糕”艺术

饼图&#xff0c;作为数据可视化家族中最经典、最易识别的成员之一&#xff0c;其核心功能如同其名——像切分蛋糕一样&#xff0c;直观展示一个整体&#xff08;100%&#xff09;被划分为若干组成部分的比例关系。 往期文章推荐: 20.用Mermaid代码画ER图&#xff1a;AI时代的…

Flutter - 原生交互 - 相机Camera - 曝光,缩放,录制视频

曝光 Flutter上CupertinoSlider组件的样式是iOS上的Slider,使用该组件控制曝光量, Camera插件提供的API是CameraController的 Future<double> setExposureOffset(double offset) async {... }最后调用iOS端的系统方法控制曝光值 - (void)setExposureTargetBias:(floa…

Python中布尔值在函数中的巧妙运用

在 Python 中&#xff0c;布尔值&#xff08;True 和 False&#xff09;不仅可以用于简单的条件判断&#xff0c;还可以在函数中发挥强大的作用。通过合理使用布尔值&#xff0c;你可以使函数更加灵活、高效且易于理解。今天&#xff0c;就让我们一起深入探讨如何在函数中巧妙运…

解决sql查询中in查询项过多时很慢的问题

最近遇到查询一张大数据量表时&#xff0c;需要对一个字段做in查询&#xff0c;in中的元素数量可能达到几千个&#xff0c;即使对这个字段加上索引&#xff0c;速度也慢到无法接受 示例表结构如下&#xff1a; 表中有几十万的数据&#xff0c;且example_id和data_id字段加了联…

Spring---Spring MVC 执行流程

SpringMVC执行流程分为两个&#xff1a;前后端分离与视图阶段&#xff08;不分离&#xff09; 视图阶段&#xff08;JSP/Thymeleaf/Freemarker&#xff09; SpringMVC 前后端分离阶段 SpringMVC中重要组建有哪些&#xff1f; 前端控制器&#xff08;DispatcherServlet&#x…

Llama 4模型卡片及提示词模板

Llama 4模型卡片及提示词模板 Llama 4 模型卡及提示格式介绍 Llama 4 模型概述 Llama 4 是一系列预训练和指令微调的混合专家(Mixture-of-Experts, MoE)大语言模型,包含两种规模:Llama 4 Scout和Llama 4 Maverick。该模型针对多模态理解、多语言任务、编码、工具调用及智…

使用Advanced Installer软件将winform程序打包成exe安装文件

使用Advanced Installer软件将winform程序打包成exe安装文件_c#程序打包软件-CSDN博客 软件的下载连接 https://download.csdn.net/download/qq_20222919/87780646

NDS 中文游戏全集下载 任天堂NDS简介NDS支持GBA游戏

这是一份关于任天堂NDS游戏及其平台的简介&#xff1a; 游戏全集打包下载 https://pan.quark.cn/s/8805da9a09c4 NDS 是什么&#xff1f; 全称&#xff1a; Nintendo DS (NDS)类型&#xff1a; 由任天堂开发和发行的掌上游戏机。世代&#xff1a; 第七世代游戏机 (与PSP、Wii…

Kamailio rtpengine_subscribe_request

master 版本的 rtpengine 新增了函数 rtpengine_subscribe_request 应该是 siprec 增加的 改天做下测试 参考链接&#xff1a; https://lists.kamailio.org/mailman3/hyperkitty/list/sr-userslists.kamailio.org/thread/Q7YJDVBHZX4BIWG23VRVRYW7N5SAAUOR/ https://kamai…

Java八股文——计算机网络「网络模型篇」

什么是OSI七层模型&#xff1f; 面试官您好&#xff0c;OSI&#xff08;Open Systems Interconnection&#xff09;七层模型&#xff0c;是由国际标准化组织&#xff08;ISO&#xff09;提出的一个网络互联的开放式参考模型。 它是一个理论上的、概念性的框架&#xff0c;其核…

国产服务器【银河麒麟v10】【CPU鲲鹏920】部署Nacos

目录 准备工作开始安装1. 下载nacos2. 启动3. 检查 结束 准备工作 环境要求&#xff1a;Linux虚拟机nacos2.3.2 安装包 开始安装 1. 下载nacos 方式1 wget https://github.com/alibaba/nacos/releases/download/2.3.2/nacos-server-2.3.2.tar.gz方式2 去官网自行下载所需版…

一款强大的音视频处理工具--FFmpeg-2--常用音频处理示例

1、查看音频文件详细信息 opus&#xff0c;wav&#xff0c;pcm等音频格式都适用。 ffprobe -i 1.opus说明&#xff1a; Input 0, ogg, from ‘1.opus’: Input 0&#xff1a;表示这是第一个输入文件。ogg&#xff1a;表示该文件封装在Ogg容器格式中&#xff08;Opus通常封装…

在 ArcPy 脚本中进行错误处理和调试

查看错误信息 当捕获到错误后&#xff0c;查看详细的错误信息对于定位问题和解决问题至关重要。 &#xff08;一&#xff09;打印错误消息 在 except 块中&#xff0c;可以直接打印错误对象来获取错误消息。例如&#xff1a; try:arcpy.CalculateField_management("in…

C++11标准(4)——并发库(多线程)

欢迎来到博主的专栏:c杂谈 博主ID&#xff1a;代码小豪 文章目录 thread的相关函数thisthread c11新增了与并发相关的库&#xff0c;包含线程、以及互斥、同步等与线程安全相关的库&#xff0c;与linux中所使用POSIX库不同&#xff0c;并发库是将其进行了封装&#xff0c;不再是…

优化TCP/IP协议栈与网络层

优化TCP/IP协议栈与网络层 在高性能架构中,网络性能往往成为系统吞吐量与响应速度的关键因素之一。而TCP/IP协议栈作为现代互联网通信的核心,其默认配置在高并发场景下常常无法满足大规模分布式系统的性能需求。因此,架构师在构建系统时,有必要对TCP/IP协议栈及其所在的网…

Nginx常见功能

Nginx 是一个高性能的 HTTP 和反向代理服务器&#xff0c;除了基本的 Web 服务功能外&#xff0c;它还支持许多高级功能。以下是 Nginx 常用的一些功能及其设置方法&#xff1a; 1. 反向代理 反向代理是 Nginx 最常用的功能之一&#xff0c;用于将客户端请求转发给后端服务器&a…

UniSAL:用于组织病理学图像分类的统一半监督主动学习方法|文献速递-深度学习医疗AI最新文献

Title 题目 UniSAL: Unified Semi-supervised Active Learning for histopathologicalimage classification UniSAL&#xff1a;用于组织病理学图像分类的统一半监督主动学习方法 01 文献速递介绍 组织病理学图像在癌症筛查、诊断及治疗决策中起着关键作用&#xff0c;有助…

智慧园区建设资料合集(Wordppt原件)

化工园区安全风险智能化管控平台.docx 数字孪生赋能的智慧园区物联网云平台建设方案.pptx 园区智慧安防解决方案.docx 新型智慧园区规划设计方案.pptx 新型智慧园区建设方案.docx 园区大数据治理解决方案.pptx 智慧产业园区综合解决方案.docx 智慧工业园区大数据云平台解决方案…