现在的位置: 首页 > 综合 > 正文

笔记081112 ORACLE 常用系统函数 数字类型 时间类型 大文件数据类型 主键约束 NOT NULL UNIQUE CHECK FOREIGN KEY ON DELETE CASCADE ON DELETE SET NULL USER_C

2017年11月10日 ⁄ 综合 ⁄ 共 21000字 ⁄ 字号 评论关闭
 

笔记081112


2008-11-12 下午6:18 发布人 tiger chang

**********************************************
NAME    :CHANGTIGER
DATE    :13:37 2008-11-12
EMAIL    :o52tiger@yahoo.com.cn
************************************
**********

################################## 知识点复习 #########################################

等值链接       from A a , B b where a.id = b.id ;
不等值链接      from A a , B b where a.id between b.aid and b.bid
自链接        from A a , A b where a.id = b.id
外连接       

c               s
1  1001   1
2  1002  

where c.id(+) = s.cid
where c.id = s.cid

组查询
单行函数 single-row
upper(name)  round(age) trunc(age) ............
分组函数 group function
count(*)  avg(*) min(*) max(*) ..............

group by age ....分组

group by age having ........分组条件过滤

select count(*) ,min(salary) from employee group by age

SELECT COUNT(*)
FROM STUDENT2
WHERE AGE > 20
AND AGE < 30
GROUP BY AGE
HAVING COUNT(*) > 10
ORDER BY AGE;

SELECT TRUNC(AGE/10),COUNT(TRUNC(AGE/10))
FROM STUDENT2
GROUP BY TRUNC(AGE/10);

查看年龄段的人数

子查询

SELECT * FROM A WHERE A.ID IN (SELECT SID FROM B WHERE B.SID > 10);
                            分页显示的查询
SQL> SELECT ID , SNAME , AGE
  2  FROM (
  3  SELECT ID , SNAME , AGE , ROWNUM R
  4  FROM (SELECT  ID , SNAME , AGE FROM STUDENT2 ORDER BY ID) WHERE ROWNUM <= 7)
  5  WHERE R > 5;
    ROWNUM 只能使用小于号,不能使用大于号,相当于一个伪字段

常用系统函数
 1 字符
length,ltrim,replace,rtrim,substr,trim
select length('abcdef') from abc;查询字符数 如本语句结果是6
select length('abc好def') from abc;
select lengthb('abc好def') from abc;查询字节数,为7;
select ltrim('   abc好ef') from abc; 空格
select rtrim('abc好ef   ')from abc;  空格
select trim ('   abc   ')from abc;
select length(a),length(b) from abc;
select substr('abcdefg',2,3) from abc;从第二个开始取串取三个即得 bcd
select substr('abcdefg',1,3) from abc
select substr('abcdefg',length('abcdefg')- 3 + 1,3) from abc;
select sysdate from abc;

2 日期
sysdate,curtent_date,next_day
select sysdate from abc;
select current_date from abc;
alter session set nls_date_format-'dd-mon-yyyy hh:mi:ss';   
select next_day(sysdate,'星期三') from abc;            下个星期三是几号,

3 转换
to_char,to_date,to_number    
select sysdate from abc;            查看系统日期
select to_char(sysdate,'yyy-mm-dd  hh:mi:ss') from abc;        转换成字符
select to_date('12-3月-04') from abc;        将字符串转换成日期
select to_number('333') from abc;        将字符串转换成数字

           
4聚集函数
sum,avg,max,min,count                   
select max(price) from book;            求最大值
select min(price) from book;            求最小值
select avg(price) from book;            求平均值
select count(price) from book;               
select count(*) from book;查询有几条记录    求数据总个数
select sum(price) from book;             求总数
select * from book where price > 20;  

