当前位置:文档之家› Oracle笔记

Oracle笔记







2.二个概念
数据库:数据存储的仓库
关系型数据库:数据库中保存的对象之间可以存在一定的关联关系,并非完全独立。主要反映到以后学习的主外键.
3.三个名词
sql:结构化的查询语句,操作oracle数据库的语言
sqlplus:oracle软件自带的可以输入sql,且将sql执行结果显示的终端
pl/sql:程序化的slq语句,在sql语句的基础上加入一定的逻辑操作,如if for...,使之成为一个sql块,完成一定的功能
4.四种对象
table:表格,由行和列组成,列又称字段,每一行内容为表格的一条完整的数据。
view: 视图,一张表或者多张表的部分或者完整的映射,好比表格照镜子,镜子里面的虚像就是view
除去常见的table和view两种对象以外,oracle数据库还支持如下四种对象
sequence:序列
index:索引,提高数据的访问效率
synonym:同义,方便对象的操作
program unit:程序单元,pl/sql操作的对象
5.五种分类
sql的五大分类:
Data retrieval:数据查询
select
DML:数据操纵语言(行级操作语言):操作的是表格当中一条一条的数据
insert update delete
DDL:数据定义语言(表级操作语言):操作的内容为表格(对象)
create alter drop truncate rename
transaction control:事务控制
commit rollback savepoint
DCL:数据控制语言
grant revoke



第二章:select语句,数据查询操作
1.使用select语句查询某张表的所有数据内容
语法:
select [distinct] *{col_name1,col_name2,..}
from tb_name;
注意:语法中出现的中括号[],表示该部分可有可无
*:表示所有列,仅仅作为测试和学习使用,在企业用语中不出现,因为效率低下且可读性差
col_name1:列名,将需要查阅的数据字段列举出来,可以查看多列值,列名之间用,进行分割即可
s_emp :员工信息表
s_dept:员工部门表
需求:查看s_dept表中的所有记录
select *
from s_dept;

select id,name,region_id
from s_dept;
练习:查看s_dept表中的所有记录的id和name
select id,name
from s_dept;



练习:查看所有员工的id,名字(last_name)和薪资(salary)
select id,last_name,salary
from s_emp;

2.select语句可以对指定的列的所有值进行算术运算。
语法:
select col_name 运算符 数字
from tb_name;
需求:查看每个员工的员工id,名字和年薪。
select id,last_name,salary*12
from s_emp;
注意:select语句永远不对原始数据进行修改。
练习:查看每个员工的员工id,名字和月薪涨100以后的年薪
select id,last_name,(salary+100)*12
from s_emp;
3.给查询的列区别名
语法:
select old_column [as] new_column_name
from tb_name;
需求:查看员工的员工id,名字和年薪,年薪列名为annual
select id,last_name,salary*12

as annual
from s_emp;

4.使用||可以使得多列的值或者列和特殊的字符串合并到一个列进行显示
语法:
select col_name||'spe_char'||col_name
from tb_name
'spe_char':如果一个列的值要跟特殊的字符串连接显示,使用该语法。
需求:查看员工的员工id,全名
select id,first_name||last_name
from s_emp;
练习:查看员工的员工id,全名和职位名称,全名和职位名称合并成一列显示,且格式为:姓 名,职位名称
select id,first_name||' '||last_name||','||title name
from s_emp;

5.对null值得替换运算
语法:
select nvl(col_name,change_value)
from tb_name;
需求:查看所有员工的员工id,名字和提成,如果提成为空,显示成0
select id,last_name,nvl(commission_pct,0) commission_pct
from s_emp;
6.使用distinct关键词,可以将显示中重复的记录只显示一条
语法:
select distinct col_name,col_name...
from tb_name;

注意1:distinct关键词只能放在select关键词后面
如:select id,distinct title
from s_emp;
该语句语法错!!!!!
注意2:如果distinct关键词后面如果出现多列,表示多列联合去重,即多列的值都相同的时候才会认为是重复的记录。
test表:
id id2
1 2
1 3
2 4
3 4
3 4
select distinct id,id2
from test;
显示结果为:
id id2
1 2
1 3
2 4
3 4
需求:查看所有员工的职位名称和部门id,同职位同部门的只显示一次
select distinct title,dept_id
from s_emp;

