`
zisefeiniao
  • 浏览: 173965 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论
阅读更多
3月20日.第四天,今天班里来了一个新同学,一个帅帅的小伙子,哈哈

今天所讲的知识点

A 表的建立、删除等SQL脚本语句(重点)
B 修改表结构(重点)
C 重命名表名(了解)
D 截断表TRUNCATE TABLE 表名;与DELECT FORM 表名;
E 约束:非空约束、主键约束、唯一约束、检查约束、主-外键约束(重点)
F 集合:并、交、差
G 序列:SEQUENCE(重点)
H 同义词:SYNONYM
I 视图:VIEW
J 备份和恢复数据库


我对知识点的分析(如果表格不够,可在备注中继续填写)
编写SQL语句脚本:
--删除表
DROP TABLE 表名;
--创建表结构
CREATE TABLE 表名

字段名…  数据类型 【DEFAULT 默认值】 【NOT NULL】 【约束】,
...
CONSTRAINT 约束名 约束类型(约束字段)
|
CONSTRAINT 外键约束名 FOREIGN KEY (约束字段) REFERENCES 主表名(约束字段)
);
建议:约束名的命名习惯是父表名_子表名_约束约定标记,约束约定标记(主键约束pk、检查约束ck、唯一约束uk、外键约束fk)
--增加测试数据
INSERT INTO 表名(字段名….)
VALUES(对应的值);
提示:(1)如果某个字段没有值可添加并且该字段可空就以NULL代替,或者在罗列字段名处不写
     (2)如果某个表中的字段列出,则如果其有默认值,则自动添加默认值,或者NULL
--修改记录
UPDATE 表名 SET 字段名1=字段值1,… WHERE 修改条件;
--删除记录
DELETE  FROM表名  WHERE  删除条件;
提示:(1)如果省略删除条件则表示删除表中所有记录,但在COMMIT之前,可通过ROLLBACK恢复;(2)如果想直接删除全表的数据,并且从内存中清除,即不可ROLLBACK则可以通过截断表命令删除表的数据:TRUNCATE TABLE 表名;
--查询表
    查询表的所有记录:SELECT * FORM 表名;
--增加字段
ALTER TABLE 表名 ADD(新增字段名1 数据类型)【DEFAULT 默认值】 【NOT NULL】【约束】,…);
--修改某字段
ALTER TABLE 表名 MODIFY (字段名1 数据类型【DEFAULT 默认值】【NOT NULL】【约束】,…);
注意:(1)修改某字段的时候,如果原来该字段原来没有设置约束,那么可以增加约束;
     (2)修改某字段的时候,如果原来该字段已经存在(除了非空约束之前的其他)约束,而此处重新指定新的约束,将不起作用,仍然按照原来的约束存在,要修改此约束只能通过单独的修改约束的语句进行修改(方法为先删除原来的约束,然后重新增加新的约束);
--删除某字段
Oracle数据库中不存在删除某字段的语句;
重命名表名是Oracle独有的:
RENAME 旧的表名 TO 新的表名;
--删除记录
截断表TRUNCATE TABLE 表名;与DELECT FORM 表名;
区别:
(1)如果省略删除条件则表示删除表中所有记录,但在COMMIT之前,可通过ROLLBACK恢复;
(2)如果想直接删除全表的数据,并且从内存中清除,即不可ROLLBACK则可以通过截断表命令删除表的数据:TRUNCATE TABLE 表名;
(1)约束的创建
A、在创建表结构的时候创建约束,格式见知识点A中的表的创建;
B、在创建表之后添加约束;
   格式:ALTER TABLE 表名 ADD CONSTRAINT 约束名称 约束类型(约束字段);
(2)各种约束
A、非空约束:即表示该字段值不能为空;
B、唯一约束:即表示该字段值在整个表范围内不能出现重复值;
C、主键约束:表中每一行数据的主键具有唯一性,并且不能为空,用于其它表的外键参照,一般设置编号为主键;
D、检查约束:用于设置某一字段的取值合法性的检查,是否在某一范围之内;
E、外键约束:唯一用于设置两张表之间的约束,即检查字表的外键字段的取值是否在父表主键字段取值的范围之内;
(3)删除约束
ALTER TABLE 表名 DROP CONSTRAINT 约束名称;

(4)约束报错集萃
假设有person和book两张表
--删除person表
DROP TABLE person;
DROP TABLE book;

--创建person表
CREATE TABLE person
(pno INT,
pname VARCHAR2(30) NOT NULL,
pid VARCHAR2(18),
age INT ,
sex VARCHAR(4) DEFAULT('女'),
CONSTRAINT person_pno_pk PRIMARY KEY(pno),
CONSTRAINT person_pid_uk UNIQUE(pid),
CONSTRAINT person_age_ck CHECK(age BETWEEN 0 AND 200),
CONSTRAINT person_sex_ck CHECK(sex IN ('男','女','中性'))
);
--创建book表
CREATE TABLE book
(
bno NUMBER,
bname VARCHAR2(20),
pno INT,
CONSTRAINT book_bno_pk PRIMARY KEY(bno),
CONSTRAINT person_book_pno_fk FOREIGN KEY(pno) REFERENCES person(pno)
);
A、主键约束
--违反主键约束的唯一性
INSERT INTO person (pno,pname,pid,age,sex)
VALUES(1001,'b','000000000000000002',20,'男');
--报错
--INSERT INTO person (pno,pname,pid,age,sex)
--*
--第 1 行出现错误:
--ORA-00001: 违反唯一约束条件 (SCOTT.PERSON_PNO_PK)

--违反主键约束的非空性
INSERT INTO person (pname,pid,age,sex)
VALUES('b','000000000000000002',20,'男');
--报错
--INSERT INTO person (pname,pid,age,sex)
--*
--第 1 行出现错误:
--ORA-01400: 无法将 NULL 插入 ("SCOTT"."PERSON"."PNO")


B、非空约束
--违反反非空约束
INSERT INTO person (pno,pname,pid,age,sex)
VALUES(1002,null,'000000000000000002',20,'男');
--报错
--VALUES(1002,null,'000000000000000002',20,'男')
--            *
--第 2 行出现错误:
--ORA-01400: 无法将 NULL 插入 ("SCOTT"."PERSON"."PNAME")


C、唯一约束
--违反唯一约束
INSERT INTO person (pno,pname,pid,age,sex)
VALUES(1002,'b','000000000000000001',20,'男');
--报错
--INSERT INTO person (pno,pname,pid,age,sex)
--*
--第 1 行出现错误:
--ORA-00001: 违反唯一约束条件 (SCOTT.PERSON_PID_UK)


D、检查约束
--违反age检查约束
INSERT INTO person (pno,pname,pid,age,sex)
VALUES(1002,'b','000000000000000002',250,'男');
--报错
--INSERT INTO person (pno,pname,pid,age,sex)
--*
--第 1 行出现错误:
--ORA-02290: 违反检查约束条件 (SCOTT.PERSON_AGE_CK)

--违反sex检查约束
INSERT INTO person (pno,pname,pid,age,sex)
VALUES(1002,'b','000000000000000002',20,'人妖');
--报错
--INSERT INTO person (pno,pname,pid,age,sex)
--*
--第 1 行出现错误:
--ORA-02290: 违反检查约束条件 (SCOTT.PERSON_SEX_CK)


E、外键约束
--插入无效数据,1008在person中不存在
INSERT INTO book(bno,bname,pno)
VALUEs(3,'JAVA',1008);
--报错
--INSERT INTO book(bno,bname,pno)
--*
--第 1 行出现错误:
--ORA-02291: 违反完整约束条件 (SCOTT.PERSON_BOOK_PNO_FK) - 未找到父项关键字


--在没有删除子表前直接删除父表
DROP TABLE person;

--报错
--DROP TABLE person
--           *
--第 1 行出现错误:
--ORA-02449: 表中的唯一/主键被外键引用

注意:在删除具有外键关系的表的时候,先删除子表再删除父表
或者可以采用如下解决方法:
DROP TABLE person CASCADE CONSTRAINT;


--在没删除子表的数据的时候,先删除父表的数据
DELETE FROM person WHERE pno=1001;

--报错
--DELETE FROM person WHERE pno=1001
--*
--第 1 行出现错误:
--ORA-02292: 违反完整约束条件 (SCOTT.PERSON_BOOK_PNO_FK) - 已找到子记录

注意:在删除具有外键关系的父表的数据的时候,先删除子表对应的数据
或者可以采用如下解决方法,在删除父表的数据的时候同时删除子表中对应的数据
即在创建外键的时候指定级联删除

CREATE TABLE book
(
bno NUMBER,
bname VARCHAR2(20) NOT NULL,
pno INT,
CONSTRAINT book_bno_pk PRIMARY KEY(bno),
CONSTRAINT person_book_pno_fk FOREIGN KEY(pno) REFERENCES person(pno) ON DELETE CASCADE
);
--为了进行集合操作演示,先创建一张临时表temp
--SQL脚本
DROP TABLE temp;
CREATE TABLE temp  AS SELECT * FROM emp WHERE deptno=20;

--并集(去重复)
SELECT * FROM emp UNION SELECT * FROM temp;

--交集(两表中相同的)
SELECT * FROM emp INTERSECT SELECT * FROM temp;

--并集(未消重复)
SELECT * FROM emp UNION ALL SELECT * FROM temp;

--差集(两表中不同的)
SELECT * FROM emp MINUS SELECT * FROM temp;
--删除表
DROP TABLE temp;

--删除序列
DROP SEQUENCE noseq;
DROP SEQUENCE idseq;

--创建表
CREATE TABLE temp
(
no INT,
id VARCHAR2(8)
);

--创建序列
CREATE SEQUENCE noseq START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE idseq;

--插入测试数据
INSERT INTO temp (no,id)
VALUES(noseq.NEXTVAL,to_char(sysdate,'yyyy') || LPAD(idseq.NEXTVAL,4,'0'));
…….

--查询
SELECT * FROM temp;


总结:
(1)在创建序列的时候,可以通过START WITH 设置起始值
(2)在创建序列的时候,可以通过INCREMENT BY 设置增值,默认为1
(3)在创建序列的时候,可以通过MINVALUE n设置最小值
(4)在创建序列的时候,可以通过MAXVALUE n设置最大值
(5)在创建序列的时候,可以通过CACHE n设置缓存值
(6)在创建序列的时候,可以通过CYCLE指定是否循环序列号


曾犯错误:
CREATE SEQUENCE noseq START WITH 0 INCREMENT BY 1;
报错:
CREATE SEQUENCE noseq START WITH 0 INCREMENT BY 1
*
第 1 行出现错误:
ORA-04006: START WITH 不能小于 MINVALUE
---不指定最小值,默认为1
解决办法:
可以指定最小值
CREATE SEQUENCE noseq minvalue 0 maxvalue 99999999 START WITH 0 INCREMENT BY 1;
dual表是sys用户下的表,而现在scott用户下访问时不需要加sys.dual的原因就是同义词的作用

CREATE SYNONYM dual FOR sys.dual;
DROP SYNONYM dual;
视图是一个被命名的SELECT语句,即一个视图封装了一个SELECT语句。

--创建视图
CREATE VIEW 视图的名称 AS SELECT语句;
--在创建视图的时候,可以通过WITH CHECK OPTION来限制修改创建视图的条件,在最后添加该子句即可
--在创建视图的时候,可以通过WITH READ ONLY 来限制DML操作,在最后添加该子句即可

--删除视图
DROP VIEW 视图的名称;

--修改视图,没有ALTER VIEW语句,只能通过
CREATE OR REPLACE VIEW 视图的名称 AS SELECT语句;
重新创建视图来达到修改的目的
备份和恢复数据库中的数据包括表、视图等等

导出数据:exp
导入数据:imp
默认导出文件名:EXPDAT.DMP


DOC命令:
运行cmd,打开....?
切换盘:“盘符:”
进入文件夹:cd 文件夹名
返回上一级:cd..

创建文件夹:md 文件夹名
删除文件夹:del 文件夹名




今天的问题


A
解决方法:

------曾犯错误
CREATE TABLE grade
(
sporterid INT,
itemid VARCHAR2(10),
mark INT --------缺逗号
CONSTRAINT sporter_grade_fk FOREIGN KEY(sporterid) REFERENCES sporter(sporterid),
CONSTRAINT item_grade_fk FOREIGN KEY(itemid) REFERENCES item(itemid)
);




经过三天的磨合之后,我已经开始适应这种李兴华老师的教学方式和紧张的学习进度了。并且慢慢开始在学习过程中摸索出了一些快速掌握所学知识的经验。
比如,首先,上课是绝对不能开小差的,思路要跟着老师走;
其次,在进行代码练习的时候,除了脑子要不停的转之外,手也要不停的敲代码,来熟悉这些语法规则以及解题思路;
第三,要及时复习总结,不能完全依靠老师的笔记,应该同时总结、整理出自己的笔记;
第四,初学的时候,要注意写代码的规范性,宁可多费功夫,也不能偷懒,因为养成好的习惯很重要;
第五,把做练习中遇到的错误记录下来,并分析错误的原因,这样才能加深印象,避免再次犯错;
第六,做到“日习日毕”,每天学习的东西,尽量当天消化,这样才不会累积问题,导致学习之路的堵车;
第七,尽量抽取时间预习即将要讲的知识,这样有助于提高第二天的听课效率,不至于在课上出现太多的新名词;
。。。。。。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics