oracle复制表去重,Oracle--联合查询、复制表/表结构、函数

联合查询

Union: 对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序

Union All:对两个结果集进行并集操作,包括重复行,不进行排序;

A U B: 把A与B的集合合并

Intersect:对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;

A ∩ B : 存在A,又存在于B的数据

Minus:对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序, 有方向

A - B: 存在于A, 但不存在于B的数据

B - A: 存在于B, 但不存在于A的数据

例:联合查询, 要求这个两个select的结果集数据是相关的

--union: 并集操作,去重, 有排序, 升序

select deptno fromempunion

select deptno from dept;

--union all 并集操作,不去重, 有排序, 升序

select deptno fromempunion all

select deptno from dept;

--Intersect: 交集,去重

select deptno fromempintersect

select deptno from dept;

--Minus: 差集, 有方向,去重

select deptno fromemp

minusselect deptno fromdept;select deptno fromdept

minusselect deptno from emp;

复制表/表结构,根据子查询

1、创建表:  create table  表名(列的声明)  as;

根据已存在的表结构, 复制一份

--创建一个emp_back(empno,ename,job)

create table emp_back as

select empno, ename,job from emp;

2、 创建表: 只需要表结构,不需要数据

create table emp_back2 as

select empno, ename,job from emp where 1!=1;

函数

字符串函数

Oracle: dual, 虚表.,  为了补全select的语法

length(字符串/列名)

select length(ename),ename from emp;

首字母大写: 每一个单词的首字母大写 initcap(字符串/列名)

SELECT initcap(‘hello world‘) FROM dual;

大写、小写

--小写: lower(字符串/列名)

SELECT LOWER(‘HELLO‘) FROMdual;--大写: upper(字符串/列名)

SELECT UPPER(‘ddd‘) FROM dual;

消除空格 / 指定字符

--左截 ltrim(字符串/列名) 清除字符串前面的空格

SELECT LTRIM(‘hello ddd‘) FROMdual;--右截 rtrim(字符串/列名) 清除字符串后面的空格

SELECT RTRIM(‘hello ddd‘) FROMdual;--左右截 trim([c1 from c2])--去掉前后空格 trim(字符串/列名) 清除字符串前后的空格

SELECT TRIM(‘hello ddd‘) FROMdual;--trim(去除的字符 from 字符串) 去除字符串前后指定的字符--从 hello haha xixi hh 去除字符串前后的h

select trim(‘h‘ from ‘hello haha xixi hh‘) from dual;

替换

----替换 replace(字符串/列名, 旧的字符串, 新的字符串) 全部替换--把 emp中ename中S 替换为*

select ename,replace(ename,‘S‘,‘*‘) from emp;

查找某个字符第一次出现的位置

--查找某个字符第一次出现的位置 instr(字符串/列名,查找的字符)--查找 hello world 中l第一次出现位置, 找不到, 返回 0--java/js 字符串的下标从0开始的--****oracle 字符串的下标从1开始的

select instr(‘hello world‘,‘a‘) from dual;

截取字符串

--截取字符串: substr(字符串/列名,开始位置[,截取的长度])--substr(字符串/列名,开始位置) 从字符串开始位置截取到字符串末尾

select substr(‘hello world‘,2) fromdual;--substr(字符串/列名,开始位置,截取的长度)

select substr(‘hello world‘,2,3) from dual;

字符串的拼接   推荐使用 ||    conact一次只能拼接两个

--字符串的连接 concat(字符串1,字符串2) oracle: ||连接符

select concat(‘hello‘,‘world‘) fromdual;select ‘hello‘||‘world‘||‘haha‘ fromdual;--练习: 使用concat 连接三个 ‘hello‘,‘world‘,‘ haha‘

select concat(concat(‘hello‘,‘world‘),‘haha‘) from dual;

数字函数

取整

--1)向上取整: 整数+ 1 ,小数去掉 15< 15.01 < 16 CEIL() 取的上限

select CEIL(15.01) fromdual;--2)向下取整 取整数, 小数去掉 取的这个数字的下限 15<15.99<16

select FLOOR(15.99) fromdual;---16< -15.01 < -15

select CEIL(-15.01) from dual; ---15

select FLOOR(-15.99) from dual; ---16

--3)四舍五入 *** ROUND(数字,保留小数位)

select ROUND(15.89,1) fromdual;select ROUND(15.39,0) from dual;

日期函数

获取当前系统时间

**** sysdate: 获取当前的系统时间: oracle默认日期格式 "dd-m月-yy"--工具设置日期的默认格式

select sysdate from dual;

相隔多少月

