ORACLE

Posted sonder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORACLE相关的知识,希望对你有一定的参考价值。

ORACLE

SYSsystem用户都是Oracle的系统用户,他们都使用system表空间,sys拥有更大的权限。Sys用户的作用主要用来维护系统信息和管理实例,只能以sysdbasysoper角色登录,system用户通常用来管理oracle数据库的用户,权限和存储等,只能以normal方式登录。

约束的目的:确保表中数据的完整性。常用的约束类型:主键约束、唯一约束、检查约束、外键约束、非空约束。主键约束要求主键列数据唯一,并且不允许为空。唯一约束要求该列唯一,允许为空,但只能出现一个空值。检查约束某列取值范围限制,格式限制等等。外键约束用于两表间建立关系,需要指定引用主表的那列。非空约束时如果使用了非空约束,则字段的内容不允许为null。约束数量的增多会降低oracle系统的性能,所以当大规模向表中增加数据时,为了提升效率也会考虑将约束暂时关闭。

单行函数分类

单行函数对于从表中查询的每一行只返回一个值,可以出现在select子句中和where子句中。

单行函数可以大致划分为:

字符函数,数字函数,日期函数,转换函数,其他通用函数

字符函数的主要功能主要是用于进行字符串处理

数值函数的主要功能主要是对数字进行有效处理

Oracle在内部使用数字格式存储日期,表示世纪、年、月、日、小时、分和秒,默认日期格式为:日--

 

转换函数的常见两种业务:日期数据格式化和数字格式化

创建表空间tbs_shop

CREATE TABLESPACE tbs_shop
DATAFILE f:/shop.dbf SIZE 100M
AUTOEXTEND ON NEXT 30M MAXSIZE UNLIMITED;

为此表空间分配一个用户shopmgr,密码为shopmgr

CREATE USER shopmgr
IDENTIFIED BY shopmgr
DEFAULT TABLESPACE tbs_shop;

给shopmgr用户分配权限或者角色

GRANT CONNECT,RESOURCE TO shopmgr;

修改用户shopmgr的密码为aptech

ALTER USER shopmgr IDENTIFIED BY aptech;

解锁scott账户

ALTER USER scott ACCOUNT UNLOCK;

重命名一张表

RENAME TEST TO test2;

截断表:清空表中的数据,但是不删除表结构

TRUNCATE TABLE TEST;

删除表

DROP TABLE TEST;

添加一个字段

ALTER TABLE TEST ADD  test_address VARCHAR2(30);

主键约束和唯一约束

两者都验证字段的唯一性,但是主键约束中不能出现空值,唯一约束可以出现空值.

 身份证列位数为18位

ALTER TABLE STUINFO
ADD CONSTRAINT ck_stuid CHECK(length(stuid)=18);

年龄列在15-40之间

ALTER TABLE STUINFO
ADD CONSTRAINT ck_stuage CHECK(STUAGE BETWEEN 15 AND 40);

学号必须以s开头

ALTER TABLE STUINFO
ADD CONSTRAINT ck_stuno CHECK(STUNO LIKE(S%));

创建表emp表的副本

CREATE TABLE emp2 AS SELECT * FROM emp;

添加数据的语法

insert into 表名称  [(字段1,字段2,字段3...)] values(值1,值2,值3...)

实例:

INSERT INTO emp2 (empno,ename,sal) values(1111,小董,3000);

表中有几个字段就必须按照表中的顺序添加

INSERT INTO emp2 values(7901,JSKD,销售,7788,Sysdate,3000,100,20);

update命令  修改数据的命令

语法:

update 表名称 set 字段1=值1,字段2=值2,...where 条件

实例

UPDATE emp2 SET ename=新值,sal=6000 WHERE empno=1111;

删除操作

删除操作:delete from 表名称 where 条件;

实例:

DELETE FROM emp2 WHERE empno=1112;

select查询语法

SELECT  *   |  {[DISTINCT] column   [ alias],…}

FROM 表名

[WHERE   条件表达式]

[GROUP BY  columns [HAVING  条件表达式]]

[ORDER BY columns(ASC|DESC)]

查询emp2中所有的数据

SELECT * FROM emp2;

查询出ename,mgr,可以为字段起别名

SELECT ename 姓名,mgr 别名 FROM emp2;
SELECT e.ename 员工姓名,e.sal 工资,e.comm 奖金 FROM emp2 e;

SELECT distinct deptno FROM emp2;  --distinct消除重复行

SELECT  ename FROM emp2; 

先按照工资降序,如果工资(sal)相同,按照工号(empno)升序

