Oracle 数据库操作

Oracle数据库操作的一些具体的赋权和语法应用.

[SQL语句分类]

DML 语句(数据操作语句)
Insert(用于添加字段), Update(用于修改已有字段), Delete, Merge

DDL 语句(数据定义语句)
Create, Alte(用于添加列)r, Drop, Truncate

DCL 语句(数据控制语言)
Grant, Revoke

事务控制语句
Commit, Rollback, Savepoint

新建表:

删除表、新建表
drop table vims_sysset
create table vims_sysset
(
   id varchar2(36) primary key not null,--ID,主键
   name varchar2(20), --名称
   address varchar2(255), --地址
   filesize varchar2(10)  --文件大小 单位kb
);

创建序列:

create sequence sq_student
start with 1 --从1开始计数
increment by 1 --每次加1个
minvalue 1 --最小值
nomaxvalue --不设置最大值 设置最大值:maxvalue9999 
nocycle --一直累加,不循环

创建触发器:

create or replace trigger student_trigger 
before insert on  student 
for each row /*对每一行都检测是否触发*/ 
begin
select sq_student.nextval into:new.id from sys.dual;
end;

查看表结构

desc student;

删除表:

drop table student;

删除表中所有的数据(保留表结构)
delete from student;

删除表中指定的数据
delete from student where age=20;

提交
commit;

删除序列:

drop sequence sq_student;

删除触发器:

drop trigger student_trigger;

插入表数据:

insert into vims_export_template(id,name,address,filesize) values('3','name', 'address','filesize');

循环插入数据

declare
   i integer;
begin
   i := 1;
loop

insert into TEST_INVOICE (id, fpdm, fphm,fpje,fpse,kprq,xfsh,gfsh)
       values (i, '123123', '12312313','100.00','10.00',sysdate,'123012312',i);
      i := i + 1;
exit when i > 10000000;
end loop;
commit;
end;

创建数据表空间:

create tablespace vims_data 
logging 
datafile 'D:\oracle\oradata\Oracle9i\user_data.dbf' 
size 50m 
autoextend on 
next 50m maxsize 20480m 
extent management local;

创建临时表空间:

create temporary tablespace vims_temp 
tempfile 'D:\oracle\oradata\Oracle9i\user_temp.dbf' 
size 50m 
autoextend on 
next 50m maxsize 20480m 
extent management local;

创建数据表空间:

create user ttvims identified by ttvims 
default tablespace vims_data 
temporary tablespace vims_temp;

alter user ttvims quota unlimited on vims_data ; 提示没有权限操作vims_data表空间,可以修改

别名:

tablename as 表别名 或 tablename 表别名
field as 别名 或 field 别名

空值:

is null 是空值
nvl(field, 'default') 将查询出来的接口赋一个默认值

plsql查询修改语句:
select * from student for update;

添加列:

alter table vims_biz_invoice add fsbz varchar(2) default('N'); 添加列,并赋默认值

修改列类型:

alter table vims_biz_invoice_inventorys modify wpsl varchar2(10)
alter table vims_biz_invoice modify (fsbz varchar2(2) default 'N');

删除列:

alter table vims_biz_invoice drop column fsbz;

查询数据库中所有表:

select table_name from user_tables;

清空表:

truncate table table_name;

递归查询:

select * from admin t connect by prior t.companyid = t.parentcompanyid start with t.companyid = ''; 

左连接查询:

select * from test1 a left join test2 b on a.id = b.id;

右连接查询:

select * from test1 a right join test2 b on a.id = b.id;

全连接查询:

select * from test1 a full join test2 b on a.id = b.id; 全连接不支持(+)写法

查询和并列:

查询和并列,多行转字符串 concat():字符连接函数 或 ||
select concat(xfsh,'|',xfmc) as acfield from cims_xtgl_company_gx;
select (xfsh||xfmc) as acfield from cims_xtgl_company_gx;

wm_concat函数:

