【Oracle】Oracle常用语句大全

目录

  • 创建/删除数据库
  • 创建/删除表
  • 其他表操作
    • 增加字段
    • 修改字段
    • 重命名字段
    • 删除字段
  • 主键/索引/视图相关
  • 数据插入
  • 数据更新
  • 数据删除
  • 字段拼接
  • merge into
    • 语法
    • 案例
      • 素材
      • 同时更新和插入
        • 记录同步错误
  • 分页查询
  • 分组查询/筛选
  • 排序
  • 连接查询
    • 1. 内连接(INNER JOIN):
    • 2.左连接(LEFT JOIN):
    • 3.右连接(RIGHT JOIN):
    • 4.全外连接(FULL OUTER JOIN):
    • 5.交叉连接(CROSS JOIN):
  • 子查询

创建/删除数据库

# 创建
create database databasename
# 删除
drop database databasename

创建/删除表

# 常规创建
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
# 使用旧表创建新表
select * into table_new from table_old 
# 使用旧表创建新表
create table tab_new as select col1,col2… from tab_old 
# 删除表
drop table tabname

其他表操作

# 重命名表
alter table 原表名 rename to 新表名

增加字段

  • 语法:alter table 表名 add (字段名 字段类型 默认值 是否为空);

  • 例如:

    alter table tablename add (ID varchar2(30) default '空' not null);
    

修改字段

  • 语法:alter table 表名 modify (字段名 字段类型 默认值 是否为空);

  • 例如:

    alter table tablename modify (ID number(4));
    

重命名字段

  • 语法:alter table 表名 rename column 列名 to 新列名 --其中:column是关键字

  • 例如:

    alter table tablename rename column ID to newID;
    

删除字段

  • 语法:alter table 表名 drop column 字段名;

  • 例如:

    alter table tablename drop column ID;
    

主键/索引/视图相关

# 添加主键
alter table tabname add primary key(col)
# 删除主键
alter table tabname drop primary key(col)
# 创建索引
create [unique] index idxname on tabname(col….)
# 删除索引 (索引是不可更改的,想更改必须删除重新建。)
drop index idxname
# 创建视图
create view 视图名 as select statement
# 删除视图
drop view viewname

数据插入

# 全字段添加-语法:
insert into 表名 values(所有列的值); 
#例如:
insert into test values(1,'zhangsan',20);
 
# 自定义字段添加-语法:
insert into 表名() values(对应的值);
# 例如:
insert into test(id,name) values(2,'lisi');

# 将表1数据插入到表2-语法:
insert into2 select * from1;
# 例如:
insert into test(name,role,createId,createdate) select name,role,id,now() from test_user;

数据更新

# 语法:
updateset=新的值 [where 条件] --更新满足条件的记录
# 例如:
update test set name='zhangsan2' where name='zhangsan'

数据删除

# delete语法:
delete from 表名 where 条件 --删除满足条件的记录
# 例如
delete from test where id = 1;

delete from test -->删除所有 delete删除的时候,会记录日志 删除会很慢

# truncate语法:
truncate table 表名 --删除所有数据,不会影响表结构,不会记录日志,数据不能恢复,删除得很快

字段拼接

  • CONCAT(char1,char2),在oracle中concat函数只能拼接两个值,这根mysql不一样
  • 返回两个字符串连接后的结果,两个参数char1,char2是要连接的两个字符串。
  • 等价操作:连接操作符“||”
  • 如果char1,char2任何一个为NULL,相当于连接了一个空格
  • 注意:建议多个字串连接时,用“||”更直观
 #字符串函数  CONCAT()函数,用来连接字符串
SELECT CONCAT(ename,sal) FROM emp
 
SELECT CONCAT( CONCAT(ename,','),sal) FROM emp
 
SELECT ename||','||sal FROM emp

merge into

  • 在Oracle中,常规的DML语句只能完成单一功能,,例如insert/delete/update只能三选一,而merge into语句可以同时对一张表进行更新/插入/删除。
  • merge into常用在数据同步的场景,它会选定一张基表作为数据源,然后与目标表的记录进行匹配,根据匹配的结果,可以对目标表同时进行更新/插入/删除操作。

