oracle中
--merge into
MERGE INTO 目标表 a
USING 源表 b
ON (a.字段1 = b.字段2 and a.字段n = b.字段n)
WHEN MATCHED THEN
UPDATE SET a.新字段 = b.字段
WHERE 限制条件
WHEN NOT MATCHED THEN
INSERT (a.字段名1,a.字段名n) VALUES(b.字段值1, b.字段值n)
WHERE 限制条件123456789
-- with workflog as (...),buyerlist as (... workflog p) select * from buyerlist; 制作临时表
with a as (select * from cafs_org c),b as (select * from a) select * from b;
**********************************************
1. //按照笔划排序
2. select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_STROKE_M');
3. //按照部首排序
4. select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_RADICAL_M');
5. //按照拼音排序,此为系统的默认排序方式
6. select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M');
***************************************************************************************
1 nulls first / nulls last 排序如果遇到null就放在最前面或者最后面
2 new PageRequest(page-1,size,new Sort(Sort.Direction.DESC,"net_amount"));
************************************************************************************************
start with connect by prior 递归查询
这个子句主要是用于B树结构类型的数据递归查询,给出B树结构类型中的任意一个结点,遍历其最终父结点或者子结点。
先看原始数据
create table a_test
( parentid varchar2(10),
subid varchar2(10));
insert into a_test values ( '1', '2' );
insert into a_test values ( '1', '3' );
insert into a_test values ( '2', '4' );
insert into a_test values ( '2', '5' );
insert into a_test values ( '3', '6' );
insert into a_test values ( '3', '7' );
insert into a_test values ( '5', '8' );
insert into a_test values ( '5', '9' );
insert into a_test values ( '7', '10' );
insert into a_test values ( '7', '11' );
insert into a_test values ( '10', '12' );
insert into a_test values ( '10', '13' );
commit;
select * from a_test;
要求给出其中一个结点值,求其最终父结点。以7为例,看一下代码
start with 子句:遍历起始条件,有个小技巧,如果要查父结点,这里可以用子结点的列,反之亦然。
connect by 子句:连接条件。关键词prior,prior跟父节点列parentid放在一起,就是往父结点方向遍历;prior跟子结点列subid放在一起,则往叶子结点方向遍历,
parentid、subid两列谁放在“=”前都无所谓,关键是prior跟谁在一起。
order by 子句:排序,不用多说。
这里start with 子句用了parentid列,具体区别后面举例说明。
connect by 子句中,prior跟subid在同一边,就是往叶子结点方向遍历去了。因为7有两个子结点,所以第一级中有两个结果(10和11),10有两个子结点(12,13),11无,所以第二级也有两个结果(12,13)。即12,13就是叶子结点。
下面看下start with子句中选择不同的列的区别:
以查询叶子结点(往下遍历)为例
结果很明显,原意是要以7为父结点,遍历其子结点,左图取的是父结点列的值,结果符合原意;右图取的是子结点列的值,结果多余的显示了7 的父结点3.
---------------------------------------
关于where条件的语句,以后验证后再记录。先留个疑问
参考:https://www.cnblogs.com/benbenduo/p/4588612.html
***********************************************************************************************
listagg函数:列转行函数LISTAGG() WITHIN GROUP ()的使用方法
(select listagg(branch_code,',') within group (order by t.branch_code) branch_code from cafs_policy t where t.policy_no = c.policy_no ) as branch_all
select c.rowid,c.* from cafs_dict c ; 锁行
listagg() within GROUP () over () 显示多行
SELECT
T .DEPTNO,
listagg (T .ENAME, ',') WITHIN GROUP (ORDER BY T .ENAME) over(PARTITION BY T .DEPTNO)
FROM
SCOTT.EMP T
WHERE
T .DEPTNO = '20'
mysql相同效果的实现 https://blog.csdn.net/sinat_36257389/article/details/95052001
PostgreSQL 相同效果的实现 https://blog.csdn.net/sinat_36257389/article/details/95611686
mysql 数据库的group_concat()使用方法
.使用 group_concat() 将多行合并成一行(比较常用)
语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
SELECT
T.DEPTNO,
group_concat ( T.ENAME ORDER BY DEPTNO separator ',' )
FROM
EMP T
WHERE
T.DEPTNO = '20'
GROUP BY
T.DEPTNO;
***********************************************************************************
over()函数写法over(partition by expr2 order by expr3),根据expr2进行分区,在各个分区内按照expr3排序。
不能单独使用,需要与row_number(),rank()和dense_rank(),lag()和lead(),sum() ,count(),wm_concat等配合使用
partition by对结果集按照指定字段进行排列,结果集不会收缩,会发现结果集中同一部们的人会连续排列。
group by 会将结果集按照指定字段进行聚合,结果集会收缩,
这里连续求和:此处的sum不是求整个分区的和,而是按照order by字段进行分层后,求出分区中小于等于自身所在分层等级的和
over()与sum()一起使用不能省略order by
多个sum over连用使用,分区只按照顺序出现第一个orderby进行排序。每个sum计算的值按照自身
ordrby进行分区后计算,类似于使用子查询进行计算。
------------------------------------------------------------------------------------------
主要是用于树查询(层次查询)以及多列转行。
select ... sys_connect_by_path(column_name,'connect_symbol') from table
start with ...connect by prior 这是指递归条件...
eg:
select sys_connect_by_path(m.ann_name,'-')from (
select rownum rn ,t.* from cafs_announcement t
) m start with rn = 1 connect by prior rn = rn-1 ;
select sys_connect_by_path(c.org_name,'>') from cas_org c start with c.org_code ='3010100' connect by prior c.id =c.parent_id;
---------------------------------------------------------------------------------------------
wm_concat(列名),可以吧列值以逗号‘ ,’分隔开并显示成一行,也可以把逗号换成其他的
可以后面跟over()
eg:
select wm_concat(ann_type) ann_type from cafs_announcement;
1.wm_cancat函数行转列后,不会按照原有查询结果排序。listagg 函数行转列后,会按照原有查询结果顺序排列。
如果考虑到需要行转列,并且保持分组后顺序不变可以使用listagg来完成。
--------------------------------------------------------------------------------------------------
--lead lag
分析函数可以在同一次查询中取出同一个字段的前n行数据(lag)和后n行数据(lead)作为独立得列。
这种操作可以代替表自连接,并且效率更高
函数语法如下:
lag(exp_str,offset,defval) over(partion by ..order by …)
lead(exp_str,offset,defval) over(partion by ..order by …)
语法
lag(exp_str,offset,defval) over()
exp_str:要取出的列
offset:取偏移后的第几行数据
defval:,默认值
eg:
select lag(c.ann_name,1,'0') over(partition by c.ann_type order by c.delete_flag),c.* from cafs_announcement c;
lead(列名,n,m): 当前记录后面第n行记录的<列名>的值,没有则默认值为m;如果不带参数n,m,则查找当前记录后面第一行的记录<列名>的值,没有则默认值为null。
lag(列名,n,m): 当前记录前面第n行记录的<列名>的值,没有则默认值为m;如果不带参数n,m,则查找当前记录前面第一行的记录<列名>的值,没有则默认值为null。
eg:
对SAL列:取上一个SAL列作为单独的列,若不指定默认值,则默认值为NULL
对SAL列:取上一个SAL列作为单独的列,指定默认值为0
-----------------------------
decode(job,
'Manage',sal*1.2,
'Analyst',sal*1.1
,'salesman',sal*1.05
sal)默认,不提供则返回null
-------------------------
select ename,job ,sal
case job when 'Manager' then sal*1.2
when 'Analyst' then sal*1.1
when 'salesman' then sal*1.05
else sal end
**************************************************************************
select 语句:
可以用* 某个列column,或者表达式
别名:紧跟列,或者用as关键字,别名可以用双引号(可以用空格或者下划线之类的)
distinct: 去除重复行
desc 表名:可以查看表结构
describe emplement 可以用desc emplement
DML:insert
update
delete
select
DDL
create
alter
drop
create index
drop index
DCL
grant:授权
revoke:撤销访问权限
commit:提交
rollabck:回滚
savepoint:设置保存点
lock: 对数据库中部分锁定
比较运算:赋值使用 := 符号
回避特殊字符:escape
select jot_id from jobs where job_id like'IT\_%' escape '\';
-------------------
创建表:oracle没有create or replace table
create table (column 数据类型(size))
create table emp1 as select * from employees;
创建空表
create table emp1 as select * from employees where 1=2;
--alter table语句
alter table emp1 ADD(column datatype [,default expre] [column datatype]);
alter table emp1 MODIFY(column datatype[default expre] [,column datatype]);
alter table emp1 DROP COLUMN column_name;或者alter table table drop (column);
alter table table_name RENAME COLUMN old_column_name TO new_column_name;
************************总结oracle和mysql区别***************************************************************************
谨记:
oracle:都是加括号并且没有column
mysql:都是不加扩招,可以有也可以没有column
--oracle语法:只需要记住都是加括号的可以用,没有关键字
alter table tb_employee add d_num number(11);-- 不可以添加column
alter table tb_employee add(d_num number(11));-- 不可以添加column
alter table tb_employee modify d_num number(12);-- 不可以添加column
alter table tb_employee modify(d_num number(11));-- 不可以添加column
alter table tb_employee drop column d_num; --必须添加column
alter table tb_employee drop( d_num);-- 不可以添加column
--mysql语法:只需要记住是不加扩招的可以用,(可加可不加)
alter table tb_test add d_num int(11); -- 可加可不加关键字column
alter table tb_test add( d_num int(11)); -- 不可添加关键字column
alter table tb_test modify d_num int(11); -- 可加可不加
--alter table tb_test modify( d_num int(12)); -- 方法不可用
alter table tb_test drop d_num; -- 可加可不加
--alter table tb_test drop( d_num); -- 方法不可用
以后谨记:比如示例
oracle:
alter table tb_employee add(d_num number(11));
alter table tb_employee modify(d_num number(11));
alter table tb_employee drop( d_num);
mysql:
alter table tb_test add d_num int(11);
alter table tb_test modify d_num int(11);
alter table tb_test drop d_num;
*************************************************************************************************
删除表结构
drop table dept80;
清空表:
truncate table detail_dept;不能回滚
改变对象的名称
RENAME dept TO detail_dept;
修改对象名称
alter table employee rename to tb_employee;
alter table tableName rename column oldCName to newCName; -- 修改字段名
alter table tableName modify (cloumnName 数据类型); -- 修改数据类型
设某个列不可用
alter table emps set unuseed column name;
创建索引
CREATE INDEX index_nameON table_name (column_name)
create 【unique】index index_name on tablename(columnname(length));
alter mytable add [unique] index [indexname] on (columnname(length));
drop index [indexname] on mytable;
show index from table_name;
--单行函数:
大小写控制
lower: lower("ABD")
upper:
initcap: initcap("abc ded") 返回字符串并将字符串的第一个字母变为大写;
字符控制函数
concat
substr
length
instr: instr("HelloWorld","W"):结果为6
lpad
rpad
trim
replace
数字函数:
round:四舍五入 round(45.926,2) 结果:45.93
trunc:截断 trunc(45.926,2) 结果:45.92
mod:求余 mod(1600,300) 结果:100
类型转换:隐式和显式
隐式转换:自动完成
varchar2 或者char -> number
varchar2 或者char -> date
number -> varchar2
date -> varchar2
显式:to_char ,to_date ,to_number
通用函数:nvl(e1,e1)
nvl2(e1,e2,e3)
nullif(e1,e2):相等就返回null,不等就返回e1
coalesce(e1,e2...en):如果第一个表达式为空,则返回第二个表达式,对其他的参数进行 coalesce
条件表达式:
case when
decode()
嵌套函数:执行时从内到外
SELECT table1.column ,table2.column FROM table1
[CROSS JOIN table2] |
[NATURAL JOIN table2] |
[JOIN table2 USING(column_name)] |
[JOIN table2 ON (table1.column_name = table2.column_name)] |
[LEFT|RIGHT|FULL OUTER JOIN table2 ON (table1.column_name=table2.column_name)]
cross join会产生叉集,跟笛卡尔积一样
natural join 自然连接以两个表中具有相同名字的列为条件创建等值连接,如果列名相同而数据类型不同会产生
using 在natural join子句创建等值连接可以使用using子句指定连接需要的列,可以有多个满足条件的进行选择,不要给选中的列中加表名前缀或别名
我们常用的是用on创建连接
select employee_id,city,department_name from employees e
join department d
on d.department_id = e.department_id
join locationis l
on d.location_id = l.location_id;
--分组函数
where 用在分组函数前面用作过滤
select avg(sal),deptno,name from emp where id <5000 group by deptno ,name having avg(sal) > 2000;
在select列表中所有未包含在组函数中的列都应该包含在group by 子句中
--子查询语法
子查询(内查询)在主查询之前一次执行完成
子查询的结果被主查询(外查询)使用
单行操作符对应单行子查询,多行操作符对应多行子查询
-单行子查询
只返回银行结果
单行操作符:= , >=, > ,< ,<= ,<>
-多行子查询
多行子查询操作符:in ,any,all
插入数据:
insert into table [(column [,column])]values (value [,value]);
字符和日期应该包含在单引号中
从其他表中拷贝数据
insert into emp2 select * from employees where department_id = 90;不用写values子句
更新数据
update table set column = value [,column = value] [where condition];
在update中使用子查询,使更新基于另一张表中的数据
upate copy_emp set department_id = (select department_id from employees where employee_id = 90)
where job_id =(select job_id from employees where employee_id =200)
删除数据
delete from table [where condition]
控制事务:
commit提交
rollback:回滚
savepoint A
rollback to savepoint A :回滚到保存点A
eg:
update...
savepoint update_dome
insert...
rollback to savepoint update_dome;
表级约束和列级约束
列级约束必须跟在列定义后面,表级约束不跟列一起,而是单独定义。
非空(not null)约束只能定义在列上
定义约束:
列级:column [constraint constraint_name] constraint_type,
表级:column,...[constraint constraint_name] constraint_type (conlumn,...),
create table emp(
empl_id number(6),
last_name varchar2(20) not null,
salary number(16,2),
hire_date date
constraint emp_hire_date_nn not null,
...
)
create table emp(
empl_id number(6),
last_name varchar2(20) unique,
email varchar2(15),
salary number(16,2),
hire_date date,
...
constraint emp_email_uk unique(email);
)可以声明在email后面,也可以声明在末尾
crete table departments(
department_id number(4),
department_name varchar2(30) constraint depart_name_nn not null,
manager_id number(6),
location_id number(4),
constraint dept_id_pk primary key(department_id);
)
create table employee(
employee_id number(6),
last_name varchar2(25) not null,
email varchar2(25),
salary number(8,2),
commission_pct number(2,2),
hire_date date not null,
...
department_id number(4),
constraint emp_dept_fk foreign key (department_id) references departments(department_id),--在后面添加on..
constraint emp_email_uk unique(email);
)
foreign key 指定字表中的列
references:表示父表中的列
on delete cascade:级联删除
on delete set null:级联置空
check约束:定义每一行都必须满足条件
...,salary number(2) constraint emp_salary_min check(salary>0),...
-----添加约束:alter table
添加和删除
有效化和无效化约束
添加not null 要用modify
alter table emp add [CONSTRAINT constraint_name] type (column);
alter table emp modify name varchar2(22) null/not null 添加或者删除非空约束
alter table emp add constraint pk_emp primary key (id);
alter table emp drop constraint pk_emp;
alter table emp add constraint u_emp unique(name);
alter table emp drop constraint u_emp;
alter table employees add constraint emp_manager_fk foreign key (manager_id) references employees(employees_id);
alter table employees drop constraint emp_manager_fk;
--使某一个约束失效:此约束还存在于表中,只是不起作用
alter table employee disabled constraint emp_emp_id_pk;
--使某一个约束激活:激活以后,此约束具有约束力
alter table employee enable constraint emp_emp_id_pk;
木槿:
create table a as select * from b ;
木槿:
insert into b select * from a;
木槿:
insert into b (acode,aname) select acode,aname from a
木槿:
创建表结构与数据
木槿:
同字段仅数据
木槿:
不同字段仅数据