wm_concat函数:可以把列值以","号分隔起来,并显示成一行
select wm_concat(name) name from test;

把wm_concat结果里的逗号替换成"|"
select replace(wm_concat(name),',','|') from test;

查看字符集:

select * from nls_database_parameters; 查看Oracle服务器的字符集
select * from nls_instance_parameters; 查看Oracle客户端的字符集
select * from nls_session_parameters; 查看session的字符集

日期转换:

to_date: 把字符串转换为数据库中的日期类型
to_date('2019-01-04 23:59:59', 'yyyy-MM-dd HH24:mi:ss')

to_char: 把日期或数字转换为字符串 
to_char('2019-01-04 23:59:59', 'yyyy-MM-dd HH24:mi:ss')

赋用户权限:

grant 
    create session, 
    create any table, 
    create any view ,
    create any index, 
    create any procedure,
    alter any table, 
    alter any procedure,
    drop any table,
    drop any view, 
    drop any index, 
    drop any procedure,
    select any table, 
    insert any table, 
    update any table, 
    delete any table
to ttvims;

赋查询权限:

说明:grant select on 表名 to 用户名;
 例:grant select on T_REPORT_LOSS to aasi;

创建同义词:

说明:create or replace synonym 表名 for 用户名.表名;
  例:create or replace synonym tb_wx_to_user  for aasi.tb_wx_to_user;

添加表字段:

说明:alter table 表名 add (字段名 字段类型 默认值 是否为空);
 例:alter table sf_users add (userName varchar2(30) default '空' not null);

修改字段的语法:

说明:alter table 表名 modify (字段名 字段类型 默认值 是否为空);
 例:alter table sf_InvoiceApply modify (BILLCODE number(4));

删除字段的语法:

说明:alter table 表名 drop column 字段名;
 例:alter table sf_users drop column HeadPIC;

字段的重命名:

说明:alter table 表名 rename  column  列名 to 新列名   (其中:column是关键字)
 例:alter table sf_InvoiceApply rename column PIC to NEWPIC;

表的重命名:

说明:alter table 表名 rename to  新表名
 例:alter table sf_InvoiceApply rename to  sf_New_InvoiceApply;

表添加注释:

说明:comment on table 表名 is '注释';
 例:comment on table sf_users is '注释';

表字段添加注释:

说明:comment on column 表名.字段名 is '注释';
 例:comment on column sf_users.name is '注释';

条件查询:

语法格式:
SELECT *|{[DISTINCT]<字段名>|<表达式>[<别名>],...}
FROM <表名>
[WHERE <查询条件>];
select * from emp where deptno=10;

如果涉及字符串和日期值要用单引扩起来,字符串大小写敏感,日期值格式敏感,缺省的日期格式是'DD-MON-RR'

获取当前缺省日期(yyyy-MM-dd HH24:mi:ss)
select sysdate from dual;

数据类型:

数据类型   说明
char   字符型,最大长度2000B,缺省长度为1B
nchar   基于NLS国家字符集的字符型,最大长度2000B,缺省为1字符
varchar2…………变长字符型,最大长度4000B
nvarchar2 基于NLS国家字符集的字符型,其余同varchar2
varchar   同varchar2
number(m, n)……数值型,m为总位数,n为小数位数,总长度最大为38位
date………………日期型,有效表数范围:公元前4712年1月1到公元后4712年12月31日
long   变长字符型,最大长度2GB,不支持对字符串内容进行搜索
raw   变长二进制数据类型,最大长度2000B
long raw 变长二进制数据类型,最大长度2GB
blob………………二进制大对象类型,最大长度4GB
clob………………字符大对象类型,最大长度4GB
nclob   基于NLS国家字符集的字符大对象类型,最大长度4GB
bfile   在数据库外部保存的大型二进制文件大对象类型,最大长度4GB

运算符:

