Oracle初始

  • Post author:
  • Post category:其他




oracle的特性

存储量大,安全性高,处理速度快



oracle概念

数据库
	oracle数据库十数据的物理存储
实例
	侧重线程,进程,只运行一个(可以运行多个)
用户
	管理表的基本单位(mysql管理表的是数据库)
表空间(逻辑单位)
	太大,不便管理则分为一个一个块
数据文件



创建表空间(有超级管理员才能创建)

create tablespace 表空间名
指定表空间	datafile '路径后缀为.dbf'	
制定大小		size 100m		
自动增加		autoextend on 
增加多少		next 10m;
删除表空间
drop tablespace 表空间名
创建用户
create user 用户名
identified by 密码
指定
default tablespace 用户名
常用角色
给用户授权(不授权无法登陆)
connect --连接角色,基本角色
resource --开发者角色
dba --超级管理员
给用户名指定角色
grant dba to 用户名

oracle数据类型

在这里插入图片描述



表的管理

创建一个person表
	create table person(
		pid number(20),
		pname varchar2(10)	
	)



修改表结构


添加一列


alter table person add gender number(1)


多列(以括号隔开)


alter table person add (gender number(1))


修改列类型(后部分同上)(char(1)固定长度不可变)


alter talbe person modify gender char(1);


修改列名称


alter table person rename column gender to sex;


删除一列


alter table person drop column sex;



增删改

查询表记录
	select * from person
添加一条数据(添加全部列可以不写,不是则需要些表名后面的括号)
	insert into person(pid,pname) values(1,'小明')
	commit;(提交)
修改一条记录
	update person set pname = '小马' where pid =1
	commit;
三个删除
	delete from person;		删除表中全部记录
	drop table person;		删除表结构
	truncate table person	先删表,再创建,效果等同删全部,在数据量大时,表中			  
    带索引时,该操作效率高,索引提供查询效率,但会影响增删改效率


序列不真的属于任何一张表,但逻辑可以和表做绑定

序列:默认从一开始依次递增

dual:虚表,只是为了补全语法,没有任何作用


create sequence s_person;

select s_person.nextval from dual;


添加一条数据


insert into person(pid,pname) values(s_person.nextval,‘小明’)

commit;(提交)


scott用户,密码:tiger(必须了解,但需解锁)

解锁Scott用户


alter user scott account unlock;


解锁Scott密码(也可以用来重置)


alter user scott identified by tiger;


切换到scott 用户下


单行函数:作用于一行,返回一个值

字符函数:字符串连接函数,字符串截取函数,字符串替换,获取字符串长度


select upper (‘yes’) from dual;小写转大写

select lower(‘YES’)from dual;大写转小写


数字函数:四舍五入函数


select round(56.16,-3) from dual; 四舍五入

select trunc(56.16,-1) from dual; 直接去截取

select mod(10,3) from dual; 求余数


日期函数:



查询出emp表中所有员工入职距离现在几天了


select sysdate-e.hiredate from emp e;


算出明天此刻


select sysdate+1 from dual;


查询出emp表中所有员工入职距离现在几个月


select months_between(sysdate,e.hiredate) from emp e;


查询出emp表中所有员工入职距离现在几年了


select months_between(sysdate,e.hiredate)/12 from emp e;


查询出emp表中所有员工入职距离现在几周了


select(sysdate-e.hiredate)/7 from emp e;



转换函数

日期转换为字符串
select to_char(sysdate,'fm yyyy-mm-dd hh24:mi:ss')from dual;
字符串转日期
select to_date('2018-6-7 16:39:50','fm yyyy-mm-dd hh24:mi:ss')from dual;



通用函数


null与任何值算数的null

刨除null值


select e.sal*12 +nvl(e.comm ,0) from emp e



条件表达式

给emp表中员工起中文名
select e.ename,
 case e.ename
  when  'SMITH' then '曹贼'
   when 'ALLEN' then '大耳贼'
    when 'WARD' then '诸葛老贼'
     else '无名'
       end
 from emp e;
oracle中除了起别名,其余引号都是单引号



多行函数[聚合函数]:作用于多行,返回一个值

count(1)找索引
	select count(1) from emp;数目
	select sum(1) from emp;总和
	select max(1) from emp;最大
	select min(1) from emp;最低
	select avg(1) from emp;平均



分组查询

分组查询中,出现在group by后的原始列,才能出现在select后面,没有出现在group by后的必须在聚合函数中
查询每个部门的平均工资
select e.deptno, avg(e.sal)
from emp e
group by e.deptno


查询出平均工资高于2000的部门信息


select e.deptno, avg(e.sal) asal

from emp e

group by e.deptno

having avg(e.sal)>2000;


所有条件都不能使用别名当条件


查询每个部门工资高于800的员工的平均工资


select e.deptno, avg(e.sal) asal

from emp e

group by e.deptno

having avg(e.sal)<800;



多表之前的概念

笛卡尔积
select * from emp,dept d
等值连接
	select * 
	from emp e,dept d
	where e.deptno=d.deptno
内连接
	select * 
	from emp e inner join dept d
	on e.deptno=d.deptno;
查询出所有部门,以及部门下的员工信息。【外连接】只有左外连接
	select *
	from emp e right  join dept d,
	on e.deptno=d.deptno;
查询出所有部门,以及部门下的员工信息
	select *
	from emp e left join dept d
	on e.deptno=d.deptno;
oracle中专用外连接(了解)
	select *
	from emp e, dept d
	where e.deptno(+)=d.deptno;

查询出员工姓名,员工领导姓名
自连接:把一张表看成多张表
	select e1.ename,e2.ename
	from emp e1,emp e2
	where  e1.mgr = e2.empno;



子查询

返回一个值
	查询出工资和SCOTT一样的员工信息员工信息
	  select * from emp where sal in
		(select sal from emp where ename = 'SCOTT')
返回一个集合
	查询出工资和10号部门任意部门任意员工一样的员工信息
	select * from emp where sal in
		(select sal from emp where deptno= 10)
返回一张表
	查询出每个部门最低工资和最低工资员工姓名和该员工所在部门名称
	1.先查询出每个部门最低工资
		select deptno,min(sal) msal
		from emp
		group by deptno
	2.三表联查得到最终结果
		select t.deptno,t.msal,e.ename,d.dname
		from (select deptno,min(sal) msal
				from emp
				group by deptno) t,emp e,dept d
		where t.deptno = e.deptno
		andt.msal = e.sal
		and e.deptno = d.deptno;

rownum行号:当我们做select操作时,

没查询一次记录,就会在该行上加上一个行号

行号从1开始,依次递增,不跳着走

emp表工资倒叙排列后,每页五条记录,查询第二页。

在这里插入图片描述



scott用户的数据支持


创建练习的四张表(dept)


CREATE TABLE DEPT(

DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,

DNAME VARCHAR2(14),

LOC VARCHAR2(13)

);


插入数据


INSERT INTO DEPT VALUES(10,‘ACCOUNTING’,‘NEW YORK’);

INSERT INTO DEPT VALUES(20,‘RESEARCH’,‘DALLAS’);

INSERT INTO DEPT VALUES(30,‘SALES’,‘CHICAGO’);

INSERT INTO DEPT VALUES(40,‘OPERATIONS’,‘BOSTON’);


emp表


CREATE TABLE EMP (

EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,

ENAME VARCHAR2(10),

JOB VARCHAR2(9),

MGR NUMBER(4),

HIREDATE  DATE,

SAL NUMBER(7,2),

COMM NUMBER(7,2),

DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT

);


插入数据


INSERT INTO EMP VALUES(7369,‘SMITH’,‘CLERK’,7902,to_date(‘17-12-1980’,‘dd-mm-yyyy’),800,NULL,20);

INSERT INTO EMP VALUES(7499,‘ALLEN’,‘SALESMAN’,7698,to_date(‘20-2-1981’,‘dd-mm-yyyy’),1600,300,30);

INSERT INTO EMP VALUES(7521,‘WARD’,‘SALESMAN’,7698,to_date(‘22-2-1981’,‘dd-mm-yyyy’),1250,500,30);

INSERT INTO EMP VALUES(7566,‘JONES’,‘MANAGER’,7839,to_date(‘2-4-1981’,‘dd-mm-yyyy’),2975,NULL,20);

INSERT INTO EMP VALUES(7654,‘MARTIN’,‘SALESMAN’,7698,to_date(‘28-9-1981’,‘dd-mm-yyyy’),1250,1400,30);

INSERT INTO EMP VALUES(7698,‘BLAKE’,‘MANAGER’,7839,to_date(‘1-5-1981’,‘dd-mm-yyyy’),2850,NULL,30);

INSERT INTO EMP VALUES(7782,‘CLARK’,‘MANAGER’,7839,to_date(‘9-6-1981’,‘dd-mm-yyyy’),2450,NULL,10);

INSERT INTO EMP VALUES(7788,‘SCOTT’,‘ANALYST’,7566,to_date(‘19-04-1987’,‘dd-mm-yyyy’)-85,3000,NULL,20);

INSERT INTO EMP VALUES(7839,‘KING’,‘PRESIDENT’,NULL,to_date(‘17-11-1981’,‘dd-mm-yyyy’),5000,NULL,10);

INSERT INTO EMP VALUES(7844,‘TURNER’,‘SALESMAN’,7698,to_date(‘8-9-1981’,‘dd-mm-yyyy’),1500,0,30);

INSERT INTO EMP VALUES(7876,‘ADAMS’,‘CLERK’,7788,to_date(‘23-05-1987’,‘dd-mm-yyyy’)-51,1100,NULL,20);

INSERT INTO EMP VALUEs(7900,‘JAMES’,‘CLERK’,7698,to_date(‘3-12-1981’,‘dd-mm-yyyy’),950,NULL,30);

INSERT INTO EMP VALUES(7902,‘FORD’,‘ANALYST’,7566,to_date(‘3-12-1981’,‘dd-mm-yyyy’),3000,NULL,20);

INSERT INTO EMP VALUES(7934,‘MILLER’,‘CLERK’,7782,to_date(‘23-1-1982’,‘dd-mm-yyyy’),1300,NULL,10);


SALGRADE表


CREATE TABLE SALGRADE (

GRADE NUMBER,

LOSAL NUMBER,

HISAL NUMBER

);


插入数据


INSERT INTO SALGRADE VALUES (1,700,1200);

INSERT INTO SALGRADE VALUES (2,1201,1400);

INSERT INTO SALGRADE VALUES (3,1401,2000);

INSERT INTO SALGRADE VALUES (4,2001,3000);

INSERT INTO SALGRADE VALUES (5,3001,9999);


BONUS表


CREATE TABLE BONUS (

ENAME VARCHAR2(10),

JOB VARCHAR2(9),

SAL NUMBER,

COMM NUMBER

);


提交


COMMIT;



版权声明:本文为weixin_43515044原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。