SELECT * FROM emp2 e ORDER BY e.sal DESC,empno ASC;

复制一张表,不赋值里面的内容

CREATE TABLE test3 AS SELECT * FROM TEST WHERE 1=3;

使用别名,查询工号(统一加前缀E)

SELECT E||empno 工号,ename 姓名,sal 工资 FROM emp;

查询所有雇员记录

SELECT * FROM emp;

查询部门编号为10的雇员记录

SELECT * FROM emp WHERE deptno=10;

查询部门编号为10 的雇员编号,姓名,月工资

SELECT empno 编号,ename 姓名,sal 月工资 FROM emp  WHERE deptno=10;

求年薪

SELECT ename,(sal)*12 FROM emp2;

查询部门编号为10或20的雇员信息

SELECT * FROM emp WHERE deptno=10 OR deptno=20;

查询工资在2000元到4000元的雇员信息

SELECT * FROM emp WHERE sal>=2000 AND sal<=4000;

查询雇员姓名中带“S”的雇员信息

SELECT * FROM emp WHERE ename   LIKE %S%;

查询没有奖金的雇员

SELECT * FROM emp WHERE comm IS NULL;

查询有奖金的雇员

SELECT * FROM emp WHERE comm IS not NULL;

字符函数

 lower:转换为小写

SELECT LOWER(ename) FROM emp2; 

substr:截取字符串,从第1个字符开始,长度为3

SELECT SUBSTR(ename,2,3) FROM emp2;

initcap:第一个字母转换为大写,其他字母转换成小写

SELECT ename 转换前, Initcap(ename) 转换后 FROM emp2;

replace:替换

SELECT REPLACE (ename,A,ZZ) 替换后, ename 原姓名 FROM emp2;

查询出雇员姓名是SMITH的完整信息

SELECT * FROM emp2  WHERE ename=SMITH;

查询出雇员的原姓名和首字母大写后的姓名

SELECT ename 原姓名, Initcap(ename) 首字母大写后 FROM emp2;

查询出雇员的原姓名和姓名中所有字母为’A’替换成’_’后的姓名

SELECT ename 原姓名, REPLACE (ename,A,_) 替换后  FROM emp2;

查询出姓名长度是5的所有雇员信息

SELECT * FROM emp2 WHERE LENGTH(ename)=5;

查询姓名前3个字母是JAM的雇员信息

SELECT * FROM emp2 WHERE Substr(ename,0,3)=JAM;

查询出雇员的原姓名和姓名的后3个字母

SELECT ename 原姓名,substr(ename,-3,3) 后三个 FROM emp2;

数值函数

查询789.652四舍五入的结果,要求 不保留小数(输出790),保留两位小数(输出789.65)

SELECT ROUND(789.652,0) FROM dual;
SELECT ROUND(789.652,2) FROM dual;

查询出雇员姓名、月薪、日薪(预留两位)

SELECT ename,sal,round(sal/30,2) FROM emp2;

查询789.652截取的结果,要求截取小数(输出789),截取两位小数(输出789.65),取整(输出700)

SELECT TRUNC(789.652,0) FROM dual;--789
SELECT TRUNC(789.652,2) FROM dual;--789.65
SELECT TRUNC(789.652,-2) FROM dual;--700

查询出10对3取余的结果

SELECT MOD(10,3) FROM dual;

查询出789.652向上取整的结果

SELECT CEIL(789.252) FROM dual;

查询出789.652向下取整的结果

SELECT FLOOR(789.999)  FROM dual;

日期函数

添加月数

SELECT add_months(SYSDATE,4) FROM dual;

next_day()返回下一个星期几

SELECT next_day(SYSDATE,星期四) FROM dual;

last_day() 一个月中的最后一天

SELECT last_day(SYSDATE) FROM dual;

查询距离今天为止3天之后及3天之前的日期

SELECT SYSDATE-3,Sysdate+3 FROM dual;

查询出每个雇员的雇佣天数,以及十天前每个雇员的雇佣天数

SELECT sysdate-hiredate 雇佣天数,Sysdate-10-hiredate 十天前的天数 FROM emp2;

查询雇员在被雇佣三个月之后的日期

SELECT add_months(hiredate,3) FROM emp2;

查询当前日期的下一个星期

SELECT next_day(SYSDATE,星期四) FROM dual;

查询出其雇佣所在月的倒数第三天被公司雇佣的雇员

SELECT * FROM emp2 WHERE last_day(hiredate)-2=hiredate;

查询出每个雇员的姓名、工资、雇佣日期、已雇佣的年数、月数