--获取两个日期相隔多少月 months_between(日期,日期) 相隔的月, number

--1999,1,1 -到今天相隔多少个月

select months_between(sysdate,‘1999-01-01‘) from dual;

add_months(日期,月份增量)

--在日期加月份 add_months(日期,月份增量) 返回的日期--计算: 今天日期加9个月是哪一天

select add_months(sysdate,-9) from dual;

指定星期的日期

--从指定日期开始往后找,找到指定星期的日期 next_day(日期字符串,星期字符串) 返回的还是日期--不包括开始日期

SELECT next_day(SYSDATE, ‘星期二‘) FROM dual;

最后一天的日期

--查找指定日期这个月的最后一天的日期 last_day(日期) 返回的日期

SELECT last_day(‘2000-03-01‘) FROM dual;

转换函数

-- to_char() 转换为字符串类型

-- to_date() 转换为日期类型

-- to_number() 转换为number类型

--to_char() 把一个数值转换指定格式的字符串 金钱: $/¥ 1,999,999.99--9 表示任意数值, 如果位数不够,不会补位

SELECT to_char(12345678.212,‘999,999,999,999.99‘) FROMdual;--0 表示任意数值, 如果位数不够,补0

SELECT to_char(12345678.212,‘$000,000,000,000.00‘) FROM dual;

to_char() 获取日期指定部门的值 ***

/*--yyyy:四位的年 yy:两位的年, mm:两位的月数字, month:月份,带月字

-- dd: 日 ddd:表示一年的第几天 day:星期 ww:一年的第几个星期 w:一月的第几个星期

--hh: 小时, 12进制 hh24: 小时,24进制 mi:分钟 ss:秒*/

select to_char(sysdate,‘yyyy‘) 四位的年,to_char(sysdate,‘mm‘) 二位的月, to_char(sysdate,‘month‘) 月份,

to_char(sysdate,‘dd‘) 日期,to_char(sysdate,‘ddd‘) 年的第多少天,to_char(sysdate,‘day‘) 星期,

to_char(sysdate,‘ww‘) 年的第多少周, to_char(sysdate,‘w‘) 月的第多少周 from dual;

to_date(日期字符串, 日期格式)把指定格式的字符串转换为日期

INSERT INTO t_student values(‘1003‘,‘王五‘,22,to_date(‘1998-12-21‘,‘yyyy-mm-dd‘),‘男‘,‘0‘);

to_number() 把字符串转换为number类型

--$99.12 + 12;--to_number(‘$99.12‘,‘$999,999,999.99‘) --> 99.12

select to_number(‘$99.12‘,‘$999,999,999.99‘)+12 from dual;

其他函数

对null处理函数:

****nvl(列名,转换值) nvl2()--nvl2(列名,值1,值2) 如果列名的值是null,返回的值2,如果不是null,返回 值1--查询每一个员工的年收入 (工资+奖金) * 12

select (sal + nvl(comm,0))*12 fromemp;select (sal + nvl2(comm,comm,0))*12 from emp;

decode:  if...else if....else

--decode() 对case的简写 swicth 等值判断--decode(value/列名,if1,then1,if2,then2...,else)--如果 value = if1, 返回的then1--如果 value = if2, 返回的then2--...--都不满足: 返回else表达式的结果

--根据岗位发奖金: CLERK :500 SALESMAN: :600 MANAGER: :300 其他 :100

select e.*,decode(job,

‘CLERK‘,500,

‘SALESMAN‘,600,

‘MANAGER‘,300,

100) 奖金 from emp e;

case

select SNO ||NAME || SCORE || case

when score>60 then

‘pass‘

else ‘fail‘

end 成绩 from score1;

分析函数

分组排名函数  返回的名次  数字

函数名([参数])  over ([分组子句:partition by 列名] [排序子句: order by 列名 排序方式]))

--部门编号分组,根据员工的薪水高低,进行排名--row_number() 组内编号连续, 相同的值, 不会在相同名次

select e.*,row_number() over(partition by deptno order by sal desc) 名次 from emp e;

--rank() 相同的值, 名次相同, 组内编号可能会跳跃, 相同的名次, 把后面编号跳过

select e.*,rank() over(partition by deptno order by sal desc) 名次 from emp e;

--dense_rank() 相同的值, 名次相同, 组内编号连续

select e.*,dense_rank() over(partition by deptno order by sal desc) 名次 from emp e;

SIGN(数字/列名)

--SIGN(数字/列名) 正数 返回 1 负数: 返回 -1 0返回0

select sign(90-90) from dual;

原文:https://www.cnblogs.com/64Byte/p/12709150.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值