Orcale查询99语法以及视图索引表设计和事物的重要点和示例

Orcale查询99语法以及视图索引表设计和事物的重要点和示例

表连接

查询的数据来自于多张表,需要使用表连接

99语法

内连接 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之后已经持久化到数据库中。

你可能感兴趣的:(数据库)