语法

MERGE INTO target_table
USING source_table ON (join_condition)
WHEN MATCHED THEN UPDATE SET[WHERE] [DELETEWHERE]
WHEN NOT MATCHED THEN INSERT (column_list) VALUES (value_list) [WHERE]
LOG ERRORS INTO … REJECT LIMIT [integer|UNLIMITED]
  • target_table 是要更新的表
  • source_table 是参考表
  • USING … ON () 是两个表的连接条件,用于判断记录是否匹配
  • WHEN MATCHED 对于满足匹配条件的记录进行的操作,可以更新或删除
  • WHEN NOT MATCHED 对于不满足匹配条件的记录,可以插入
  • LOG ERRORS INTO 可以将匹配错误的记录记录到日志表中

案例

素材

create table src_table(
id number(6),
name varchar2(32),
salary number(6),
bonus number(6));
 
insert into src_table values(1,'Vincent',1000,100);
insert into src_table values(2,'Victor',2000,200);
insert into src_table values(3,'Grace',3000,300);
 
 
create table tgt_table(
id number(6),
name varchar2(32),
age number(6),
salary number(6),
bonus number(6));
 
insert into tgt_table values(1,'someone',1,0,0);
insert into tgt_table values(3,'someone',3,0,0);
insert into tgt_table values(4,'someone',4,0,0);
commit;

同时更新和插入

merge into tgt_table t
using src_table s on (t.id=s.id)
when matched then update set t.name=s.name, t.salary=s.salary, t.age=10
when not matched then insert values(s.id,s.name,10,s.salary,s.bonus+50);
 
commit;
 
select * from tgt_table;
  • When matched 为匹配存在的记录(id为1,3),更新了name, salary, age个字段
  • When not match 为目标表不存在的记录(id为2),插入了该记录,同时bouns字段加50
  • Matched 和 not matched的子句是独立的,可以任意选择一项,或同时出现
  • 目标表中id为4的记录在源表中不存在(不满足连接条件),因此不会涉及

对于匹配的记录,可以使用where子句进一步限制范围

merge into tgt_table t
using src_table s on (t.id=s.id)
when matched then update set t.bonus=s.bonus where s.id>=2;
 
Select * from tgt_table order by id;
  • 这里对匹配的记录bonus字段进行更新,同时进一步限制id>=2的记录才更新
  • Where 子句的条件可以通过源表或者目标表指定,这里是通过源表的s.id指定

在update子句后,还可以跟上delete … where …子句,对匹配上的记录进行删除操作

merge into tgt_table t
using src_table s on (t.id=s.id)
when matched then update set t.bonus=s.bonus+50 where s.id>=3 delete where id>=2;
 
select * from tgt_table order by id;
  • delete where id>=2 指定将ID大于等于2的记录删除,但注意id为2的记录并未被删除,只有3被删除了
  • 因为delete只会在update匹配的到记录范围内删除,update子句有个where s.id>=3,delete也会受到这个条件的限制
  • 实际执行的效果是 delete where s.id>=3 and id>=2,只有id为3的记录满足这个条件
  • id为4的记录不在匹配范围内,不受merge into语句的影响,也不会被删除
记录同步错误

数据同步的时,源表和目标表的结构/数据类型/约束可能并不一致,这就导致数据同步可能部分失败,现在我们修改tgt表,限制salary字段值不能超过3000,即插入超过3000的数字将失败:

Alter table tgt_table modify salary number(6) check(salary<=3000);

首先调用dbms_errlog.create_error_log为tgt_table创建一张错误日志表,表名为errlog:

exec dbms_errlog.create_error_log('tgt_table', 'errlog');
  • 第一个参数指定要创建错误日志的基表,第二个参数是错误日志表名

然后在执行merge into 语句时,在最后跟上log errors into子句,如果语句执行过程中遇到错误,则会将错误记录到错误日志中,方便后期排查和修复,这里将tgt_table清空,尝试将src_table的3条数据同步进去,同时salary增加1000