7.sqlplus命令
a:在当前操作的命令行追加内容
a test
c: 在当前操作的命令行修改内容
c/old_char/new_char
clear buffer:清空当前缓存的命令
del:删除当前操作行
del line_num指定删除第几行
i:当前操作命令行的下一行插入内容
l:查看缓存命令
l line_num:查看指定的命令行
n text:替换第n行的整行内容
!:后面接终端命令
!clear:清屏
/:执行缓存sql命令

save file_name:将缓存命令保存到file_name中
get file_name:将文件中的内容提取到sqlplus
start 和 @ file_name:执行文件中的sql命令
edit file_name:使用终端设置好的vi编辑器编辑文件
spool file_name 将接下来的sql语句以及sql的运行结果保存到文件中
sql1
result1
sql2
result2
...
spool off 关闭spool功能
exit:退出

8.select id,last_name,first_name, salary, dept_id
from s_emp
Where rownum <=10;

结果不好看,通过column使我们的显示界面好看。

colu last_name format a15;
colu first_name format a15;

Column 有没有改变数据表里数据啊,没有,它只是改变显示。它是不是SQL命令呢? 不是,它是sqlplus命令。除了刚才这个作用之外,我们下面来看看它还有什么作用。

COLUMN last_name HEADING 'Employee|Name' FORMAT A15
. 给last_name取别名为Employee|

Name , 竖杠代表换行。
. A15表示十五个字节长,一短横杠就是一个字节长

COLUMN salary JUSTIFY LEFT FORMAT $99,990.00
. salary JUSTIFY LEFT : 仅仅改变列名显示为左齐
. FORMAT $99,990.00: 控制显示格式为前面加 $ 符, “,”为分隔符, 0或9代表数字(通配符),0表示替换对齐数值,位数不足会补足,可以混合使用。Oralce里目前不支持人民币符¥

COLUMN start_date FORMAT A8 NULL 'Not hired'
. 如果start_date值为空的话,显示为’Not hired’;
. Format后不能直接跟null, 要先a8或a10;
. NULL 'Not hired'和nvl有点不同, nvl要求类型匹配

column 显示所有对列格式的设置情况
column last_name 显示对last_name列显示设置的情况
column last_name clear 删除对last_name列格式设置的情况
Clear column 清除所有column的格式设置

Column某列的格式设置,这里的列并不特定于某个表.

ex:
1234 column 99.99 -- > ###### //出错的时候不能显示,只是显示####
column columName 显示对列的限制

第二章:排序和限制查询
1.排序:所谓排序,就是根据某个字段的值按照升序或者降序的情况将记录查询出来
语法:
select col_name,...
from tb_name
order by col_name [asc|desc],...
注意:1.排序使用order by字句,该子句只对查询记录显示调整,并不改变查询结果,所以执行权最低,即最后执行。
2.排序关键词:
asc:升序(默认,默认的意思是不加关键词的时候默认为生序排序)
desc:降序
3.如果有多个列排序,后面的列排序的前提是前面的列排好序以后有重复(相同)的值。

例子:
id id2
1 2
2 3
3 4
4 1
4 2

语句:
select id,id2
from test
order by id,id2 desc;

结果:
id id2
1 2
2 3
3 4
4 2
4 1
注意:先排第一列,如果第一列有重复的值再排第二列,以此类推
需求:查看员工的id,名字和薪资,按照薪资的降序排序显示。

2.限制查询,即指定查询条件进行查询
语法:
select col_name,...
from tb_name
where col_name 比较操作表达式
逻辑操作符
col_name 比较操作表达式
...
注意:
1.限制查询条件,使用where子句
2.条件可以多个,使用逻辑操作符和()进行条件的逻辑整合
3.where子句的优先级别最高
4.比较操作表达式由操作符和值组成
常见的操作符有三类:
1》逻辑比较操作符
= > < >= <= !=
需求:查看员工工资小于1000的员工id和名字
select id,last_name,salary
from s_emp
where salary < 1000;
2》sql比较操作符
between and:在什么范围之内
需求:查看员工工资在700 到 1500之间的员工id,和名字
select id,last_name,salary
from s_emp
where salary between 700 and 1500;
in(list):在一个列表中
需求:查看员工号1,3,5,7,9员工的

