数据库oracle2

数据库oracle2

99语法

笛卡尔积  cross join

select * from emp,dept;

select * from emp cross join dept;

查询员工以及这个员工所在的部门信息

等值连接

自然连接 natural join: 自动把同名列|主外键 做等值连接

注意:同名字段不能指明出处

select deptno ,dname,ename from emp natural join dept;

join…using(同名字段)使用指定的同名字段做等值连接

select deptno,dname,ename from emp inner join dept  using(deptno);

join…on 等值|非等值连接 连接条件由你自己指定 (先连接再过滤)

select e.deptno, dname, ename
  from emp e
  join dept d
    on e.deptno = d.deptno
 where e.deptno = 30;

查询员工以及员工的薪资等级信息

select * from emp e join salgrade s on e.sal between s.losal and s.hisal;

查询30部门的员工信息以及所在的部门信息 —先过滤再连接

select *
  from (select * from emp where deptno = 30)
 cross join (select * from dept where deptno = 30);

查询30部门的员工信息

select * from emp where deptno = 30;

查询30部门的部门信息

select * from dept where deptno = 30;

查询员工信息,所在的部门信息,薪资等级信息

select *
  from emp e
  join dept d
    on e.deptno = d.deptno
  join salgrade s
    on e.sal between s.losal and s.hisal;

–员工的信息 以及 上级经理信息 e1员工表 e2经理人表

select * from emp e1 inner join emp e2 on e1.mgr = e2.empno;

–以上都是内连接 (inner) join 内连接
–外连接
–确定主表: 主表中的数据无论是否满足条件都会显示
–左外连接 left 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;

rowid

1、rowid是Oracle数据库中特有的,在其它数据库中没有。rowid【行的标识】

2、rowid是一张表中真正存在的一个字段。并且rowid是和表中记录存在绑定关系的。每一张表都有rowid字段。

3、rowid是:行的id,是一张表中某条记录的在硬盘上存储的真实物理地址。通过rowid查询表中的记录不需要对表进行扫描,直接从硬盘上读取该数据,因为有硬盘的真实物理地址。

作用:可以为表中的数据做去重,可以根据每条数据的rowid进行区分,如果表有主键,可以根据主键或者唯一字段去重

select deptno,dname,loc,rowid from dept;

示例:select* from tb_student;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dHLxaJeH-1595574657123)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1595509502684.png)]

​ insert into tb_student values(1,‘张三’,‘语文’,81);
​ insert into tb_student values(2,‘张三’,‘数学’,75);
​ insert into tb_student values(3,‘李四’,‘语文’,81);
​ insert into tb_student values(4,‘李四’,‘数学’,90);
​ insert into tb_student values(5,‘王五’,‘语文’,81);

​ select* from tb_student;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JjHs5Z1u-1595574657129)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1595509682971.png)]

表中多条重复数据只保留一条,其余删掉

找到那些要保留的数据

select min(rowid) from tb_student group by id,name,course,score;

找到那些要删除的数据

select rowid 

​	from tb_student

where not rowid in(select min (rowid) from tb_student group by id;)

删除这些数据

delete from tb_student
 where not
        rowid in
        (select min(rowid) from tb_student group by id, name, course, score);

rownum

rownum是什么?
* Oracle数据库中特有的,其它数据库中没有这种机制。
* rownum是行号,行号从1开始,以1递增。
* rownum只在DQL语句当中存在
* rownum是专门为查询结果集生成的行号
* 查询结果集出来之后,再为查询结果集动态生成行号。

作用: 用来做分页,保证数据根据指定规则排序之后,rownum也要保证规律,从1开始,每次+1

查询员工信息, 根据薪资进行排序,降序排序, 每页显示num = 3条数据,显示第i = 2页数据

嵌套的select为了让rownum有顺序有规律,先排序再确定rownum

select empno, sal , rownum num
  from (select empno, ename, sal, rownum n from emp order by sal desc);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-COSr9bjM-1595574657132)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1595510437609.png)]

又嵌套的select目的: 为了在where判断之前就确定rownum,因为执行流程,如果当前这次select的结果集还没确定,没办法做判断 先走from–where–select

select *
  from (select empno, sal, rownum num
          from (select empno, ename, sal, rownum n from emp order by sal desc))
 where num >= 4
   and num <= 6;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uye93D2m-1595574657136)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1595510901595.png)]

根据不同的字段排序,排序和rownum顺序可能不同,如果rownum没有规律,就在外面嵌套一个select,外部select的rownum就是有规律的

索引

索引: sql优化|调优
–作用: 加快查询效率, 大量的根据表中的某个字段做查询时候,可以为这个字段添加索引

​ --索引是透明的,使用完全没有区别

​ --相当于数据库的对象之一,不是自己维护的

​ --如果数据量小,或者经常做增删改,就不建议 为该字段添加索引,因为对象需要维护

​ --建议添加索引的字段不要出现数据值大量重复的情况,索引使用的效果就不明显

​ --oracle会自动为主键添加索引

​ --索引也是存储在硬盘当中的,也是需要维护的,所以字段上不能随便添加索引

创建索引

create index emp_ename_index on emp(ename); //给emp表中的ename字段添加一个索引,索引起名emp_ename_index
create index 索引名 on表名 (字段列表...) drop index 索引名 
create index index_emp_sal on emp(sal);

删除索引

drop index emp_ename_index;

索引也有一张系统表:user_indexes

​ user_tables 系统表描述用户表
​ user_constraints 系统表描述约束信息
​ user_indexes 系统表描述索引信息

视图

–create or replace view 视图名 as 结果集;
create or replace view vw_emp_haha as select empno,ename,sal from emp where deptno in(10,30);
create or replace view vw_student as select * from tb_student;

/*
、授权: grant dba to scott; 回收: revoke dba from scott;
*/
grant dba to SCOTT; 回收: revoke dba from SCOTT;

–从视图中查询数据
select * from tb_student;

select * from vw_student;

–删除原表
drop table tb_student;
–删除视图
drop view vw_student;

update vw_student set score = 100 where name=‘张三’;

表设计 及 定义 ddl

– 根据业务,通过项目组分析设计–>开发文档–>创建

– 博客网站
– 用户表(作者)
– userid,username,userpwd…
– 文章表
– id,userid,时间…

–创建表 (不添加约束)
create table 表名(
字段名 类型,

字段名 类型
)

create table haha(
hahaid number(3),
hname varchar2(15)
)

–插入测试数据
insert into haha values(123,‘张三风哈哈’);
insert into t_student values(112,‘abc’,18,‘男’,13000000000);

select * from haha;

–主键约束 非空约束 检查约束 唯一约束 默认约束 default(默认值) 外键约束

–创建表同时添加约束(1.默认名字 2.指定名字)

create table t_student(
       --主键约束
       sid number(3) primary key,
       --非空约束
       sname varchar2(12) not null,
       --检查约束 (0~150)
       sage number(3) check(sage between 0 and 150),
       --检查约束
       sgender char(1 char) check(sgender in ('男','女')),
       --唯一
       sphoneNum number(11) unique not null
)

–创建表 的同事指定约束名字,直接添加在字段的后面,不需要指定为哪一个字段添加约束

create table t_student(
       --主键约束
       sid number(3) constraints pk_student_sid primary key,
       --非空约束
       sname varchar2(12) constraints snameNotNull not null,
       --检查约束 (0~150)
       sage number(3) check(sage between 0 and 150),
       --检查约束
       sgender char(1 char) check(sgender in ('男','女')),
       --唯一
       sphoneNum number(11) unique not null
)

–创建表 的同事指定约束名字 ,需要指定为哪一个字段添加约束,表结构结束之前

create table t_student(
       --主键约束
       sid number(3) constraints pk_student_sid primary key,
       --非空约束
       sname varchar2(12) constraints snameNotNull not null,
       --检查约束 (0~150)
       sage number(3) check(sage between 0 and 150),
       --检查约束
       sgender char(1 char) check(sgender in ('男','女')),
       --唯一
       sphoneNum number(11),

   	constraints number_check check(sphoneNum is not null)   

)

–创建表 之后追加约束

alter table t_student add constraints name_check check(length(sname)>=3) ;

–删除约束

alter table t_student drop constraints name_check;

DML语句

insert into 表(指定列) select 查询列 from 源表 where 过滤数据;
insert into 表(指定列) values(值列表);
insert into 表名 select 查询列 from 源表 where 过滤数据;
insert into 表名 values(值列表 );

update 表名 set(字段列表)=(select 字段列表 from 源表 where 过滤源表记录 ) where 更新记录的条件 手动更改字段值:
update 表名 set 字段=值 [,…] where 过滤行记录;

–删除数据 一个 多个 所有
delete from 数据源 where 条件;

–delete 数据截断truncate 区别
–删除表中的所有数据
–1) delete 默认开启事务 删除主表中数据—>三种解决方案
–2) 数据截断truncate 不会开启事务 从表结构上检查,是否有被引用,存在被引用就不能数据截断
delete from t_class;
truncate table t_class;

序列

序列-sequence

1、序列是Oracle数据库当中特有的,专门用来维护一个自增的数字,默认情况下从1开始,以1递增。
类似于mysql当中的auto_increment

2、创建序列对象
create sequence myseq;

3、删除序列对象
drop sequence myseq;

4、序列对象也有一张系统表:user_sequences

规律:user_XXXs

5、序列对象都有两个属性:
* nextval:从序列当中获取下一个值
* currval:从序列对象当中获取当前值

6、案例:
create table t_customer(
id number(10) primary key,
name varchar2(32)
);

create sequence myseq;