5其他
user,decode,nvl
select user from abc;            查看用户
connect scott/changtiger        转换到用户scott/密码是changtiger
select sum(decode(sex,'男',1,0))    男人数,sum(decode(sex,'女',1,0))女人数 from e;
select  a1,nvl(a2,'未输入')a2 from aa;    在null的地方写上'未输入'
select * from aa where a2 is null;      为空
select * from aa where a2 is not null;    不为空
select *  from aa order by a1 asc;    升序
select * from aa order by a1 desc;    降序
select distinct a1 from aa;没个a1    只显示一个,不重复。
select all a1 frm aa;

实体和关系  ER图
关系类型
    一对一关系 one - to - one
    多对一关系 many - to - one
    多对多关系 many - to - many

SQL> SELECT USER FROM TIGER2;    查看用户的例子

USER
------------------------------
SCOTT
SCOTT
SCOTT
SCOTT

SQL>

################################## 知识点复习 #########################################

##################################  建表前 #########################################
关系类型
     ONE TO ONE
     一对一的关系
     MANY TO MANY
     多对多的关系
     MANY TO ONE
     多对一关系

约束
    主键约束(自然主键 和 业务主键) 唯一的,不可为空 可以是数字, 字符串等, 主键一般不可修改
    非空约束 
    外键约束 两个表之间的约束 可以是一对一的,多对一的

注意点
    0 表名列名要规范
    1 实体和表名对应,多对多的关系和表名对应
    2 实体里的属性要和表的列名对应
    3 不能使用系统关键字
    4 主键 外键的设计
建表范式
    第一范式(1NF)first normal form 
     减少数据冗余 减少完整性问题 在关系R中的每个具体关系,每个属性值都是不可在分的最小数    据单位。all attributes must be single-valued
    字段必须是不可在分的最小的数据单位
   
    第二范式 (2NF) Second normal form
    如果关系模式R(u,f)中的所有非主属性都完全依赖于任意一个候选关键字,则该    关系属于第二范式
    简单的讲就是:就是说每个表有个主键,其他字段完全依赖于该主键。
   
    第三范式(3NF) Third normal form
    如果关系模式(u , f)中的所有非主属性对任何候选关键字都不存在传递依赖,则    称关系R属于第三范式
    比如有这么一张表,学生id,学生名字,所学专业,该专业办公室
        其中学生id,确定了专业,专业确定了专业办公室,则说明有传递依赖,即不满足第三范式
   

   
用空间换时间 ----可以有适当的冗余   


   
   
       

################################### 建表前 ##########################################

################################# 字符串类型 ######################################
CREATE TABLE

数据类型 字符串类型
char  varchar varchar2     

1   
char     The default length for a CHAR column is 1 byte and the maximum
allowed is 2000 bytes. A 1-byte string can be inserted into a CHAR(10)
column, but the string is blank-padded to 10 bytes before it is stored.

2      varchar         
___________________________________________________________________________________

CREATE TABLE TIGER3(
A CHAR(10),
B VARCHAR(10),
C VARCHAR2(10)
);
INSERT INTO TIGER3 VALUES('AAA','AAA','AAA');

SQL> DESC TIGER3;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------
 A                                                  CHAR(10)
 B                                                  VARCHAR2(10)
 C                                                  VARCHAR2(10)

SQL> INSERT INTO TIGER3 VALUES('AAA','AAA','AAA');

1 row created.

SQL> SELECT * FROM TIGER3;

A          B          C
---------- ---------- ----------
AAA        AAA        AAA

SQL> select length(a),length(b),length(c) from tiger3;

 LENGTH(A)  LENGTH(B)  LENGTH(C)
---------- ---------- ----------
        10          3          3

查询结果显示对于char类型是一个固定长度的类型,而其他的varchar和varchar2是根据数据的大小来可变的。
varchar 是标准的数据类型在每种数据库中都有的,而varchar2是oracle自己的标准的数据类型
When
you create a VARCHAR2 column, you supply the maximum number of bytes or
characters of data that it can hold. The maximum length of VARCHAR2
data is 4000 bytes

超过4000 bytes就要用大数据类型。


建议使用char类型,其查询效率较高,但浪费存储空间.


################################# 数字类型 ######################################