工资
select id,last_name,salary
from s_emp
where id in (1,3,5,7,9);
like:模糊查询,即值不是精确的值的时候使用
通配符,即可以代替任何内容的符号
%:通配0到多个字符
_: 当且仅当通配一个字符
转义字符:
默认为\,可以指定 指定的时候用escape 符号指明即可,转义字符只能转义后面的一个字符
需求:查看员工名字以C字母开头的员工的id,工资。
select id,last_name,salary
from s_emp
where last_name like 'C%';
练习:查看员工名字长度不小于5,且第四个字母为n字母的员工id和工资
select id,last_name,salary
from s_emp
where last_name like '___n_%';
需求:查看员工名字中包换一个_的员工id和工资
select id,last_name,salary
from s_emp
where last_name like '%\_%' escape '\';
is null:对null值操作特定义的操作符,不能使用=
需求:查看员工提成为为空的员工的id和名字
select id,last_name,commission_pct
from s_emp
where commission_pct is null;
3.逻辑操作符
当条件有多个的时候使用
and:且逻辑
or:或逻辑
注意:and逻辑比or逻辑要高
not:非逻辑
需求:查看员工部门id为41且职位名称为Stock Clerk(存库管理员)的员工id和名字
select id,last_name,dept_id,title
from s_emp
where dept_id = 41
and
title = 'Stock Clerk';
练习:查看员工部门为41 或者 44号部门 且工资大于1000的员工id和名字
select id,last_name,dept_id,title
from s_emp
where salary > 1000
and
(dept_id = 41
or
dept_id = 44);
查看员工部门为41且工资大于1000 或者 44号部门的员工id和名字
select id,last_name,dept_id,title
from s_emp
where salary > 1000
and
dept_id = 41
or
dept_id = 44;


第三章:单行记录(每一行)操作函数
语法:
select 函数操作表达式
from tb_name
where 函数操作表达式 比较操作表达式
1.字符操作函数
lower:将字符串全部转换成小写
需求:查看员工名字为chang的员工的id和薪资,chang不区分大小写,即(CHANG Chang chang)都符合。
select id,last_name,salary
from s_emp
where lower(last_name) = 'chang';
2.数字函数
round:四舍五入
trunc:直接舍弃
mod:取余
3.日期函数
sysdate:系统时间
dual:哑表 测试用
需求:查看系统时间
select sysdate from dual;
4.转换函数
to_char:
1.将日期类型转换成字符类型
语法:to_char(date,'fmt')
需求:将系统时间转换成字符串输出
select to_char(sysdate,'yy-mon-dd')
from dual;

日期格式指代:
yyyy:四位数的年份
rrrr:四位数的年份
yy:两位数的年份
rr:两位数的年份
mm:两位数的月份(数字)
D:一周的星期几
DD:一月的第几天
DDD :一年的第几天
YEAR:英文的年份
MONTH:英

文全称的月份
mon:英文简写的月份
ddsp:英文的第几天
ddspth:英文序列数的第几天
DAY:全英文的星期
DY:简写的英文星期
hh:小时
mi:分钟
ss:秒

指代格式不区分大小写,但是你写的大小写格式控制显示格式,例如
mon 显示 oct
MON 显示 OCT
Mon 显示 Oct

千年虫
00-49 系统默认为 2000 到 2049
50-99 系统默认为 1950 到 1999

fm:去除开始的空格和0字符

