/* 起别名使用双引号 处理特殊字符使用 数据库里的字符串都是使用单引号 */ /* DDL语句 是数据定义语言 使用语句创建数据库的对象 表空间 是实例分配的一块空间 用于开发使用 创建语法: create tablespace 表空间名 datafile 文件的路径 size 文件大小 autoextend on next 扩展大小 */ --演示表空间创建 需要使用管理员操作 create tablespace baidu datafile 'c:\baidu.dbf'---linux系统 size 100m autoextend on next 10m --------------------------------- /* 开发使用管理员创建分配的用户 用户的创建 create user 用户名 identified by 密码 default tablespace 表空间名 */ ---创建用户 create user baidu identified by baidu default tablespace baidu --创建完成用户 登陆测试 缺少权限 /* 授权语法: grant 权限 to 用户 权限的分类 connect 连接的权限可以连接数据库 resource 高级一点的权限 可以建表 dba 最高级的权限 相当于管理员 */ ---授权connect给baidu用户 测试登陆 grant connect to baidu --授予dba权限 grant dba to baidu ------ create table p( pid number(9), pname varchar(10) ) --------------------------------------------------------------- ---plsql developer 图形化工具 instanclient /* 对表结构的设计 表中含有多少个字段 根据需求来 表中字段都是什么数据类型 主键外键 约束 数据类型 数值类型 int double bigint --mySql支持的数据类型 number(16,v2) v1是数值的总长度 v2是数值的小数位数 默认为0 number(6,2)---9999.99 字符类型 char() --固定长度的字符类型 char(20) zs 实际长度是 2 占用空间 20个长度 varchar() --可变长度的字符类型 varchar(20) zs 张三 utf8 6 gbk 4 实际长度是 2 占用空间 2个长度 varchar2() --可变长度的字符类型 varchar(20) zs 张三 utf8 6 gbk 4 实际长度是 2 占用空间 2个长度 推荐使用 日期类型 date mySql格式 yyyy-mm-dd oracle 格式 yyyy-mm-dd hh:mi:ss datetime mySql格式 yyyy-mm-dd hh:mi:ss oracle 格式 yyyy-mm-dd hh:mi:ss 精确到后面的9位纳秒 大文本类型 clob 字符类型大文本 最大支持4G的长度 数据库存放网页的源代码 blob 二进制类型大文本 最大支持4G的长度 long 长文本 最大支持2g的长度 */ /* 约束 主键约束 primary key 非空加唯一 外键约束 foreign key 唯一约束 unique 唯一 非空约束 not null 非空 检查约束 check (gender in (0,1)) 判断数值是否违反表达式 手动使用关键字指定约束 constraint 约束名称 约束类型(列) */ ---使用数据类型和约束建表操作 create table person( pid number(11) , pname varchar2(11) not null, phone varchar2(11) unique, gender number(1) check (gender in (0,1)), constraint pk_person_pid primary key(pid) ) ---插入数据测试约束 oracel事务必须手动选择提交或者回滚 insert into person values(1,'zs','11122223333',1); insert into person values(1,'zs','11122223333',1);--违反主键约束 insert into person values(2,'zs','11122223333',1);--违反唯一约束 insert into person values(2,'zs','11122224444',1); insert into person values(3,null,'11122225555',1);--违反非空约束 insert into person values(3,'','11122225555',1); --空串违反非空约束 insert into person values(3,' ','11122225555',1); insert into person values(4,'zs','11122226666',3);--违反检查约束 insert into person values(4,'zs','11122226666',0); commit; /* 表结构的修改 增加一列 alter table 表名 add(列名 数值类型) 修改一列 alter table 表名 modify(列名 数值类型) 重命名列 alter table 表名 rename column 旧列名 to 新列名 删除一列 alter table 表名 drop column 列名 */ --给person表增加地址一列 alter table person add(address varchar2(20)); --修改address为char 类型 10个长度 alter table person modify(address char(10)); alter table person modify(pname number(11)); --列如有有数据不可以修改类型 报错 --重命名gender性别为sex alter table person rename column gender to sex --删除地址address alter table person drop column address /* DML语句 数据操作语言 对表中数据做增删改 插入数据 insert into 表名 values(.....) insert into person values(1,'zs',1); --不能插入 列数量不匹配 insert into person(pid,pname,sex) values(1,'zs',1); --指定列名插入数据 修改数据 update 表名 set 列名=值 where 条件 修改满足条件的记录 删除数据 delete from 表名 where 条件 删除匹配的数据 delete from 表名 删除所有记录 一条条删除 效率低 可以加条件 truncate table 表名 摧毁表结构 再重建表结构 效率高 不能加条件 */ --想使用emp表的数据做测试 select * from emp; --创建表的同时拷贝表的数据 scott用户下的emp create table emp as select * from scott.emp; --修改SMITH用户更改名称为SSSS update emp set ename='SSSS' where ename='SMITH'; commit; /* 存在主外键的情况下 直接删除主表的记录 一、 1.先删除从表记录 2.再删除主表记录 二、级联删除 on delete cascade 三、直接删除主表 */ --创建主表订单 orders表 create table orders( oid number(11) primary key, oname varchar2(11) , oprice number(6,2) ) --创建字表订单明细表 order_detail create table order_detail( detail_id number(11) primary key, detail_name varchar2(11) , detail_price number(6,2), oid number(11), constraint fk_detail_oid foreign key(oid) references orders(oid) -- on delete cascade ) --插入主表和从表的记录 insert into orders values(1,'订单1',1000); --insert into order_detail values(1,'订单1',1000,2);--违反外键约束 insert into order_detail values(1,'订单1',1000,1); commit; ---- select * from orders; select * from order_detail; ----直接删除主表记录测试 delete from orders where oid=1; delete from order_detail where detail_id = 1; commit; drop table order_detail; --直接删除主表 强制删除 不建议使用 drop table orders cascade constraint /* 事务 作为一个逻辑操作单元 执行的任务全部成功,或者全部失败 特性:ACID (原子性 持久性 隔离性 一致性) 没有隔离级别 脏读 幻读 不可重复读 调整隔离级别 oracel数据库隔离级别 READ COMMITED ,SERIALIZABLE,READ ONLY 默认隔离级别是READ COMMITED 事务的保存点: 事务保存点的概念: 保存起执行成功的任务 意义:可以保证执行成功的任务正常提交 使用方法: 声明事务保存点 savepoin 保存点名 出现错误回滚到保存点 rollback to 保存点 再继续提交 commit spring管理事务 在servie层切入点 */ declare begin insert into orders values(1,'订单1',1000); insert into orders values(2,'订单1',1000); insert into orders values(3,'订单1',1000); insert into orders values(4,'订单1',1000); insert into orders values(5,'订单1',1000); savepoint s1; --声明保存点 insert into orders values(6,'订单1',1000); insert into order_detail values(1,'订单1',1000,100); commit; exception when others then rollback to s1; commit; end; /* 数据库其余对象 视图 是一个虚拟的表 不存放数据 数据来源为原始表 意义是: 为了数据的安全 为了权限的细分 创建视图 查看特定的数据 create view 视图名 as select * from 表 */ --查看员工信息 select * from emp; --创建视图 create view emp_view as select empno,ename,job,deptno from emp; --查询视图 select * from emp_view --修改视图 update emp_view set ename='SMITH' where ename='SSSS'; commit; --创建只读的视图 create view e_view as select empno,ename,job,deptno from emp with read only update e_view set ename='SSSS' where ename='SMITH'; commit; /* 序列 是oracle数据生成的一系列数值 用来实现 (序列是对象,所以有属性) 表中记录id的自增长 创建序列 create sequence 序列名称 序列的属性 nextval --下一个值 currval --当前值 create sequence sequence [INCREMENT BY n] 表示自增长,每次增长n个 [START WITH n] 表示初始值,n就是初始值. [{MAXVALUE n | NOMAXVALUE}] 表示最大值 [{MINVALUE n | NOMINVALUE}] 表示最小值 [{CYCLE | NOCYCLE}] 表示循环 表示如果设置了最大值,当数字达到最大值以后,会进行循环的设置值,这个不适用于自动增长的主键(非空唯一的) [{CACHE n | NOCACHE}] 表示缓存,表示缓存n个,如果n是10,表示一次缓存10个序列. */ --创建序列 create sequence order_sequence select order_sequence.nextval from dual; --序列默认值从1开始 nextval生成不会因为插入失败回退 select order_sequence.currval from dual; --查看当前值 必须先生成nextval insert into orders values(order_sequence.nextval,'订单1',1000); commit; /* 索引 理解为一本书的目录 没有目录找到特定章节 费时很长 意义:为了提升查询数据的速度(通过id,创建树结构,来提升查询效率) 前提 : 只有数据量非常大的情况下 才有意义 创建索引 单行索引 create index 索引名称 on 表(列) 复合索引 create index 索引名称 on 表(列,列2) create index index_order on orders(oname) 创建索引是在数据库中创建索引结构,放的是索引的列的数值rowid,将oname的数值按照从小到大的排序, 当where oid = 139,通过条件去索引结构定义记录的位置,数据库会通过rowid真实地址去查找数据. 优点 : 提升查询速度. 缺点 : 占用空间. 增删改数据效率降低,需要更新索引结构,如果表中有主键和唯一约束会自动创建索引. 索引使用规范 : 用在于列的数值重复数据很少情况.例如 : 当gender列都是1,会影响索引的查询效率 索引分类 : 常用的是 unique唯一索引,normal普通索引. */ --创建大数据量的表 --序列生成的属性 在同一sql语句中只会生成一次 declare begin for i in 1..5000000 loop insert into orders values(order_sequence.nextval,'订单'||order_sequence.nextval,1000); commit; end loop; end; select count(*) from orders --先查询数据 记录耗时 select * from orders where oname='订单3333333' --2.234 15 18 19 --创建索引 create index index_order on orders(oname) --一分多钟 --创建索引后 查询同样的记录 耗时 select * from orders where oname='订单3333333' ---0.204 --多个条件作为查询 不是触发单行索引 select * from orders where oname='订单3333333' and oprice=1000 --自动创建索引,根据oid创建的. select * from orders where oid=4444444 /* rowid 是数据库在保存数据时候 生成的真实物理地址 区别rownum 是一个伪列 是在查询数据时候才会生成的,可变 rowid 是插入数据就已经生成了 固定的物理地址 唯一不变 */ --通过以下查询,可以对表进行直接修改. select rowid,emp.* from emp; /* 同义词 可以理解为一个对象的别名 意义: 为了数据的安全 为了权限的细分 创建同义词 create synonym 同义词名 for 用户.对象 oracel的from后面可以跟同义词,视图,表,这三种对象. */ --查询员工表 select * from scott.emp; create synonym syn_emp for scott.emp; ---查询同义词 select * from syn_emp /* 数据库的导入导出 1.为了数据安全 备份和还原使用 2.为了服务器的迁移 把以前旧服务器的整个数据库迁移到新服务器 3.开发人员的操作 是为了部署项目导入表结构 开发是在测试环境 开发完成 需要上线 代码 上传到服务器 tomcat 开发的数据库表 上传到服务器数据库 去数据库建表 直接new 有风险 公司里一般都是 导出新建的表结构 通过命令运行 导入导出实现 通过命令行导入导出 需要安装oracel数据库服务器 导出命令 exp 整个数据库导入 exp 用户名/密码 file=文件.dmp full = y 按照用户导出 exp 用户名/密码 owner= 用户 file=文件.dmp 按照表来导出 exp 用户名/密码 file=文件.dmp tables=表名,表名2 导入 将exp 换成 imp 通过图形化工具导入导出 tools --export user objects 导出表结构 不能备份数据 包含所有的对象 tools --exprot tables 导出表可以备份结构和数据 默认情况只能备份数据 oracel数据库格式 .dmp文件 服务器才能做 sql文件格式 .sql文件 图形化工具格式 .pde文件