您的位置:首页 > 数据库 > Oracle

Oracle学习(八)----sql语言

2016-03-30 16:54 543 查看
一 集合运算(详见PPT)

例:查询部门号是10和20的员工信息

方法一:

SQL> select * from emp
2  where deptno = 10 or deptno =20;

EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
1 tom_abc                                              8000                    10
7369 SMITH      CLERK           7902 17-12月-80            800                    20
7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
7839 KING       PRESIDENT            17-11月-81           5000                    10
7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
7902 FORD       ANALYST         7566 03-12月-81           3000                    20
7934 MILLER     CLERK           7782 23-1月 -82           1300                    10

方法二:

SQL> select * from emp
2  where deptno in(10, 20);

EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
1 tom_abc                                              8000                    10
7369 SMITH      CLERK           7902 17-12月-80            800                    20
7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
7839 KING       PRESIDENT            17-11月-81           5000                    10
7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
7902 FORD       ANALYST         7566 03-12月-81           3000                    20
7934 MILLER     CLERK           7782 23-1月 -82           1300                    10

方法三:采用集合

SQL> select * from emp where deptno = 10
2  union
3  select * from emp where deptno = 20;

EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
1 tom_abc                                              8000                    10
7369 SMITH      CLERK           7902 17-12月-80            800                    20
7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
7839 KING       PRESIDENT            17-11月-81           5000                    10
7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
7902 FORD       ANALYST         7566 03-12月-81           3000                    20
7934 MILLER     CLERK           7782 23-1月 -82           1300                    10

二 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

OCA认证 OCP(dba)一起考, 参加oracle的培训  2w
Oracle数据库管理员认证专员(OCA):Oracle Certified Associate
Oracle数据库管理员认证专家(OCP): Oracle Certified Professional

Oracle数据库管理员认证大师(OCM): Oracle Certified Master

三 insert语言

3.1 插入一个完整的记录,可以不用再表明后边写列名

SQL> insert into emp values(2, 'Apple', 'PRESIDENT',0000, sysdate, 10000, NULL, 20);

已创建 1 行。

3.2 插入部分记录,必须要写上列名

SQL> insert into emp(empno, ename, job, sal) values(3,'Lin', 'MANAGER', 800);

已创建 1 行。
3.3 插入空值

显示的插入空值,如3.1
隐式的插入空值,如3.2

3.4 创建脚本,取地址符&

SQL> insert into emp(empno, ename, job, sal) values(&empno,&ename, 'MANAGER', 800);
输入 empno 的值:  4
输入 ename 的值:  'Qian'   -----------注意:输入字符串时别忘了引号
原值    1: insert into emp(empno, ename, job, sal) values(&empno,&ename, 'MANAGER', 800)
新值    1: insert into emp(empno, ename, job, sal) values(4,'Qian', 'MANAGER', 800)

已创建 1 行。

SQL> / 			---------------注意:紧接着这个符号代表继续插入,继续输入
输入 empno 的值:  5
输入 ename 的值:  'Qin'
原值    1: insert into emp(empno, ename, job, sal) values(&empno,&ename, 'MANAGER', 800)
新值    1: insert into emp(empno, ename, job, sal) values(5,'Qin', 'MANAGER', 800)

3.5 select中使用取地址符

select中使用取地址符代表检索那一列没有确定下来,需要用户输入检索的列名:

SQL> select empno, ename, job, &tt from emp;
输入 tt 的值:  deptno
原值    1: select empno, ename, job, &tt from emp
新值    1: select empno, ename, job, deptno from emp

EMPNO ENAME      JOB           DEPTNO
---------- ---------- --------- ----------
1 tom_abc                      10
7369 SMITH      CLERK             20
7499 ALLEN      SALESMAN          30
7521 WARD       SALESMAN          30
7566 JONES      MANAGER           20
7698 BLAKE      MANAGER           30
7782 CLARK      MANAGER           10
7788 SCOTT      ANALYST           20
7839 KING       PRESIDENT         10
7844 TURNER     SALESMAN          30
7876 ADAMS      CLERK             20
7900 JAMES      CLERK             30
7902 FORD       ANALYST           20
7934 MILLER     CLERK             10
2 Apple      PRESIDENT         20
3 Lin        MANAGER
4 Qian       MANAGER
5 Qin        MANAGER
此时紧接着输入/可以继续执行前边的内容!

3.6 回退,对于刚刚插入的数据我们还没有提交,此时可以用回退命令回复插入之前的样式

SQL> rollback;

回退已完成。

3.7 批量插入数据

例:把10号部门的员工copy到另外一个表中

(1)原先的表结构,没有表emp10

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
BONUS                          TABLE
DEPT                           TABLE
EMP                            TABLE
SALGRADE                       TABLE

(2)先创建一个表emp10:

SQL> create table emp10
2  as
3  select * from emp;   ------------相当于子查询

