Oracle第四课(学习笔记)

1、复制文件到新的表
建立表直接拷贝内容
CREATE TABLE JUL12_STUDENT_NEW  
    AS
    SELECT ID,SNAME,AGE FROM JUL12_STUDENT
    WHERE AGE >23;
>>把查询出来的内容放置在新的表中,创建表的同时将数据放置在表里面

==============================================================

2、Data Manipulation Language 数据库操作语言
Command
INSERT 添加命令
UPDATE 更新命令
DELETE 删除命令

INSERT语句用子查询得到的数据直接添加进入另一个表
INSERT INTO HISTORY (ID,LAST_NAME,SALARY,TITLE,START_DATE)
SELECT ID,LAST_NAME,SALARY,TITLE,START_DATE
FROM S_EMP
WHERE START_DATE<'01-JAN-94';
-------------------------
Updating Rows
UPDATE JUL12_STUDENT_NEW SET AGE=44,SNAME ='ABC'
WHERE ID =103;

要求,表内所有人的年龄都加10
UPDATE JUL12_STUDENT_NEW
SET AGE = AGE+10;

CREATE TABLE JUL12_STUDENT_TEMP(
    A NUMBER(3),
    B NUMBER(3)
);
INSERT INTO JUL12_STUDENT_TEMP VALUES( 2,3);
将student_temp表中a字段的值更新为student中
最大的id,b字段的值更新为student中最小的年龄
自己写:UPDATE JUL12_STUDENT_TEMP
SET     A=(SELECT MAX(SID) FROM JUL12_STUDENT),
    B=(SELECT MIN(AGE) FROM JUL12_STUDENT)
减少查询的次数 。变成一次。
UPDATE JUL12_STUDENT_TEMP
SET    SET (A,B)=     
    (SELECT MAX(SID) ,MIN(AGE)  FROM JUL12_STUDENT)
--------------------------
Deleting Rows from a table
条件删除
DELETE FROM a_smp
WHERE start_date >
TO_DATE('01.01.1996','DD.MM.YYYY');
非条件删除
DELETE FROM JUL12_TEST;

==================================================

3、DCL 数据控制语言
Database Control Language
Transaction 事务
事务的四个特性
ACID四个英文单词的缩写
atomic         原子性    不可分割
consistence     一致性    一起成功一起失败
isolation     隔离性    两个事务之间的隔离
durability     持久性    持久化到数据库的表文件

进入SQLPLUS后每个人都开启一个事务

注:"/"表示执行上面的那个命令语句。

两种级别:
局部事务:
局部事务(数据库的操作都是针对一个数据库的同一个用户)
全局事务(分布式事务)(数据库操作是对多个数据库或者一个数据库的不同用户下的表)

COMMIT 全部成功
ROOLBACK 上面失败   回滚所有的操作

    DELETE FROM JUL12_STUDENT WHERE ID > 12;
    UPDATE JUL12_STUDENT SET AGE=23 WHERE SID =4;
    SELECT * FROM JUL12_STUDENT;
    --事务结束,一起失败
    ROOLBACK ;


事务的锁定
一个端口
INSERT INTO JUL12_TABLE
VALUES( 123,'XIE');

另一个端口
UPDATE JUL12_TABLE
SET SID =123;

一个客户端对这条记录操作。则锁定 。。等待提交事务(commit.或者,roolback) 否则另一个事务中就没有办法操作这个数据项
事务工作方式:
如果你没有提交事务,则其他用户就看不见
没有提交或者回滚则,其他用户就不可以对该数据进行处理
如果成功提交,则数据更改就提交到数据库中,进行存盘的操作。

---------指定返回事务----------
当我们想把其中的几步回滚,那么我们就需要在操作的地址进行设置回滚点。
例子:
SELECT * FROM JUL12_STUDENT
INSERT INTO JUL12_STUDENT VALUES(120,'ZHANG',12);
SAVEPOINT INSERT_POINT_NAME1;
UPDATE JUL12_STUDENT
SET SID = 123, SNAME = 'XIA', AGE =13;
SAVEPOINT UPDATE_POINT_NAME2;
ROOLBACK;全部回滚
ROOLBACK TO UPDATE_POINT_NAME1;
则我们的insert语句还是可以执行的,就是下面的update语句是不可以执行的而已。这样我们就可以理解了这个ROOLBACK的用意了。
------------END-----------

Other Database Object  其他数据对象
1、Sequence     序列

INSERT INTO JUL12_STUDENT VALUES(103,'ZHANG',23);

CREATE SEQUENCE JUL12_SEQ_STU;
//创建一个SEQUENCE
CREATE SEQUENCE name
    [INCREMENT BY n]        增长的段    
    [START WITH n]            开始编号
    [{MAXVALUE n|NOMAXVALUE}]    最大值
    [{MINVALUE n|NOMINVALUE}]    最小值
    [{CYCLE|NOCYCLE}]        循环
    [{CACHE n|NOCACHE}]        缓存

//删除索引
DROP SEQUENCE name
其中[START WITH n]不可以被修改,只可以被删除

INSERT INTO JUL12_STUDENT VALUES (JUL12_SEQ_STU.NEXTVAL,'ZHANG',23);

//序列的数字字典表
user_sequences
DESC USER_SEQUENCES;
//查看序列当前的值
SELECT JUL12_SEQ_STU.currval from dual(这个表只是为了让序列显示而已);

//CACHE一般情况使用NOCACHE
=====================================

CREATE TABLE JUL12_INFO(
    ID NUMBER(3) PRIMARY KEY,
    NAME VARCHAR2(10),
    AGE NUMBER(3)
);
INSERT INTO JUL12_INFO VALUES( 1,'ZHANG',17);
INSERT INTO JUL12_INFO VALUES( 2,'ZHANG',15);
INSERT INTO JUL12_INFO VALUES( 3,'ZHANG',45);
INSERT INTO JUL12_INFO VALUES( 4,'ZHANG',78);
INSERT INTO JUL12_INFO VALUES( 5,'GOOD',23);
INSERT INTO JUL12_INFO VALUES( 6,'GOOD',25);
INSERT INTO JUL12_INFO VALUES( 7,'XIE',14);
INSERT INTO JUL12_INFO VALUES( 8,'XIE',64);

相同的记录只留下一条记录(自己写)
SELECT A.ID, A.NAME,A.AGE
FROM JUL12_INFO A ,
(
SELECT NAME,MAX(AGE) AGE FROM JUL12_INFO
GROUP BY NAME
) B
WHERE A.NAME =B.NAME AND A.AGE = B.AGE ;
----------------------面试的可能题目---------------
ROWID 这条记录的实际存储位置
SELECT ROWID FROM JUL12_INFO ;

去除所有的内容
DELETE FROM JUL12_INFO
WHERE NAME IN
(
    SELECT NAME FROM JUL12_INFO
    GROUP BY NAME
    HAVING COUNT(*) > 1
);

DELETE FROM JUL12_INFO A
WHERE ID >
(
    SELECT MIN(ID)
    FROM JUL12_INFO B
    WHERE A.NAME = B.NAME
)

DELETE FROM JUL12_INFO A
WHERE A.ROWID >
{
    SELECT MIN(ROWID)
    FROM JUL12_INFO B
    WHERE A.NAME = B.NAME
}
============================
随机查找
SELECT DBMS_RANDOM.RANDOM FROM JUL12_INFO;
-------随即取三条记录(自己写)-----------
SELECT ID,NAME,AGE FROM
(
    SELECT DBMS_RANDOM.RANDOM RADOMNUM,ID,NAME,AGE     
    FROM JUL12_INFO
    ORDER BY RADOMNUM
)
WHERE ROWNUM <=3;

SELECT ID,NAME,AGE FROM
(
    SELECT ID,NAME,AGE
    FROM JUL12_INFO
    ORDER BY DBMS_RADON.RANDOM
)
WHERE ROWNUM <= 3;
-----------------end-----------------

――――――――acid
-----隔离级别
四种读:    
dirty-read,脏读
一个事务读到另一个事务没有提交的数据(在ORACLE没有这个情况)。
committed-read ,提交读(默认的隔离级别)
一个事务提交了事务,而另一个事务才可以读到
repeatable-read 重复读 ,
更改后没有什么,另一个查找的两次查找的过程中显示的结果一样。
serializable-read 序列读(phantom-read幻影读)
插入记录后,另一个用户读取不到数据。

SET TRANSACTION ISOLATION;

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

2、Index        索引

是一个独立的对象。

