查询的数据来自于多张表,需要使用表连接
内连接 inner join
外连接 left join right join full join(全连接)…
示例:
--笛卡尔积 cross join
select * from emp e,dept d;
select * from emp e cross join dept d;
--等值连接
--自然连接 natural join 自动帮你找两个表之间的同名字段|主外键关系字段左连接 自动做等值连接
--员工的信息以及所在部门的信息
select empno,deptno from emp e natural join dept d;--注意:如果使用同名字段,不能指明出处
--join..using(同名字段)指定使用哪一个同名字段作为等值连接条件
select empno,deptno from emp e join dept d using(deptno);--注意:如果使用同名字段,不能指明出处
--非等值连接
--A join B on 连接条件 join C on 连接条件 可以做等值连接,也可以做非等值连接
select * from emp e join dept d on e.deptno=d.deptno where e.deptno=30;--注意:如果使用同名字段,必须指明出处
--查询员工信息,薪资等级
select grade, count(1)
from emp e
join salgrade s
on e.sal between losal and hisal
join dept d
on e.deptno = d.deptno
where e.deptno in (10, 30)
group by grade
having grade != 1
order by grade;
--员工信息,上级信息
select * from emp e1 join emp e2 on e1.mgr=e2.empno;
--内连接(inner) join
--外连接 left join 左连接 right join右连接 全连接 full join 两边的表都作为主表
--主表 主表在join的左边是左连接left join,在join右边是右连接right join, full join 两边的表都作为主表
select * from emp e1 left join emp e2 on e1.mgr=e2.empno;
select * from emp e1 right join emp e2 on e1.mgr=e2.empno;
select * from emp e1 full join emp e2 on e1.mgr=e2.empno;
–视图 视图是虚拟表,操作视图其实数据还是在对应的表中,使用视图最大好处可以简化select语句代码
–索引: 提高sql语句查询速度的一种手段 -->目录
–1、唯一性较好字段适合建立索引
–2、大数据量才有效果
–3、主键|唯一: 唯一索引
示例:
--不是所有的账号都有权限创建视图
--需要授权
--1、切换到管理员账号sys
--2、grant dba to 账户名;授权 回收权限 revoke dba from 账户名;
grant dba to SCOTT;
--创建视图
--create or replace view 视图名 as select语句 [with read only];
create or replace view vw_sql as select empno,ename,sal from emp where deptno=30;
--删除视图
--drop view 视图名;
drop view vw_sql;
--查看视图
select * from vw_sql;
--修改数据 update 表名 set 字段=值 [,......] where 过滤行记录;
update vw_sql set sal=100 where empno=7499;
--对每个部门中所有经理人求平均薪资,查询平均薪资最低的部门的部门名称
--所有经理人
select distinct mgr from emp where mgr is not null;
--创建视图存储所有经理人
create or replace view vw_mgr as select distinct mgr from emp where mgr is not null with read only;--添加只读 with read only,不能修改
--对所有经理人进行分组,查到部门编号,经理人的平均薪资
select deptno,avg(sal) from emp where empno in(select distinct mgr from emp where mgr is not null) group by deptno;
--找到部门最低平均薪资
select min(avg(sal)) from emp where empno in(select distinct mgr from emp where mgr is not null) group by deptno;
--判断部门薪资和部门最低平均薪资相等的,获取这个部门的部门编号
select deptno
from (select deptno, avg(sal) avg1
from emp
where empno in (select distinct mgr from emp where mgr is not null)
group by deptno)
where avg1 =
(select min(avg(sal))
from emp
where empno in (select distinct mgr from emp where mgr is not null)
group by deptno);
--根据部门编号获取部门名称
select dname from dept where deptno=(select deptno
from (select deptno, avg(sal) avg1
from emp
where empno in (select distinct mgr from emp where mgr is not null)
group by deptno)
where avg1 =
(select min(avg(sal))
from emp
where empno in (select distinct mgr from emp where mgr is not null)
group by deptno));
--视图
select dname from dept where deptno=(select deptno
from (select deptno, avg(sal) avg1
from emp
where empno in (select * from vw_mgr)
group by deptno)
where avg1 =
(select min(avg(sal))
from emp
where empno in (select * from vw_mgr)
group by deptno));
--索引
--是数据库的对象之一,是透明的,有没有索引,sql都一样
--大量的数据的查询,如果数据量比较小,如果不是大量做查询,而是大量的执行增删改的操作,反而会降低效率,因为需要维护索引
--可以说索引特别像字典的目录
select * from emp where sal>1500;
--create index 索引名 on表名 (字段列表...)
create index index_sal on emp(sal);
--drop index 索引名
drop index index_sal;
–表设计
–三范式的要求
–表的名称,字段,类型,要求(约束)
–表和表之间的关系 一对一 一对多|多对一 多对多(中间表)
–创建表和添加约束
–先创建表,后续为这个表的某个字段添加约束
创建表的同时添加约束
创建表 字段后直接添加约束
1、默认的约束名 优点:简单 缺点:不便于后期维护
2、字段后添加指定约束名
3、字段声明后,表结构结束之前添加约束
字段定义完成之后,统一为不同的字段的添加约束
–DDL定义语句 创建表 create 删除表 drop 修改 alter
–创建表
create table 表名{
字段名 类型 约束,
字段名 类型 约束,
字段名 类型,
约束
约束...
}
追加约束
–删除表
删除表的时候
先删除从表后删除主表
删除主表并同时删除主外键约束 cascade constraints
删除主表中数据的时候,这个数据有可能已被从表中的数据中引用了
这个主表数据如果已经被从表中数据引用了,需要处理
处理方式:
1、先删除从表中引用了的数据,再删除主表的这个数据
2、添加外键约束的时候 on delete set null,当主表数据被删除时,从表引用这条数据的外键字段为null
3、添加外键约束的时候 on delete cascade 删除主表数据的时候同时把从表中引用这条数据一起删除了
这个主表数据如果没有被从表中数据引用,可以直接删除
–序列工具 帮助我们管理为表中的主关键字段添加值使用的
–创建create sequence 序列名 start with 起始值 increment by 步进;
–删除drop sequence 序列名
示例:
--分析:学生id等字段应该不能重复等其他要求
--解决办法:1、逻辑方面,代码层面上进行判断 2、为数据库中的表的字段添加约束要求
--学生表 从表
--创建表的同时添加约束 字段后添加指定约束名 字段声明之后,表结构结束之前添加约束
create table sxt_student(
--主键约束 (非空+唯一)
sid number(5) constraints pk_student_sid primary key,
--非空约束 not null
sname varchar2(4 char) constraints sname_not_null not null, --默认字节数 如果想要指定字符个数 varchar2(2 char)
--检查约束 check()
sage number(3) constraints ck_sage check(sage>=0 and sage<=150),
--检查约束 '男' '女'
gender char(3) constraints ck_gender check(gender in('男','女')), --默认3个字节
--默认约束
birthday date default(sysdate),
--唯一约束 手机号不能重复
phonName number(11) unique,
--外键约束
--cid number(5) references sxt_class(cid)
cid number(5), --constraints fk_sxt_class_cid references sxt_class(cid)
--添加约束
--constraints pk_student_sid primary key(sid),
--constraints ck_sage check(sage>=0 and sage<=150),
--constraints un_phonName unique(phonName),
constraints fk_sxt_class_cid foreign key(cid) references sxt_class(cid) on delete cascade--on delete set null
)
--表结构结束之后追加约束
--alter table sxt_student add constraints ck_sage check(sage>=0 and sage<=150);
--删除约束
--alter table sxt_student drop constraints ck_sage;
--加入注释
--comment on table sxt_student is '学生表';
--comment on column sxt_student.sid is '学号,主键';
--comment on column sxt_student.sname is '学生名';
--comment on column sxt_student.sage is '学生年龄';
--comment on column sxt_student.gender is '学生性别';
--comment on column sxt_student.birthday is '入学时间';
--comment on column sxt_student.phonName is '学生电话';
--班级表 主表
create table sxt_class(
cid number(5) primary key,
cname varchar2(15) not null
)
--删除表
drop table sxt_student;--从表
drop table sxt_class cascade constraints;--主表,同时删除主外键约束
--添加从表数据
insert into sxt_student values(12345,'胡歌',18,'男',sysdate,12345,203);
insert into sxt_student values(1234,'胡歌1',18,'男',sysdate,123456,203);
--添加主表数据
insert into sxt_class values(207,'JAVA35期');
insert into sxt_class values(203,'JAVA35期');
insert into sxt_class values(sq_class_cid.nextval,'JAVA35期');--sq_class_cid.nextval 序列工具
--删除数据
delete from sxt_student where sid=1234;
delete from sxt_class where cid=203;
--只添加2个字段数据
insert into sxt_student(sid,sname) values(123,'周星驰');
--查询
select * from sxt_student;
select * from sxt_class;
--序列工具 帮助我们管理为表中的主关键字段添加值使用的
--创建create sequence 序列名 start with 起始值 increment by 步进;
--删除drop sequence 序列名
--创建
create sequence sq_class_cid start with 200 increment by 1;
--currval 当前值
--nextval 下一个值,获取最新值
--注意:第一次要使用nextval
--使用(查询)
select sq_class_cid.nextval from dual;
select sq_class_cid.currval from dual;
--删除
drop sequence sq_class_cid;
事务是指作为单个逻辑工作单元执行的一组相关操作。
事务的特点:这些操作要求全部完成或者全部不完成。
事务的作用:使用事务是为了保证数据的安全有效。
事务的特性: ACID
1、原子性( Atomic):事务中所有数据的修改,要么全部执行,要么全部不执行。
2、一致性( Consistence):事务完成时,要使所有所有的数据都保持一致的状态,换言之:通过事务进行的所有数据修改,必须在所有相关的表中得到反映。
3、隔离性( Isolation):事务应该在另一个事务对数据的修改前或者修改后进行访问。
4、持久性( Durability):保证事务对数据库的修改是持久有效的,即使发生系统故障,也不应该丢失。
事务的开启
自动开启于 DML 之 insert delete update
事务的结束
1) 成功
正常执行完成的 DDL 语句: create、 alter、 drop
正常执行完 DCL 语句 GRANT、 REVOKE
正常退出的 SQLPlus 或者 SQL Developer 等客户端
如果人工要使用隐式事务, SET AUTOCOMMIT ON (只针对一个连接)
手动提交 :使用 commit
2) 失败
rollback ,手动回滚
非法退出 意外的断电
注意:rollback 只能对未提交的数据撤销,已经 Commit 的数据是无法撤销的,因为 commit之后已经持久化到数据库中。