insert into t_customer(id,name) values(myseq.nextval,'jack1');
insert into t_customer(id,name) values(myseq.nextval,'jack2');
insert into t_customer(id,name) values(myseq.nextval,'jack3');
insert into t_customer(id,name) values(myseq.nextval,'jack4');
insert into t_customer(id,name) values(myseq.nextval,'jacka');
insert into t_customer(id,name) values(myseq.nextval,'jackb');
insert into t_customer(id,name) values(myseq.nextval,'jackc');

commit;

select * from t_customer;

7、注意:Oracle中的sequence是一个共享的对象。所以有的时候会出现断号现象,
但是断号不是问题,因为主键只要不重复即可,没必要连续。

8、创建一个完整的序列对象:

create sequence my_seq_01
start with 100
minvalue 100
maxvalue 1000

主外键约束删除

--学生表 班级表
--班级表 -->主表
create table t_class(
       cid number(5) primary key,
       cname varchar2(10 char) not null     
);
--学生表 -->从表
create table t_student(
       sid number(3) primary key,
       sname varchar2(12) not null,
       --外键约束 这个学生所在的班级编号 班级表的主键
       cid number(5) ,--references t_class(cid)

  -- constraints 约束名 foreign key(字段) references t_class(cid)
   constraints fk_student_cid foreign key(cid) references t_class(cid) on delete set null

);

–在主从表关系下删除表
–删除表
–删除从表可以直接删除
drop table t_student;
drop table t_class;
–删除主表
–不能直接删除主表,默认要求先删除从表再删除主表
–删除主表的同时,删除主外键约束关系
drop table t_class cascade constraint;
–在主从表关系下删除数据
–删除主表中数据:
–删除没有被从表引用的主表数据
delete from t_class where cid = 41;
–删除被从表中数据所引用的主表数据时: 3种解决方案
delete from t_class where cid = 40;
–1) 默认先删除从表中引用了当前主表数据的从表数据
delete from t_student where cid = 40;
–2) 删除主表数据的同时,就把从表中引用了当前主表数据的从表数据一起删掉 on delete cascade
–2) 删除主表数据的同时,就把从表中引用了当前主表数据的从表数据外键字段设置为null on delete set null

–注释

comment on table t_class is '班级表'; 
comment on column t_class.cid is '班级编号,主键'; 
comment on column t_class.cname is '班级名称';

–约束开启和禁用

ALTER TABLE t_student disable constraint fk_student_cid; 
ALTER TABLE t_student enable constraint fk_student_cid;

事务

事务是指作为单个逻辑工作单元执行的一组相关操作。这些操作要求全部完成

或者全部不完成。使用事务是为了保证数据的安全有效

事务的四个特点:

​ 1、原子性(Atomic):事务中所有数据的修改,要么全部执行,要么全部不执行。

​ 2、一致性(Consistence):事务完成时,要使所有所有的数据都保持一致的状态,

​ 换言之:通过事务进行的所有数据修改,必须在所有相关的表中得到反映。

​ 3、隔离性(Isolation):事务应该在另一个事务对数据的修改前或者修改后进行访问。

​ 读未提交(脏读)(READ UNCOMMITTED)

​ 读提交 (READ COMMITTED)

​ 可重复读 (REPEATABLE READ)

​ 序列化 (SERIALIZABLE)
​ Oracle 中只支持:READ COMMITTED 和 SERIALIZABLE

​ 4、持久性(Durability):保证事务对数据库的修改是持久有效的,即使发生系统故障,

​ 也不应该丢失。

事务控制语言(TCL)
事务中存在一些概念:
a) 事务(Transaction):一批操作(一组 DML sql)
b) 开启事务(Begin Transaction)
c) 回滚事务(rollback Transaction)–Oracle—rollback
d) 提交事务(commit transaction)----Oracle–commit
当执行 DML 语句时其实就是开启一个事务
关于事务的回滚需要注意:只能回滚 insert、delete 和 update 语句,不能回滚 select(回滚
select 没有任何意义),对于 create、drop、alter 这些无法回滚
Delete 和 truncate 都可以删除表中的数据。
Delete 语句删除数据之后还可以回滚
Truncate 语句删除数据之后不可以回滚
Delete 语句是 DML 语句
Truncate 语句是 DDL 语句
Truncate 语句是将表截断。
Delete from emp_bak;
生系统故障,

​ 也不应该丢失。

事务控制语言(TCL)
事务中存在一些概念:
a) 事务(Transaction):一批操作(一组 DML sql)
b) 开启事务(Begin Transaction)
c) 回滚事务(rollback Transaction)–Oracle—rollback
d) 提交事务(commit transaction)----Oracle–commit
当执行 DML 语句时其实就是开启一个事务
关于事务的回滚需要注意:只能回滚 insert、delete 和 update 语句,不能回滚 select(回滚
select 没有任何意义),对于 create、drop、alter 这些无法回滚
Delete 和 truncate 都可以删除表中的数据。
Delete 语句删除数据之后还可以回滚
Truncate 语句删除数据之后不可以回滚
Delete 语句是 DML 语句
Truncate 语句是 DDL 语句
Truncate 语句是将表截断。
Delete from emp_bak;
Truncate table emp_bak;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值