oracle总结

数据库总结
数据库简介
什么是数据库
简单的说,数据库(database)就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织、存储的,我们可以通过数据提供的多种方法来管理数据库里的数据。
当人们收集了大量的数据后,应该把它们保存起来进入近一步的处理,进一步的抽取有用的信息。当年人们把数据存放在文件柜中,可现在随着社会的发展,数据量急剧增长,现在人们就借助计算机和数据库技术科学的保存大量的数据,以便能更好的利用这些数据资源
数据库分类
层次式数据库 网络式数据库 关系式数据库
而在当今的互联网中,最常见的数据库模型主要是两种,即关系型数据库和非关系型数据库
关系型数据库
关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。在关系型数据库中,对数据的操作几乎全部建立在一个或多个关系表格上,通过对这些关联的表格分类、合并、连接或选取等运算来实现数据库的管理。如 oracle ,mysql,sqlserver
这里以oracle为例学习其用法
oracle数据库
1.安装注意事项
在需要使用oracle数据库时,只需要启动两项服务即可:
OracleOraDb11g_home1TNSListener: oracle的监听服务
OracleServiceORCL: 数据库的实例服务
2.oracle实例服务的用户
Sys用户 oracle的超级管理员用户 可以给其他用户(包括管理员)授予权限 修改其他用户的权限 登录时只能以sysdba或者sysoper身份登录
Scott 每个实例服务被创建后自动创建的一个默认普通用户,里面提供了四个默认表 即dept部门表 emp员工表 salgrade工资等级表 bonus奖金表 供用户参考学习 习惯设置的密码是tiger
System管理员用户 可以给其他用户授权一些操作 如登录 修改表等 只能以normal或者sysdba身份登录
数据库文件的分类
从物理上划分,数据库文件有三种:
|- ctl后缀文件:控制文件,用来存放登录信息
|-dbf后缀文件: 数据库文件,用来存放项目数据
|-log后缀文件:日志文件,用来记录日志
从逻辑上划分,所有的数据都是以表空间的形式保存的
创建数据库实例服务用户
一个oracle数据库实例被创建时会自动生成几个默认用户可以供我们使用,我们也可以自己创建一些用户
注:oracle中在安装实例时会默认创建若干个表空间,在创建新的用户时,该用户默认保存在一个叫做users的表空间中;此时使用该用户登录后,创建的表也都保存在这个users表空间下
创建表空间需要该用户具有dba权限
创建用户前可以先创建一个表空间,表空间用来存放用户创建的表,创建表空间语法
Create tablespace 表空间名 datafile ‘表空间路径’ size 表空间大小m
删除表空间语法 drop tablespace 表空间名 including contents and datafiles
创建用户语法
Create user 用户名 identified by 密码 [default tablespace 表空间名 此为可选项 不标明即新创建的用户默认使用数据库实例默认创建的表空间]
创建完用户后,此用户还是不能进行登录等任何操作的 仍需要在具有dba权限下的用户下给他授权
在管理员用户下给新建用户授权
1.授予角色权限
Grant connect to 用户名 授予新建用户登录权限
Grant resource to 用户名 授予对表的增删改查,新建权限
Grant connect,resource to 用户名 同时授予
Grant dba to 用户名 授予用户dba权限
2.授予操作权限
Grant select on 表名 to 用户名 授予查询student表的权限给用户
Grant delete on 表名 to 用户名 授予删除student表记录的权限给用户
收回权限
Revoke connect from 用户名 收回登录权限
为了限制用户暂时不能登录,还可以锁定用户:
Alter user 用户名 account lock; 管理员用户下锁定普通用户登录权限
解除封锁
Alter user 用户名 account unlock;
当用户不再需要时,可以直接删除该用户
Drop user 用户名 也是在具有管理员权限的用户下删除
3. 建表
数据存储在表中 表存储在表空间中
创建表语法
Create table 表名(列名1 数据类型(列值的长度),列名1 数据类型(列值的长度),……)
其中 create table 为关键字 表示创建表的动作
列名(字段)
每张表中有多少列名(字段),需要根据业务需求来决定,可以是一个,也可以是多个;
每个字段都要指定一个数据类型(好比是java中每个变量都需要指定数据类型一样),oracle中常用的字段类型有:
number(m,n) : 数字类型,m表示最大长度,n表示小数点后面最多有多少位小数;
字符类型:
长度不可变的字符串:
Char(长度):指定可以存的最大字节长度的字符,且无论存进去的字符比这个长度小多少,开辟出来的空间始终为该长度
Nchar:同上,不过采用的是unicode编码字符
长度可变的字符串:
Varchar2: 指定可以存的最大字节长度的字符,会根据存进去的字符实际字节数开辟对应的空间,不会造成空间浪费
Nvarchar2:同上,不过采用的是unicode编码
长字符串
Long:
时间日期类型
date 日期时间类型 格式为’日-月-年’ 如’8-7月-2018’ 即表示2018年7月8日
timestamps:时间戳,精确到秒后6位小数
大数据类型:BLOB:大二进式数据
CLOB:大的字符数型
BFILE:大的二进制文件
修改表结构
对于已经创建好的表,我们可以进行一些操作,用来维护表的结构
删除列
Alter table 表名 drop column 列名
新增列
Alter table 表名 add 列名 数据类型(长度);
修改表名
Alter table 表名 rename to 新表名
修改列名(字段名)
Alter table 表名 rename column 列名 to 新列名
修改列名(字段)的数据类型
Alter table 表名 modify 列名 新数据类型(长度)
查看一个用户下所有的表名称
Select table_name from all_tables where owner=’用户名’;
删除表
Drop table 表名

