**
DML语言
**
sql语言的类型
数据语言实现数据的crud
DML语句 (Data Manipulation Language) 数据库操作语言
主要包含: insert update delete select
DDL语言 data definition Lanaguage
create table
create view index sequence synonym同义词
truncate table
DCL语言 data control language数据语言
commit rollback savetpointe
insert 语言
–1插入一个完整记录
insert into emp values (1, ‘aaa’, ‘clerk’, 7092, ‘17-12月-80’, 8000, NULL, 20);
–2插入部分记录
insert into emp(empno, ename, deptno ) values (2, ‘bb’, 20);
–3插入空值 (显示和隐式)
–4插入日期
insert into emp values (3, 'ccc', 'clerk', 7092, sysdate, 8000, NULL, 20);
–5创建脚本 取地址符 &
SQL> insert into emp(empno, ename, deptno ) values (&empno, &ename, 20);
输入 empno 的值: 4
输入 ename 的值: 'cccc4'
原值 1: insert into emp(empno, ename, deptno ) values (&empno, &ename, 20)
新值 1: insert into emp(empno, ename, deptno ) values (4, 'cccc4', 20)
已创建 1 行。
如下所示:取地址符也可以用于select语句中
–6 SQL> select ename, job, &tt from emp;
输入 tt 的值: deptno
原值 1: select ename, job, &tt from emp
新值 1: select ename, job, deptno from emp
–7 批量插入数据
---把10号部门的员工 copy到另外一个表中
create table emp10
as
select * from emp where 1=2
将emp表中的所有内容完全复制到emp10表中
====
insert into emp10
select * from emp where deptno = 10
SQL> select * from emp10;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7839 KING PRESIDENT 17-11月-81 5000 10
7934 MILLER CLERK 7782 23-1月 -82 1300 10
=================== =============== =============== =============== ===============
update
语法:(其中方括号是可选的意思)
UPDATE table
SET column = value [, column = value, …]
[WHERE condition];
update table emp10
set deptno = 20
where empno = 7782
=================== ===============
删除数据
—删除指定数据
delete emp10
where empno=7782
–删除整个表中的数据
delete emp10 (但是表结构在…)
drop emp10; 删除表
有关删除数据
DELETE [FROM] table
[WHERE condition];
delete(删除表的数据)和truncate表(把表drop 然后再重新建表 )区别
1 delete逐条删除 truncate先摧毁表再重建
2 delete语言是DML语言 truncate是DDL
DML语言可以闪回 做错的并且提交了.可通过闪回,撤销操作
DDL语言不可以闪回 flashback
3 delete是逐条删除,会产生碎片, truncate不会产生碎片
行移动功能: 要开启闪回功能,必须要开启行移动功能
4 delete不会释放空间 truncate会
5 delete可以回滚 truncate不可以
6 oracle delete快 mysql truncate快
实验: 从文件中导入数据, 通过命名delete 和 truncate删除表数据 实验
从文件中导入数据
SQL> set timing off;
SQL> set feedback off;
SQL> drop table testdelete purge;
SQL> @c:\Sql.sql;//这是载入一个已经写好的sql脚本的意思。
SQL>
SQL> set timing on; //最后删除数据表的时候,把时间打开,记录时间
SQL> delete from testdelete;
已用时间: 00: 00: 00.09
从文件中导入数据
SQL> set timing off;
@c:\Sql.sql;
set timing off;
select count(*) from testdelete;
set timing on; //最后删除数据表的时候,把时间打开,记录时间
truncate table testdelete;
已用时间: 00: 00: 00.51
事务
1 基本概念
概念 一个或者多个DML语言组成
特点 要么都成功,要么都失败
特性 原子性 一致性 隔离性 持久性
事物的隔离性 多个客户端同时操作数据库的时, 要隔离他们的操作
否则:脏读 不可重复读 幻读
设置不同的搁置级别来解决
-----oracle默认情况下,事务是打开...
create table t1(tid int, tname varchar2(20));
insert into t1(tid, tname) valudes(1, ‘aaaaa’);
commit;
rollback;
2 oracle中的事务 生命周期
1 事务起始标志 DML语言 (oracle默认事务打开的)
2 事务的结束标志
提交: 显示提交commit
隐式提交
1) 执行DDL语言
eg create table语言 还有I个隐式的功能
提交之前的没有提交的DML语言(insert update)
2) 正常退出
回滚: 显示 rollback
隐式 掉电/宕机/非正常退出==系统出错了
-=–保存点
insert into t3(tid, tname) values(1, 'aaaaa');
insert into t3(tid, tname) values(2, 'bbbbb');
savepoint a;
insert into t3(tid, tname) values(3, 'cccc');
rollback to savepoint a
===数据库的隔离级别
read-only
DDL
管理数据库的对象
表
视图 索引 序列 同义词 约束(..... )
oracle基于用户的管理方案
借助于管理工具可以方便 看到数据库各个对象....
=======
1 创建一个表
2个条件(1 有权限 2 有表空间)
oracle给你提供了默认的resource,
create table t4(tid number, tname varchar2(20), tname2 char(6));
insert into t4 () values(1, ‘12’)
oracle的数据类型:
a) VARCHAR2(size) 可变和定长区别:varchar可变长,就是说在规定了最大存储后,还有实际存储的数据所占的存储空间,而char不可变长,也就是说当规定了字符的最大长度之后,无论存储的数据占据几个字符存储时都会占据已经给定的定长字符空间。
b) varchar2() 不能超过4096KB
c) oracle的数据类型 支持可见字符和不可字符的存储, 存图片使用的是不可见字符(二进制字符),可见字符是base64
—创建并且copy表
create + as
create table t5
as
select *from emp;
—-查看别的用户下的表
select * from scott.emp;
– rowid 行地址 索引时候用
SQL> select rowid, empno, ename from emp;
ROWID EMPNO ENAME
------------------ ---------- ----------
AAAMfPAAEAAAAAgAAA 7369 SMITH
AAAMfPAAEAAAAAgAAB 7499 ALLEN
AAAMfPAAEAAAAAgAAC 7521 WARD
AAAMfPAAEAAAAAgAAD 7566 JONES
AAAMfPAAEAAAAAgAAE 7654 MARTIN
AAAMfPAAEAAAAAgAAF 7698 BLAKE
AAAMfPAAEAAAAAgAAG 7782 CLARK
AAAMfPAAEAAAAAgAAH 7788 SCOTT
AAAMfPAAEAAAAAgAAI 7839 KING
AAAMfPAAEAAAAAgAAJ 7844 TURNER
AAAMfPAAEAAAAAgAAK 7876 ADAMS
AAAMfPAAEAAAAAgAAL 7900 JAMES
AAAMfPAAEAAAAAgAAM 7902 FORD
AAAMfPAAEAAAAAgAAN 7934 MILLER
已选择14行。
表的增删改查
alter table t1 add myname varchar2(20);
alter table t1 modify myname varchar2(40);
alter table t1 drop column myname
--删除表
drop table test1;
–oracle的回收站
– 查看回收站 show recyclebin
– 清空回收站 purge recyclebin;
– 彻底删除一张表
drop table test1 purge; –直接删除一张表,不通过回收站
– 还原表(从回收站中返复原表)
闪回的内容
–关于回收站注意问题
–并不是所有的人都有回收站 管理员没有回收站
显示回收站的信息
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
—————- —————————— ———— ——————-
EMP20 BIN
yB56S7m9QCacFW9wbkk4Ig==
0 TABLE 2014-08-10:22:48:43
SQL> select * from emp20; 不可以访问表
SQL> select * from BIN
yB56S7m9QCacFW9wbkk4Ig==
0 不可以访问表
SQL> select * from “BIN
yB56S7m9QCacFW9wbkk4Ig==
0”; 可以访问表
结论:通过回收站的名字,查看原来表的内容,需要双引号
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
EMP10 TABLE
BIN$fzmdJXyITtOZOnFngV2ONQ==$0 TABLE =====>回收站
T2 TABLE
TESTDELETE TABLE
T1 TABLE
T3 TABLE
T5 TABLE
EMPINCOMEVIEW VIEW
HREMP SYNONYM
已选择13行。
练习题
第二天练习
1. 查询和Zlotkey相同部门的员工姓名和雇用日期
select last_name, hire_date
from employees
where department_id = (
select department_id
from employees
where last_name = ‘Zlotkey’
)
- 查询工资比公司平均工资高的员工的员工号,姓名和工资。
select employee_id, last_name, salary
from employees
where salary > (
select avg(salary)
from employees
)
- 查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资
select employee_id, last_name, salary
from employees e
where salary > (
select avg(salary)
from employees
where department_id = e.department_id
)
查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名
select employee_id, last_name
from employees
where department_id in (
select department_id
from employees
where last_name like ‘%u%’
)查询在部门的location_id为1700的部门工作的员工的员工号,
select employee_id
from employees
where department_id in (
select department_id
from departments
where location_id = 1700
)- 查询管理者是King的员工姓名和工资
select last_name, salary
from employees
where manager_id in (
select employee_id
from employees
where last_name = ‘King’
)