表已创建。

(3)现在的表结构

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
BONUS                          TABLE
DEPT                           TABLE
EMP                            TABLE
EMP10                          TABLE
SALGRADE                       TABLE

(4)创建一个和emp结构相同的表,但是不拷贝其内容

SQL> create table emp11
2  as
3  select * from emp where 1=2;    ------因为where子句后边为假,所以没有拷贝其内容

表已创建。

(5)emp11的表结构

SQL> desc emp11;
名称                                                                                是否为空? 类型
----------------------------------------------------------------------------------- -------- ------------------

EMPNO                                                                                        NUMBER(4)
ENAME                                                                                        VARCHAR2(10)
JOB                                                                                          VARCHAR2(9)
MGR                                                                                          NUMBER(4)
HIREDATE                                                                                     DATE
SAL                                                                                          NUMBER(7,2)
COMM                                                                                         NUMBER(7,2)
DEPTNO                                                                                       NUMBER(2)

(6)emp11的内容

SQL> select * from emp11;

未选定行

(7)把emp表中10号部门的员工信息copy到另外emp11表中

SQL> insert into emp11
2  select * from emp where deptno = 10;

已创建4行。

(8)显示 内容

SQL> select * from emp11;

EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
1 tom_abc                                              8000                    10
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

3.8 更新数据update

UPDATE		table
SET		column = value [, column = value, ...]
[WHERE 		condition];

例:将员工编号7782员工的部门编号更改为20

SQL> ed
已写入 file afiedt.buf

1  update emp11
2  set deptno = 20
3* where empno = 7782
SQL> /

已更新 1 行。

(*)显示信息

SQL> select * from emp11;

EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
1 tom_abc                                              8000                    10
7782 CLARK      MANAGER         7839 09-6月 -81           2450                    20
7839 KING       PRESIDENT            17-11月-81           5000                    10
7934 MILLER     CLERK           7782 23-1月 -82           1300                    10

四 删除数据:delete语句

语法结构:

DELETE [FROM]	  table
[WHERE	  condition];
4.1
例:删除emp11表中员工编号是1的员工

SQL> delete from emp11
2  where empno = 1;

已删除 1 行。

SQL> select * from emp11;

EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7782 CLARK      MANAGER         7839 09-6月 -81           2450                    20
7839 KING       PRESIDENT            17-11月-81           5000                    10
7934 MILLER     CLERK           7782 23-1月 -82           1300                    10

4.2 删除一个表emp10,但是表结构在

SQL> delete from emp10;

已删除15行。

(*1)删除之后表结构还存在

SQL> desc emp10;
名称                                                                                是否为空? 类型
----------------------------------------------------------------------------------- -------- ----------------

EMPNO                                                                                        NUMBER(4)
ENAME                                                                                        VARCHAR2(10)
JOB                                                                                          VARCHAR2(9)
MGR                                                                                          NUMBER(4)
HIREDATE                                                                                     DATE
SAL                                                                                          NUMBER(7,2)
COMM                                                                                         NUMBER(7,2)
DEPTNO                                                                                       NUMBER(2)

(*2)

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
BONUS                          TABLE
DEPT                           TABLE
EMP                            TABLE
EMP10                          TABLE
EMP11                          TABLE
SALGRADE                       TABLE

4.3 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;      -----查询执行这条语句的时间,现在是关闭, on是打开呢
SQL> set feedback off;    -----将返回关掉, on表示打开
SQL> drop table testdelete purge;  ---- 因为不知道新建的这个表格有没有,先要删除这个表格
SQL> @c:\Sql.sql;    ------@执行脚本,后边紧跟着脚本名称和文件名称
SQL>
SQL> set timing on;  //最后删除数据表的时候,把时间打开,记录时间
SQL> delete from testdelete;   ----oracle条件下这个快
已用时间:  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

六 事物

6.1 基本概念
概念: 一个或者多个DML语言组成
特点: 要么都成功,要么都失败
特性: 原子性、一致性、隔离性、持久性
事物的隔离性	多个客户端同时操作数据库的时, 要隔离他们的操作
否则:脏读 不可重复读 幻读
设置不同的搁置级别来解决

-----oracle默认情况下,事务是打开的,提交之后才能被不同的客户端看到数据...

6.2 oracle中的事务 生命周期
1 事务起始标志 DML语言 (oracle默认事务打开的)
2 事务的结束标志
提交: 显示提交commit
隐式提交
1) 执行DDL语言
eg create table语言 还有I个隐式的功能
提交之前的没有提交的DML语言(insert update)
2) 正常退出 exit,隐式提交上一个没有提交的DML语言
回滚:	显示 rollback
隐式 掉电/宕机/非正常退出==系统出错了

6.3 保存点

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

===数据库的隔离级别(详见PPT)

对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:
脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.
数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.
一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱

read-only
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: