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;