Oracle学习笔记(1)

本文详细介绍了Oracle数据库的基本概念,包括表空间、数据文件、段、区间、数据块等核心组件,以及如何创建、管理和操作这些组件。此外,文章还涵盖了用户管理、表的创建与管理、权限与角色分配、表查询、数据插入与删除等内容,提供了实用的操作技巧和示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:没有PL/SQL内容。

Oracle中一个实例,就是一个数据库,所以没有对应的show databases语句。

Oracle数据库的基本单元:

表空间(Tablespace

数据文件(DataFiles)表空间物理上由一个或多个数据文件组成。

段(Segment)        多个数据块组成的区间,多个区间组成了段。

区间(Extents)  区间由多个数据块组成,一个Extent总是属于一个表空间的一个数据文件。

数据块(Blocks) 数据块是Oracle的最小存储单位,一般为8K,实际的数据是存储在数据块中。

表空间是逻辑概念,各种对象都存放在表空间上。

根据表用途分成几种:

Permenent Tablespace存放数据

Undo Tablespace存放回滚数据

Temporary Tablespace存放临时数据

著名的表空间:SYSTEM、SYSAUX、TEMP、Users、Example

Oracle里,只有表空间,表空间里有表。

//创建临时表空间

create temporary tablespace user_temp

tempfile 'D:\oracle\oradata\Oracle9i\user_temp.dbf'

size 50m

autoextend on

next 20m maxsize 500m

extent management local;

//创建数据表空间

create tablespace test_data

logging

datafile 'D:\oracle\oradata\Oracle9i\user_data.dbf'

size 50m

autoextend on

next 50m maxsize 20480m

extent management local;

//创建用户并指定表空间

create user username identified by password

default tablespace user_data

temporary tablespace user_temp;

//给用户授予权限(角色)

grant connect,resource to username;

//转换用户

conn username/password

//创建表(类似与sql,数据类型有些变化)

create table user(

       id number primary key,

       …

)

//插入数据(和sql一样)

insert into table values (…)

角色、权限和用户

比如:具有create session权限才能连接到数据库上,只有具有create table权限再能建表。

角色是指多个权限的集合,因为在给用户设置权限时,一个一个分配权限,太过于麻烦,可以通过将多个权限分配给角色,然后将角色直接分配给用户。

权限:系统权限:用户对数据库的相关权限。

  对象权限:用户对其他用户的数据对象(如:表,视图,存储过程…)操作的权限。

角色:预定义角色、自定义角色。

syssystem是用户,sysdbasysoper是权限。

===============================================================

基本命令

conn[ect] 用户名/@网络服务名 [as sysdba/sysoper]

disc[onnect]

passw[ord]

show user

start@

edit

spool

exit

Oracle基本命令

set linesize 300;    设置行高

set pagesize 50;     设置每页显示的数目

conn system/manager as sysdba;   system登陆

show user;           显示当前的用户

select * from tab;   显示当前数据库所有的表

desc 表名;            显示表的结构

clear scr;           清除屏幕

/                    上次查询

====================

用户管理

创建用户

新用户的创建命令create user,具有dba权限才能使用。

create user 用户名 identified by 密码

实例:create user ruan identified by ruan012

修改密码

给自己修改直接用:

password [用户名]

具有dba权限,或拥有alter user的系统权限,可以修改别人密码:

实例:create user ruan identified by ruan012

删除用户:

drop user 用户名 [cascade]

删除用户时,如果该用户创建了表,删除时就得带上参数cascade

创建的新用户是没有任何权限的,需要为其指定相应的权限。

给一个用户赋权限使用命令grant,回收权限用命令revoke

能授权的用户下:grant connect to ruan;

grant select on emp to ruan;

其中对象权限有:selectupdatedeletealertall……

ruan用户下:select * from scott.emp;

方案:是该用户下所有对象的集合。默认情况下方案名就是用户名。如上面句子的:scott

授权的用户收回权限:revoke select on emp from ruan

对权限的维护

权限的传递:

——如果是对象权限,就在后面加with grant option

如:grant select on emp to ruan with grant option;

——如果是系统权限

如:grant connect to ruan with admin option;

使用profile管理用户口令

概述:profile是口令限制,资源限制的命令集合,当建立数据库时,oracle会自动建立名称为defaultprofile。当建立用户没有指定profile选项,那oracle就会将default分配给用户。

(1)账户锁定

指定用户登录时最多可以输入密码的次数,也可以指定用户锁定的时间(天),一般用dba的省份去执行该命令。

实例:create profile aaaa limit failed_login_attempts 3 password_lock_time 2;

赋给哪个用户:alter user ruan profile aaaa;

(2)给用户解锁

alter user ruan account unlock;

 (3)终止口令

使用终止口令可以让用户定期修改密码。

实例:每10天要修改密码,宽限为2天。

create profile aaaa limit password_life_time 10 password_grace_time 2;

alter user ruan profile aaaa;

另:password_reuse_time 指定口令可重用时间

删除profile

drop profile aaaa [cascade]

====================

表的管理

表名和列的命名规则:

必须以字母开头

长度不超过30字符

不能使用oracle的保留字

只能使用如下字符a-zA-Z0-9、¥、#

支持的数据类型:

字符型:

char      定长,最大2000字符

varchar2  变长,最大4000字符

clob      字符型大对象,最大4G

数字型:

number    范围-1038次方到1038次方

如 number5,2)表示一个小数有5位有效数,2位小数