=   等 于
>   大 于
>=   大于等于
<   小于
<=   小于等于
<>   大等于(即不等于)
BETWEEN...AND... 界于两值之间(包括边界,注意:小值在前面)
IN(set)    出现在集合中
LIKE    模糊查询(% 表示零或多个字符 like 'S%',_表示一个字符 like '_A%',对于特殊符号可使用 ESCAPE 标识符来
        查找 like '%\_%' escape '\'),like ‘%123%’ 通配两头固定中间,like ‘%123’ 通配开头固定结尾, 
        like '123%' 通配结尾固定开头
IS NULL    为空值
IS NOT NULL 不为空值

AND   逻辑"与"
OR   逻辑"或"
NOT   逻辑"非"
三者优先级:NOT>AND>OR

优先级   运算符
1   *, /
2   +, -
3   ||
4   =, >, >=, <, <=, <>
5   IS [NOT] NULL, LIKE, [NOT] IN
6   [NOT]BETWEEN..AND..
7   NOT
8   AND
9   OR

分页:

SELECT * 
     FROM
   (select  ROWNUM r, result.*  from
      (
       查询SQL语句...
   ) result )
     <![CDATA[ where r <= ${end} and r > ${start} ]]>

表连接
select 字段列表 from table1, table2 where table1.column1 = table2.column2

求和:

select count(0)
  from 
  (
   查询SQL语句...
  ) result

聚合函数:

group by 分组
select * from student group by name having count(age) > 25; 按照姓名分组查询,并且过滤出年龄大于25岁的数据

order by 排序
select * from student order by age ASC; 默认正序排列 (DESC)降序,(ASC, 缺省)升序
select deptno, empno, ename, sal from emp order by deptno, sal; 多字段排序
select empno, ename, sal*12 annsal from emp order by annsal; 字段别名排序
select deptno, empno, ename, sal from emp order by nulls last; NULL排序

执行顺序: where -> group by -> select ... from ... -> order by.

聚合函数,日期函数,字符串函数,格式化函数,类型转换函数,加密函数,控制流函数,数学函数,系统信息函数
Oracle 函数分为单行函数和多行函数两大类:
单行函数
操作数据项
接受参数并返回处理结果
对每一返回行起作用
可修改数据类型
可嵌套使用

单行函数分类
字符函数
数值函数
日期函数
转换函数
通用函数

字符函数
字符大小写转换函数
函数   功能   用法    返回结果
lower()   转换为小写 lower('John Smith') john smith
upper()   转换为大写 upper('John Smith') JOHN SMITH
initcap() 单词首字母大写 initcap('JOHN smith') John Smith

数值函数
函数   功能   用法    返回结果
abs()   取绝对值 abs(-3.14)   3.14
round()   四舍五入 round(3.1415)   3
  round(3.1415, 3) 3.142
  round(314.1592, -2) 300
trunc()   截断   trunc(3.1415, 3) 3.141
ceil()   向上取整 ceil(3.14)   4
floor()   向下取整 floor(3.14)   3
sign()   判断数值正负 sign(-3.14)   -1
sin()..   三角函数.. sin(3.14)   .001592653
power()   幂运算   power(4.5, 2)   20.25
sqrt()   开平方根 sqrt(9)    3
mod()   取模   mod(10, 3)   1
exp()   基数为e的幂运算 exp(1)    2.71828183
log()   对数运算 log(4, 16.0)   2
ln()   自然对数运算 ln(7)    1.94591015

日期类型
关于日期类型
Oracle内部以数字格式存储日期和时间信息:世纪,年,月,日,小时,分钟,秒
缺省的日期格式是DD-MON-YY
可使用sysdate函数获取当前系统日期和时间

日期型数据的算术运算
日期型数据可以直接加或减一个数值,结果仍为日期
两个日期型数据可以相减,结果为二者相差多少天
查询200-12-25减1991-12-25一共有多少天
select to_date('25-12月 -09') - to_date('25-12月 -1991') from dual;

 日期函数
函数    功能      用法    返回结果
add_months(x, y) 计算在日期x基础上增加y个月后的日期 add_months(sysdate, 2)
last_day(x)   返回日期x当月最后一天的日期   last_day(sysdate)
months_between(x, y) 返回日期x和y之间相差的月数   months_between(sysdate, hiredate)
round(x, y)   将日期x四舍五入到y所指定的   round(sysdate, 'month')
  日期单位(月或年)的第一天   round(sysdate, 'year')
trunc(x, y)   将日期x截断到y所指定的    trunc(sysdate, 'month')
  日期单位(月或年)的第一天   trunc(sysdate, 'year')
next_day   计算指定日期x后的第一个星期几   next_day(sysdate, '星期二')(由参数y指定)对应的日期

转换函数
数据类型转换包括隐含转换和显式转换两方式,建议使用显式的数据类型转换,确保SQL语句的可靠性
字符类型 -> 数值类型 -> to_number()
字符类型 -> 日期类型 -> to_date()
数值类型 -> 字符类型 -> to_char()
日期类型 -> 字符类型 -> to_char()

日期 -> 字符串
to_char()函数可以将日期型数值转换为字符串形式
 格式:
to_char(date)     // 缺省转换为'dd-mm-yy'格式
to_char(date, 'format_model')   // 转换为模式串指定的格式

常用日期格式符
格式符   说明    举列
yyyy   年份    2008
mm   用数字显示月份   02
dd   在当月中是第几天 28
day   星期几    星期五
am/pm   显示上午/下午   上午
hh/hh12/hh24 小时    2:30 14:30
mi   分钟    30
ss   秒钟    46
说明:除上述格式符外,日期模式串中还可直接出现如下字符( - : ; / );
如要显示其它文本字符串则需使用双引号括起来;也可在械串的开头使用"fm"标
记以去掉数字前面的零

字符串 -> 日期
to_date()函数可以将字符串转换为日期型数值形式
 格式:
to_date(char)     // 按缺省格式'dd-mm-yy'进行解析
to_date(char, 'format_model')   // 按模式串指定的格式进行解析

数字
to_char()函数可以将数字值转换为字符串形式

字符串 -> 数字
to_number()函数可以将字符串转换为数字值形式
 格式:
to_number(char)
to_number(char, 'format_model')

通用函数
通用函数适用于任何类型数据(包括空值):
nvl()
nvl2()
nullif()
coalesce()
case表达式
decode()
 
NVL()函数
NVL()函数用于将空值null替换为指定的缺省值,适用于字符,数字,日期等类型数据
语法格式: NVL(exp1, exp2)
说明: 如果表达式exp1的值为null,则返回exp2的值,否则返回exp1的值

NVL2()函数
NVL2()函数用于实现条件表达式功能
语法格式: NVL2(exp1, exp2, exp3)
说明: 如果表达式exp1的值不为null,则返回exp2的值,否则返回exp3的值

NULLIF()函数
NULLIF()函数用于数据等价性比较并根据比较结果返回null或其中一个被比较的数值
语法格式: NULLIF(exp1, exp2)
说明: 如果表达式exp1与exp2的值相等返回null,否则返回exp1的值

COALESCE()函数
COALESCE()函数用于实现数据"接合"功能
语法格式: COALESCE(exp1, exp2, ...)
说明: 依次考察各参数表达式,遇到非null值即停止并返回该值

CASE()函数
CASE()表达式用于实现多路分支结构
语法格式:
CASE exp1 when comparison_exp1 then return_exp1
  [when comparison_exp2 then return_exp2
  when comparison_expn then return_expn
   else esle_exp]
  end [TempName]
说明: 如果 exp1 是 comparison_exp1 的时候,就返回 return_exp1
   [ comparison_exp2 的时候,就返回 return_exp2
   comparison_expn 的时候,就返回 return_expn
   else 就返回 esle_exp ]
   end [别名]

DECODE()函数
和CASE()表达式类似,DECODE()函数也用于实现多路分支结构
语法格式:
decode(col|expression, search1, result1
   [, search2, result2, ...,]
   [, default])
说明: 如果 col|expression 是 search1 的时候,就返回 result1
   [ search2 的时候,就返回 result2, ...]
   [, default])
   [别名]