数字类型
CREATE TABLE TIGER4(
A NUMBER,
B NUMBER(3),
C NUMBER(5,2)
);
INSERT INTO TIGER4(A) VALUES(12345678901234567890123);
INSERT INTO TIGER4(B) VALUES(1.23);
INSERT INTO TIGER4(C) VALUES(1.23222);


number      Each NUMBER value requires from 1 to 22 bytes.
NUBER(3)    插入的只有整数部分
NUMBER(5,2) 插入总位数为5的小数点后最多为2位的数据;

SQL> SELECT * FROM TIGER4;

         A          B          C
---------- ---------- ----------
1.2346E+22
                    1
                            1.23


自己测试一下INT 类型

################################### 时间类型 ########################################
CREATE TABLE TIGER5(
A DATE
);
INSERT INTO TIGER5 VALUES(SYSDATE);
INSERT INTO TIGER5 VALUES('08-AUG-08');  ---会自动类型转换不用to_date函数,必须是 (日-月-年) 的格式
INSERT INTO TIGER5 VALUES(TO_DATE('98-DEC-25 17:30','YY-MON-DD HH24:MI'));
INSERT INTO TIGER5 VALUES(TO_DATE('98-DEC-25 17:30:23','YY-MON-DD HH24:MI:SS'));
INSERT INTO TIGER5 VALUES(TO_DATE('98-DEC-25 7:30:23 AM','YY-MON-DD HH:MI:SS AM'));
INSERT INTO TIGER5 VALUES(TO_DATE('98-DEC-25 17:30:23','YY-MON-DD HH24:MI:SS'));

INSERT INTO TIGER5 VALUES (TRUNC(SYSDATE));
INSERT INTO TIGER5 VALUES (TO_DATE('3-OCT-2002','DD-MON-YYYY'));
INSERT INTO TIGER5 VALUES (TO_DATE('3-OCT-1999','DD-MON-YYYY'));
INSERT INTO TIGER5 VALUES (TO_DATE('OCT-3-2002','MON-DD-YYYY'));
INSERT INTO TIGER5 VALUES (TO_DATE('OCT/3/2003','MON-DD-YYYY')); 也可以用这样的分割线
INSERT INTO TIGER5 VALUES (TO_DATE('OCT:3:2004','MON-DD-YYYY')); 同上

SELECT TO_CHAR(A,'DD-MM-YYYY HH:MI:SS') FROM TIGER5;
SELECT TO_CHAR(A,'DD-MM-YYYY HH:MI:SS am') FROM TIGER5;
SELECT TO_CHAR(A,'DD-MM-YYYY HH:MI:SS pm') FROM TIGER5;
SELECT TO_CHAR(A,'DD-MM-YYYY HH24:MI:SS') FROM TIGER5;

SELECT NEXT_DAY(SYSDATE,'FRIDAY') FROM TIGER5;
SELECT ADD_MONTHS(SYSDATE,4) FROM TIGER5;

SQL> SELECT ROUND(A,'MONTH') FROM TIGER5;   四舍五入
SQL> SELECT ROUND(A,'YEAR') FROM TIGER5;   
SQL> SELECT TRUNC(A,'MONTH') FROM TIGER5;   截取
SQL> SELECT TRUNC(A,'YEAR') FROM TIGER5;

ROUND
returns date rounded to the unit specified by the format model fmt. The
value returned is always of datatype DATE, even if you specify a
different datetime datatype for date. If you omit fmt, then date is
rounded to the nearest day. The date expression must resolve to a DATE
value.
The TRUNC (date) function returns date with the time portion of the day truncated to the unit specified by the format model fmt.

SQL> SELECT TO_CHAR(A,'DD-MM-YYYY HH:MI:SS pm') FROM TIGER5 WHERE A > SYSDATE;

SQL> DESC TIGER5;
 Name                                      Null?    Type
 ----------------------------------------- -------- -------
 A                                                  DATE

SQL> INSERT INTO TIGER5 VALUES(SYSDATE);

1 row created.

SQL> SELECT * FROM TIGER5;

A
---------
12-NOV-08

