第一篇:Oracle数据库导入导出命令总结
执行环境:可以在SQLPLUS.EXE或者DOS(命令行)中执行,DOS中可以执行时由于 在oracle中,安装目录ora9iBIN被设置为全局路径,该目录下有EXP.EXE与IMP.EXE文件被用来执行导入导出。
oracle用java编写,SQLPLUS.EXE、EXP.EXE、IMP.EXE这两个文件是被包装后的类文件。
SQLPLUS.EXE调用EXP.EXE、IMP.EXE所包裹的类,完成导入导出功能。
下面介绍的是导入导出的实例。数据导出:
将数据库zxcc完全导出,用户名kf 密码zx 导出到D:zxcc.dmp中
exp kf/zx@zxcc file=d:zxcc.dmp full=y
full=y 表示全库导出。full总共有2个可选项yes(y)/no(n),缺省情况下full=no,这时只会将该用户下的对象导出。
将数据库zxcc中kf用户与cc用户的表导出
exp kf/zx@zxcc file=d:zxcc_ur.dmp owner=(kf,cc)
full方式可以备份所有用户的数据库对象,包括表空间、用户信息等,owner=XX只能备份指定用户的对象,其他用户下的就不备份了,EXP中full=y和owner=XX是不能同时使用的。
将数据库zxcc中的表kf_operator、kf_role导出
exp kf/zx@zxcc file= d:zxcc_tb.dmp tables=(kf_operator,kf_role)
tables=xx 表示备份相关表,不能同时和owner、full使用。
将数据库中的表kf_operator中的字段oper_id以“00”打头的数据导出
exp kf/zx@zxcc file=d:zxcc_t.dmp tables=(kf_operator)query=“ where oper_id like '00%'”
query主要是导出合适条件的数据。使用该参数时,需要注意对所有操作系统保留字符都要使用转义符号。若有括号()也需要转义:
query=“where dt=to_date('2007-09-22','yyyy-mm-dd')”。
如果遇到条件比较繁琐的语句,频繁的转义操作不仅费时,还很容易出错。我们可以使用exp或expdp的PARFILE参数避免query内容的繁琐转义问题。
例:
oracle DBALNP01 > cat > zxcc.par
tables=kf_operator
file=zxcc.dmp
query=“where dt_time=to_date('2010-06-25','yyyy-mm-dd')”
这时就可以尽情的再双引号中写条件语句了。
上面是常用的导出,对于压缩,可用winzip把dmp文件可以很好的压缩。
也可以在上面命令后面 加上 compress=y 来实现。
数据的导入
将D:zxcc.dmp 中的数据导入 zxcc数据库中。
imp kf/zx@zxcc file=d:zxcc.dmp
导数据得时候,有可能报错。为什么?有以下主要的原因:
A.导入的对象(表,视图,方法等)原本不属于当前连接的用户的
B.导入的对象在该数据库的指定用户下已经存在
C.导入的对象的原本用户不再这个数据库里
对于这三个问题的处理方法如下:
a/c、所有对象全部导入到指定的账户下:
imp kf_new/zx@zxcc_new file=d:zxcc.dmp fromuser=kf touser=kf_new
其中fromuser=kf为.dmp文件里的对象的原先的owner, touser=kf_new 为作为导入的对象的新的Owner.b、忽略/插入数据:
Imp system/123456@ATSTestDB file=c:export.dmp ignore=y
其中ignore=y告诉imp.exe把数据直接插入到相应对象(并且如果导入的对象里面有其他的对象,如约束,索引等,会在数据插入后被创建)。
将d:zxcc_tb.dmp中的表tb_operator 导入
imp kf/zx@zxcc file=d:zxcc_tb.dmp tables=(tb_operator)
忽略加载约束
有时候导数据进来的时候,我们不需要把它的约束,比如一些外键约束等都导进来,可以加上参数constraints=N
不加载索引(比如唯一性的索引),可以加上参数indexs=N
只加载结构,不加载数据,如果只要表的结构等定义(约束,触发器),那么不要里面的数据,可以加上参数rows=N
对于上述操作登陆操作的对象system是管理员,如果不是管理员,而是普通用户,那么这个用户必须有创建删除对象的权利,对象可能包括 表,视图,方法,存储过程等等常见的对象。为什么“可能”包括?因为这个视导入导出的时候是否涉及相关类型的对象而定。
Imp kf/zx@zxcc_new file=d:zxcc.dmp fromuser=kf touser=kf_new ignore=y
基本上上面的导入导出够用了。不少情况要先是将表彻底删除,然后导入。
注意:
操作者要有足够的权限,权限不够它会提示。
数据库链接正常,可以用tnsping zxcc 来获得数据库zxcc能否连上。
导入/导出数据库时注意字符集。可能会出现导出/导入时数据库字符集不一致而报错。
oracle数据库其他常用命令:
1、给用户增加导入数据权限的操作
第一,启动sql*puls
第二,以管理员(DBA)用户登陆
第三,create user 用户名 IDENTIFIED BY 密码(如果已经创建过用户,这步可以省略)
第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,DBA,CONNECT,RESOURCE,CREATE SESSION TO 用户名字
第五, 运行-cmd-进入dmp文件所在的目录,imp userid=管理员用户名/密码 full=y file=*.dmp
或者 imp userid=管理员用户名/密码 full=y file=filename.dmp
2、Oracle 不允许直接改变表的拥有者, 利用Export/Import可以达到这一目的.先建立.par文件,然后,使用时命令如下:imp parfile=/filepath/import9.par
例 import9.par 内容如下:
FROMUSER=user
TOUSER=user_new
(注:把表的拥有者由FROMUSER改为TOUSER,FROMUSER和TOUSER的用户可以不同)
ROWS=Y
INDEXES=Y
GRANTS=Y
CONSTRAINTS=Y
BUFFER=409600
file==/filepath/xxxx.dmp
log==/filepath/import_log.log
学会使用oracle相关命令方法会给我们的工作带来便利,遇到问题可以迅速的解决,而不用再baidu出来的海量信息中区找解决方法。
希望本文能够对大家有所帮助。
第二篇:Oracle数据库总结范文
创建表及命名规则?
表名和列名:
必须以字母开头 必须在1–30个字符之间
必须只能包含A–Z, a–z, 0–9, _, $, 和# 必须不能和用户定义的其他对象重名 必须不能是Oracle 的保留字 Oracle默认存储是都存为大写
增删改查语法?
增加: 例如:使用INSERT语句往customers表中插入数据,指定相关列和值 INSERT INTO customers(customer_id, first_name, last_name, dob, phone)VALUES(6, 'Fred', 'Brown', '01-1月-1970', '800-555-1215');
如果为表所有列都指定值,那么可以忽略列清单
INSERT INTO customersVALUES(6, 'Fred', 'Brown', '01-1月-1970', '800-555-1215');
可以使用NULL为某些列指定空值
INSERT INTO customersVALUES(8, 'Sophie', 'White', NULL, NULL);
查询:select * fromcustomers;或者select字段 fromcustomerswhere条件 删除:deletefromcustomerswhere条件
更改:update customersset name = 'xiaoming',age = ‘16’(更改多个字段时候用逗号隔开)where 条件
对查询结果进行排序?
语句:select * fromcustomersorderby字段 desc;
(asc(升序),desc(降序)如果不写,默认升序)
NULL值了解么?
NULL值表示未知的值。它是一个特殊的值,但并不是空字符串,NULL值表示该列是未知的。当某些查询语句在输出结果列上看不到值的时候,可能就是NULL值
NVL()和NVL2():
NULL值被查询出来的时候没有显示信息,如何告知用户这是空字符串还是NULL,这可以通过NVL()函数来进行处理
NVL(x,value)是有value显示本身,null显示为替换的value NVL2(x,value1,value2)是如果x不为NULL值,返回value1,否则返回value2 例程:
select name,nvl2(email,'已知','未知')from student;【代码含义:代表如果email字段中有值,则显示已知,null则显示未知,如果想显示本来的查询结果select name,nvl(email,'未知')from student;】 update student set name = replace(name,'小','大');【代码含义:代表将STUDENT表中NAME 字段中如果含有小字,那么就将小字替换为大字(操作的不是显示结果,而是将表中数据进行更改)】
Oracle中的简单函数?
字符串函数
concat:将x和y拼接起来,并返回新字符串
例程:
select concat(first_name,'-'||last_name)姓名 from customers; Instr字符查找,从1开始。
select instr('asdbcrdbewqrbmde','b')from dual;select instr('asdbcrdbewqrbmde','b',5,2)from dual;【代表从第5个字符开始,第二个b所在的位置】
Ltrim : LTRIM(x,[trim_string])从x字符串左侧去除所有的trim_string字符串,如果没有指定trim_string字符串,则默认为去除左侧空白字符
Rtrim RTRIM(x,[trim_string])从x字符串右侧去除所有的trim_string字符串,如果没有指定trim_string字符串,则默认为去除右侧空白字符 Trim TRIM(trim_string FROM x)从x字符串两侧去除trim_string字符串
Replace REPLACE(x, search_string, replace_string)从字符串x中搜索search_string字符串,并使用replace_string字符串替换。用select执行并不会修改数据库中原始值,但是用update执行可以修改。
Substr SUBSTR(x, start,[length])返回字符串中的指定的字符,这些字符从字符串的第start个位置开始,长度为length个字符;如果start是负数,则从x字符串的末尾开始算起;如果length省略,则将返回一直到字符串末尾的所有字符
例程:
select substr('abcd月fg',4,2)from dual;(结果:d月)select substr('abcdefg',-2)from dual;(结果:fq)
日期函数
Sysdate 例程:
Selectsysdatefromdual;
Select to_char(sysdate, 'yyyy-mm-dd-hh-mm-ss')from dual;
Add_months(d1,n1) last_day():
转换函数
To_char TO_CHAR(x,[ format])将x转化为字符串。format为转换的格式,可以为数字格式或日期格式
select to_char(sysdate,'yyyy-mm-dd')from dual;【一般在查询时候使用,使返回的值成为指定格式】
to_date TO_DATE(x,[format])将x字符串转换为日期
insert into student values(seq_stu.nextval,'小明',to_date('1992-2-18','yyyy-mm-dd'),default,'北京',null);【一般在添加使用】 返回所查询的值中最后一个日期数据。
聚合函数
Avg:平均数 Sum:求和 Max:最大值 Min:最小值 Count:返回统计的行数 Round:四舍五入
例程:
select round(avg(bid),1)from bug;分组了解么?
有时需要对表中的行进行分组,然后统计每组的信息,可以使用GROUP BY进行分组,然后再对每组进行统计。
(1)可以使用GROUP BY对多个列进行分组
例:
SELECT product_id, avg(customer_id)FROM purchases GROUP BY product_id;
(2)可以对分组后的行使用聚集函数,聚集函数会统计每组中的值,对于每组分别统计后返回一个值 例:
SELECT
product_type_id,BY
COUNT(ROWID)FROM
BY
productsGROUP product_type_id;注意:
product_type_idORDER a)如果查询中使用了聚集函数,被查询的列未使用聚集函数处理,那么这些列必须出现在GROUP BY子句后,否则,会提示ORA-00937错误
b)不能使用聚集函数作为WHERE子句的筛选条件,否则,会提示ORA-00934错误
c)可以使用HAVING子句过滤分组后的行
SELECT...FROM...WHERE GROUP BY...HAVING...ORDER BY...;(GROUP BY使用时可以不使用HAVING,但是使用HAVING时必须有GROUP BY才有意义)
(3)同时使用WHERE, GROUP BY和HAVING
a)首先,执行WHERE筛选掉不符合条件的行 b)然后,将符合条件的行使用GROUP BY进行分组 c)最后,使用HAVING对分组统计的结果进行再次筛选 例:
SELECT product_type_id, AVG(price)FROM products
WHERE price < 15
GROUP BY product_type_id HAVING AVG(price)> 13 ORDER BY product_type_id;
表的约束条件?
目的:
确保表中数据的完整性。
常用的约束类型: 主键约束(PRIMARY KEY):要求主键列数据唯一,并且不允许为空 非空约束(NOT NULL):指定的列的值不允许为空
唯一键约束(UNIQUE):要求该列唯一,允许为空,但只能出现一个空
值
检查约束(CHECK):指定表中一列或多列可以接受的数据值格式 默认约束(DEFAULT):指定某列的默认值
外键约束(FOREIGN KEY):用于建立和加强两个表数据之间连接的一
列或多列。通过将表中的主键列添加到另一个表中。可以创建两个表之间的连接。这个主键的列就称为第二个表的外键。外键约束就可以确保添加到外键表中的任何行都在主表中都存在相应的行
多表查询?
不同的数据存储在不同的表中,通常要查询多张表才能找到需要的数据
例程: SELECT products.name, product_types.name FROM products, product_types WHERE
products.product_type_id
= product_types.product_type_id AND products.product_id = 3;
products表和product_types表相关字段会用在SELECT语句及WHERE子句上,可以给表起别名,提高代码可读性、降低书写难度 例程:
SELECT p.name, pt.name FROM products p, product_types pt WHERE p.product_type_id = pt.product_type_id AND p.product_id = 3 注意:
如果查询两张表,并且没有定义连接条件,那么查询的结果集是两表相乘的结果,这样的情况称之为笛卡尔乘积。总结:多表查询WHERE时,连接次数=查询时连接表的数量-1
常见的三种连接类型:
内连接:
内连接返回的行只有满足连接条件才会返回。如果连接条件的列中有NULL值,那么该行则不会返回 外连接:
外连接返回的行满足连接条件,也包括在连接条件的列包含空值的行
自连接:
连接的表为同一张表
子查询?
子查询是嵌入到另一个SELECT语句中的一个SELECT语句。通过使用子查询,可以使用简单的语句组成强大的语句。当需要从表中选择行,而选择条件却取决于该表自身中的数据时,子查询非常有用。
单行子查询:(1)可以将另外一个查询作为WHERE子句的子查询
例:查询尾名是‘Brown’的首名和尾名
SELECT first_name, last_name FROM customers
WHERE customer_id =
(SELECT customer_id FROM customers WHERE last_name = 'Brown');(2)在单行子查询还可以使用其他比较运算符,如<>、<、>、<=和>= 例:查询价格大于平均价格的商品编号、名称及价格
WHERE子句中使用>,以及子查询中使用AVG()聚集函数
SELECT product_id, name, price FROM products WHERE price >(SELECT AVG(price)FROM products);(3)在HAVING子句中使用子查询
HAVING是在分组统计后用于过滤行,同样在HAVING子句后面可以跟子查询。单行子查询将返回结果用于HAVING子句过滤分组统计的行
例如:查询平均价格小于最大平均值的商品编号及平均值
SELECT product_type_id, AVG(price)FROM products GROUP BY product_type_id HAVING AVG(price)<(SELECT MAX(AVG(price))FROM products GROUP BY product_type_id)ORDER BY product_type_id;
分页查询?
可以通过ROWNUM来实现。
序列?
序列是一个数据库对象,用于生成一系列的整数。
索引?
索引是与表关联的可选结构。可以创建索引以加快对表执行SQL语句的速度。就像书的索引可以帮助我们更快速的查找信息一样,Oracle中的索引也提供了一种更快地访问表数据的途径。
视图?
视图是基于一张表或多张表或另外一个视图的逻辑表。视图不同于表,视图本身不包含任何数据。表是实际独立存在的实体,是用于存储数据的基本结构。而视图只是一种定义,对应一个查询语句。视图的数据都来自于某些表,这些表被称为基表。数据库中只在数据字典中存储对视图的定义。
第三篇:Oracle中的导入导出表及数据
Oracle中的导入导出表及数据
Oracle数据导入导出imp/exp就相当于oracle数据还原与备份。exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中。利用这个功能可以构建两个相同的数据库。
1.用plsql实现
1.1使用plsql连接oracle,点击工具——导出表
1.2选择要导出的表
1.3可执行文件在C:oracleproduct10.2.0db_1bin 目录下
导出是exp 导入是imp 导出的为dmp文件
1.4导入文件:
点击工具——导入表
在导入文件中选择要导入的表 确认后点击导入
2.用dos命令实现
2.1Windows——R——cmd
2.2输入dos命令:
exp youngtop_us/ail@192.168.0.46/orcl10g file=F:/fileSys.dmp log=F:/fileSys.log statistics=none tables=file_attach,file_tree,file_permission
ps:exp user/password@主机地址 file=存储位置 log=存储位置 statistics=none tables=tablename
3.将数据导出到excel表中及将excel表数据导入数据库
3.1选中要导出数据的表右键——查询数据
3.2选中表中的数据邮件——复制到excel
3.3在excel中保存
3.4可以不按照数据库中的字段存放顺序,编辑形成Excel表中的数据
3.5选中要导入的数据后另存一份txt文档
3.6在plsql中点击 工具——文本导入器
进入到文本导入器的页面后,先点击“来自文本文件的数据”选项卡,然后点击打开按钮,选择数据录入.txt文件
3.7在配置中进行配置
如果不将标题名勾选上,则会导致字段名也当做记录被导入到数据库中,影响正确录入
3.8点击导入按钮将数据导入oracle数据库中
第四篇:Oracle数据库学习总结
Oracle数据库学习总结
1.set linesize xx;设置行间距,常用数值有100,200,300
2.set pagesize xx;设置每页显示行数
3.ed x;表示新建一个x.sql文件,通过文件编辑SQL语句,然后用@x命令可以调用刚才的命令
4.CONN username/password;命令可以建立用户的连接,需要注意的是sys用户是超级管理员,连接是时需要在末尾加上AS SYSDBA 以系统管理员的身份进行连接
5.如果表是归某个用户特有的,在查询的时候需要加上用户名 即以 用户名.表名 的格式查询
6.SHOW USER;命令可以显示当前连接的用户名
7.SELECT * FROM tab;可以显示当前用户下的所有数据表
8.“ / ”表示重复执行上一次的SQL命令操作
9.SELECT xx别名,xx 别名 FROM xx;搜索指定列名,并指定别名,方便显示
10.关键字DISTINCT 可以消除重复值 如 SELECT DISTINCT xx FROM xx;
11.Oracle中提供的字符串连接操作,使用“||”表示,相当于Java的“+”普通字符用“ ' ” 括起来
如: SELECT'员工姓名是'||ename||'员工卡号是'||empnoFROM emp;
12.查询语句 BETWEEN xx AND xx 是包括边界的13.查询日期的时候要加上''把日期引起来
例如:SELECT * FROM emp WHERE hiredate BETWEEN '1-1月-81' AND '08-9月-81';
14.模糊查询中“%”可以匹配任意长度的内容,“_”可以匹配一个长度的内容,如果没输入模糊查询关键字,那么默认查询全部数据,like关键字可以用在任何地方,可以匹配数字、字符、日期等。
15.SQL中不等于可以用“<>”或者“!=”表示
16.ORDER BY语句中 ASC表示升序,DESC表示降序,在没指定的时候默认按照升序排序
17.Oracle中的单行函数有如下,默认的所有的函数都要到表中执行,加上关键字DUAL只会产生一个临时表
UPPER('xxx')将小写转换为大写
LOWER('xxx')将大写转换为小写
INITCAP('xxx')将首字母大写
CONCAT('','')字符串连接
SUBSTR('xxx',x,x)字符串截取,从0或1开始截取效果是一样的,因为Oracle比较智能,要是输入的参数为负数,则表示倒着截取
LENGTH('xxx')字符串长度
REPLACE('xxx','x','x')字符串替换
ROUND(xxx,xx)四舍五入 xxx需要四舍五入的数值,xx保留的小数位,可以加负数 TRUNC(xxx)截断操作,默认小数点后的全部截断,也可以指定小数点保留位数如TRUNC(789.536,2)得到的结果是789.53,也可以加负数如TRUNC(789.536,-2)结果是700
18.SELECT sysdate FROM DUAL;可以求出当前的日期
19.Oracle 中提供了以下日期函数支持:
MONTHS_BETWEEN()求出给定日期范围的月数
ADD_MONTHS(xxx,xxx)在指定日期加上指定的月数
NEXT_DATE(xxx,'')求出下一个给定日期数
TO_CHAR()可以将年、月、日进行分割
例如
TO_CHAR(hirdate,'yyyy')year,TO_CHAR(hirdate,'mm')months,TO_CHAR(hirdate,'dd')day 还可以对时间进行格式化输出 如TO_CHAR(hirdate,'yyyy-mm-dd')
TO_CHAR(hirdate,'fmyyyy-mm-dd')可以去掉前导0
TO_CHAR()还可以对数字进行格式化 如
SELECT ename,TO_CHAR(SAL,'99,999')FROM emp;
注意:一定要用9来表示
$表示美元符号,L表示Local的缩写,以本地语言进行金额显示
TO_NUMBER()将字符串变为数字
TO_DATE()将字符串变为Date类型 例如 SELECT TO_DATE('2009-12-8','yyyy-mm-dd')FROM dual;
TO_NVL()可以将NULL的内容变为指定的内容
DECODE()相当于Java的if else else语句
例如SELECT DECODE(1,1,'内容是1',2,'内容是2',3,'内容是3')FROM dual;将输入 内容是1
20.左右连接
SELECT e.empno,e.ename,d.deptno,d.dname,d.loc FROM emp e,dept d WHERE
e.deptno(+)=d.deptno;此例中是右连接,以deptno表为准。
21.SQL1999语法
CROSS JOIN 交叉连接 会产生笛卡尔积
NATURAL JOIN 自然连接 自动进行关联字段匹配 可以消除笛卡尔积
USING 子句:直接关联操作列 如 SELECT * FROM emp e JOIN dept USING(deptno)WHERE deptno=30;
ON 子句 用户自己编写连接条件
LETF JOIN/RIGHT JOIN 左右连接
SELECT e.empno,e.ename,d.deptno,d.dname,d.loc FROM emp e right OUTER JOIN dept d ON(e.deptno=d.deptno);
22.分组查询GROUP BY 放在where之后
常见的组函数有
COUNT();
MAX();
MIN();
AVG();
SUM();
用法如下:SELECT deptno,count(empno)FROM emp GROUP BY deptno;
语法:SELECT deptno,empno,count(empno)FROM emp GROUP BY deptno;是错误的,原因是使用分组函数的时候,不能出现分组函数和分组条件以外的字段。
语法:SELECT deptno,count(empno)FROM emp;是错误的,原因是不使用分组的时候,则只能单独使用分组函数
分组函数只能在分组中使用,不允许子啊where语句中个使用,要使用个分组条件可以加上HAVING
例如:SELECT deptno,avg(sal)FROM emp GROUP BY deptno having avg(sal)>2000;注意:分组函数可以嵌套使用,但是在组函数嵌套使用的时候不能再出现分组条件的查询语句
如下语法是错误的:SELECT deptno,max(avg(sal))FROM emp GROUP BY deptno;不能出现deptno
如下语法是正确的:SELECT max(avg(sal))FROM emp GROUP BY deptno;
23.子查询中
>ANY 比里面的最小值大
=ANY 与IN用法相同 >ALL 比里面的最大值大 24.表复制 CREATE TABLE myemp AS SELECT * FROM emp;既复制表结构,又复制表内容 CREATE TABLE myemp AS SELECT * FROM emp where 1=2;后面的条件不可能成立,只复制表结构 25.Oracle 中常用的数据类型 VARCHAR、VARCHAR2 代表一个字符串,有长度限制,为255 NUMBER 分为两种 1)NUMBER(n)代表一个整数,数字的长度是n,可以使用INT 2)NUMBER(m,n)代表一个小数,小数长度为n,整数长度为m-n,可以使用FLOAT DATE 代表日期的类型,日期要按照标准的日期格式进行存放 CLOB 大对象,表示大文本数据,一般可以存放4G的文本 BLOB 大对象,表示二进制数据最大可以存放4G,例如存放歌曲、电影、图片 26.表的创建 CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200),birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男'); 27.插入数据 INSERT INTO person(pid,name,birthdate,age)VALUES('222','里斯 ',TO_DATE('1989-02-09','yyyy-mm-dd'),45); 28.更改表中数据 增加表结构:ALTER TABLE person ADD(address VARCHAR2(50)DEFAULT '暂无地址'); 修改已存在的列:ALTER TABLE person MODIFY(name VARCHAR2(40)DEFAULT '无名氏'); 29.表的重命名(只能在Oracle中使用) RENAME XXX TO XXX; 30.约束(主要分为5类) 1)主键约束 主键表示是一个唯一的标识。本身不能为空 2)唯一约束 在一个表中只允许建立一个主键约束,而其他列如果不希望重复值的话,则可以使用唯一约束 3)检查约束 检出一个列的内容是否合法 4)非空约束 5)外键约束 在两张表中进行约束的操作 删除时应该先删除子表,再删除父表 创建主键: 语法1 CREATE TABLE person(pid VARCHAR2(18)PRIMARY KEY,name VARCHAR2(200),birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男'); 语法2: CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200),birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男',CONSTRAINT p_id PRIMARY KEY(pid)); 创建非空约束 CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男'); 创建唯一约束 语法一 CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)UNIQUE NOT NULL,birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男'); 语法二 CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男',CONSTRAINT p_name UNIQUE(name),); 创建检查约束 语法一 CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4)NOT NULL CHECK(age BETWEEN 0 AND 150),sex VARCHAR2(2)DEFAULT '男' CHECK(sex IN('男','女','中')),); 语法二 CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4)NOT NULL ,sex VARCHAR2(2)DEFAULT '男' ,CONSTRAINT p_age CHECK(age BETWEEN 0 AND 150),CONSTRAINT p_sex CHECK(sex IN('男','女','中'))); 创建外键约束 --person表 CREATE TABLE person(pid VARCHAR2(18)PRIMARY KEY,name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4)NOT NULL ,sex VARCHAR2(2)DEFAULT '男'); --book表 CREATE TABLE book(bid NUMBER PRIMARY KEY,bname VARCHAR2(30),bprice NUMBER(5,2),pid VARCHAR2(18),CONSTRAINT b_pid_fk FOREIGN KEY(pid)REFERENCES person(pid)); 对于删除,应该先删除book表再删除person表 也可以使用级联删除,强制删除某张表 DROP TABLE person CASCADE CONSTRAINT; 设置外键约束级联删除 --person表 CREATE TABLE person(pid VARCHAR2(18)PRIMARY KEY,name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4)NOT NULL ,sex VARCHAR2(2)DEFAULT '男'); --book表 CREATE TABLE book(bid NUMBER PRIMARY KEY,bname VARCHAR2(30),bprice NUMBER(5,2),pid VARCHAR2(18),CONSTRAINT b_pid_fk FOREIGN KEY(pid)REFERENCES person(pid)ON DELETE CASCADE); 31.修改约束 如果一张表已经建立完成之后,则可以为其添加约束 ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 约束类型(约束字段); 关于约束名称的命名最好要统一: PRIMARY KEY :主键字段_PK UNIQUE:字段_UK CHECK:字段_CK FOREIGH KEY:父字段_子字段_FK 例如: DROP TABLE person; CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4)NOT NULL ,sex VARCHAR2(2)DEFAULT '男'); ALTER TABLE person ADD CONSTRAINT pid_PK PRIMARY KEY(pid); ALTER TABLE person ADD CONSTRAINT name_UK UNIQUE(name); ALTER TABLE person ADD CONSTRAINT age_CK CHECK(age BETWEEN 1 AND 150);CREATE TABLE book(bid NUMBER ,bname VARCHAR2(30),bprice NUMBER(5,2),pid VARCHAR2(18)); ALTER TABLE book ADD CONSTRAINT book_PK PRIMARY KEY(bid); ALTER TABLE book ADD CONSTRAINT pid_FK FOREIGN KEY(pid)REFERENCES person(pid);删除约束 ALTER TABLE person DROP CONSTRAINT name_UK; ALTER TABLE person DROP CONSTRAINT age_CK; 1.constraint约束: alter table [table_name] add constraint [pk_name] primary key(pkname);//添加主键 alter table [table_name] drop constraint [pk_name];//删除主键 alter table [table_name] add constraint [fk_name] foreign key(fkname)references [tablename](fkname);//添加外 键 alter table [table_name] drop constraint [fk_name];//删除外键 2.union 关键字: A username, B username rod bruce rose marina select username from A union select username from B 2、几个高级查询运算词 A: UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来 自 TABLE2。 B: EXCEPT 运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时(EXCEPT ALL),不消除重复行。 C: INTERSECT 运算符 INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时(INTERSECT ALL),不消除重复行。 注:使用运算词的几个查询结果行必须是一致的。 3.复合主键一般不设外键 4.组函数也称为聚合函数。 例如:我们把学生可以分为男生和女生两个组,如果想求每组的人数,平均身高,平均年龄等,就需要用到分组函数了。 在SQL中常用的组函数有以下几个: COUNT():求出全部的记录数 MAX():求出一组中的最大值 MIN():求出一组中的最小值 AVG():求出一组中的平均值 SUM():求和 范例:COUNT()函数 SELECT COUNT(empno)FROM emp; 我们常用COUNT(*),最好能够用字段代替* 范例:MAX()、MIN()函数,求最大最小值,一般是针对于数值的字段的,求出所有员工的的最高工资,和最底工资和平均工 资。 SELECT MAX(sal)最高工资,MIN(sal)最底工资,AVG(sal)平均工资 FROM emp; 范例:求出部门10的所有员工工资的总合 SELECT SUM(sal)工资综合 FROM emp WHERE deptno=10; 如果如下查询输出部门编号和其部门所有员工的工资总和,会产生错误。 SELECT deptno ,SUM(sal)工资综合 FROM emp WHERE deptno=10; 错误: “不是单组分组函数” 发生以上的错误信息,是因为这样的查询需要进行分组统计。 分组统计有其固定的语法格式: SELECT {DISTINCT} *| 查询列 列别名1,查询列2 列别名2,…… FROM 表名称1 表别名1,表名称2 表别名2,…… {WHERE 条件(s)} {ORDER BY 排序的字段1,排序的字段2 ASC|DESC} {GROUP BY 分组字段} 所以老师写的是错的! 5.//从t_student表中删除名字重复的记录的信息 delete from t_student where sid not in(select sid from(select min(sid)sid,sname from t_student group by sname)); // delete from tablename where id not in(select max(id)from tablename group by col1,col2,...) 6.sequence 在oracle中sequence就是序号,每次取的时候它会自动增加。sequence与表没有关系。 (1) CREATE SEQUENCE seqTest INCREMENT BY 1--每次加几个 START WITH 1--从1开始计数 NOMAXvalue--不设置最大值 NOCYCLE--一直累加,不循环 CACHE 10;--设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为----NOCACHE(2) 定义好sequence后,你就可以用currVal,nextVal取得值。 CurrVal:返回 sequence的当前值 NextVal:增加sequence的值,然后返回 增加后sequence值 eg: SELECT Sequence名称.CurrVal FROM DUAL; select seqtest.currval from dual(3) 在Sql语句中可以使用sequence的地方: -不包含子查询、snapshot、VIEW的 SELECT 语句 -INSERT语句的子查询中 -INSERT语句的values中 -UPDATE 的 SET中 如在插入语句中 insert into 表名(id,name)values(seqtest.Nextval,'sequence 插入测试'); 7.范式: 所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一 列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分 为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式 就是无重复的域。 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。 第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作 为实体的唯一标识。第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一 部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一 对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。例如在员工表中的身份证号码即可实现每个一员工的区分,该身份证号码即为候选键,任何 一个候选键都可以被选作主键。在找不到候选键时,可额外增加属性以实现区分,如果在员工关系中,没有对其身份证号 进行存储,而姓名可能会在数据库运行的某个时间重复,无法区分出实体时,设计辟如ID等不重复的编号以实现区分,被 添加的编号或ID选作主键。 第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门 有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简 介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有 大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传 递依赖于主属性。第五篇:Oracle数据库 知识点总结