SELECT ename,sal,hiredate,
months_between(Sysdate,hiredate),
ROUND(MONTHS_between(SYSDATE,hiredate)/12) FROM emp2;

转换函数 to_char()

yyyy:年     mm:月      dd:日       hh:12小时制    hh24:24小时制     mi:分      ss:秒

SELECT to_char(SYSDATE ,yyyy-mm-dd hh24:mi:ss ) FROM dual;

格式化数字12345.66

SELECT TO_char(12345.66,L999999.99) FROM dual;   

日期字符串转换为日期类型

SELECT SYSDATE drom FROM dual;
SELECT to_date(2019-3-12,yyyy-mm-dd) FROM dual;

to_number()  把字符串类型的数字转化

SELECT to_number(100)+100 FROM dual;
SELECT 100+200 FROM dual;

查询出每年在2月份雇佣的雇员信息

SELECT * FROM emp2 WHERE to_char(hiredate,mm)=2;

查询出每个雇员的雇佣日期,雇佣日期按照“年-月-日”的形式显示,并分别显示年、月、日

SELECT to_char(hiredate,yyyy-mm-dd),to_char(hireDATE,yyyy) 年,to_char(hireDATE,mm) 月,to_char(hireDATE,dd) 日 FROM emp2;

格式化数字显示,将987654321.789分别格式化为987,654,321.78900和000,987,654,321.78900

SELECT to_char(987654321.789,999,999,999.99900) FROM dual;
  SELECT to_char(987654321.789,000,999,999,999.99900) FROM dual;

格式化货币显示,将987654321.789分别格式化为¥987,654,321.78900和$987,654,321.78900

 SELECT to_char(987654321.789,L999,999,999.99900) FROM dual;
  SELECT to_char(987654321.789,$000,999,999,999.99900) FROM dual;

 

ORACLE

SYSsystem用户都是Oracle的系统用户,他们都使用system表空间,sys拥有更大的权限。Sys用户的作用主要用来维护系统信息和管理实例,只能以sysdbasysoper角色登录,system用户通常用来管理oracle数据库的用户,权限和存储等,只能以normal方式登录。

约束的目的:确保表中数据的完整性。常用的约束类型:主键约束、唯一约束、检查约束、外键约束、非空约束。主键约束要求主键列数据唯一,并且不允许为空。唯一约束要求该列唯一,允许为空,但只能出现一个空值。检查约束某列取值范围限制,格式限制等等。外键约束用于两表间建立关系,需要指定引用主表的那列。非空约束时如果使用了非空约束,则字段的内容不允许为null。约束数量的增多会降低oracle系统的性能,所以当大规模向表中增加数据时,为了提升效率也会考虑将约束暂时关闭。

单行函数分类

单行函数对于从表中查询的每一行只返回一个值,可以出现在select子句中和where子句中。

单行函数可以大致划分为:

字符函数,数字函数,日期函数,转换函数,其他通用函数

字符函数的主要功能主要是用于进行字符串处理

数值函数的主要功能主要是对数字进行有效处理

Oracle在内部使用数字格式存储日期,表示世纪、年、月、日、小时、分和秒,默认日期格式为:日--

转换函数的常见两种业务:日期数据格式化和数字格式化

创建表空间tbs_shop

CREATE TABLESPACE tbs_shop
DATAFILE ‘f:/shop.dbf‘ SIZE 100M
AUTOEXTEND ONNEXT 30M MAXSIZE UNLIMITED;

为此表空间分配一个用户shopmgr,密码为shopmgr

CREATEUSER shopmgr
IDENTIFIED BY shopmgr
DEFAULT TABLESPACE tbs_shop;

shopmgr用户分配权限或者角色

GRANT CONNECT,RESOURCE TO shopmgr;

修改用户shopmgr的密码为aptech

ALTERUSER shopmgr IDENTIFIED BY aptech;

解锁scott账户

ALTERUSER scott ACCOUNT UNLOCK;

重命名一张表

RENAME TEST TO test2;

截断表:清空表中的数据,但是不删除表结构

TRUNCATETABLE TEST;

删除表

DROPTABLE TEST;

添加一个字段

ALTERTABLE TEST ADD  test_address VARCHAR2(30);

主键约束和唯一约束

两者都验证字段的唯一性,但是主键约束中不能出现空值,唯一约束可以出现空值.

 身份证列位数为18

ALTERTABLE STUINFO
ADDCONSTRAINT ck_stuid CHECK(length(stuid)=18);

年龄列在15-40之间

