目录
1. DDL
1.1 create表
--不加约束
create table tb_user(
userid number(5),
username varchar2(30)
);
--注释
comment on table tb_user is '用户表';
--创建表(同时创建约束+指定名称) 在字段的后面指定约束名直接添加
create table tb_user(
--主键约束
userid number(5) constraint pk_user primary key,
--非空约束
username varchar2(30) constraint nameNotNull not null,
--检查约束
userpwd varchar2(20) constraint ckPwd check(length(userpwd) between 4 and 18),
--默认约束 检查约束
age number(3) default(18) constraint ck_age check(age>=18),
--默认约束 检查约束
gender char(3) default('男') check(gender in('男','女')),
--唯一约束
email varchar2(30) unique,
--默认约束
regtime date default(sysdate)
);
1.2 alter
--追加约束
alter table tb_user add constraint pk_user_id primary key (userid);
alter table tb_user add constraint ck_user_name check(length(username)between 4 and 20) ;
alter table tb_user add constraint ck_user_pwd check(length(userpwd) between 4 and 18);
alter table tb_user add constraint ck_user_age check(age>=18);
alter table tb_user add constraint ck_user_gender check(gender in('男','女'));
alter table tb_user add constraint uq_user_email unique(email);
--默认与非空
alter table tb_user modify age default 18;
alter table tb_user modify username not null;
1.3 drop
--删除 (先删除从表 再删除主表 ;同时删除约束)
--删除表
drop table emp_his;
--主外键关系下的两张表的删除 :
--删除从表 : 直接删除 drop table student
--删除主表 : 不能直接删除
--1)先删除所有从表,再删除主表
--2)删除主表的同时级联删除主外键约束 drop table clazz cascade constraints;
drop table tb_txt cascade constraints;
drop table tb_user cascade constraints;
drop table student cascade constraints;
1.4 约束
外键约束
1)cid number(5) references clazz(cid)
2)cid number(5) constraint fk_cid references clazz(cid)
3) constraint fk_cid foreign key(cid) references clazz(cid)
物理约束 : 表结构上为字段添加约束,推荐主外键约束可以定义物理约束
逻辑约束 : 在后端逻辑代码上添加判断,逻辑,检查等约束建议定义为逻辑约束
2. 视图与索引
2.1 视图
视图 : 建立在结果集与表之间的虚拟表
物理视图 : 真实存储数据
逻辑视图 : 不会真实存储数据,数据来资源数据源 简化封装sql
权限问题 :
--登录sys管理员账号
--授权: grant dba to 账户名;
--回收: revoke dba from 账户名;
create or replace view 视图名 as select语句 [with read only];
grant create view to scott;--在sys管理员窗口将创建视图的权限赋给scott
create or replace view vw_xixi_haha as select empno,ename,sal,deptno from emp with read only;
select * from vw_xixi_haha;
2.2 索引
- 提高查询效率;
- 相当于目录;
- 索引是透明的,一个字段上是否添加了索引对字段的使用没有任何影响;
- 大数据量前提下,做查询才会提高效率,如果频繁做增删,反而会降低效率,索引也是数据库的对象之一,需要维护;
- 唯一性较好,少量修改,大量查询适合添加索引;
- oracle数据库自动为主键添加索引。
3. 事务
事务是指作为单个逻辑工作单元执行的一组相关操作。这些操作要求全部完成或者全部不完成。
使用事务为的是保证数据的安全有效
事务的开启: 执行DML中的insert delete update默认开启事务
事务的结束 :
a. 成功
手动提交 :使用 commit
正常执行完成的 DDL 语句:create、alter、drop
正常执行完 DCL 语句 GRANT、REVOKE
正常退出的 SQLPlus 或者 SQL Developer 等客户端
如果人工要使用隐式事务,SET AUTOCOMMIT ON (只针对一个连接)
b. 失败
意外退出,强制断电
手动提交 :使用 rollback
事务的隔离级别:
隔离级别 脏读 不可重复读 幻读 读未提交 是 是 是 读已提交 否 是 是 可重复读 否 否 是 序列化 否 否 否
事务的四个特点(ACID):
- 原子性(Atomic):事务中所有数据的修改,要么全部执行,要么全部不执行。
- 一致性(Consistence):事务完成时,要使所有所有的数据都保持一致的状态,换言之:通过事务进行的所有数据修改,必须在所有相关的表中得到反映。
隔离性: 事务应该在另一个事务对数据的修改前或者修改后进行访问。 持久性: 保证事务对数据库的修改是持久有效的,即使发生系统故障,也不应该丢失。
4. DML
4.1 insert
--insert into 表名 values(值列表);
insert into dept values(60,'教学部','上海');
--insert into 表(指定列) values(值列表);
insert into dept(deptno,dname) values(70,'营销部');
--insert into 表名 select 查询列 from 源表 where 过滤数据;
insert into emp_his2 select ename,sal from emp where deptno = 30;
--insert into 表(指定列) select 查询列 from 源表 where 过滤数据;
insert into emp_his2(ename) select ename from emp where deptno = 10;
4.2 update 更新修改
--update 表名 set 字段=值 [,....] where 过滤行记录;
update dept set loc='三亚' where deptno = 70;
update dept set dname='A'||dname,loc='青岛' where deptno in (50,60,70);
--update 表名 set (字段列表) =(select 字段列表 from 源表 where 过滤源表记录) where 更新记录的条件手动更改字段值:
update dept set (dname,loc) =(select ename,job from emp where empno=7369) where deptno in (50,60);
4.3 delete
delete from 表名; 删除一张表中所有数据
delete from 表名 where 行过滤条件; 满足条件的数据删除
删除主外键约束关系下的两张表中的数据:
1. 从表中的数据可以直接正常删除 emp
2. 删除主表中数据 :
a. 主表中没有被从表引用的数据,可以直接删除
b. 主表中已被从表引用的数据,不能直接删除
解决方案:
- 删除从表中引用了当前主表数据的那些从表删除,然后再删除当前主表数据->默认;
- 删除主表数据的同时,为从表所有引用了当前主表数据的那些从表数据的外键字段设置为null,需要为从表中外键字段设置约束的时候 on delete set null;
- 删除主表数据的同时,直接删除从表所有引用了当前主表数据的那些从表数据需要为从表中外键字段设置约束的时候 on delete cascade.
5. 数据截断 (truncate)
与delete区别:
- 数据截断没有事务管理,而delete可以通过事务管理
- 数据截断不能操作主表,从表结构上检查如果存在从表,不能截断 ,但是delete可以删除,可能存在3中方案
6. 序列
使用工具|程序管理流水号,序列在创建时 没有与表关联 ,在操作数据时与表关联
- 创建
--create sequence 序列名 start with 起始值 increment by 步进;
create sequence seq_deptno start with 70 increment by 1;
- 使用
在操作数据 添加 更新 -->主键
1)、currval :当前值
2)、nextval:下个值
select seq_tb_user.nextval from dual;
select seq_tb_user.currval from dual
- 删除
drop sequence 序列名;
drop sequence seq_tb_user;
7. JDBC
7.1 JDBC步骤
加载驱动 建立连接 创建处理块(PreparedStatement) 执行(execute) 分析并释放资源
public class Class001_JDBC {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载驱动(选择数据库)
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.获取连接(与数据库建立连接)
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:XE",
"SCOTT",
"TIGER"
);
//3.准备SQL
String sql = "SELECT * FROM DEPT";
//4.构建处理块(封装发送SQL)
Statement state = conn.createStatement();
//5.发送SQL,得到结果
ResultSet result = state.executeQuery(sql);
//6.处理结果
while(result.next()){
int deptno = result.getInt(1);
String dname = result.getString("dname");
String loc = result.getString(3);
System.out.println(deptno+"-->"+dname+"-->"+loc);
}
//7.连接关闭
conn.close();
}
}