truncate table tgt_table;
 
merge into tgt_table t
using src_table s on (t.id=s.id)
when not matched then insert values(s.id,s.name,10,s.salary+1000,s.bonus)
log errors into errlog('something is wrong.');
 
select * from tgt_table;
  • 这里将tgt_table表清空,然后尝试将src_table中的3条记录同步进来,同步过程中我们将salary增加了1000
  • 因为tgt_table表salary有约束不能超过3000,因此语句回滚,一条记录都没同步进来
  • errlog中的’something is wrong.’ 是用户定义的错误标记,可以帮助识别是哪个语句导致的错误

查询errlog表,可以看到导致失败的原因,id为3的记录,salary在增加1000后为4000,违反了目标表的约束(check salary<=3000)

如果我们不想让出现错误的时候语句就回滚,可以在后面跟上一个reject limit N子句,限制只有出现N个以上的错误时才回滚语句:

merge into tgt_table t
using src_table s on (t.id=s.id)
when not matched then insert values(s.id,s.name,10,s.salary+1000,s.bonus)
log errors into errlog('Allow one error.') reject limit 1;
 
select * from tgt_table;
  • 我们在上面的语句后面增加了1个reject limit 1子句,当出现1个及以下的错误时,并不会回滚
  • 因此id为1和2的记录成功插入,语句并未报错
  • errlog的用户标记修改为’Allow one error.’
  • 通过Allow one error标签,我们发现ID为3的记录因违反约束没有被插入
  • 但这此有reject limit 1子句,语句允许出现1个及以下错误,因此满足条件的记录被成功插入
  • 如果选择reject limit unlimited,则不限制错误数量

分页查询

在Oracle中,可以使用ROWNUM关键字来实现分页查询。

示例1:查询表中的前10条记录

SELECT *
FROM your_table
WHERE ROWNUM <= 10;

示例2:查询表中的第11到20条记录

SELECT *
FROM (
    SELECT t.*, ROWNUM AS rnum
    FROM (
        SELECT *
        FROM your_table
        ORDER BY your_column
    ) t
    WHERE ROWNUM <= 20
)
WHERE rnum >= 11;

示例3:查询表中的第21到30条记录,并按照指定的列进行排序

SELECT *
FROM (
    SELECT t.*, ROWNUM AS rnum
    FROM (
        SELECT *
        FROM your_table
        ORDER BY your_column
    ) t
    WHERE ROWNUM <= 30
)
WHERE rnum >= 21;

注意,在查询结果之前使用ROWNUM,否则可能会产生错误的结果。此外,使用子查询的方式可以在外层查询中使用rnum进行过滤,从而实现分页效果。

分组查询/筛选

在Oracle中,可以使用分组查询和筛选语法来对数据进行分组和筛选。

基本的语法如下:

SELECT column1, column2, ..., aggregate_function(column)
FROM your_table
WHERE conditions
GROUP BY column1, column2, ...
HAVING conditions;

其中,column1, column2, …是要查询的列,aggregate_function是聚合函数(如SUM、COUNT、AVG等),your_table是要查询的表,conditions是查询条件,column1, column2, …是要进行分组的列。

示例1:统计每个部门的员工数量,并筛选出员工数量大于5的部门

SELECT department, COUNT(*) AS employee_count
FROM your_table
GROUP BY department
HAVING COUNT(*) > 5;

示例2:计算每个部门的平均工资,并筛选出平均工资大于1000的部门

SELECT department, AVG(salary) AS average_salary
FROM your_table
GROUP BY department
HAVING AVG(salary) > 1000;

示例3:统计每个部门的最高工资,并筛选出最高工资大于5000的部门

SELECT department, MAX(salary) AS highest_salary
FROM your_table
GROUP BY department
HAVING MAX(salary) > 5000;

