Oracle数据库学习笔记
数据库学习
本学期专业课开设数据库系统,之前写程序很少接触此方面,故开学习笔记记录过程,便于知识巩固。
用户创建
DCL(Data Control Language)数据控制语言
创建用户密码
create user c##homework identified by homework;
在Oracle 12c 环境下, 使用命令行或是SQL Developer 创建用户失败, 错误信息报:
ORA-65096: 公用用户名或角色名无效
65096. 00000 - “invalid common user or role name”
原因及解析:
Oracle 12C 提出了多租户环境(Multitenant Environment)和容器(Container)的概念, 区分了两个层级:
CDB , Container Database, 数据库容器
PDB, Pluggable Database, 可插拔数据库
在数据库中建立的用户对应以上两个层级:
COMMOM USERS , 普通用户, 一般建立在CDB层, 用户名需要以 C#或C##开头;
LOCAL USERS , 本地用户, 仅建立在PBD层,建立的时候需要指定容器
从上面的错误 “invalid common user or role name” 来看, COMMOM USERS 需要以 C#或C##开头, 所有这里的用户名不合规范。
解决方法:
解决方法有两种:
如果确定需要创建在CDB容器中, 则在用户名前面加C#或C## (最好是加上C##, 部分环境加C#会不行)
如果想保持原用户名,可以将用户创建到PDB容器中。
用户赋予权限
grant create session to c##homework;//授予用户创建session的权限,即登陆权限
grant connect,resource to c##homework;//授予用户connect和resource权限
grant unlimited tablespace to c##homework;//授予用户使用表空间的权限
grant create table to c##homework;//授予创建表的权限
grant drop any table to c##homework;//授予删除表的权限
grant insert any table to c##homework;//插入表的权限
grant update any table to c##homework;//修改表的权限
grant create view to c##homework ; //创建视图权限
CONNECT角色: –是授予最终用户的典型权利,最基本的
ALTER SESSION –修改会话
CREATE CLUSTER –建立聚簇
CREATE DATABASE LINK –建立数据库链接
CREATE SEQUENCE –建立序列
CREATE SESSION –建立会话
CREATE SYNONYM –建立同义词
CREATE VIEW –建立视图
RESOURCE角色: –是授予开发人员的
CREATE CLUSTER –建立聚簇
CREATE PROCEDURE –建立过程
CREATE SEQUENCE –建立序列
CREATE TABLE –建表
CREATE TRIGGER –建立触发器
CREATE TYPE –建立类型
DBA:拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构。
RESOURCE:拥有Resource权限的用户只可以创建实体,不可以创建数据库结构。
CONNECT:拥有Connect权限的用户只可以登录Oracle,不可以创建实体,不可以创建数据库结构。
对于普通用户:授予connect, resource权限。
对于DBA管理用户:授予connect,resource, dba权限。
撤销权限
基本语法同grant,关键字为revoke
查看权限
select * from user_sys_privs;//查看当前用户所有权限
select * from user_tab_privs;//查看所用用户对表的权限
表操作
DDL(Data Definition Language)数据定义语言
操作库
– 创建库
create database db1;
– 创建库是否存在,不存在则创建
create database if not exists db1;
– 查看所有数据库
show databases;
– 查看某个数据库的定义信息
show create database db1;
– 修改数据库字符信息
alter database db1 character set utf8;
– 删除数据库
drop database db1;
操作表
–创建表
create table student(
id int,
name varchar(32),
age int ,
score double(4,1),
birthday date,
insert_time timestamp
);
– 查看表结构
desc 表名;
– 查看创建表的SQL语句
show create table 表名;
– 修改表名
alter table 表名 rename to 新的表名;
– 添加一列
alter table 表名 add 列名 数据类型;
– 删除列
alter table 表名 drop 列名;
– 删除表
drop table 表名;
drop table if exists 表名 ;
约束条件
添加约束
表格创建成功后,为了确保数据的完整性,我们还需要为表格添加一系列的约束,比如主键、唯一约束、检查约束、默认值、外键等。现在咱们就一一进行讲解。
主键约束:设置主键约束有两种方式,可以在创建表的同时设置主键,也可以在表格创建完成之后在单独添加。
在建表的同时设置主键(以Number字段举例):
create table StudentInfo(
ID int not null identity(1,1),--编号
Number char(10) not null primary key,--学号 主键
Name varchar(20) not null,--姓名
Sex char(2) null,--性别
Age int,--年龄
Birthday date,--出生日期
Address varchar(50),--家庭住址
Class varchar(10)--班级
)
表格创建之后单独添加约束:
alter table StudentInfo add constraint PK_StudentInfo_Number primary key (Number)
这两种方式均可。
如果需要添加多个列作为主键列,则可以使用以下语法:
alter table 表名 add constraint 约束名称 约束 (字段1,字段2,...)
例如:alter table StudentInfo add constraint PK_StudentInfo_Number primary key (ID,Number,Name)
唯一约束:同主键约束一样,唯一约束也可以有两种添加方式。
在建表的时候设置(以ID字段示例):
create table StudentInfo(
ID int not null identity(1,1) unique,--编号 唯一键
Number char(10) not null primary key,--学号 主键
Name varchar(20) not null,--姓名
Sex char(2) null,--性别
Age int,--年龄
Birthday date,--出生日期
Address varchar(50),--家庭住址
Class varchar(10)--班级
)
表格创建之后单独添加约束:
alter table StudentInfo add constraint UQ_StudentInfo_ID unique (ID)
默认值约束:
在建表的时候设置(以Sex字段示例):
create table StudentInfo(
ID int not null identity(1,1) unique,--编号 唯一键
Number char(10) not null primary key,--学号 主键
Name varchar(20) not null,--姓名
Sex char(2) null default '男',--性别 默认为男
Age int,--年龄
Birthday date,--出生日期
Address varchar(50),--家庭住址
Class varchar(10)--班级
)
表格创建之后单独添加约束:
alter table StudentInfo add constraint DF_StudentInfo_Sex default '男' for S
检查约束(check)
某列取值范围限制、格式限制等
格式:check(字段名 like ‘约束条件’) 或者 check(regexp_like(字段名,’约束条件’))
检查性别只能是男或女
–第一种
create table test(
s_id number primary key,
sex varchar2(2) check(sex =’男’ or sex=’女’)
);
–第二种
create table test1(
t_id number primary key,
sex varchar2(2)
);
alter table test1 add constraint chkk check (sex =’男’ or sex=’女’);
alter table test1 add constraint chkk check (sex in(‘男’,’女’));
在一个范围中间
–第一种
create table test2(
t_id number primary key,
age number check(age between 12 and 30)
);
–第二种
create table test3(
t_id number primary key ,
age number
);
alter table test3 add constraint ch_test3 check(age>12 and age<30);
alter table test3 add constraint ch_test3 check(age between 12 and 30);
长度大于等于某个值
–第一种
create table test4(
id number primary key ,
password varchar2(20) check(length(password)>=6)
);
–第二种
create table test5(
id number primary key ,
password varchar2(20)
);
alter table test5 add constraint check_test5 check(length(password)>=6);
以下内容仅写第一种方法(表中check约束)
数大于某个值
create table test6(
id number(10) primary key,
no number(10) check(no>1)
);
只能是8位字符,前两位是0,34位为数字,第 5 位为””下划线,68位为字母
create table test7(
id number(10) primary key ,
password varchar2(10)check((regexp_like(password,’^00[0-9]{2}[_][a-z,A-Z]{3}$’) )and(length(password)=8))
);
insert into test7 values(1,’0012_jaa’);
电子邮箱要含有@符号check
–第一种 like方法
create table test8(
id number(10) primary key,
email varchar2(10) check (email like ‘%@%’)
);
insert into test8 values(1,‘12@126.com‘);
–第二种 regexp_like方法
create table test9(
id number(10) primary key,
email varchar2(10) check ( regexp_like(email,‘@’))
);
insert into test9 values(1,‘12@126.com‘);
用check约束一列的首字母为’s’
–第一种方法 like
create table test10(
id number(10) primary key ,
name varchar2(10) check(name like ‘s%’)
);
insert into test10 values(1,’same’);
第二种方法 regexp_like
create table test11(
id number(10) primary key ,
name varchar2(10) check(regexp_like(name,’s’,’i’) )
);
insert into test11 values(1,’same’);
以下内容仅采用like方法,regexp_like方法由读者自行修改调试
检查约束前3位和后5位均为数字字符: (代码存在问题)–认为思路正确(求help)
create table test12(
id number(10) primary key,
wno varchar2(10)check(wno like ‘[0-9]{3}%[0-9]{5}’)
);
insert into test12 values(4,’12324578’);
增加
-- 写全所有列名
insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
-- 不写列名(所有列全部添加)
insert into 表名 values(值1,值2,...值n);
-- 插入部分数据
insert into 表名(列名1,列名2) values(值1,值2);
删除
-- 删除表中数据
delete from 表名 where 列名 = 值;
-- 删除表中所有数据
delete from 表名;
-- 删除表中所有数据(高效 先删除表,然后再创建一张一样的表。)
truncate table 表名;
修改
-- 不带条件的修改(会修改所有行)
update 表名 set 列名 = 值;
-- 带条件的修改
update 表名 set 列名 = 值 where 列名=值;
未完待续。。。