第四章:多表查询
所谓多表查询,又称表联合查询,即一条语句涉及到的表有多张,数据通过特定的连接进行联合显示。
多表查询连接方式:
等值连接
语法:
select tb_name.col_name,tb_name.col_name,...
from tb_name,tb_name,...
where tb_name.col_name = tb_name.col_name
and
tb_name.col_name = tb_name.col_name
...
需求:查看每个员工的id,last_name以及部门名称
select e.id,https://www.doczj.com/doc/df1630225.html,st_name,d.id,https://www.doczj.com/doc/df1630225.html,
from s_emp e,s_dept d
where e.detp_id = d.id;
练习:查看每个员工的id,last_name以及部门名称和所属区域名称、
s_region:区域表
select e.id,https://www.doczj.com/doc/df1630225.html,st_name,d.id,https://www.doczj.com/doc/df1630225.html,,https://www.doczj.com/doc/df1630225.html,
from s_emp e,s_dept d,s_region r
where e.detp_id = d.id
and
d.region_id = r.id;
练习:查看员工工资小于1000的员工的id,名字和区域名称
select e.id,https://www.doczj.com/doc/df1630225.html,st_name,e.salary,https://www.doczj.com/doc/df1630225.html,
from s_emp e,s_dept d,s_region r
where e.salary < 1000
and e.dept_id = d.id
and d.region_id = r.id;
不等连接
使用的是除=以外的操作符号的多表查询
例如:使用between and
select t1.col_name,t2.col_name
from t1,t2
where t1.col_name between t2.col_name
and t2.col_name;
需求:查看test1表中的数据,限制条件test1表中的id列在一个区间范围之间,但是这个区间在不断的变化
select test1.id
from test1,test2
where test1.id between test2.min_value and test2.max_value;
外连接:
当一个表的记录在另外一张表中不存在的时候,我们依旧需要显示,使用外连接即可。
外连接分为右外连接和左外连接
右外连接的语法:
select tb_name,col_name,...
from tb_name1,tb_name2
where
tb_name1.col_name (+)= tb_name2.col_name;
意义:右外连接表示右边表(=号右边的表)中的记录在左边表中不存在的时候,右边表的记录依旧显示。

select c.id,https://www.doczj.com/doc/df1630225.html,,https://www.doczj.com/doc/df1630225.html,st_name
from s_customer c,s_emp e
where c.id (+)= c.sales_rep_id;

左外连接的语法:
select tb_name,col_name,...
from tb_name1,tb_name2
where
tb_name1.col_name = tb_name2.col_name(+);
意义:左外连接表示左边表(=号左边的表)中的记录在右边表中不存在的时候,左边表的记录依旧显示。
需求:查看s_customer中所有客户的id和名字以及该客户所对应的负责员工的id,last_name
表之间的连接列
s_customer 表中的sales_rep_id
s_emp 表中的id

select c.

id,https://www.doczj.com/doc/df1630225.html,,https://www.doczj.com/doc/df1630225.html,st_name
from s_customer c,s_emp e
where c.sales_rep_id = e.id;

自连接
实质就是一张表当多张表用,即一张表中的某列的值取决于自己的某一列
需求:查看每一个员工的经理名字
语法:
select ...
from tb_name t1,tb_name t2
where t1.col_name = t2.ano_col_name

select e1.id,https://www.doczj.com/doc/df1630225.html,st_name,e1.manager_id,https://www.doczj.com/doc/df1630225.html,st_name
from s_emp e1,s_emp e2
where e1.manager_id = e2.id;


集合连接
union:将上下结果取并集,去除掉重复的记录(重复的只显示一次)

union all:将上下结果全部显示

minus:取差集 A-B

intersect:取交集

rownum:记录行号

id name rownum
100 zs 1
200 ls 2
300 ww 3
第五章:组查询
所谓组查询即将数据按照某列或者某些列相同的值进行分组,然后对改组的数据进行组函数运用
语法:
select ...
from ...
where ...
group by col_name,col_name
having ...
order by...

group by col_name:即将数据按照col_name相同值进行分组
组函数常见有5个:
avg:求平均值
count:求总数
max:最大值
min:最小值
sum:求和
需求:查看所有部门的部门工资,按照部门工资的降序排序
select dept_id,sum(salary) dept_salary
from s_emp
group by dept_id
order by dept_salary desc;
练习:查看各个部门的最高工资
查看各个部门的员工数
查看各个部门的平均工资
查看各个部门的最低工资

