Oracle增删查改 day04
1.内连接t1 join t2 on 条件
1.1.等值连接:如果on后面的条件是等于。
t1 join t2 on t1.deptno = t2.deptno
1.1.1.等值连接的一种形式:自连接
t1 join t2 on t1.mgr = t2.empno
1.2.非等值连接:on后面的条件不是等值操作
empno ename salary grade lowsal hisal
------------------ -------------------
1001 zhangwj 10000 1 1000199999
1002 liucs 8000 2 8001 10000
1003 liyi 9000 3 6001 8000
1004 guofr 5000 4 4001 6000
5 1 4000
--步骤:1.建表;2.插入数据(commit);3.查询
create table salgrade_ning(
grade number(2),
lowsal number(7,2),
hisal number(7,2)
);
insert into salgrade_ning values(1,10001,99999);
insert into salgrade_ning values(2,8001,10000);
insert into salgrade_ning values(3,6001,8000);
insert into salgrade_ning values(4,4001,6000);
insert into salgrade_ning values(5,1,4000);
commit;
--计算员工的薪水等级:
select e.empno, e.ename, e.salary, s.grade
from emp_ning e join salgrade_ning s
on e.salary between s.lowsal and s.hisal;
--最终查询结果的形式:
1001zhangwuj 10000 2
1002liucs 80003
2.外连接
t1 left | right | full outer join t2 on 条件
SQL语句的种类:
DQL:select
DDL:create / drop / alter / truncate
DML:insert / update / delete
TCL:commit / rollback / savepoint
DCL:grant / revoke
一、DML操作
1.insert into...values...
--1.1.不写列名
--必须提供全部的列数据,数据的顺序必须按照表结构
--如果有数据没提供,用null表示
insert into dept_ning
values(66, 'market', null);
insert into emp_ning
values(1020,'rory','Programmer',6000,null,null,
sysdate,10);
--1.2.写列名
insert into emp_ning(empno, salary, ename, hiredate)
values(1020, 6000, 'rory',
to_date('2011/10/10','yyyy/mm/dd'));
--to_date函数是oracle独有的。
--在oracle数据库中插入日期数据,一定要用to_date
处理,不要采用默认格式,比如:'10-OCT-11'。
--建议采用:写列名的方式。即使是插入全部数据,也
建议把列名写全。
--复制全表
create table 表名
as
查询语句;
--只复制结构,不复制数据
create table salgrade_ning1
as
select * from salgrade_ning
where 1 <> 1;
--复制一部分数据:给查询语句加条件。
--如果查询语句中有表达式或者函数(包括单行函数和
组函数),必须指定新表中的列名
--指定方式:给列设置别名;或者在新表后指定。
create table emp_ning1
as
select empno, ename, salary*12 year_sal
from emp_ning
where deptno = 10;
create table emp_count(did, emp_num)
as
select deptno, count(*)
from emp_ning
group by deptno;
--创建一个空表
create table emp_bak1
as
select * from emp_ning
where 1 = 0;
--向表中插入多条记录
insert into emp_bak1
(select * from emp_ning
where deptno = 10);
--把表中的数据换为部门20和30的员工记录
delete 表名; --删除全表的数据。
delete from emp_bak1;
insert into emp_bak1
(select * from emp_ning
where deptno in (20, 30));
--向新表中插入指定记录数的数据,比如前8条。
delete from emp_bak1;
insert into emp_bak1
(select * from emp_ning
where rownum <= 8);
小结insert:
1)insert into 表名(列名,...) values(列值,...);
一次只能新增一行。
2)insert into 表名 (查询语句);
一次可以增加多行。
2.update:更新数据
update 表名 set 列名 = 新的列值,
列名 = 新的列值
where 条件;
update emp_ning set salary = 3500,
job = 'Programmer'
where empno = 1012;
--部门10的员工薪水+1000
update emp_ning set salary = salary + 1000
where deptno = 10;
--更新数据表时,注意条件。
--如果不加条件,影响的是全部表记录。
3.delete
--注意条件。
--如果不加条件的删除,将删掉表中的全部记录
--rollback 回退,commit确认。
delete 表名 where 条件;
delete emp_bak1 where empno = 1002;
delete emp_bak1 where deptno = 10;
delete emp_bak1;
commit;
--执行了3遍
insert into emp_bak1(empno, ename, salary)
values(1015,'amy',4000);
--执行了2遍
insert into emp_bak1(empno, ename, salary)
values(1016,'rory',5000);
--执行了1遍。
insert into emp_bak1(empno, ename, salary)
values(1017,'river',6000);
--创建表emp_bak2,只存放不重复的记录
create table emp_bak2
as
select distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr
from emp_bak1;
--删除表emp_bak1
drop table emp_bak1;
--把emp_bak2改名为emp_bak1
rename emp_bak2 to emp_bak1;
___________________________________________
delete emp_bak1;
insert into emp_bak1(empno, ename, salary)
values(1020, 'amy', 4000);
insert into emp_bak1(empno, ename, salary)
values(1021, 'roy', 5000);
insert into emp_bak1(empno, ename, salary)
values(1022, 'river', 6000);
--rowid是Oracle数据库的伪列。
--rowid是Oracle数据库独有的。
delete from emp_bak1
where rowid not in (
select max(rowid) from emp_bak1
group by empno, ename, salary);
二、事务:Transaction
TCL:Transaction Control Language
commit / rollback / savepoint
事务:一组DML操作的逻辑操作集合
***
1、事务的开始和终止
1)事务开始于上一个事务的终止或者第一条DML语句
2)事务终止于commit/rollback显式操作。
连接关闭:隐式终止
DDL操作,比如create:隐式提交。
insert into ...values...
update ...
delete ...
insert into ....
--rollback;--回退到事务之初,数据的状态和事务
开始之前完全一致。
commit; --所有的数据改动提交。
2、事务中的数据状态
create table mytemp_ning(
id number(4));
insert into mytemp_ning values(1);
insert into mytemp_ning values(2);
--事务内部的数据改变只有自己的会话能够看到
--对事务改动的数据加锁,事务之外不允许操作。
如果提交:commit
数据的改变被确认。所有的会话都能看到这种改动。
数据上的锁被释放。
保存数据的临时空间被释放。
如果回滚:rollback
数据的改变被取消。
数据上的锁被释放。
临时空间被释放
create table mytemp_ning(id number(4));
--事务起点
insert into mytemp_ning values(3);
savepoint A;
insert into mytemp_ning values(4);
savepoint B;
insert into mytemp_ning values(5);
rollback to A; --回滚到保存点A,A之后的保存点全部被取消
select * from mytemp_ning; --3保存,4、5回退
三、DDL
create / drop / alter / truncate
数据库的脚本(script)文件main.sql:
------------begin--------------------
--删除表emp
drop table emp;
--创建表emp
create table emp(id number(4),
name char(20));
insert into emp values(1, 'amy');
commit;
页:
[1]