一、简介
Oracle Database,又名Oracle RDBMS,或简称Oracle,是甲骨文公司的一款关系数据库管理系统。本课程主要介绍Oracle的SQL基础,包括表空间的概念,如何登录Oracle数据库,如何管理表及表中的数据,以及约束的应用。为后续课程的学习打下一个良好的基础。
二、安装好之后可以登录系统账户
打开sqlplus,输入用户名system或sys(后者有最高权限)和自己设置的口令就可以登录了。
三、用户与表空间
系统用户有哪些?
sys,system 前者高于后者,前者必须以管理员权限登录
sysman 操作企业管理的用户,也是管理员用户
scott 普通用户
前三者用户的密码是安装时设置的,scott的默认密码是tiger
登录通用语句:
[username/password][@server][as sysdba|sysoper]
如果是远程登录,则需要输入IP地址。
也可以在前面加一个connect,比如connect as sysdba;
四、数据字典
(1)数据字典介绍
数据字典是Oracle存放有关数据库信息的地方,其用途是用来描述数据的。比如一个表的创建者信息,创建时间信息,所属表空间信息,用户访问权限信息等。当用户在对数据库中的数据进行操作时遇到困难就可以访问数据字典来查看详细的信息。
dba_开头的是管理员才能查看的数据字典,users_开头的是都能查看的数据字典。
数据字典或表前加上desc可以查看他们的结构。
比如desc dba_users查看数据字典的信息。
select username from dba_users;
可以从数据字典里面查看用户的名字。
(2)查看用户的数据字典dba_users
dba_users、user_users用来查看不同权限级别的数据字典。使用示例如:
select default_tablespace,temporary_tablespace from dba_users where username='SYSTEM';
(3)数据字典dba_data_files,查看数据文件的
select file_name from dba_data_files where tablespace_name = 'TEST1_TABLESPACE';
得到结果:
FILE_NAME
--------------------------------------------------------------------------------
D:\APP\HP\PRODUCT\11.2.0\DBHOME_1\DATABASE\TEST1FILE.DBF
类似的字典 dba_temp_files(查看临时表空间文件的)
五、如何启用scott用户
默认情况下是锁定的。
启用语句:
alter user username(可以替换) account unlock;
六、表空间
(1)表空间介绍
表空间就是在数据库中开辟的一个空间用来存储我们的数据库对象,一个数据库可以由多个表空间构成。
表空间由一个或多个数据文件构成,大小可以由用户来定义。
表空间的分类:
永久表空间
临时表空间
UNDO表空间
永久表空间主要存储数据库中要永久存储的对象,表、视图、存储过程。临时表空间存储数据库操作当中中间执行的过程,执行结束之后自动释放掉,不进行永久性保存。UNDO表空间用于保存事务所修改数据的旧值,可以做回滚操作。
(2)如何查看用户的表空间?
数据字典:dba_tablespaces(针对管理员级别的用户)、user_tablespaces(针对普通用户的数据字典)
dba的表空间中,system用于管理员,也叫系统表空间,sysaux为示例的辅助表空间,undotbs1用于存储撤销信息的,temp用于存储处理的表和索引信息的临时表空间,users用于存储用户创建的数据库对象,example表空间等。
(3)如何设置用户的默认或者临时表空间
alter user username default|temporary tablespace tablespace_name;
alter user system default tablespace system;
(4)创建表空间
create [temporary] tabalspace tablespace_name tempfile|datafile 'xx.dbf' size xx;
create tablespace test1_tablespace datafile 'test1file.dbf' size 10M;
create temporary tablespace temptest1_tablespace tempfile 'tempfile1.dbf' size 10M;
(5)修改表空间的状态
设置在线离线状态
alter tablespace tablespace_name online|offline; --脱机状态不能使用它
dba_tablespaces字典下面的status状态可以查看状态。
select status from dba_tablespaces where tablespace_name = 'TEST1_TABLESPACE';
设置只读或可读写状态,一般是read write可读写的状态
alter tablespace tablespace_name read only|read write; --前提是表空间是一定是在线状态
(6)增加数据文件
alter tablespace tablespace_name add datafile 'xx.dbf' size xx;
添加后使用dba_data_files来查询。
select file_name from dba_data_files where tablespace_name='TEST1_TABLESPACE';
(7)删除数据文件
alter tablespace tablespace_name drop datafile 'xx.dbf'; --注意不能删除创建表空间时候的第一个文件,如果需要删除则必须要把表空间删掉。
(8)删除表空间
drop tablespace tablespace_name [including contents]; --如果需要把数据文件也删除则把后面加上。
七、数据表
(1)表的介绍
表是基本存储单位,要把数据都存在表中,oracle中的表都是二维结构。
一行也可以叫做记录,一列也可以叫做域或者字段。
约定:要求每一列需要有相同的数据类型。
列名要是唯一的。
每一行的数据是唯一的。
(2)表中的数据类型
字符型
固定长度类型:char(n)(max2000),nchar(n)(unicode格式,max1000,多数用来存储汉字)
可变长度类型:varchar2(n)(max4000),nvarchar2(n)(unicode格式,max2000)
数值型
number(p,s) p为有效数字,s为小数点后面的位数,s可正可负
float(n) 用来存储二进制数据,二进制数据的1-126位,一般使用number
日期型
date 范围为公元前4712年1月1日到公元9999年12月31日,可以精确到秒
timestamp 可以精确到小数秒,一般用date类型
其他类型
blob 可存4G数据以二进制存放
clob 可存4G数据以字符串存放
(3)如何管理表
创建表:
create table table_name( --在同一个用户下表明要是唯一的。
column_name datatype,...
);
如
create table userinfo
(id number(6,0),
username varchar2(20),
userpwd varchar2(20),
email varchar2(30),
regdate date);
创建完之后如果需要查看字段的信息使用desc userinfo即可查看。
(4)如何修改表的结构
添加字段
alter table table_name add column_name datatype;
如
alter table userinfo add remarks varchar2(500);
更改字段数据类型
alter table table_name modify column_name datatype; --改长度或者更换数据类型
如
alter table userinfo modify remarks varchar2(400);
删除字段
alter table table_name drop column column_name;
修改字段名
alter table table_name rename column column_name to new_column_name;
修改表名
rename table_name to new_table_name;
(5)删除表
truncate table table_name; --删除表中的全部数据,没有删除表,比delete快很多。
drop table table_name; 数据和结构都删掉。
(6)操作表中的数据
添加数据
insert into table_name (column1,column2,...) values (value1,value2,...); --如果是所有字段都添加值,则表明后面的小括号可以省略。
如
insert into userinfo values (1,'xxx','123','xxx@126.com',sysdate); --sysdate可以获取当前系统日期
查询select * from userinfo;
又如
insert into userinfo (id,username,userpwd) values (2,'yyy','123');
(7)设置某字段的默认值
创建表时添加
如
create table userinfo1(id number(6,0),regdate date default sysdate); --使用default关键词,虽然指定了默认值,但是在添加的时候还是要指定字段名才行
在创建表以后添加默认值:
alter table userinfo modify email default '无'; --如果在新加记录的时候不想要默认值了,则按正常的添加方式添加了就可以替换默认值了
(8)复制表数据
在建表时复制
create table table_new as select column1,...|* from table_old; --可以选择要复制的字段也可以复制所有
如:
create table userinfo_new as select * from userinfo; --userinfo是被复制的表
部分字段复制如
create table userinfo_new1 as select id,username from userinfo;
在添加时复制
insert into table_new [(column1,...)] select column1,...|* from table_old; --顺序和数据类型要完全一致
如
insert into userinfo_new select * from userinfo;
又如
insert into userinfo_new (id,username) select id,username from userinfo;
(9)修改表的数据
update tabel_name set column1=value1,...[where conditions];
无条件更新:
update userinfo set userpwd = '111111';
有条件的更新:
update userinfo set userpwd='123456' where username ='xxx';
(10)删除数据
只能以行为单位来删除数据
delete from table_name; --删除全部数据,效率慢些
delete from table_name [where conditions];
无条件删除
delete from testdel;
有条件的删除
delete from userinfo where username='yyy';
八、约束
(1)约束的介绍
约束的作用是定义规则(最重要
),确保完整性。
(2)约束的种类
非空约束
主键约束
外键约束
唯一约束
检查约束
(3)非空约束
在创建表时设置非空约束:
create table table_name(column_name datatype not null,...);
如:
create table userinfo_1 (id number(6,0),
username varchar2(20) not null,
userpwd varchar2(20) not null);
在修改表时添加非空约束:
alter table tabel_name modify column_name datatype not null;
如
alter table userinfo modify username varchar2(20) not null; --在修改之前表里面不要有任何数据
在修改表时去除非空约束:
alter table tabel_name modify column_name datatype null;
(4)主键约束
必不可少,确定每一行数据的唯一性。
一张表只能设计一个主键约束。
主键约束可以由多个字段构成,称为联合主键或者复合主键。
在创建表时设置主键约束:
create table table_name(column_name datatype primary key,...);
如
create table userinfo_p(id number(6,0) primary key,
username varchar2(20),
userpwd varchar2(20));
如果用约束的话:
constraint constraint_name primary key (column_name1,...); --一般用来创建联合主键
如
create table userinfo_p1(id number(6,0),
username varchar2(20),
userpwd varchar2(20),
constraint pk_id_username primary key(id,username));
如果忘记了约束的名字,可以到user_constraints
数据字典查询constraint_name.
如
select constraint_name from user_constraints where table_name='USERINFO_P1';
如果没有用约束来创建主键,则系统会自动命名约束的名称,可以看这个:
select constraint_name from user_constraints where table_name='USERINFO_P';
结果为:
CONSTRAINT_NAME
------------------------------
SYS_C0011189
在修改表时添加主键约束:
add constraint constraint_name primary key(column_name1,...); --主键名一般以pk_开头
alter table userinfo add constraint pk_id primary key(id); --设置约束之前,如果已经有值了,必须唯一,且不能为空。
更改约束的名称,可以修改任何约束的名字
alter table table_name rename constraint old_name to new_name;
删除主键约束:
alter table table_name disable|enable constraint constraint_name; --禁用|启用约束,不删除
查看状态:
select constraint_name,status from user_constraints where table_name='USERINFO';
如果是完全删除:
alter table table_name drop constraint constraint_name;
还有一种方法:
drop primary key[cascade]; --删除主键约束,如果存在外键约束,填写cascade,可以把其他表中引用该主键约束的一起删掉
(5)外键约束
两个表之中字段关系的约束。
在创建表的时候设置外键约束:
--分开创建时
create table table1(column_name datatype references table2(column_name),...);
--table2为主表,table1为从表,也叫主从表。主表当中的字段必须是主表中的主键字段,主从表的字段要设置成同一个数据类型。在向设置了外键约束的表输入值的时候,从表中外键字段的值必须来自主表中的相应字段的值,或者为null值。
如创建主表:
create table typeinfo(typeid varchar2(10) primary key,
typename varchar2(20));
创建从表:
create table userinfo_f(id varchar2(10) primary key,
username varchar2(20),
typeid_new varchar2(10) references typeinfo(typeid));
然后给主表插入数据:
insert into typeinfo values(1,1);
如果这样给从表插入数据:
insert into userinfo_f(id,typeid_new) values (1,2);
则2在主表中没有找到,会报错。需要填写
insert into userinfo_f(id,typeid_new) values (1,1);
才可以,或者那个部分留空值:
insert into userinfo_f(id,typeid_new) values (2,null);
在创建表的时候设置外键约束:
--定义完所有的字段之后设置的约束
constraint constraint_name foreign key(column_name) references table_name(column_name) [on delete cascade];
--后面的中括号是级联删除,表示主表当中的一条数据被删除的时候,从表当中使用了这条数据的字段所在的行也会被一起删除掉,这样确保了主从表数据的完整性。
如:
create table userinfo_f2 (id varchar2(10) primary key,
username varchar2(20),
typeid_new varchar2(10),
constraint fk_typeid_new foreign key (typeid_new) references typeinfo(typeid));
如果添加级联删除:
create table userinfo_f3 (id varchar2(10) primary key,
username varchar2(20),
typeid_new varchar2(10),
constraint fk_typeid_new1 foreign key (typeid_new) references typeinfo(typeid) on delete cascade);
在修改表时添加外键约束:
alter table tabel_name add constraint constraint_name foreign key(column_name) references table_name(column_name) [on dedelete cascade];
删除外键约束:
ALTER TABLE 表名
DROP CONSTRAINT 外键约束名;
其中,“表名”是包含外键约束的表的名称,“外键约束名”是你要删除的外键约束的名称。
禁用外键约束:
disable|enable constraint constraint_name;
彻底删除外键约束:
drop constraint constraint_name;
(6)唯一约束
作用是保证字段的唯一性,和主键约束的区别是,主键约束必须是非空的,而唯一约束允许有一个空值。主键约束在一张表中只能有一个,唯一约束可以有多个。
在创建表时设置唯一约束:
create table tabel_name(column_name datatype unique,...);
在表级设置唯一约束:
constraint constraint_name unique(column_name); --如果需要设置多个字段为唯一约束,要写多个constraint子句。
在修改表时添加唯一约束:
add constraint constraint_name unique(column_name);
删除唯一约束:
禁用:
disable|enable constraint constraint_name;
完全删除:
drop constraint constraint_name;
(7)检查约束
检查约束,让表当中的值更具有实际意义,能够满足一定的条件,具有实际意义。
在创建表时设置检查约束:
create table tabel_name(column_name datatype check(expression),...);
如:
create table userinfo_c (id varchar2(10) primary key,
username varchar2(20),
salary number(5,0) check(salary>0));
比如输入insert into userinfo_c values(1,'aaa',-50);
就会报错。
在表级设置检查约束:
constraint constraint_name check(expression);
如:
create table userinfo_c1(id varchar2(10) primary key,
username varchar2(20),
salary number(5,0),
constraint ck_salary check(salary>0));
在修改表时添加检查约束:
add constraint constraint_name check(expression);
删除检查约束:
禁用:
disable|enable constraint constraint_name;
删除:
drop constraint constraint_name;
(8)总结五个约束
非空约束
主键约束:每张表只能有一个,可以由多个字段构成
外键约束:涉及两个表之间的关系
唯一约束
检查约束
在创建表时设置约束:
只有非空约束只能在列级设置约束,不能在表级设置约束,其他的都是两者都可以的。非空约束是没有名字的。
在修改表时添加约束,也是只有非空约束不同,修改表时用的语句是
alter table talbe_name modify column_name datatype not null;
更改约束的名称:数据字典(user_constraints查看名称)
rename constraint old_name to new_name;
删除约束,非空约束较特殊
alter table tabel_name modify column_name datatype null;
其他的如果是禁用的话使用
disable|enable constraint constraint_name;
如果要永久删除可以用
drop constraint constraint_name;
删除主键约束还能用
drop primary key;
九、基本查询
(1)查询基本语句
select [distinct] column_name1,...|* from table_name [where conditions]; --distinct可以不显示重复的行。
(2)在SQL*PLUS中设置格式
column column_name heading new_name;
如
col username heading 用户名; --执行成功的话不会有回显
--column可以简写成col,设置新的字段名(别名),使用select语句来查询的时候就可以看到变化了,但使用desc看结构还依然不变化。
设置结果显示的格式:
column column_name format dataformat;
注意:字符类型只能设置它的长度。 --字符格式用a开头,后面跟它要的长度。
如
col username format a10;
如果是数值类型用,9表示一位数字,比如
col salary format 9999.9;
可以保留4位数和一位小数。
如果
col salary format 999.9;
但如果数据中有四位的数,超过这个长度的就用#####表示了,与excel一致。
如果使用col salary format $9999.9;则数字前面加了美元符号。
清除之前设置过的格式:
column column_name clear;
如
col salary clear;
(3)查询表中的所有字段
select * from table_name;
查询指定的字段:比如
select username,salary from users;
(4)给字段设置别名
不会更改字段的名字,可以为多个字段设置别名
select column_name as new_name,... from table_name; --其中as可以省略,但最好加上
如
select id as 编号, username as 用户名, salary 工资 from users;
查看唯一值:
select distinct username as 用户名 from users;
(5)运算符和表达式
运算符大家都比较熟悉了,而表达式=操作数+运算符组成。
oracle中的操作数可以有变量、常量、字段。
运算符有算术运算符(+、-、*、/),比较运算符(>,>=,<,<=,=,<>都是用在where条件里面的,两个数进行比较得到的结果是布尔类型的,真或者假),逻辑运算符(and,or,not)
在select语句中使用运算符
在查询结果中,给每个员工的工资加上200元,但数据本身没变。
如
select id,username,salary+200 from users;
使用比较运算符:
查询工资高于800元的员工的姓名;
如
select username from users where salary > 800;
使用逻辑运算符:
如
select username from users where salary > 800 and salary <>1800.5;
select username from users where salary > 800 or salary <>1800.5;
(6)带条件的查询
如
select salary from users where username='aaa';
select username,salary from users where id=3;
多条件如
select * from users where username='aaa' or salary<=2000 and salary>800;
逻辑运算符的优先级顺序:not,and,or
比较运算符优先级高于逻辑运算符
not的例子:
select * from users where not(username='aaa');
(7)模糊查询
like关键字,也可以归入比较运算符当中。
通配符的使用(_表示一个字符,%表示0到多个任意字符)
如
select * from users where username like 'a%'; --以a开头的行
select username from users where username like '%a%'; --含有a的
(8)范围查询
between...and --表示从什么到什么之间。查询结果是含头又含尾的区间。
如果不在这个之间的,在它们前面加上not
如
select * from users where salary not between 800 and 2000;
in/not in 后面跟着小括号,里面是一个列表的值,一个具体的值。
如
select * from users where username in ('aaa','bbb');
select * from users where username not in ('aaa','bbb');
(9)对查询结果排序
select...from...[where...] order by column1 desc/asc,... --desc为降序排列,asc升序
(10)case...when语句
case column_name when value1 then result1,...[else result] end;
如
select username,case username when 'aaa' then '计算机部门'
when 'bbb' then '市场部门' else '其他部门' end as 部门
from users;
另一种形式:
case when column_name=value1 then result1,...[else result] end;
如
select username,case when username='aaa' then '计算机部门'
when username='bbb' then '市场部门' else '其他部门' end as 部门
from users;
如
select username,case when salary<800 then '工资低' when salary>5000 then '工资高' end as 工资水平 from users;
(11)decode函数的使用
decode(column_name,value1,result1,...,defaultvalue)
如
select username,decode(username,'aaa','计算机部门','bbb','市场部门','其他') as 部门 from users;
十、其他一些实用命令
可以使用host cls来清屏。
查看用户show user。
使用上下箭头可以选择历史输入记录来使用。
===================================================================================