Oracle第三课(学习中笔记)
复习
一。连接查询
等值连接 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
外连接
class student
1 1001
2 1002
WHERE CLASS.ID(+) = STUDENT.CID;
二。组查询
single-row单行函数
upper(name)更改数据为大写
round(age)单个处理四舍五入
group function 分组函数
count(*) 查询数量
avg(age) 查询平均值
三。
group by :
select count(*),min(salary)
frome table_emplpyee
group by age
分组后进行条件的过滤
having count(*)>2 (hanving专属于group by )
例:
SELECT COUNT(*)
FROM TABLE
WHERE AGE >20 AND AGE <30 由此问上是取出大于20小于30的年龄
GROUP BY AGE 利用age进行分组
HAVING COUNT(*)>10 取分组后的数据中count(*)>10的内容
ORDER BY AGE 最后将所有的数据进行排序
group by trunc(age/10) 将1-10,10-20,20-30 进行分组
要是我们要在21-31 进行分组呢。应当如此写法
group by trunc((age-1)/10)
subquery
SELECT * FROM A WHERE A.ID IN (
SELECT AVG(AGE) FRME B
)
分页(子查询)
page
SELECT * FROM (
SELECT D FROM P
)
使用rownum表示当前行的行号
-----------------------------------------------
E-R图的绘画。
one-to-one
many-to-one
many-to-many
范式
第一范式(INF):在关系模式R中的每一种具体关系R中,如果每个属性值都是不可再分的最小数据单位,
则称为R是第一范式的关系
第一范式简单地说,就是要求属性具有原子性,不可再分解。第一范式面临出第二范式。
第二范式(2NF):如果关系模式R(U,F)中的左右非主属性都完全依赖于任意一个候选关键字,则称关系R是属于第二范式。
第二范式简单地说,就是每个表有个主键,其他字段完全依赖于该主键,第二范式的问题?引出第三范式。
第三范式(3NF);如果关系模式R(U,F)中的所有非主属性对任何候选关键字都不存在传递依赖,则成关系R是属于第三范式的。
第三范式是很重要的,表示了不要存在值的依赖关系。
第四章节TABLE
Datetype
VARCHAR2
CHAR
VARCHAR
CREATE TABLE JUL12_TEST_CHAR(
a char(10),
b varchar(10),
c varchar2(10)
)
INSERT INTO JUL12_TEST_CHAR VALUES('AAA','AAA','AAA');
SELECT LENGTH(A),LENGTH(B),LENGTH(C) FROM JUL12_TEST_CHAR
CHAR为不可变
VARCHAR为可变类型,为微软的标准。
VARCHAR2也为可变类型,只有Oralce自己可以用。
VARCHAR2的类型最多可以放置4000个字符。
NUMBER
CREATE TABLE JUL12_TEST_NUMBER(
A NUMBER,
B NUMBER(3),
C NUMBER(5,2)
);
INSERT INTO JUL12_TEST_NUMBER (A) VALUES(1234);
INSERT INTO JUL12_TEST_NUMBER (A) VALUES(123123123123123);
INSERT INTO JUL12_TEST_NUMBER (A) VALUES(123.12);
如此可见 NUMBER就是什么样的数据都可以添加进入数据库
INSERT INTO JUL12_TEST_NUMBER (B) VALUES(2.234);
如此可件 NUMBNER(3可添加的都是整数,而位数最多为三位,若添加小数,则在开始的时候就被取整
INSERT INTO JUL12_TEST_NUMBER (C) VALUES(1.2312);
INSERT INTO JUL12_TEST_NUMBER (C) VALUES(123.12312);// 可以插入但是小数被转化成2位
INSERT INTO JUL12_TEST_NUMBER (C) VALUES(12344); // 不能插入
如此可见 NUMBER(5,2)中可以添加小数的位数必须为2。那么整数的位数就只能为三了。
当然也可以 使用INT 他的范围和变成语言中的是一样的。
日期格式
CREATE TABLE JUL12_DATE
(
D DATE
);
INSERT INTO JUL12_DATE VALUES(SYSDATE);
INSERT INTO JUL12_DATE VALUES('09-AUG-08');
INSERT INTO JUL12_DATE VALUES(TO_DATE('AUG:03:08','MM:DD:YY'));
SELECT TO_CHAR(D,'DD-MM-YY HH24:MM:SS') FROM JUL12_DATE;
INSERT INTO JUL12_DATE VALUES(TO_DATE('AUG:18:2008 12:23:10','MM-DD-YY HH:MI:SS'));
----CLOB BLOB
=====================================================
主键。。。
PRIMARY KEY
CREATE TABLE JUL12_PK(
ID NUMBER(4) PRIMARY KEY,
NAME CHAR(10)
);
INSERT INTO JUL12_PK VALUES(1,'AA');
INSERT INTO JUL12_PK VALUES(2,'BB');
INSERT INTO JUL12_PK VALUES(3,'CC');
CREATE TABLE JUL12_PK1(
ID NUMBER(4) ,
NAME CHAR(10),
CONSTRAINT S_1PK PRIMARY KEY(ID)
);
ALTER TABLE JUL12_STUDENT_04
ADD CONSTRAINT SS_PK
PRIMARY KEY(SID);
非空约束
CREATE TABLE JUL12_NULL(
ID NUMBER(3) PRIMARY KEY,
NAME VARCHAR(10) NOT NULL
);
ALTER TABLE JUL12_NULL MODIFY NAME NULL;
--unique唯一性约束
CREATE TABLE JUL12_UNIQUE1(
ID NUMBER PRIMARY KEY,
NAME CHAR(10) UNIQUE
);
INSERT INTO JUL12_UNIQUE1 VALUES (1,'ZAHNG');
INSERT INTO JUL12_UNIQUE1 VALUES (2,'ZHANG');
、、CHECK
加查值是否在约束的范围里面
CREATE TABLE JUL12_CHECK(
A CHAR(3)
CONSTRAINT CHECK_A CHECK (A IN ('A','B','C'))
);
---FOREIGN KEY
CREATE TABLE JUL12_TEST_CLASS(
CID NUMBER(3) PRIMARY KEY,
CNAME VARCHAR2(10) UNIQUE
);
CREATE TABLE JUL12_TEST_STUDENT(
SID NUMBER(3) PRIMARY KEY,
SNAME VARCHAR2(10) NOT NULL,
CID NUMBER(3) ,
CONSTRAINT JUL12_FK_SC FOREIGN KEY(CID) REFERENCES
JUL12_TEST_CLASS(CID)
);
INSERT INTO JUL12_TEST_CLASS VALUES(1,'JAVA');
INSERT INTO JUL12_TEST_STUDENT VALUES(101,'ZHANG',1);
先删除子表,然后再删除父表。
级联删除呢?
DELETE FROM JUL12_TEST_CLASS;
alter TABLE JUL12_TEST_STUDENT MODIFY
CONSTRAINT JUL12_FK_SC1 FOREIGN KEY(CID) REFERENCES
JUL12_TEST_CLASS(CID) ON DELETE CASCADE;
-------实现级联删除,父表删除则子表关于删除列的内容全部删除
1。删除以前约束
ALTER TABLE JUL12_TEST_STUDENT DROP CONSTRAINT JUL12_FK_SC;
2。建立新的符合要求的约束
ALTER TABLE JUL12_TEST_STUDENT ADD
CONSTRAINT JUL12_FK_SC1 FOREIGN KEY(CID) REFERENCES
JUL12_TEST_CLASS(CID) ON DELETE CASCADE;
-------删除后子表的该字段为NULL
1。删除以前的约束
ALTER TABLE JUL12_TEST_STUDENT DROP CONSTRAINT JUL12_FK_SC1;
2。建立信的符合要求的约束
ALTER TABLE JUL12_TEST_STUDENT ADD
CONSTRAINT JUL12_FK_SC1 FOREIGN KEY(CID) REFERENCES
JUL12_TEST_CLASS(CID) ON DELETE SET NULL;
约束名字在user_constratints表中
SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM
USER_CONSTRAINTS WHERE TABLE_NAME='JUL12_TEST_STUDENT';
一。连接查询
等值连接 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
外连接
class student
1 1001
2 1002
WHERE CLASS.ID(+) = STUDENT.CID;
二。组查询
single-row单行函数
upper(name)更改数据为大写
round(age)单个处理四舍五入
group function 分组函数
count(*) 查询数量
avg(age) 查询平均值
三。
group by :
select count(*),min(salary)
frome table_emplpyee
group by age
分组后进行条件的过滤
having count(*)>2 (hanving专属于group by )
例:
SELECT COUNT(*)
FROM TABLE
WHERE AGE >20 AND AGE <30 由此问上是取出大于20小于30的年龄
GROUP BY AGE 利用age进行分组
HAVING COUNT(*)>10 取分组后的数据中count(*)>10的内容
ORDER BY AGE 最后将所有的数据进行排序
group by trunc(age/10) 将1-10,10-20,20-30 进行分组
要是我们要在21-31 进行分组呢。应当如此写法
group by trunc((age-1)/10)
subquery
SELECT * FROM A WHERE A.ID IN (
SELECT AVG(AGE) FRME B
)
分页(子查询)
page
SELECT * FROM (
SELECT D FROM P
)
使用rownum表示当前行的行号
-----------------------------------------------
E-R图的绘画。
one-to-one
many-to-one
many-to-many
范式
第一范式(INF):在关系模式R中的每一种具体关系R中,如果每个属性值都是不可再分的最小数据单位,
则称为R是第一范式的关系
第一范式简单地说,就是要求属性具有原子性,不可再分解。第一范式面临出第二范式。
第二范式(2NF):如果关系模式R(U,F)中的左右非主属性都完全依赖于任意一个候选关键字,则称关系R是属于第二范式。
第二范式简单地说,就是每个表有个主键,其他字段完全依赖于该主键,第二范式的问题?引出第三范式。
第三范式(3NF);如果关系模式R(U,F)中的所有非主属性对任何候选关键字都不存在传递依赖,则成关系R是属于第三范式的。
第三范式是很重要的,表示了不要存在值的依赖关系。
第四章节TABLE
Datetype
VARCHAR2
CHAR
VARCHAR
CREATE TABLE JUL12_TEST_CHAR(
a char(10),
b varchar(10),
c varchar2(10)
)
INSERT INTO JUL12_TEST_CHAR VALUES('AAA','AAA','AAA');
SELECT LENGTH(A),LENGTH(B),LENGTH(C) FROM JUL12_TEST_CHAR
CHAR为不可变
VARCHAR为可变类型,为微软的标准。
VARCHAR2也为可变类型,只有Oralce自己可以用。
VARCHAR2的类型最多可以放置4000个字符。
NUMBER
CREATE TABLE JUL12_TEST_NUMBER(
A NUMBER,
B NUMBER(3),
C NUMBER(5,2)
);
INSERT INTO JUL12_TEST_NUMBER (A) VALUES(1234);
INSERT INTO JUL12_TEST_NUMBER (A) VALUES(123123123123123);
INSERT INTO JUL12_TEST_NUMBER (A) VALUES(123.12);
如此可见 NUMBER就是什么样的数据都可以添加进入数据库
INSERT INTO JUL12_TEST_NUMBER (B) VALUES(2.234);
如此可件 NUMBNER(3可添加的都是整数,而位数最多为三位,若添加小数,则在开始的时候就被取整
INSERT INTO JUL12_TEST_NUMBER (C) VALUES(1.2312);
INSERT INTO JUL12_TEST_NUMBER (C) VALUES(123.12312);// 可以插入但是小数被转化成2位
INSERT INTO JUL12_TEST_NUMBER (C) VALUES(12344); // 不能插入
如此可见 NUMBER(5,2)中可以添加小数的位数必须为2。那么整数的位数就只能为三了。
当然也可以 使用INT 他的范围和变成语言中的是一样的。
日期格式
CREATE TABLE JUL12_DATE
(
D DATE
);
INSERT INTO JUL12_DATE VALUES(SYSDATE);
INSERT INTO JUL12_DATE VALUES('09-AUG-08');
INSERT INTO JUL12_DATE VALUES(TO_DATE('AUG:03:08','MM:DD:YY'));
SELECT TO_CHAR(D,'DD-MM-YY HH24:MM:SS') FROM JUL12_DATE;
INSERT INTO JUL12_DATE VALUES(TO_DATE('AUG:18:2008 12:23:10','MM-DD-YY HH:MI:SS'));
----CLOB BLOB
=====================================================
主键。。。
PRIMARY KEY
CREATE TABLE JUL12_PK(
ID NUMBER(4) PRIMARY KEY,
NAME CHAR(10)
);
INSERT INTO JUL12_PK VALUES(1,'AA');
INSERT INTO JUL12_PK VALUES(2,'BB');
INSERT INTO JUL12_PK VALUES(3,'CC');
CREATE TABLE JUL12_PK1(
ID NUMBER(4) ,
NAME CHAR(10),
CONSTRAINT S_1PK PRIMARY KEY(ID)
);
ALTER TABLE JUL12_STUDENT_04
ADD CONSTRAINT SS_PK
PRIMARY KEY(SID);
非空约束
CREATE TABLE JUL12_NULL(
ID NUMBER(3) PRIMARY KEY,
NAME VARCHAR(10) NOT NULL
);
ALTER TABLE JUL12_NULL MODIFY NAME NULL;
--unique唯一性约束
CREATE TABLE JUL12_UNIQUE1(
ID NUMBER PRIMARY KEY,
NAME CHAR(10) UNIQUE
);
INSERT INTO JUL12_UNIQUE1 VALUES (1,'ZAHNG');
INSERT INTO JUL12_UNIQUE1 VALUES (2,'ZHANG');
、、CHECK
加查值是否在约束的范围里面
CREATE TABLE JUL12_CHECK(
A CHAR(3)
CONSTRAINT CHECK_A CHECK (A IN ('A','B','C'))
);
---FOREIGN KEY
CREATE TABLE JUL12_TEST_CLASS(
CID NUMBER(3) PRIMARY KEY,
CNAME VARCHAR2(10) UNIQUE
);
CREATE TABLE JUL12_TEST_STUDENT(
SID NUMBER(3) PRIMARY KEY,
SNAME VARCHAR2(10) NOT NULL,
CID NUMBER(3) ,
CONSTRAINT JUL12_FK_SC FOREIGN KEY(CID) REFERENCES
JUL12_TEST_CLASS(CID)
);
INSERT INTO JUL12_TEST_CLASS VALUES(1,'JAVA');
INSERT INTO JUL12_TEST_STUDENT VALUES(101,'ZHANG',1);
先删除子表,然后再删除父表。
级联删除呢?
DELETE FROM JUL12_TEST_CLASS;
alter TABLE JUL12_TEST_STUDENT MODIFY
CONSTRAINT JUL12_FK_SC1 FOREIGN KEY(CID) REFERENCES
JUL12_TEST_CLASS(CID) ON DELETE CASCADE;
-------实现级联删除,父表删除则子表关于删除列的内容全部删除
1。删除以前约束
ALTER TABLE JUL12_TEST_STUDENT DROP CONSTRAINT JUL12_FK_SC;
2。建立新的符合要求的约束
ALTER TABLE JUL12_TEST_STUDENT ADD
CONSTRAINT JUL12_FK_SC1 FOREIGN KEY(CID) REFERENCES
JUL12_TEST_CLASS(CID) ON DELETE CASCADE;
-------删除后子表的该字段为NULL
1。删除以前的约束
ALTER TABLE JUL12_TEST_STUDENT DROP CONSTRAINT JUL12_FK_SC1;
2。建立信的符合要求的约束
ALTER TABLE JUL12_TEST_STUDENT ADD
CONSTRAINT JUL12_FK_SC1 FOREIGN KEY(CID) REFERENCES
JUL12_TEST_CLASS(CID) ON DELETE SET NULL;
约束名字在user_constratints表中
SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM
USER_CONSTRAINTS WHERE TABLE_NAME='JUL12_TEST_STUDENT';