在HAVING子句中可以使用聚合函数进行筛选,用来对分组后的结果再进行一次筛选。与WHERE子句不同的是,HAVING子句是在分组后进行筛选,可以使用聚合函数,而WHERE子句是在分组前进行筛选,不能使用聚合函数。

注意,在SELECT子句中,除了分组的列和聚合函数外,还可以选择其他需要显示的列,如:

SELECT department, job, COUNT(*) AS employee_count, AVG(salary) AS average_salary
FROM your_table
GROUP BY department, job
HAVING COUNT(*) > 5;

排序

在Oracle中,可以使用ORDER BY子句对查询结果进行排序。ORDER BY子句的语法如下:

SELECT column1, column2, ...
FROM your_table
WHERE conditions
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;

其中,column1, column2, …是要排序的列,ASC表示升序(默认),DESC表示降序。

示例1:按照工资升序排序查询结果

SELECT *
FROM your_table
ORDER BY salary ASC;

示例2:按照部门升序、工资降序排序查询结果

SELECT *
FROM your_table
ORDER BY department ASC, salary DESC;

示例3:按照姓名升序、年龄降序排序查询结果

SELECT *
FROM your_table
ORDER BY name ASC, age DESC;

可以根据需要在ORDER BY子句中指定多个列,并对每个列设置排序方式。如果不指定排序方式,默认为升序。

注意,ORDER BY子句应该在WHERE子句之后使用,用于对筛选后的结果进行排序。如果只有一个列需要排序,可以直接写上列名,如果有多个列需要排序,使用逗号分隔。

连接查询

在Oracle中,可以使用不同的连接查询语法来联结多个表。以下是Oracle中的一些常见连接查询语法及示例:

1. 内连接(INNER JOIN):

SELECT column1, column2, ...
FROM table1
INNER JOIN table2 ON table1.column = table2.column;

示例:

SELECT employees.employee_id, employees.first_name, departments.department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id;

2.左连接(LEFT JOIN):

SELECT column1, column2, ...
FROM table1
LEFT JOIN table2 ON table1.column = table2.column;

示例:

SELECT employees.employee_id, employees.first_name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;

3.右连接(RIGHT JOIN):

SELECT column1, column2, ...
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;

示例:

SELECT employees.employee_id, employees.first_name, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.department_id;

4.全外连接(FULL OUTER JOIN):

SELECT column1, column2, ...
FROM table1
FULL OUTER JOIN table2 ON table1.column = table2.column;

示例:

SELECT employees.employee_id, employees.first_name, departments.department_name
FROM employees
FULL OUTER JOIN departments ON employees.department_id = departments.department_id;

5.交叉连接(CROSS JOIN):

SELECT column1, column2, ...
FROM table1
CROSS JOIN table2;

示例:

SELECT employees.first_name, departments.department_name
FROM employees
CROSS JOIN departments;

注意:以上语法和示例仅供参考,实际使用时应根据具体的表和列名进行调整。连接查询可以通过指定JOIN条件,将多个表中的数据关联起来,从而获取更加丰富的查询结果。

子查询

在Oracle中,可以使用子查询来作为查询语句的一部分,以便在查询中使用子查询的结果。以下是Oracle中子查询的语法和示例:

语法:

SELECT column1, column2, ...
FROM table1
WHERE columnN IN (SELECT columnM FROM table2 WHERE condition);

示例:

  1. 使用子查询获取某个表中符合条件的数据:
SELECT * 
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 1700);
  1. 使用子查询获取某个表中的最大值或最小值:
SELECT employee_id
FROM employees 
WHERE salary = (SELECT MAX(salary) FROM employees);
  1. 使用子查询作为存在性检查:
SELECT employee_id, first_name, last_name
FROM employees 
WHERE EXISTS (SELECT * FROM job_history WHERE job_history.employee_id = employees.employee_id);
  1. 使用子查询作为计算列:
SELECT employee_id, first_name, last_name, (SELECT MAX(salary) FROM employees) - salary AS salary_diff
FROM employees;

注意:以上语法和示例仅供参考,实际使用时应根据具体的表和列名进行调整。子查询可以嵌套在主查询中,以便根据子查询的结果来筛选、计算或检查数据。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kafka集群安装部署