注意1:没有出现在group by子句中和组函数中的列,不能出现在select子句中
如:
select dept_id,last_name,max(salary)
from s_emp
group by dept_id;
(错误)并不能找到工资最大的员工名字
注意2:当group by子句中出现多列的时候,表示按照从左至右的顺序进行分组,即先按照第一列分组,然后再第一列分好的组里面 按照第二列进行分组,以此类推。
注意3:如果限制条件中出现了组函数,该条件必须放到having子句中,不能放在where子句中
需求:查看部门平均工资大于1000的部门id
select dept_id,avg(salary)
from s_emp
group by dept_id
having avg(salary) > 1000;

第六章:子查询(嵌套查询)
所谓子查询,即一个select语句中嵌套了另外的一个或者多个select语句
子查询出现情况一:
比较值不确定,需要另外一个select语句执行后才能得到,使用子查询
语法:
select ...
from ...
where col_name 比较操作符 (
select ...
from ...
where ...
group by ...
having...
)
group by ...
having...
order by ...
需求:查看工资大于Chang员工工资的所有员工的id和名字。
第一步:确定需求

第二步:写父句,写子句
父句:
select id,last_name,salary
from s_emp
where salary > ?;
子句:
select salary
from s_emp
where last_name = 'Chang'
第三步:嵌套

select id,last_name,salary
from s_emp
where salary > (select salary
from s_emp
where last_name = 'Chang');


练习1:查看职位名称和名字为Chang的员工一样的所有员工id和名字
父句:
select id,last_name,title
from s_emp
where title = ?
子句:
select title
from s_emp
where last_name = 'Chang';
嵌套:
练习2:查看员工工资小于平均工资的所有员工的id和名字
父句:
select id,last_name,salary
from s_emp
where salary < ?
子句:
select avg(salary)
from s_emp;
嵌套:
练习3:查看 //select
部门和名字为Chang的部门相同或者区域ID为2的部门相同的部门
所有员工id和名字 //列名
父句:
select id,last_name,dept_id
from s_emp
where dept_id = ?
or
dept_id in ?;
子句1:
select dept_id
from s_emp
where last_name = 'Chang'
子句2:
select id
from s_dept
where region_id = 2;
嵌套:
练习4:查看部门平均工资大于32号部门平均工资的部门id
父句:
select dept_id,avg(salary)
from s_emp
group by dept_id
having avg(salary) > ?
子句:
select avg(salary)
from s_emp
where dept_id = 32
嵌套:
练习5:查询工资大于smith所在部门平均工资的员工的id last_name salary
父句:
select id,last_name,salary
from s_emp
where salary>

子句1:
select avg(salary)
from s_emp
where dept_id=?

子句2:
select dept_id
from s_emp
where last_name = 'Smith'
嵌套
select id,last_name,salary
from s_emp
where salary > (
select avg(salary)
from s_emp
where dept_id = (
select dept_id
from s_emp
where last_name = 'Smith')
)
课后练习:

练习:
1.查看薪资大于Chang员工薪资的员工信息
2.查看薪资大于Chang员工薪资或者所在部门在3号区域下的员工的信息
3.查看薪资大于Chang所在区域平均工资的员工信息
4.查看薪资高于Chang员工经理薪资的员工信息
5.查看薪资大于Chang员工经理的经理所在区域的最低工资的员工的信息
6.查看客户负责员工中工资大于Chang员工的工资的员工信息

练习
1.查看Chang员工所在部门其他员工薪资总和
2.统计不由11号和12号员工负责的客户的人数
3.查看部门平均工资大于Chang所在部门平均工资的部门信息
4.查看员工的id,last_name,salary,
部门名字,区域名字,这些员工有如下条件:薪资大于Chang所在区域的平均工资
或者
跟Chang员工不在同个部门

子查询出现情况二:
将select语句查询出来的结果,当做一张表嵌套到另外一个select语句中
语法:
select ...
from (
select...
from...
where...
group by...
having...
order by...
) table_name
where ...
group by ...
having ...
order by ...
需求:查看部门平均工资最高的部门id

创建部门平

均工资表 dept_avg_salary_tb
select dept_id,avg(salary) dept_avg_salary
from s_emp
group by dept_id

找dept_avg_salary_tb表中的最大值
select max(dept_avg_salary)
from dept_avg_salary_tb;