ALTERTABLE STUINFO
ADDCONSTRAINT ck_stuage CHECK(STUAGE BETWEEN15AND40);

学号必须以s开头

ALTERTABLE STUINFO
ADDCONSTRAINT ck_stuno CHECK(STUNO LIKE(‘S%‘));

创建表emp表的副本

CREATETABLE emp2 ASSELECT*FROM emp;

添加数据的语法

insertinto表名称  [(字段1,字段2,字段3...)]values(1,2,3...)

实例:

INSERTINTO emp2 (empno,ename,sal) values(1111,小董,3000);

表中有几个字段就必须按照表中的顺序添加

INSERTINTO emp2 values(7901,‘JSKD‘,销售,7788,Sysdate,3000,100,20);

update命令  修改数据的命令

语法:

update表名称set字段1=1,字段2=2,...where条件

实例

UPDATE emp2 SET ename=新值,sal=6000WHERE empno=1111;

删除操作

删除操作:deletefrom表名称where条件;

实例:

DELETEFROM emp2 WHERE empno=1112;

select查询语法

SELECT  *   |  {[DISTINCT]column   [ alias],…}
 
FROM表名
 
[WHERE   条件表达式]
 
[GROUP BY  columns [HAVING  条件表达式]]
 
[ORDER BY columns(ASC|DESC)]

查询emp2中所有的数据

SELECT*FROM emp2;

查询出ename,mgr,可以为字段起别名

SELECT ename 姓名,mgr 别名FROM emp2;
SELECT e.ename 员工姓名,e.sal 工资,e.comm 奖金FROM emp2 e;
 
SELECTdistinct deptno FROM emp2;  --distinct消除重复行
 
SELECT  ename FROM emp2; 

先按照工资降序,如果工资(sal)相同,按照工号(empno)升序

SELECT*FROM emp2 e ORDERBY e.sal DESC,empno ASC;

复制一张表,不赋值里面的内容

CREATETABLE test3 ASSELECT*FROM TEST WHERE1=3;