简介 Kafka是一款分布式的、去中心化的、高吞吐低延迟、订阅模式的消息队列系统。 同RabbitMQ一样&#xff0c;Kafka也是消息队列。不过RabbitMQ多用于后端系统&#xff0c;因其更加专注于消息的延迟和容错。 Kafka多用于大数据体系&#xff0c;因其更加专注于数据的吞吐能力…

AI网络爬虫006:从当当网批量获取图书信息

文章目录 一、目标二、输入内容三、输出内容一、目标 用户输入一个图书名称,然后程序自动从当当网批量获取图书信息 查看相关元素在源代码中的位置: 二、输入内容 第一步:在deepseek中输入提示词: 你是一个Python爬虫专家,一步步的思考,完成以下网页爬取的Python脚本任…

WEB攻防-XSS跨站反射型存储型DOM型标签闭合输入输出JS代码解析

文章目录 XSS跨站-输入输出-原理&分类&闭合XSS跨站-分类测试-反射&存储&DOM反射型XSS存储型XSSDOM-base型XSS XSS跨站-输入输出-原理&分类&闭合 漏洞原理&#xff1a;接受输入数据&#xff0c;输出显示数据后解析执行 基础类型&#xff1a;反射(非持续…

ffmpeg下载/配置环境/测试

一、下载 1、访问FFmpeg官方网站下载页面&#xff1a;FFmpeg Download Page&#xff1b; 2、选择适合Windows的版本&#xff08;将鼠标移动到windows端&#xff09;。通常&#xff0c;你会找到“Windows builds from gyan.dev”或者“BtbN GitHub Releases”等选项&#xff0…

Java的异常处理体系

目录 异常处理1、Java的异常类层次结构2、try-catch-finally 使用注意事项3、在Web应用中如何实现全局异常处理机制 异常处理 1、Java的异常类层次结构 其中Error表示程序运行错误 常见的错误类型有&#xff1a; OutOfMemoryError (内存溢出错误) StackOverFlowError (栈内存溢…

ctfshow-web入门-命令执行(web118详解)Linux 内置变量与Bash切片

输入数字和小写字母&#xff0c;回显 evil input 查看源码&#xff0c;发现这里会将提交的参数 code 传给 system 函数 使用 burpsuite 抓包进行单个字符的模糊测试 fuzz&#xff1a; 发现过滤掉了数字和小写字母以及一些符号&#xff0c;下面框起来的部分是可用的 结合题目提…

vue2使用use注册自定义指令实现输入控制与快捷复制

使用场景 在一些form表单填写内容的时候&#xff0c;要限制输入的内容必须是数值、浮点型&#xff0c;本来el-input-number就可以实现&#xff0c;但是它本身带那个数值控制操作&#xff0c;等一系列感觉不舒服的地方。如果只是使用el-input该多好&#xff0c;只要监听一下输入…

爬虫笔记20——票星球抢票脚本的实现

以下内容仅供交流学习使用&#xff01;&#xff01;&#xff01; 思路分析 前面的爬虫笔记一步一步走过来我们的技术水平也有了较大的提升了&#xff0c;现在我们来进行一下票星球抢票实战项目&#xff0c;实现票星球的自动抢票。 我们打开票星球的移动端页面&#xff0c;分…

身份证OCR识别的深度解读

引言 随着信息技术的飞速发展&#xff0c;光学字符识别&#xff08;OCR&#xff09;技术在各个领域得到了广泛应用。身份证OCR识别&#xff0c;作为OCR技术的一个重要分支&#xff0c;以其高效、准确的特点&#xff0c;在身份验证、信息录入等方面发挥着重要作用。本文将深入解…

【Linux】Linux用户,用户组,其他人

1.文件拥有者 初次接触Linux的朋友大概会觉得很怪异&#xff0c;怎么“Linux有这么多用户&#xff0c;还分什么用户组&#xff0c;有什用呢&#xff1f;”&#xff0c;这个“用户与用户组”的功能可是相当健全而且好用的一个安全防护措施。 怎么说呢&#xff1f;由于Linux是个…