建立了一个主键约束,或唯一约束的话,那么那个主键就是一个索引
如果NAME为主键
SELECT ID ,NAME .AGE FROM JUL12_INFO WHERE NAME='ASD';
INDEX_TABLE
AAA      ROWID
BBB    ROWID
......

自己建立索引
CREATE INDEX index
ON table (column[,column]...);

Example:
SQL> CREATE INDEX     s_emp_last_name_idx
    ON    s_emp(last_name);
Index created;

DESC USER_INDEXES;    
SELECT INDEX_NAME FROM
USER_INDEXES
WHERE TABLE_NAME ='JUL12_INFO';

按照NAME来找
CREATE INDEX  JUL12_INDEX_INFO
ON JUL12_INFO(NAME);
删除索引
DROP INDEX JUL12_INDEX_INFO
3、view        视图
准备数据
CREATE TABLE JUL12_CLASS(
    CID NUMBER(3),
    CNAME CHAR(10)
);
INSERT INTO JUL12_CLASS VALUES( 101,'JAVA');
INSERT INTO JUL12_CLASS VALUES (102,'C');
INSERT INTO JUL12_CLASS VALUES( 103,'DD');
CREATE TABLE JUL12_STUDENT(
    SID NUMBER(3),
    SNAME CHAR(10),
    CID NUMBER(3)
);
INSERT INTO JUL12_STUDENT VALUES (1,'ZHANG',101);
INSERT INTO JUL12_STUDENT VALUES (2,'XIE',102);
INSERT INTO JUL12_STUDENT VALUES (3,'GOOD',101);
INSERT INTO JUL12_STUDENT VALUES (4,'SSS',101);
SELECT S.SID,S.SNAME,C.CNAME    
FROM JUL12_CLASS C ,JUL12_STUDENT S
WHERE S.CID = C.CID;
创建视图
CREATE VIEW JUL12_S_C_VIEW
AS
    SELECT S.SID,S.SNAME,C.CNAME
    FROM JUL12_CLASS C,JUL12_STUDENT S
    WHERE S.CID = C.CID;
查询视图
SELECT * FROM JUL12_S_C_VIEW
更改视图
CREATE OR REPLACE VIEW JUL12_S_C_VIEW
AS
    SELECT S.SID,S.SNAME,C.CNAME
    FROM JUL12_CLASS C,JUL12_STUDENT S
WHERE S.CID = C.CID;

数据字典表
user_views
SELECT VIEW_NAME,TEXT FROM USER_VIEWS;

================================================
CREATE TABLE JUL12_INFO(
    ID NUMBER(3),
    NAME CHAR(10),
    AGE NUMBER(3),
    ADDRESS CHAR(10)
);
INSERT INTO JUL12_INFO VALUES (101,'ZHANG',23,'JIANGSU');
INSERT INTO JUL12_INFO VALUES (102,'XIE',23,'NANJING');
INSERT INTO JUL12_INFO VALUES (103,'ZHNG',23,'ZEJIANG');
INSERT INTO JUL12_INFO VALUES (104,'ZHG',23,'HANGZHOU');
1。建立视图
CREATE OR REPLACE VIEW JUL12_INFO_VIEW
AS
    SELECT NAME ,AGE,ADDRESS
    FROM JUL12_INFO;
2。查询视图
SELECT * FROM JUL12_INFO_VIEW;
3。加入数据
INSERT INTO JUL12_INFO_VIEW  
VALUES ('ZHANG',23,'CHANGZHOU');
4.不允许加入数据
CREATE OR REPLACE VIEW JUL12_INFO_VIEW
AS
    SELECT NAME ,AGE,ADDRESS
    FROM JUL12_INFO
WITH READ ONLY;
如此作业就可以将视图不可以往数据库里面添加记录

CREATE OR REPLACE VIEW JUL12_INFO_VIEW
AS
    SELECT NAME,AGE ,ADDRESS
    FROM JUL12_INFO
    WHERE AGE =24
WITH CHECK OPTION CONSTRAINT SS111;
加入的记录符合WHERE的条件。
INSERT INTO JUL12_INFO_VIEW
VALUES ('22',24,'NJ'); 可以插入
INSERT INTO JUL12_INFO_VIEW
VALUES ('23',22,'JS'); 不可以插入

简单视图,复杂视图
复杂视图是不可以对视图进行插入值将值转换到表中。
posted @ 2008-08-11 09:16  系咪噶  阅读(358)  评论(0编辑  收藏  举报