找该最大值对应的dept_id
select dept_id
from dept_avg_salary_tb
where dept_avg_salary = ?

嵌套:
select dept_id,
from (select dept_id,avg(salary) dept_avg_salary
from s_emp
group by dept_id) dept_avg_salary_tb
where dept_avg_salary = (
select max(dept_avg_salary)
from (select dept_id,avg(salary) dept_avg_salary
from s_emp
group by dept_id) dept_avg_salary_tb
);


select dept_id
from ?
where ?=max(?)
select dept_id,avg(salary)
from s_emp
group by dept_id


第九章:create table 建表
语法:
create table tb_name(
col_name datatype [constraints],
...,
constraint,
...
);
表名规则:
1.字母开头
2.长度为1-30
3.只能有大小写英文数字和_ $ #组成
4.对象名不能重复
5.不能使用关键词作为表明(如:select group等等)
oracle支持的数据类型
数字类型:number
number(p,s):
p确定数字的总位数
s确定数字的小数点位数
number(4,2)最大值和最小值为多少?
-99.99~99.99
字符类型:char varchar varchar2
语法:关键词(数字),括号里面的数字确定最大能保存多少个字符
如:char(2)最多存放两个字符的字符串
char varchar varchar2之间的区别
char:定长字符
即一旦确定了()中的字符个数,在保存数据的时候,不论你保存的字符个数为多少个,所占空间大小为固定的()中的字符个数。
如char(2)
保存 a ab都占用2个字符空间
varchar varchar2:不定长字符
即在保存数据的时候,会先判断字符个数,然后再分配对应的空间进行保存。
如varchar(2)
保存a 占用1字符空间
保存ab 占用两2字符空间

varchar2为oracle定义的varchar数据类型,意义跟varchar差不错。
日期类型:date
系统默认日期类型:'DD-MON-YY'
操作字符类型和日期类型数据的时候,一定要放到''中间
大数据类型:clob blob...

null类型:值为null
constraints:约束
约束的语法:
注意1:约束分为两种情况:
列级约束:约束放在列的完整定义中的称为列级约束,只能约束当前该列,只能一列。
表级约束:约束放在列的完整定义外地成为表级约束,可以约束该表中的所有列,且可以约束多列
直观区分:放在,前面的为列级约束 放在,后面的为表级约束
注意2:约束语法:
[constraint c_name] 约束关键词语法

not null:非空约束
只能列级约束
unique:唯一约束
列级约束语法:unique
表级约束语法:unique (col_name1,col_name2,...)
如果表级约束unique约束了多列,表明多列进行联合唯一
只要有一列值不相同 就合法
所有列的值

都相同 不合法
primary key:主键约束
所谓主键:即一张表的决定因素列,加上主键约束,该约束约束到的列就满足了非空(任意列都不能为null)唯一(联合唯一)的约束,一个表只能有一个主键
列级约束:primary key
表级约束:primary key(col_name1,col_name2,...)
foreign key:外键约束
所谓外键约束即加了该约束的表的外键列的值取决于另外一张表的主键列的值
列级约束:
references pk_tb_name(pk_col_name)
表级约束:
foreign key(col_name,...)
references pk_tb_name(pk_col_name,...)

注意:一旦设置了外键约束,外键列的值只能为主键列的值或者null

check:check约束
通过check约束可以很好的限制列的值符合你的规定要求
表级约束:
check (col_name 表达式)

default:设置默认值
语法:
列级约束
default 值

需求:创建一张学生信息表,名字叫jd1107_自己名字缩写_student,有两列,一列叫id,number类型 主键约束 一列叫name varchar2(50)类型,非空约束

create table jd1107_kae_student(
id number
constraint jd1107_kae_student_pk primary key,
name vachar2(50) not null
);

create table jd1107_kae_student(
id number,
name vachar2(50) not null,
constraint jd1107_kae_student_pk primary key(id)
);

select table_name
from user_tables;
查看当前用户所有表。