4.表约束
数据完整性约束
a1.域完整性约束 即列完整性约束
a2.实体完整性约束 行完整性约束
a3.引用完整性约束 外键完整性
a4.自定义完整性约束用户定义完整性则是根据应用环境 的要求和实际的需要,对某一具体应用所涉及的数据提出约束性条件。这一约束机制一般不应由应用程序提供,而应有由关系模型提供定义并检验,用户定义完整性 主要包括字段有效性约束和记录有效性。
对完整性约束的具体实现
约束的分类:
1.—-主键约束(Primay Key Coustraint) 唯一性,非空性
2.—-唯一约束 (Unique Counstraint)唯一性,可以空,但只能有一个
3.—-检查约束 (Check Counstraint) 对该列数据的范围、格式的限制(如:年龄、性别等)
4.—-默认约束 (Default Counstraint) 该数据的默认值
5.—-外键约束 (Foreign Key Counstraint) 需要建立两表间的关系并引用主表的列
1.主键约束(Primay Key)
主键是每一行的唯一标识符,并具有唯一值,不能为空。可以准确的获取数据库中的数据
添加主键约束语法
创建表时
列名 数据类型(长度) primary key 为该列创建一个主键 键名为数据库自动生成
给已经创建的表的列添加主键
Alter table 表名 add constraint 主键名 primary key(列名) ;
还可以通过对表的编辑界面进行添加主键
2.唯一约束(unique key)
该列所有值都唯一,可为空
添加唯一约束语法
创建表时
列名 数据类型(长度) unique key 为该列创建一个唯一约束 约束名为数据库自动生成
给已经创建的表的列添加唯一约束
Alter table 表名 add constraint 唯一约束名 unique(列名) ;
还可以通过对表的编辑界面进行添加主键
3.检查约束(check)
表示该列的值只能为固定的几个值
创建表时
列名 数据类型(长度) check(列名=’’ or 列名=’’ or ….)为该列创建一个检查约束 约束名为数据库自动生成
给已经创建的表的列添加检查约束
Alter table 表名 add constraint 约束名 check(列名=’’ or 列名=’’)
同样也可以在编辑表的界面中进行添加
4.默认约束(default)
表示往表中插入记录时 该行默认值
创建表时
列名 数据类型(长度)default 值
给已经创建的表的列添加默认值约束
Alter table 表名 modify 列名 default(默认值)
同样也可以在编辑表的界面中进行添加
5.外键约束(foreign key)
有主从表之分 表示主表某列的值对从表某列值得约束
创建表时
列名 数据类型(长度) foreign key references 主表名(列)
给已经创建的表的列添加外键约束
Alter table 表名 add constraint 约束名 foreign key(列名) references 主表名(列名)
同样也可以在编辑表的界面中进行添加
删除约束语法
Alter table 表名 drop constraint 约束名
5.对表记录的增删查改等动作(insert,delete,select,update)
1.insert 往表里插入记录
语法
Insert into 表名(列名1,列名2,….) values(值一,值二,……)
对应列插入对应值
Insert into 表名 values(值一,值二,…)插入所有的列值
Insert into 表名 Select * from 表名 复制另外一张表里的记录
Create table 新表名 as select * from 表名 从另外一张表里复制数据到新表里
Create table 新表名 as select * from 表名 where 1=2(不成立的条件) 复制另外一张表的表结构
2.delete 删除表里的记录
语法
Delete from 表名 删除整张表里所有记录
Delete from 表名 where 条件 删除表里面符合条件的对应记录
注:删除记录还有另外一个关键字 truncate
Truncate 语法 :truncate table 表名 表示删除表里所有记录 不能接where 条件
Truncate 与 delete 的区别
a1.truncate不能接where条件,是删除表中所有的记录;而delete可以根据条件来删除记录
a2.truncate不能删除有外键约束的表中的记录;而delete没有此约束
a3.truncate删除的记录不能回滚,也不会记录到日志中;而delete可以回滚,也会记录到日志
a4.truncate效率比delete高
注意:当要删除的记录有子项记录时,truncate和delete都无法删除,除非,先删除子项的记录行,再删除记录(即该表某列是其他表的外键约束的主表)
3.update 修改表里的记录
语法
Update 表名 set 列名1=值,列名2=值,…, where 条件
不接条件的话代表修改该表对应列所有行的值
4.select 查询表数据
语法
1.Select 列名1,列名2,…,from 表名 查询表里对应列的值
Select * from 表名 查询表里所有列的值
拓展:
复杂查询
Select 列1,列2,…,from 表名
Where 条件(分组前过滤条件)
Group by 条件 分组条件
Having 条件 分组后过滤条件
Order by 排序方法 升序 order by 列名 asc ,降序为order by 列名 desc
序列:oracle数据库提供的一个数据库对象
序列只能产生数字类型的值,一般作为主键使用,都是整数 方便查询
序列的语法:
create sequence 序列名
start with 初始值
increment by 步长 步长为负数则是数值减小的序列
maxvalue 最大值
minvalue 最小值
cycle|nocycle
cache 缓存数量
create sequence 序列名 默认建一个初始值为1 步长为1,没有循环,没有缓存的序列
取序列的下一个值:序列名.nextval
取序列的当前值: 序列名.currval
如 select 序列名.nextval from dual 即从临时表里把序列下一个值显示出来
修改序列
alter sequence 序列名
increment by 步长
maxvalue 最大值
minvalue 最小值
cycle|nocycle
cache 缓存数量 注:修改序列除了初始值不能修改,其他都可以修改
删除序列
drop sequence 序列名
五个聚合函数
count() --统计数量
max(); --求最大值
min(); --求最小值
avg(); --求平均
sum(); --求和
聚合函数一般与group by分组函数连用,即没有写在聚合函数里的列,查询时都要表明用group by进行分组 如查询男女性别人数 select sex,count() from 表名 group by sex :表示以性别分组,分别查询男女人数
上述基本都是单表查询,涉及到多表查询时,就要用到表连接了,即连接查询
表连接一般分三类
1.内连接 2.外连接 3.交叉连接
1.内连接 内连接又包括 内连接 自然连接 不等值连接
自然连接:语法
Select 表名1.
,表名2.* from 表名1,表名2 where 表名1.列名=表名2.列名
表示连接两个表查询,当连接的两个列值相同时显示出对应两个表的记录
内连接:语法
Select 表名1.,表名2. from 表名1 inner join 表名2 on 表名1.列名=表名2.列名
作用与自然连接相同
不等值连接
Select 表名1.,表名2. from 表名1 inner join 表名2 on 表名1.列名!=表名2.列名
作用正好与前两个想法,找出对应两个列不同值的所有记录
2.外连接
左外连接 语法
Select 表名1.,表名2. from 表名1 left outer join 表名2 on表名1.列名!=表名2.列名
表示以左表为主,查询左表所有记录,右表中有对应记录则显示,没有则为空
右外连接 语法
Select 表名1.,表名2. from 表名1 right outer join 表名2 on表名1.列名!=表名2.列名
作用正好与左外连接相反
全外连接 语法
Select 表名1.,表名2. from 表名1 full outer join 表名2 on表名1.列名!=表名2.列名
查询两张表所有记录 没有的则显示为空
3.交叉连接 语法
Select * from 表名1 cross join 表名2
相当于 select 表名1.,表名2. from 表1,表2
多表查询还有种方式 即联合查询 将多张表的记录联合起来查询
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
Minus:对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序
Intersect:对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;
语法
Select * from 表1 union select * from 表2 表示查询两张表的所有记录,且去掉重复的
联合查询与连接查询的区别:联合查询是行级别,即两张表显示多行,而连接查询是列级别,即对应列的查询记录
分页查询 oracle中还提供了一种查询数据的方式 即分页查询
两层嵌套
Select 别名,* from (Select rownum 别名, * from 表名 where rownum <上限值) where 别名>下限值
其中上限值为 pagesizepage, pagesize为一页显示的记录条数 page为查询的页数 下限值为 Pagesize (page-1)
三层嵌套
Select 别名,* from (Select rownum 别名,* from (Select * from 表名) where rownum<上限值) where 别名<下限值 上限值下限值取值同上
Mysql 分页查询 limit
语法 select * from 表名 limit Pagesize* (page-1),pagesize*page
Sqlserver 分页查询 top
Select top pagesize from 表名 where 列名 not in(select top (page-1)*pageSize 列名 from 表名)
6.oracle 函数
分为单行函数 多行函数 分析函数
单行函数:对每一个函数应用在表的记录中时,只能输入一行结果,返回一个结果, 可以出现在 SELECT 子句中和 WHERE 子句中
常用的单行函数有:
A 字符函数
A1 :initCap(char) :将首字母设为大写
A2: lower(char) :将字母都转成小写
A3: upper(char):将字母都转成大写
A4: replace(char,search_str,replace_str);替换原始字母串中的内容
A5:concat(char1,char2) 连接字符串
B 数字函数
B1:round(x[,y]) x在第y位四舍五入
B2:ceil(x) 大于或等于x的最小整数
B3:floor(x) 小于或等于x的最大整数
B4:power(x,y) x的第y次幂
C 转换函数
to_date(日期列,‘yyyy-MM-dd hh24:Mi:ss’)
to_number(‘12.5’) 相当于:Double.parseDouble(str)
D 日期函数

  1. add_months(d,n),在某一个日期 d 上,加上指定的月数 n,返回计算后的新日期。
  2. last_day(d) 返回指定日期d当月的最后一天
  3. round(x[,y]) 返回日期x以指定格式显示
    多行函数—聚合函数
    分析函数
    1.row_number使用:它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号。
    语法 select row_number() over([partition by 列名] order by 列名 asc/desc) from 表名
  4. rank():具有相等值的行排位相同,序数随后跳跃 语法与row_number类似
    3.dense_rank():具有相等值的行排位相同,序号是连续的
    通用函数
    Nvl(列名,值) 处理值为空的列并修改成后面的值
    Nvl2(列名,值1,值2) 处理一列值 为空则改为值2否则改为1
    7.表分区
    1.什么是表分区 即将表中数据划分成若干部分,并存储在不同的位置
    2.为什么要进行表分区 oracle的表分区功能使得表更容易管理,可以改善查询性能,便于备份和恢复,提高数据安全性
    表分区优点:
    a1.改善查询性能:对分区对象的查询可以仅搜索自已关心的分区,从而提高检查效率和速度
    a2.增强可用性:如果表的某个分区出现故障,表在其他分区的的数据仍然可用
    a3.维护方便 :需要修复数据时,只修复该分区即可,针对性修复
    a4.均衡I/O:可以把不同的分区映射到指定磁盘以平衡I/O,从而全面提高整个系统的性能。
    表分区的缺点:
    已经存在的表没有方法可以直接转化为分区表,不过oracle提供了在线重定义表的功能
    3.什么时候使用表分区:
    a1.表的大小超过2GB
    a2.表中包含历史数据,新的数据被增加到新的分区中

你可能感兴趣的:(oracle总结)