Chapter10 高级纹理——Shader入门精要学习笔记

Chapter10 高级纹理 一、立方体纹理1.基本概念①组成②采样 2.天空盒子 Sky Box3.环境映射三种方法①特殊布局的纹理创建②手动创建Cubemap——老方法③脚本生成 4.反射5.折射6.菲涅尔反射 二、渲染1.镜子效果2.玻璃效果3.渲染纹理 vs GrabPass 三、程序纹理1.简单程序纹理2.Un…

使用 bend-ingest-kafka 将数据流实时导入到 Databend

作者&#xff1a;韩山杰 Databend Cloud 研发工程师 https://github.com/hantmac Databend是一个开源、高性能、低成本易于扩展的新一代云数据仓库。bend-ingest-kafka 是一个专为 Databend 设计的实时数据导入工具&#xff0c;它允许用户从 Apache Kafka 直接将数据流导入到 D…

MacOS下更新curl

苹果自带的curl不支持Https,我们可以通过curl -V看到如下结果 curl 7.72.0 (x86_64-apple-darwin18.6.0) libcurl/7.72.0 zlib/1.2.12 libidn2/2.3.7 librtmp/2.3 Release-Date: 2020-08-19 Protocols: dict file ftp gopher http imap ldap ldaps pop3 rtmp rtsp smtp telne…

LabVIEW汽车ECU测试系统

开发了一个基于LabVIEW开发的汽车发动机控制单元&#xff08;ECU&#xff09;测试系统。该系统使用了NI的硬件和LabVIEW软件&#xff0c;能够自动执行ECU的功能测试和性能测试&#xff0c;确保其在不同工作条件下的可靠性和功能性。通过自动化测试系统&#xff0c;大大提高了测…

基于xilinx FPGA的GTX/GTH/GTY位置信息查看方式(如X0Y0在bank几)

目录 1 概述2 参考文档3 查看方式4查询总结&#xff1a; 1 概述 本文用于介绍如何查看xilinx fpga GTX得位置信息&#xff08;如X0Y0在哪个BANK/Quad&#xff09;。 2 参考文档 《ug476_7Series_Transceivers》 《pg156-ultrascale-pcie-gen3-en-us-4.4》 3 查看方式 通过…

linux——IPC 进程间通信

IPC 进程间通信 interprocess communicate IPC&#xff08;Inter-Process Communication&#xff09;&#xff0c;即进程间通信&#xff0c;其产生的原因主要可以归纳为以下几点&#xff1a; 进程空间的独立性 资源隔离&#xff1a;在现代操作系统中&#xff0c;每个进程都…

Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL

章节内容 上一节我们完成了&#xff1a; Reduce JOIN 的介绍Reduce JOIN 的具体实现DriverMapperReducer运行测试 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&am…

独立开发者系列(18)——js的window对象

独立开发者&#xff0c;必然要面对JS代码&#xff0c;基本可以认为在脚本语言里面&#xff0c;JS门槛最低&#xff0c;正因为如此&#xff0c;JS也是最受欢迎的开发语言之一。JS的代码运行规律&#xff0c;按照代码模块执行&#xff0c;也就是<script></script> 每…

2024年上半年网络工程师下午真题及答案解析

试题一(20分) 某高校网络拓扑如下图所示&#xff0c;两校区核心&#xff08;CORE-1、CORE-2&#xff09;&#xff0c;出口防火墙&#xff08;NGFW-1、NGFW-2&#xff09;通过校区间光缆互联&#xff0c;配置OSPF实现全校路由收敛&#xff0c;两校区相距40km。两校区默认由本地…

「媒体邀约」苏州媒体宣传服务公司

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体宣传加速季&#xff0c;100万补贴享不停&#xff0c;一手媒体资源&#xff0c;全国100城线下落地执行。详情请联系胡老师。 苏州的媒体资源相当丰富&#xff0c;涵盖了报纸、电视、广…