如 number5)表示一个五位整数

日期类型:

date 包含年月日和时分秒

timestamp 这是oracle9idate数据类型的扩展

图片:

blob  二进制数据,可以存放图片、声音 4G (一般不用,除非考虑安全性)

注意分号别忘了!

创建表

create table student( --表名

xh number(4), --学号

xm varchar2(20), --姓名

sex char(2), --性别

birthday date, --出生日期

sal number(5,2) --奖学金

);

查看表结构

desc student

添加一个字段

alter table student add (classid number(2));

(以下实际很少用)

修改字段的类型或是名字(不能有数据,)

alter table student modify (xm char(30))

删除一个字段

alter table student drop column sal;

修改表的名字

rename student to stu

所有字段都插入

insert into student values (001,'小明','','1990-12-14',100.00);

注意:

Oracle默认日期格式:

'DD-MON-YY',如:14-12-90

改日期默认格式(也只是暂时改,除非改注册表):

alter session set nls_date_format = 'yyyy-mm-dd';

操作数据库插入带有日期值的时候可以用to_data()函数。

插入部分字段

insert into student(xh,xm,sex) values (002,'Amy','');

插入空值

insert into student (xh,xm,sex,birthday) values(003,'aa','',null)

查询:select * from student where birthday is null;

select * from student where birthday is not null;

改一(多)个字段

update student set sex='' where xh=001;

update student set sex=''birthday='1980-12-14' where xh=001;

修改含有null值的数据

参考插入空值,用is null

删除数据

delete from student;

删除所有记录,表结构还在,写日志,可以恢复的,速度慢。

删除数据前,设置保存点:savepoint aa;

恢复数据:rollback to aa;  必须保证在这之前没有提交(commit);

drop table student;

删除表的结构和数据

delete from student where xh=002;

删除一条记录

truncate table student;

删除表中左右记录,表结构还在,不写日志,无法找回删除的记录,速度快。

====================

表的查询

scott表中的emp表和dept表。

消除重复行用distinct关键字。

如:select discinct sex from student;

注意查询表中数据时,数据内容区分大小写字母。例如:

select * from scott.emp where job='clerk';

会出现找不到内容,使用下面可以找到:

select * from scott.emp where job='CLERK';

为字段取别名(as可以不要):

如:select ename "名字",job as "职位" from scott.emp;

如何处理null值

使用nvl函数来处理

select ename "名字",job as "职位",sal*12+comm*12 as "年工资" from scott.emp;

