ORACLE
Posted sonder
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORACLE相关的知识,希望对你有一定的参考价值。
ORACLE
SYS和system用户都是Oracle的系统用户,他们都使用system表空间,sys拥有更大的权限。Sys用户的作用主要用来维护系统信息和管理实例,只能以sysdba或sysoper角色登录,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
SYS和system用户都是Oracle的系统用户,他们都使用system表空间,sys拥有更大的权限。Sys用户的作用主要用来维护系统信息和管理实例,只能以sysdba或sysoper角色登录,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;
查询部门编号为10或20的雇员信息
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
查询出10对3取余的结果
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.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的主要内容,如果未能解决你的问题,请参考以下文章
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不含(代码片段