SQL> SELECT LENGTH(A) FROM TIGER5;

 LENGTH(A)
----------
         9

SQL>  SELECT * FROM TIGER5;

A
---------
12-NOV-08
08-AUG-08
12-NOV-08
25-DEC-98
03-OCT-02
03-OCT-99
03-OCT-02

7 rows selected.

SQL> SELECT TO_CHAR(A,'DD-MM-YYYY HH:MI:SS') FROM TIGER5;

TO_CHAR(A,'DD-MM-YY
-------------------
12-11-2008 03:42:55
08-08-2008 12:00:00
12-11-2008 12:00:00
25-12-2098 05:30:00
03-10-2002 12:00:00
03-10-1999 12:00:00
03-10-2002 12:00:00
03-10-2003 12:00:00
03-10-2004 12:00:00
03-10-2004 12:00:00

10 rows selected.

SQL> SELECT TO_CHAR(A,'DD-MM-YYYY HH:MI:SS pm') FROM TIGER5;

TO_CHAR(A,'DD-MM-YYYYH
----------------------
12-11-2008 03:42:55 pm
08-08-2008 12:00:00 am
12-11-2008 12:00:00 am
25-12-2098 05:30:00 pm
03-10-2002 12:00:00 am
03-10-1999 12:00:00 am
03-10-2002 12:00:00 am
03-10-2003 12:00:00 am
03-10-2004 12:00:00 am
03-10-2004 12:00:00 am
25-12-2098 05:30:23 pm

TO_CHAR(A,'DD-MM-YYYYH
----------------------
25-12-2098 07:30:23 am
25-12-2098 05:30:23 pm

13 rows selected.

SQL> SELECT TO_CHAR(A,'DD-MM-YYYY HH24:MI:SS') FROM TIGER5;

TO_CHAR(A,'DD-MM-YY
-------------------
12-11-2008 15:42:55
08-08-2008 00:00:00
12-11-2008 00:00:00
25-12-2098 17:30:00
03-10-2002 00:00:00
03-10-1999 00:00:00
03-10-2002 00:00:00
03-10-2003 00:00:00
03-10-2004 00:00:00
03-10-2004 00:00:00
25-12-2098 17:30:23

TO_CHAR(A,'DD-MM-YY
-------------------
25-12-2098 07:30:23
25-12-2098 17:30:23

13 rows selected.

SQL> SELECT TO_CHAR(A,'DD-MM-YYYY HH:MI:SS pm') FROM TIGER5 WHERE A > SYSDATE;

TO_CHAR(A,'DD-MM-YYYYH
----------------------
25-12-2098 05:30:00 pm
25-12-2098 05:30:23 pm
25-12-2098 07:30:23 am
25-12-2098 05:30:23 pm

################################## 大文件数据类型 #########################################

CLOB 大的文本文件
BLOB 大的二进制文件

CREATE TABLE TIGER6(
A CLOB
);
INSERT INTO TIGER6 VALUES('ASDFASDFASD');    ----------仅供测试插入

CREATE TABLE TIGER7(
A BLOB
);
大数据类型
需要写程序来存储数据

LOB 数据类型
  LOB(Large Object) 数据类型存储非结构化数据,比如二进制文件,图形文件,或其他外部文件。
    LOB 可以存储到4G字节大小。数据可以存储到数据库中也可以存储到外部数据文件中。LOB数据的
   控制通过DBMS_LOB 包实现。BLOB, NCLOB, 和CLOB 数据可以存储到不同的表空间中,BFILE存储在
  服务器上的外部文件中。LOB数据类型有以下几种:

  BLOB: 二进制数据

  CLOB: 字符型数据

  BFILE: 二进制文件

  其他数据类型

  ROWID ROWID 数据类型是ORACLE数据表中的一个伪列,它是数据表中每行数据内在的唯一的标识。

#################################  主键约束  #########################################
CREATE TABLE TIGER8(
ID NUMBER(4) PRIMARY KEY,
NAME CHAR(10)
);
INSERT INTO TIGER8 VALUES(1,'ABC');
INSERT INTO TIGER8 VALUES(2,'ABCD');
INSERT INTO TIGER8 VALUES(3,'ABCE');
INSERT INTO TIGER8 VALUES(3,'ABCDE');

SQL> INSERT INTO TIGER8 VALUES(3,'ABCDE');
INSERT INTO TIGER8 VALUES(3,'ABCDE')
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.SYS_C002746) violated

主键必须是唯一的,不能为空的,建表时用PRIMARY KEY 标识主键

SQL> DESC TIGER8;
 Name                                      Null?    Type
 ----------------------------------------- -------- -------------
 ID                                        NOT NULL NUMBER(4)
 NAME                                               CHAR(10)

ID为主键其 不能为空 NOT NULL

修改一个没有主键的表,给其添加主键
ALTER TABLE CLASS2 ADD CONSTRAINT S_PK1 PRIMARY KEY (ID);
ALTER TABLE STUDENT2 ADD CONSTRAINT S_PK1 PRIMARY KEY (ID);

CREATE TABLE TIGER9(
ID NUMBER(4),
NAME CHAR(10),
CONSTRAINT ID_PK PRIMARY KEY(ID)
);
第二种建立主键的方式;

################################# NOT NULL ##########################################

CREATE TABLE TIGER10(
ID NUMBER NOT NULL,
NAME VARCHAR2(10)
);

INSERT INTO TIGER10 VALUES(1, 'CHANGTIGER');
INSERT INTO TIGER10 VALUES(NULL,'TIGERCHANG')

SQL> INSERT INTO TIGER10 VALUES(NULL,'TIGERCHANG');
INSERT INTO TIGER10 VALUES(NULL,'TIGERCHANG')
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."TIGER10"."ID")

ALTER TABLE TIGER10 MODIFY ID NULL;
用MODIFY 修改表的属性可以为空
SQL> ALTER TABLE TIGER10 MODIFY ID NULL;

Table altered.
插入数据
SQL> INSERT INTO TIGER10 VALUES(NULL,'TIGERCHANG') ;

1 row created.
查看数据
SQL> SELECT * FROM TIGER10 ;

        ID NAME
---------- ----------
         1 CHANGTIGER
           TIGERCHANG

SQL>
再改回去
由于里面已经有一条可为空的数据,所以不能改,必须修改后才可以;
SQL> ALTER TABLE TIGER10 MODIFY ID NOT NULL;
ALTER TABLE TIGER10 MODIFY ID NOT NULL
*
ERROR at line 1:
ORA-02296: cannot enable (SCOTT.) - null values found
修改数据
SQL> UPDATE TIGER10 SET ID = 2 WHERE NAME = 'TIGERCHANG';

1 row updated.
修改回去
SQL> ALTER TABLE TIGER10 MODIFY ID NOT NULL;

Table altered.
查看数据
SQL> SELECT * FROM TIGER10 ;

        ID NAME
---------- ----------
         1 CHANGTIGER
         2 TIGERCHANG

SQL>

##################################  UNIQUE  #########################################

CREATE TABLE TIGER11(
ID NUMBER(3) PRIMARY KEY,
NAME VARCHAR2(10) CONSTRAINT S_UNIQUE UNIQUE
);

INSERT INTO TIGER11 VALUES(100,'TIGER');
INSERT INTO TIGER11 VALUES(101,'TIGER');

SQL> INSERT INTO TIGER11 VALUES(101,'TIGER');
INSERT INTO TIGER11 VALUES(101,'TIGER')
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.S_UNIQUE) violated

SQL> DESC TIGER11;
 Name                                      Null?    Type
 ----------------------------------------- -------- ---------------------
 ID                                        NOT NULL NUMBER(3)
 NAME                                               VARCHAR2(10)

SQL> SELECT * FROM  TIGER11;

        ID NAME
---------- ----------
       100 TIGER

##################################  CHECK #########################################

插入的数据必须在CHECK提供的里面选择
CREATE TABLE TIGER12(
A CHAR,
CONSTRAINT C_K CHECK(A IN ('A','B','C'))
);

INSERT INTO TIGER12 VALUES('A');
INSERT INTO TIGER12 VALUES('B');
INSERT INTO TIGER12 VALUES('D');

SQL> INSERT INTO TIGER12 VALUES('A');

1 row created.

SQL> INSERT INTO TIGER12 VALUES('D');
INSERT INTO TIGER12 VALUES('D')
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.C_K) violated

SQL> SELECT * FROM TIGER12;

A
-
A

############################### FOREIGN KEY ############################################
建一张班级表
CREATE TABLE CLASS3(
ID NUMBER(3) PRIMARY KEY,
NAME VARCHAR2(10) UNIQUE
);
建一张学生表 气所在班级的ID外键到班级表的主键ID,
主表是班级表,从表是学生表
建表时要主要顺序,删除也是要注意顺序
先建主表,后删除主表
CREATE TABLE STUDENT3(
SID NUMBER(3) PRIMARY KEY,
SNAME VARCHAR2(10) NOT NULL,
CID NUMBER(3),
CONSTRAINT FK_SC FOREIGN KEY(CID) REFERENCES CLASS3(ID)
);

INSERT INTO CLASS3 VALUES(100,'JAVA');
INSERT INTO CLASS3 VALUES(101,'C++');
INSERT INTO CLASS3 VALUES(103,'ENGLISH');
INSERT INTO CLASS3 VALUES(104,'GOOGLE');

INSERT INTO STUDENT3 VALUES(001,'TIGER',100);
INSERT INTO STUDENT3 VALUES(002,'TIGER2',101);
INSERT INTO STUDENT3 VALUES(003,'TIGE3',105);

---插入此条数据时由于没有班级105,违反外键约束,不能插入。
SQL> INSERT INTO STUDENT3 VALUES(003,'TIGE3',105);
INSERT INTO STUDENT3 VALUES(003,'TIGE3',105)
*
ERROR at line 1:
ORA-02291: integrity constraint (SCOTT.FK_SC) violated - parent key not found

SQL>

表结构展示
SQL> DESC CLASS3;
 Name                                      Null?    Type
 ----------------------------------------- -------- ---------------------
 ID                                        NOT NULL NUMBER(3)
 NAME                                               VARCHAR2(10)

表结构展示
SQL> DESC STUDENT3;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------
 SID                                       NOT NULL NUMBER(3)
 SNAME                                     NOT NULL VARCHAR2(10)
 CID                                                NUMBER(3)

表中数据
SQL> SELECT * FROM STUDENT3;

       SID SNAME             CID
---------- ---------- ----------
         1 TIGER             100
         2 TIGER2            101
表中数据
SQL> SELECT * FROM CLASS3;

        ID NAME
---------- ----------
       100 JAVA
       101 C++
       103 ENGLISH
       104 GOOGLE

先删除从表中有用到主表主键的数据,在删除主表中的数据
如果从表中有外键约束到主表的数据,则不能删掉,要注意删除顺序 即可。

SQL> DELETE FROM CLASS3 WHERE ID = 100;
DELETE FROM CLASS3 WHERE ID = 100
*
ERROR at line 1:
ORA-02292: integrity constraint (SCOTT.FK_SC) violated - child record found

SQL> SELECT * FROM STUDENT3;

       SID SNAME             CID
---------- ---------- ----------
         1 TIGER             100
         2 TIGER2            101

SQL> DELETE FROM STUDENT3 WHERE CID = 100;

1 row deleted.

SQL> DELETE FROM CLASS3 WHERE ID = 100;

1 row deleted.

SQL> SELECT * FROM CLASS3;

        ID NAME
---------- ----------
       101 C++
       103 ENGLISH
       104 GOOGLE


###################### 级联删除 ON DELETE CASCADE ###########################

修改原本没有级联的表有级联
ALTER TABLE STUDENT3 DROP CONSTRAINT FK_SC ;
ALTER TABLE STUDENT3 ADD CONSTRAINT FK_SC FOREIGN KEY(CID) REFERENCES CLASS3(ID) ON DELETE CASCADE;
 
先删除表的外键
在添加外键并有级联这里添加的是DELETE级联

SQL> ALTER TABLE STUDENT3 DROP CONSTRAINT FK_SC ;

Table altered.

SQL> ALTER TABLE STUDENT3 ADD CONSTRAINT FK_SC FOREIGN KEY(CID) REFERENCES CLASS
3(ID) ON DELETE CASCADE;

Table altered.

原本表中的数据
SQL> SELECT * FROM CLASS3;

        ID NAME
---------- ----------
       101 C++
       103 ENGLISH
       104 GOOGLE
       100 JAVA

SQL> SELECT * FROM STUDENT3;

       SID SNAME             CID
---------- ---------- ----------
         2 TIGER2            101
         1 TIGER             100

删除主表中的数据 由于级联关系从表中的数据也别删掉了。
SQL> DELETE FROM CLASS3 WHERE ID = 100;

1 row deleted.

SQL> SELECT * FROM CLASS3;

        ID NAME
---------- ----------
       101 C++
       103 ENGLISH
       104 GOOGLE

SQL> SELECT * FROM STUDENT3;

       SID SNAME             CID
---------- ---------- ----------
         2 TIGER2            101

SQL>

#########################  ON DELETE SET NULL  ##################################

修改原本没有级联的表有级联
ALTER TABLE STUDENT3 DROP CONSTRAINT FK_SC ;
ALTER TABLE STUDENT3 ADD CONSTRAINT FK_SC FOREIGN KEY(CID) REFERENCES CLASS3(ID) ON DELETE SET NULL ;

删除外键
SQL> ALTER TABLE STUDENT3 DROP CONSTRAINT FK_SC ;

Table altered.
添加外键和ON DELETE SET NULL
SQL> ALTER TABLE STUDENT3 ADD CONSTRAINT FK_SC FOREIGN KEY(CID) REFERENCES CLAS
3(ID) ON DELETE SET NULL;

Table altered.

SQL>
删除主表中的数据
SQL> DELETE FROM CLASS3 WHERE ID = 100;

1 row deleted.
看到主表中的数据删掉了,从表中有与ON DELETE SET NULL的关系没有删掉数据 而是将对应数据设为NULL (和级联对比一下)
SQL> SELECT * FROM CLASS3;

        ID NAME
---------- ----------
       101 C++
       103 ENGLISH
       104 GOOGLE

SQL> SELECT * FROM STUDENT3;

       SID SNAME             CID
---------- ---------- ----------
         2 TIGER2            101
         1 TIGER

SQL>

################################ USER_CONSTRAINTS ###########################################

查看系统表USER_CONSTRAINTS 的结构
DESC USER_CONSTRAINTS;

SQL> DESC USER_CONSTRAINTS;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------
 OWNER                                     NOT NULL VARCHAR2(30)
 CONSTRAINT_NAME                           NOT NULL VARCHAR2(30)
 CONSTRAINT_TYPE                                    VARCHAR2(1)
 TABLE_NAME                                NOT NULL VARCHAR2(30)
 SEARCH_CONDITION                                   LONG
 R_OWNER                                            VARCHAR2(30)
 R_CONSTRAINT_NAME                                  VARCHAR2(30)
 DELETE_RULE                                        VARCHAR2(9)
 STATUS                                             VARCHAR2(8)
 DEFERRABLE                                         VARCHAR2(14)
 DEFERRED                                           VARCHAR2(9)
 VALIDATED                                          VARCHAR2(13)
 GENERATED                                          VARCHAR2(14)
 BAD                                                VARCHAR2(3)
 RELY                                               VARCHAR2(4)
 LAST_CHANGE                                        DATE
 INDEX_OWNER                                        VARCHAR2(30)
 INDEX_NAME                                         VARCHAR2(30)
 INVALID                                            VARCHAR2(7)
 VIEW_RELATED                                       VARCHAR2(14)

查看约束的名称 约束的类型 表的名字 。
SQL> SELECT  CONSTRAINT_NAME , CONSTRAINT_TYPE,TABLE_NAME FROM USER_CONSTRAINTS;

CONSTRAINT_NAME                C TABLE_NAME
------------------------------ - ------------------------------
S_PK1                          P CLASS2
SYS_C002973                    P CLASS3
SYS_C002974                    U CLASS3
PK_DEPT                        P DEPT
PK_EMP                         P EMP
FK_DEPTNO                      R EMP
EMP_LAST_NAME_NN               C EMPLOYEES_DEMO
EMP_EMAIL_NN                   C EMPLOYEES_DEMO
EMP_HIRE_DATE_NN               C EMPLOYEES_DEMO
EMP_JOB_NN                     C EMPLOYEES_DEMO
EMP_SALARY_NN                  C EMPLOYEES_DEMO

CONSTRAINT_NAME                C TABLE_NAME
------------------------------ - ------------------------------
EMP_SALARY_MIN                 C EMPLOYEES_DEMO
EMP_EMAIL_UK                   U EMPLOYEES_DEMO
S_PK                           P LIUML_INFO1
LIUML_S_PK                     P LIUML_STUDENT
FK_SC                          R STUDENT3
SYS_C002984                    C STUDENT3
SYS_C002985                    P STUDENT3
SYS_C003207                    P TEST_CLASS
SYS_C003208                    U TEST_CLASS
SYS_C002883                    P TEST_NULL
SYS_C002732                    P TEST_PK

CONSTRAINT_NAME                C TABLE_NAME
------------------------------ - ------------------------------
LIUML_ID_PK                    P TEST_PK1
SYS_C003209                    C TEST_STUDENT
SYS_C003210                    P TEST_STUDENT
LIUML_S_FK                     R TEST_STUDENT
SYS_C002887                    P TEST_UNIQUE
SYS_C002888                    U TEST_UNIQUE
SYS_C002923                    C TIGER10
SYS_C003065                    P TIGER11
S_UNIQUE                       U TIGER11
C_K                            C TIGER12
SYS_C002746                    P TIGER8

CONSTRAINT_NAME                C TABLE_NAME
------------------------------ - ------------------------------
ID_PK                          P TIGER9
SYS_C002739                    P T_PK

35 rows selected.

SQL> SELECT  CONSTRAINT_NAME , CONSTRAINT_TYPE,TABLE_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'STUDENT3';

SQL> SELECT  CONSTRAINT_NAME , CONSTRAINT_TYPE,TABLE_NAME FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'STUDENT3';

CONSTRAINT_NAME                C TABLE_NAME
------------------------------ - ------------------------------
FK_SC                          R STUDENT3
SYS_C002984                    C STUDENT3

R 表示外键
P 表示主键
C 表示NOT NULL  & CHECK
U 表示唯一性约束

###########################################################################
MODIFY    只能用来修给非空约束 不能修改外键 只能先删后加。
ALTER TABLE TIGER11 MODIFY NAME NULL;

###########################################################################

课后练习
1) 公司有多少人和提成不为空的人数。
2) 工资大于0的人数。
3) 各个部门平均、最大、最小工资、人数,按照部门号升序排列。
4) 工资大于1500的部门的人数。
5) 各个部门平均工资和人数,按照部门名字升序排列。
6) 是否有员工在同一个部门,而且工资相同,列出这样的部门号和工资、人数。
7) 哪些部门工资高于1000的人数超过2人,列出部门名字。
8) 哪些员工和biri同部门。   
9) 哪些员工的工资,高于整个公司的平均工资,列出员工的名字和工资(降序)。
10)哪些员工的工资,介于32和33部门(33高些)平均工资之间。
11)所在部门平均工资高于1500的员工名字。
12)列出各个部门的ID,以及这个部门的最高工资员工名字和工资。   
13)哪个员工是整个公司的最高工资
14)部门平均工资最高的是多少。
15)哪些部门的人数比32号部门的人数多。

抱歉!评论已关闭.