使用别名,查询工号(统一加前缀E

SELECT‘E‘||empno 工号,ename 姓名,sal 工资FROM emp;

查询所有雇员记录

SELECT*FROM emp;

查询部门编号为10的雇员记录

SELECT*FROM emp WHERE deptno=10;

查询部门编号为10 的雇员编号,姓名,月工资

SELECT empno 编号,ename 姓名,sal 月工资FROM emp  WHERE deptno=10;

求年薪

SELECT ename,(sal)*12FROM emp2;

查询部门编号为1020的雇员信息

SELECT*FROM emp WHERE deptno=10OR deptno=20;

查询工资在2000元到4000元的雇员信息

SELECT*FROM emp WHERE sal>=2000AND sal<=4000;

查询雇员姓名中带“S”的雇员信息

SELECT*FROM emp WHERE ename   LIKE‘%S%‘;

查询没有奖金的雇员

SELECT*FROM emp WHERE comm ISNULL;

查询有奖金的雇员

SELECT*FROM emp WHERE comm ISnotNULL;

字符函数

 lower:转换为小写

SELECTLOWER(ename) FROM emp2; 

substr:截取字符串,从第1个字符开始,长度为3

SELECT SUBSTR(ename,2,3) FROM emp2;

initcap:第一个字母转换为大写,其他字母转换成小写

SELECT ename 转换前, Initcap(ename) 转换后FROM emp2;

replace:替换

SELECTREPLACE (ename,‘A‘,‘ZZ‘) 替换后, ename 原姓名FROM emp2;

查询出雇员姓名是SMITH的完整信息

SELECT*FROM emp2  WHERE ename=‘SMITH‘;

查询出雇员的原姓名和首字母大写后的姓名

SELECT ename 原姓名, Initcap(ename) 首字母大写后FROM emp2;

查询出雇员的原姓名和姓名中所有字母为’A’替换成’_’后的姓名

SELECT ename 原姓名, REPLACE (ename,‘A‘,‘_‘) 替换后  FROM emp2;

查询出姓名长度是5的所有雇员信息

SELECT*FROM emp2 WHERE LENGTH(ename)=5;

查询姓名前3个字母是JAM的雇员信息

SELECT*FROM emp2 WHERE Substr(ename,0,3)=‘JAM‘;

查询出雇员的原姓名和姓名的后3个字母

SELECT ename 原姓名,substr(ename,-3,3) 后三个FROM emp2;

数值函数

查询789.652四舍五入的结果,要求不保留小数(输出790),保留两位小数(输出789.65)

SELECTROUND(789.652,0) FROM dual;
SELECTROUND(789.652,2) FROM dual;

查询出雇员姓名、月薪、日薪(预留两位)

SELECT ename,sal,round(sal/30,2) FROM emp2;

查询789.652截取的结果,要求截取小数(输出789),截取两位小数(输出789.65),取整(输出700)

SELECT TRUNC(789.652,0) FROM dual;--789
SELECT TRUNC(789.652,2) FROM dual;--789.65
SELECT TRUNC(789.652,-2) FROM dual;--700

查询出103取余的结果

SELECT MOD(10,3) FROM dual;

查询出789.652向上取整的结果

SELECT CEIL(789.252) FROM dual;

查询出789.652向下取整的结果

SELECTFLOOR(789.999)  FROM dual;

日期函数

添加月数

SELECT add_months(SYSDATE,4) FROM dual;

next_day()返回下一个星期几

SELECT next_day(SYSDATE,星期四) FROM dual;

last_day() 一个月中的最后一天

SELECT last_day(SYSDATE) FROM dual;

查询距离今天为止3天之后及3天之前的日期

SELECT SYSDATE-3,Sysdate+3FROM dual;

查询出每个雇员的雇佣天数,以及十天前每个雇员的雇佣天数

SELECT sysdate-hiredate 雇佣天数,Sysdate-10-hiredate 十天前的天数FROM emp2;

查询雇员在被雇佣三个月之后的日期

SELECT add_months(hiredate,3) FROM emp2;

查询当前日期的下一个星期

SELECT next_day(SYSDATE,星期四) FROM dual;

查询出其雇佣所在月的倒数第三天被公司雇佣的雇员

SELECT*FROM emp2 WHERE last_day(hiredate)-2=hiredate;

查询出每个雇员的姓名、工资、雇佣日期、已雇佣的年数、月数

SELECT ename,sal,hiredate,
months_between(Sysdate,hiredate),
ROUND(MONTHS_between(SYSDATE,hiredate)/12) FROM emp2;

转换函数 to_char()

yyyy:     mm:      dd:       hh:12小时制    hh24:24小时制     mi:分      ss:

SELECT to_char(SYSDATE ,‘yyyy-mm-dd hh24:mi:ss ‘) FROM dual;

格式化数字12345.66

SELECT TO_char(12345.66,‘L999999.99‘) FROM dual;   

日期字符串转换为日期类型

SELECT SYSDATE drom FROM dual;
SELECT to_date(‘2019-3-12‘,‘yyyy-mm-dd‘) FROM dual;

to_number()  把字符串类型的数字转化

SELECT to_number(‘100‘)+100FROM dual;
SELECT‘100‘+200FROM dual;

查询出每年在2月份雇佣的雇员信息

SELECT*FROM emp2 WHERE to_char(hiredate,‘mm‘)=2;

查询出每个雇员的雇佣日期,雇佣日期按照--的形式显示,并分别显示年、月、日

SELECT to_char(hiredate,‘yyyy-mm-dd‘),to_char(hireDATE,‘yyyy‘) ,to_char(hireDATE,‘mm‘) ,to_char(hireDATE,‘dd‘) FROM emp2;

格式化数字显示,将987654321.789分别格式化为987,654,321.78900000,987,654,321.78900

SELECT to_char(987654321.789,‘999,999,999.99900‘) FROM dual;
  SELECT to_char(987654321.789,‘000,999,999,999.99900‘) FROM dual;

格式化货币显示,将987654321.789分别格式化为¥987,654,321.78900$987,654,321.78900

 SELECT to_char(987654321.789,‘L999,999,999.99900‘) FROM dual;
  SELECT to_char(987654321.789,‘$000,999,999,999.99900‘) FROM dual;

 

 

以上是关于ORACLE的主要内容,如果未能解决你的问题,请参考以下文章

Client / Server Interoperability Support Matrix for Different Oracle Versions (Doc ID 207303.1)(代码片段

Oracle 数据库 - 使用UEStudio修改dmp文件版本号,解决imp命令恢复的数据库与dmp本地文件版本号不匹配导致的导入失败问题,“ORACLE error 12547”问题处理(代码片段

续:纠正:ubuntu7.04可以安装,而且完美的安装 ! for《Oracle-10.2.0.1,打补丁10.2.0.5:在 debian 版本4不含4以上,及 ubuntu 7.04不含(代码片段

Oracle-常用数据库对象笔记(片段)

Oracle数据库从RMAN备份集片段还原指定单个归档日志进行日志挖掘分析

从Oracle存储过程Oracle 11g发送邮件