这样得到的年工资有的就是空,因为表达式sal*12+comm*12中comm为空值,整个表达式也就是空值。通过nvl函数处理如下:

select ename "名字",job as "职位",sal*12+nvl(comm,0)*12 as "年工资" from scott.emp;

like操作符

%:表示任意0到多个字符

_:表示任意单个字符

例子:select * from scott.emp where ename like 'S*';

in操作符

例子:select * from scott.emp where ename in ('SCOTT','SMITH');

order by(默认升序asc)和desc(降序)

例子:select * from scott.emp order by deptno,sal desc;

另外:通过别名排序:

select ename,job,sal*12 "年工资(不包括奖金)",deptno from scott.emp order by deptno,"年工资(不包括奖金)" desc;

函数:countmaxminavgsum

1、分组函数只能出现在选择列表、havingorder by子句中。

2、在select语句中同时拥有以下的的应按照group byhavingorder by的顺序

3、在选择列如果有列、表达式和分组函数,那么这些列和表达式必须有一个出现在group by子句中,否则出错。

子查询:

select * from scott.emp where sal=(select max(sal) from scott.emp);

select * from scott.emp where sal>=(select avg(sal) from scott.emp);

group byhaving

select avg(sal),deptno,job from scott.emp group by deptno,job;

用having进一步进行条件显示:

select avg(sal),deptno from scott.emp group by deptno having avg(sal)>2000;

多表查询

select * from scott.emp,scott.dept

where scott.emp.deptno=scott.dept.deptno;

allany操作符

单行子查询、多行子查询、多列子查询

Select ename,sal,deptno from emp where sal>

All (select sal from emp where deptno=30);

Select ename,sal,deptno from emp where sal>

Any (select sal from emp where deptno=30);

Select * from emp Where (deptno,job)=(select deptno,job from emp where ename='SMITH');

Oracle分页查询  三种方式

rownum分页
1.rownum分页 
(select * from emp) 
2.显示rownum[oracle分配的
select a1.*,rownum rn from (select * from emp )a1; 
3.查询110行记录 
select a1.*,rownum rn from (select * from emp )a1 where rownum<=10;  OR 
select * from (select a1.*,rownum rn from (select * from emp )a1 where rownum<=10) ; 
查询610行记录 
select * from (select aa.*,rownum rm from(select * from emp order by sal)aa where rownum<=10) where rm>5; 

格式:

SELECT x.* from (   
     SELECT z.*,rownum numbers from(   
          select * from emp order by sal)z   
     where rownum<10) x    
where x.numbers>5 

另外:子查询的效率是非常慢的, 能不用子查询就尽量不要用。 

select * from (select e.*,rownum rn from scott.emp e) a1 where a1.rn between 6 and 10;
4.几个查询变化 
A。指定查询列,只需修改最里层的子查询; 
B。排序,也只需修改最里层的子查询; 
select * from (select a1.*,rownum rn from (select ename,sal from emp )a1 where rownum<=10) where rn=>6; 
select * from (select a1.*,rownum rn from (select ename,sal from emp order by sal desc)a1 where rownum<=10) where rn=>6; 

分页三种方式:
要把ROWID来分 
 select * from t_xiaoxi where rowid in(select rid from select rownum rn,rid from (select rowid rid,cid from t_xiaoxi order by cid desc) where rownum<10000) where rn>9980) order by cid desc;
按分析函数来分 
 select * from (select t.*,row_number() over(order by cid desc) rk from t_xiaoxi t )where rk<100000 and rk>9980; 
rownum来分。 
 select * from (select t.* rownum rn from (select * from t_xiaoxi order by cid desc)t where rownum<10000) where rn>9980; 
效率13(1比较麻烦,2效率很低

其他:当使用values子句时,一次只能插入一条数据。当使用子查询插入语句是,一条insert可以插入大量数据。当处理行迁移或者装载外部表的数据到数据库时,可以使用子查询来插入数据。   还有update也可以。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值