函数嵌套
单行孙数可以嵌套使用, 嵌套层次无限制
嵌套函数的执行顺序是由内到外
select empno, lpad(initcap(trim(ename)), 10, '*') name, job, sal from emp;
 
AVG(DISTINCT|ALL)
ALL表示对所有的值求平均值,DISTINCT只对不同的值求平均值
SELECT AVG(SAL) FROM SCOTT.EMP;
SELECT AVG(DISTINCT SAL) FROM SCOTT.EMP;

MAX(DISTINCT|ALL)
求最大值,ALL表示对所有的值求最大值,DISTINCT表示对不同的值求最大值,相同的只取一次
(加不加查询结果一致,不知DISTINCT有什么用途,不同于AVG等聚合函数)
SELECT MAX(DISTINCT SAL) FROM SCOTT.EMP;
SELECT MAX(SAL) FROM SCOTT.EMP

MIN(DISTINCT|ALL)
求最小值,ALL表示对所有的值求最小值,DISTINCT表示对不同的值求最小值,相同的只取一次
SELECT MIN(SAL) FROM SCOTT.EMP;
SELECT MIN(DISTINCT SAL) FROM SCOTT.EMP;

STDDEV(distinct|all)
求标准差,ALL表示对所有的值求标准差,DISTINCT表示只对不同的值求标准差
SELECT STDDEV(SAL) FROM SCOTT.EMP;
SELECT STDDEV(DISTINCT SAL) FROM SCOTT.EMP;