DML:insert语句
语法:
insert into tb_name(col_name,...)
values(val1,....);
insert into jd1107_kae_student(id,name)
values(1,'zhangsan');
insert into jd1107_kae_student(id,name)
values(null,'zhangsan');报错 主键不能为null
insert into jd1107_kae_student(id,name)
values(1,'zhangsan');报错 主键值只能唯一
insert into jd1107_kae_student(id,name)
values(2,null);报错 not null约束name不能插入null值

需求:创建两张表
student
id number primary key
name varchar2(50) not null
mark
id number primary key
stu_id number外键关联student表的id列
mark number not null

create table student(
id number primary key,
name varchar2(50) not null
);
create table mark(
id number primary key,
stu_id number
constraint mark_fk
references student(id),
mark number not null
);
create table mark(
id number primary key,
stu_id number,
mark number not null,
constraint mark_fk
foreign key(stu_id)
references student(id)
);

create table default_test(
id number primary key,
name varchar2(50) default 'briup'
);

需求:创建一张表check_test,
id number primary key,
gender char(1) 该列的值只能是f或者m

create table check_test(
id number primary key,
gender char(1),
constraint check_test_gender_ck
check (gender in ('f','m'))
);

注意:在加外键约束的时候,如果想在删除主表的记录的同时对外键表中已经存在的关联关系记录进行操作可以使用下面两个关键词:
on delete cas

cade:级联删除
删除主表记录,外键表的关联记录一块儿删除

student表
1 zs
mark表
1 1 100

如果删除1 zs记录
mark表中的1 1 100一起删除
on delete set null:
删除主表记录,外键表的关联记录该列的值变成null

student表
1 zs
mark表
1 1 100

如果删除1 zs记录
mark表中的1 1 100变成1 null 100


使用 drop table tb_name可以一张表

使用 select 'drop table '||table_name||';'
from user_tables
where table_name like 'tb_name的通配表达式';
第十二章:alter操作 更新表
创建一张表:alter_test表
id number
查看表结构:
desc tb_name;
1.增加列
alter table tb_name
add 列的完整定义
需求:给alter_test表增加一列
name varchar2(50) not null unique 默认值为briup
alter table alter_test
add name varchar2(50) default 'briup' not null unique ;
2.删除列
alter table tb_name
drop column col_name;
需求:删除name列
alter table alter_test
drop column name;
3.修改列属性(数据类型和约束)
alter table tb_name
modify 列的完整定义
需求:将alter_test表中的id列number类型更改成varchar2(50)
alter table tb_name
modify id varchar2(50);
注意:不能重命名列
not null约束的增删只能用modify
4.增加约束
alter table tb_name
add 约束的完整定义
注意:只能增加能够使用表级约束的约束
需求:将alter_test表中的id列加上唯一约束
alter table alter_test
add
constraint alter_test_id_uk
uniqeu(id);

5.删除约束
alter table tb_name
drop constraint c_name;
需求:将alter_test表中的id列的唯一约束删除
alter table alter_test
drop constaint alter_test_id_uk;
6.重命名:rename
重命名表:
rename old_tb_name to new_tb_name;
重命名列:
alter table tb_name
rename column old_col_name to new_col_name;
需求:将alter_test表中的id列重命名为al_test_id
alter table alter_test
rename column id to al_test_id;
7.truncate:清空表记录,且释放表空间(返回建表初始状态)
truncate table tb_name

第十一章:DML语句 数据操纵语言 列级操作语言
insert
update
delete

CRUD:增删改查
c:create
r:retrieval
u:update
d:delete
insert:数据插入
注意1:
语法
insert into tb_name[(col_name,)]
values(val1,...);
当不指明列名的时候,必须写出所有列的值,且按照见表时候的列顺序依次指明。
注意2:
除了以下情况在插入值的时候不写以外,都必须指明该列的值
1.有默认值
2.可以为null
update:更新数据
语法:
update tb_name
set col_name = val,...
where ...
需求:创建一张表叫update_test
id number primary key
name varchar2(20) not null

记录:
1 zs
2 ls
3 ww
4 zl
将id为3的名字都改成briup

create table update_test(
id number primary key,

name varchar2(20) not null);

insert into update_test(id,name) values(1,'zs');
insert into update_test(id,name) values(2,'ls');
insert into update_test(id,name) values(3,'ww');
insert into update_test(id,name) values(4,'zl');

