-- 创建表空间
create tablespace Test --表空间的名字
datafile 'c: est.dbf' -- 位置
size 100m -- 大小
autoextend on -- 允许自动扩容
next 10m; -- 每次扩容10m
-- 删除表空间 drop
drop tablespace itheima
--- 创建用户
create user hogan
identified by hogan
default tablespace Test;
-- 用户授权才能登录
-- Oracle 数据中常用角色
-- connect 连接角色,基本角色
-- resource 开发者角色
-- dba 超级管理员角色
-- 给hogan用户授权dba角色
grant dba to hogan;
-- 创建表
create table person (
pid number(20),
pname varchar2(10)
);
-- 修改表结构
-- 添加一列
alter table person add gender number(1)
-- 修改列类型
alter table person modify gender char(1);
-- 修改列的名称
alter table person rename column gender to sex;
-- 删除一列
alter table person drop column sex;
-- 数据的增删改
--添加记录
insert into person (pid,pname) values (1,'xaom');
commit;
--修改
update person set pname='xiaoming' where pname='小明';
commit;
--删除
-- 删除表中全部记录
delete from person
-- 删除表结构
drop table person
--先删除表在创建表,等同于删除表中所有记录;
---在数据量比较大的情况之下,尤其是在表中带有索引的情况下,该操作的效率较高。
-- 索引能够提高查询效率,但是影响增删改查
truncate table person
select * from person;
--- 序列:默认从1开始,一次递增,只要是用来给主键赋值使用的
create sequence s_person;
--- 序列:默认从1开始,一次递增,只要是用来给主键赋值使用的
create sequence s_person;
select s_person.nextval from dual;
select s_person.currval from dual;
--- 添加记录
insert into person (pid, pname ) values (s_person.nextval, 'xiaoqin');
commit;
select * from person;
-- scott 用户,密码默认tiger ,初学者适用
-- 解锁scott 用户
alter user scott account unlock;
--解锁密码,也可以用来重置密码
alter user scott identified by tiger;
-- 查询
--单行函数:作于单行,返回一个值
--字符函数
select upper('yes') from dual;
select lower('YES') from dual;
--数值函数
select round(26.18, 1) from dual;--,四舍五入,后面的参数表示保留的位数
select trunc(26.18, 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;
--转换函数 date--》char
select to_char (sysdate, 'yyyy-mm-dd hh:mi:ss') from dual; --此函数带零,加上fm零就可以去掉
select to_char (sysdate, 'fm yyyy-mm-dd hh:mi:ss') from dual;
select to_char (sysdate, 'fm yyyy-mm-dd hh24:mi:ss') from dual;--24小时计数
--- char --> date
select to_date ( '2020-2-6 7:14:40', 'fm yyyy-mm-dd hh24:mi:ss') from dual;--24小时计数
-- 通用函数
-- 算出emp中所有员工的年薪
select emp.sal*12 from emp;
select emp.sal from emp;
---当算术运算中有null值是,用nvl排除
select sal*12+nvl(comm,0 )from emp;
--- 添加表达式
---条件表达式的通用写法(orcal和mysql)
---给emp中表中员工起中文名字
select ename ,
case ename
when 'SMITH' then '曹贼'
when 'ALLEN' then '诸葛'
when 'JONES' then '山贼'
-- else '无名'
end
from emp;
-- 判断emp员工工资,高于3000显示高收入,1500-3000中等收入,其余低收入
--范围判断,case后面的值放到比较符号前面
select sal,ename,
case
when sal>3000 then '高收入'
when sal>1500 then '中等收入'
else '低收入'
end
from emp e;
--orcale 专用条件表达式
select ename ,
decode(ename,
'SMITH' ,'曹贼',
'ALLEN' ,'诸葛',
'JONES' ,'山贼',
'无名' )
from emp;
--- 起别名, Oracle中除了起别名都用单引号,别名可以不加引号
select ename ,
decode(ename,
'SMITH' ,'曹贼',
'ALLEN' ,'诸葛',
'JONES' ,'山贼',
'无名' ) 中文名
from emp;
-- 多行函数【聚合函数】: 作用于多行,返回一个值
--count返回表中有多少条数据,count(1) 等价于count(*)
select count(1) from emp; --查询总数量
select sum(sal) from emp; -- 总和
select min(sal) from emp; -- 最小值
select max(sal) from emp; -- 最大值
select avg(sal) from emp; -- 平均值
-- 分组查询
-- 查询出每个部门的平均工资
---分组查询中出现在group by后面的原始列才能出现在select后面
-- 没有出现在group by 后面的列,想在select后面,必须加上聚合函数。
select e.deptno,avg(e.sal)
from emp e
group by e.deptno
-- 查询平均工资高于2000的部门
--- 所有条件都不能使用别名来判断,查询的时候先看条件
select emp.deptno, avg(sal) avsal
from emp
group by emp.deptno
having avg(emp.sal)>2000
select ename,sal from emp where sal > 200;
-- 查询出每个部门工资高于800的员工的平均工资
select emp.deptno, avg(sal)
from emp
where sal>800
group by emp.deptno
-- where 是过滤分组前的数据,having是过滤分组后的数据
-- 表现形式:where必须在group by 之前,having是在group by之后
-- 查询出每个部门工资高于800的员工的平均工资,在查询出平均工资高于2000的部门
select emp.deptno,avg(sal)
from emp
where sal>800
group by emp.deptno
having avg(sal)>2000;
--- 多表查询的概念
-- 笛卡尔积; 两张表的数据相乘
select * from emp ,dept;
-- 等值连接
select *
from emp,dept
where emp.deptno=dept.deptno;
-- 内连接<=>等值连接
select *
from emp inner join dept
on emp.deptno=dept.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;
--员工姓名及部门,员工领导姓名及部门
select e1.ename,d1.dname,e2.ename,d2.dname
from emp e1,emp e2,dept d1,dept d2
where e1.empno=e2.mgr and e1.deptno=d1.deptno and e2.deptno=d2.deptno;
-- 子查询
-- 子查询返回一个值
-- 查询出工资和Scott一样的员工信息 。。当不能保证为null时用in
select * from emp where emp.sal=(
select sal from emp where emp.ename='SCOTT');
-- 返回一个集合
-- 查询出工资和10号部门任意员工工资一样的员工信息
select sal
from emp
where sal
in (
select sal from emp where emp.deptno=10);
-- 返回张表
-- 查询每个部门的最低工资和员工姓名、部门名称
---先查询出每个部门最低工资
select deptno,min(sal) msal
from emp
group by deptno
-- 再三表联查
select e.ename,e.sal,d.dname
from (select deptno,min(sal) msal
from emp
group by deptno) t,emp e, dept d
where t.deptno=e.deptno
and t.msal=e.sal
and e.deptno=d.deptno;
-- oracle中的分页
-- rownum行号,当我们做select操作的时候没查询出一行记录,就会再改行上加上
---一个行号,
-- 行号从1开始依次递增,不能跳着走
-- emp表工资倒叙排列,每页五条记录,查询第二页
-- 排序操作会影响rownum的顺序
select rownum,emp.* from emp
order by sal desc;
-- 先排序再加行号,如果涉及排序和rownum 可以选择先排序再查询
select rownum ,t.* from(
select rownum,emp.* from emp order by sal desc) t;
-- -- emp表工资倒叙排列,每页五条记录,查询第二页
-- rownum不能大于一个正数
select * from (
select * from(
select rownum rn,t.* from (
select e.* from emp e order by sal desc) t)
where rn<11
) where rn>5;
-- 视图:提供一个查询的窗口,所有数据来自于原表
-- 创建一个视图【必须有dba权限】
-- 查询语句创建表
create table emp as select * from scott.emp;
select * from emp;
-- 创建视图
create view e_emp as select ename,job from emp;
-- 查询视图(视图是可以改变的)
select * from e_emp;
update e_emp set job='CLERK' where ename='MANAGER';
commit;
--只读视图
create view r_emp as select ename,job from emp with read only;
-- 1.视图可以屏蔽敏感字段;2.保证总部和分部数据及时统一;3.
-- 索引:在表的列上构建二叉树,达到大幅度提高查询效率的目的,但是会影响增删改的效率
-- 单列索引
-- 创建单列索引,
create index idx_ename on emp(ename);
select * from emp where ename='SMITH';
select * from emp;
-- 单行函数,模糊查询都会影响索引的触发
-- 复合索引
--创建复合索引,复合索引中第一列为优先检索列,如果触发复合索引必须包含优先检索列中的原始值
create index idx_enamejob on emp(ename,job);
select * from emp where enmae='SCOTT' and job='xx'; --触发复合索引
select * from emp where enmae='SCOTT' or job='xx'; -- 不触发索引
select * from emp where enmae='SCOTT' ; --- 触发单列索引
--p1/sq1编程语言
--p1/sq1病程语言是利sq1语言的扩展,使得sq1语言具有过程化编程的特性。
--p1/sq1编程语方比一般的过程化编程语言,更加灵活高效。
--p1/sq1编程语言主要用来新写存能过程和存储函数等。
declare
i number(2) := 10; -- 表示数字2 用‘:=’来赋值
s varchar2(10) :='小明';
ena emp.ename%type; -- 直接提取表中数据格式大小(引用型变量)
emprow emp%rowtype; -- 记录型变量
begin
dbms_output.put_line(i);
dbms_output.put_line(s);
select ename into ena from emp where empno=7788; -- 查 询语句赋值 into
dbms_output.put_line(ena);
select * into emprow from emp where empno=7788; -- 查询语句赋值 into,把一行赋值变量
dbms_output.put_line('名字:'||emprow.ename||'工作:'||emprow.job); -- 输出连接符应‘||’
end;
-- pl/sql中的if判断
select * from emp;
insert into person values(1,'小明');
-- 解决中文乱码问题
select userenv('language') from dual;
select * from V$NLS_PARAMETERS
中文乱码问题解决
1.查看服务器端编码
select userenv('language') from dual;
我实际查到的结果为:AMERICAN_AMERICA.ZHS16GBK
2.执行语句 select * from V$NLS_PARAMETERS
查看第一行中PARAMETER项中为NLS_LANGUAGE 对应的VALUE项中是否和第一步得到的值一样。
如果不是,需要设置环境变量.
否则PLSQL客户端使用的编码和服务器端编码不一致,插入中文时就会出现乱码.
3.设置环境变量
计算机->属性->高级系统设置->环境变量->新建
设置变量名:NLS_LANG,变量值:第1步查到的值, 我的是 AMERICAN_AMERICA.ZHS16GBK
4.重新启动PLSQL,插入数据正常
-- 多行函数:作用于多行,返回一个值