VARIANCE(DISTINCT|ALL)
求协方差  ALL表示对所有的值求协方差,DISTINCT表示只对不同的值求协方差
SELECT VARIANCE(SAL) FROM SCOTT.EMP;
SELECT VARIANCE(DISTINCT SAL) FROM SCOTT.EMP;

SUM(DISTINCT|ALL)
求和  ALL表示对所有值求和,DISTINCT表示只对不同值求和(相同值只取一次)
SELECT SUM(SAL) FROM SCOTT.EMP;
SELECT SUM(DISTINCT SAL) FROM SCOTT.EMP;

COUNT(DISTINCT|ALL)
求记录、数据个数。 ALL对所有记录,数组做统计, DISTINCT只对不同值统计(相同值只取一次)
SELECT COUNT(SAL) FROM SCOTT.EMP;
SELECT COUNT(DISTINCT SAL) FROM SCOTT.EMP;  
 
MEDIAN
求中位数
SELECT MEDIAN(SAL) FROM SCOTT.EMP;
SELECT MEDIAN(DISTINCT SAL) FROM SCOTT.EMP;  --错误:DISTINCT 选项在此函数中禁用

VARIANCE(DISTINCT|ALL)
统计数据表选中行x列的方差
select VARIANCE(distinct sal),VARIANCE(all sal),VARIANCE(sal) from table3; 

distinct
去除重复数据
select distinct deptno from emp;
select distinct deptno, job from emp;

Using 子句
如果不希望参照被连接表的所有同名列进行等值连接,自然连接将无法满足
要求,可以在连接时使用Using子句来设置用于等值连接的列(参照列)名.
select empno, ename, sal, deptno, dname from emp join dept using(deptno);
*不允许在参照列上使用表名或者别名作为前缀

On 子句
如果要参照非同名的列进行等值连接,或想设置任意的连接条件,可以使用 ON 子句
select empno, ename, sal, emp.deptno, dname from emp join dept on(emp.deptno = dept.deptno);
* 必须加上表名前缀(emp.deptno)

子查询(Sub Query)
select * from emp where sal > (select sal from emp where empno = 7654);

转载请注明出处!

猜你喜欢

转载自blog.csdn.net/weixin_42614447/article/details/85810610