select * from update_test;

update update_test
set name = 'briup'
where id=3;

select * from update_test;

delete:删除记录
语法:
delete from tb_name
where...

事务控制:
默认情况下oracle数据库对dml的
insert update delete操作将不作提交工作,即只在当前连接终端的缓存进行处理,并不对数据库做永久的更改

事务:将一列的sql操作放在一起,
当做一个完整的事情进行处理,
从而达到控制这个事件中的sql操作同时完成,
局部完成或者全部失效,局部失效。

事务处理三步骤:
事务开启:所有sql语句都默认开始事务
事务提交:commit
dml语句只用碰到commit的时候才会将操作进行永久化的保留。
事务回滚:rollback
取消commit到rollback之间的所有dml操作
如果设置了回滚点,取消回滚点到rollback to savepoint之间的所有dml操作

insert into tran_test values(5);
svaepoint p5

insert into tran_test values(6);
svaepoint p6

insert into tran_test values(7);
svaepoint p7

insert into tran_test values(8);
svaepoint p8

rollback to savepoint
commit








oracle本机环境搭建:
http://172.16.10.210/down.html


sqlplus
system
...
create user briup identified by briup //创建用户 briup 密码 briup
grant resource,connect to briup
//给briup用户授权
alter session set nls_date_language=english;
//修改系统会话日期格式
conn briup/briup

@ d:/summit2.sql//导入数据库

select table_name
from user_tables;

第十三章:sequence操作
所谓序列对象,用来管理数据库的唯一性质,通常为表的主键服务,序列可以服务一张或者多张表,且序列值可以缓存一定的数量
语法:
create sequence s_name
[increment by n]:步长
[start with n]:开始值
[maxvalue n]:最大值
[minvalue n]:最小值
[cycle]:是否循环,建议不适用
[cache n]:缓存
需求:创建一张表sequence_test
id number primary key
name varchar2(50) not null

create table sequece_test(
id number primary key,
name varchar2(50) not null
);
创建一个序列为该表的id列服务,使得不需要给id指明数字,系统自动的实现递增插入的功能,序列开始为1,步长为1
create sequence sequence_test_id_sequence
increment by 1
start with 1;
往该表插入三条记录,zs ls ww他们的id由该列的服务序列自动提供
注意:使用序列对象的两个属性即可操作当前的序列号和接下来的序列号
currval:当前已经用到的序列号
nextval:下一个序列号
使用语法:sequence_name.currval
se

quence_name.nextval
insert into sequence_test values(sequence_test_id_sequence.nextval,'zs');
insert into sequence_test values(sequence_test_id_sequence.nextval,'ls');
insert into sequence_test values(sequence_test_id_sequence.nextval,'ww');

修改sequence
语法:
alter sequence squence_name
序列定义语法的限制
increment by ...
删除sequence
drop sequence sequence_name
查看sequence:
select sequence_name
from user_sequences;

第十四章:视图的管理
视图:所谓视图就是提取一张或者多张表的数据生成一个映射,管理视图可以同样达到操作原表的效果,方便数据的管理以及安全操作。
语法:
create view view_name
as
select ...

with check option:加上该关键词表示对view进行dml操作的时候,只能操作select语句中where条件限制的内容
例子
create view v_test
as
select id,name
from test
where id=3
with check optioin

update v_test set name='briup' where id=3;成功
update v_test set name='briup' where id=4;报错

需求:给sequence_test表中的zs ls这两条记录创建视图
create or replace view sequence_test_v
as
select id,name
from sequence_test
where name in ('zs','ls');

select * from sequence_test_V;

insert into sequence_test_v valeus(sequence_test_id_sequence.nexeval,'zl');
select * from sequence_test;

update sequence_test_v
set name='briup'
where name='zs';
select * from sequence_test;

delete from sequence_test_v
where name='ls';
select * from sequence_test;


第十五章:索引操作
索引:所谓索引,是给一个表的某些列服务,使得在操作表的时候调高效率。



http://172.16.10.210/video.video.txt

相关主题
文本预览
相关文档 最新文档