select
Projection:投影,竖向查询
selection:横向查询
join:联合,印象查询速度
select*formtable;
select标志那些列
from标志那些表
1.sql语句大小写不敏感(关键字大写)
2.sql语句可以写一行也可以多行
3.关键字不能缩写,也不能跨行
4.字句(clause)单独分异行
5.以分号结尾
6.字符型左对齐,数字型右对齐(缺省),列头大写
arithmeticexpresstions(+-*/)
字符串类型智能+-
()可以提高+-的优先级
NULL
是一种不可见,无分配,不知道,不可用的状态
null不等于0,也不是空格
null与数字结果还是null
null与字符串结果还是字符串
SQL>selectlast_name,12*salary*commission_pct
2fromemployees;
列别名columnalias
可以用于表达式的计算
如果包含空格或特殊字符或需要保持大小写敏感,则需要“”
一般用AS或空格
连接操作符conncatenationoperator
||
SQL>selectlast_name||job_idas"Employees"
2fromemployees;
literalcharacterstring用单引号
SQL>selectlast_name||''||job_idas"Employees"
2fromemployees;
用q'<>[]'实现转义字符
SQL>selectdepartment_name||q'['sManagerId:]'||manager_idas"DandM"
2fromdepartments;
DandM
--------------------------------------------------------------------------------
Administration'sManagerId:200
SQL>l
1selectdepartment_name||q'<'sManagerId:>'||manager_idas"DandM"
2*fromdepartments
重复列Duplicaterows
DISTINCT消除重复列
SQL>selectdistinctdepartment_id
2fromemployees;
显示表结构
desc-->describe//并不太详细,可以下载PL/SQL的包,更加详细
SQL>descemployees;
NameNull?Type
-----------------------------------------------------------------------------
EMPLOYEE_IDNOTNULLNUMBER(6)
FIRST_NAMEVARCHAR2(20)
LAST_NAMENOTNULLVARCHAR2(25)
EMAILNOTNULLVARCHAR2(25)
PHONE_NUMBERVARCHAR2(20)
=====
select*|{[DISTINCT]column|expression[alias],...}
fromtable;
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
限制和排序数据(RestrictingandSortingData)
1.where
select*|{[DISTINCT]column|expression[alias],...}
fromtable
[wherecondition(s)];
where字句不能使用别名
SQL>selectemployee_id,last_name,job_id,department_id
2fromemployees
3wheredepartment_id=90;
EMPLOYEE_IDLAST_NAMEJOB_IDDEPARTMENT_ID
-----------------------------------------------------------
100KingAD_PRES90
101KochharAD_VP90
102DeHaanAD_VP90
不能使用别名:
SQL>l
1selectemployee_id,last_name,job_id,department_idDID
2fromemployees
3*whereDID=90
SQL>/
whereDID=90
*
ERRORatline3:
ORA-00904:"DID":invalididentifier
数值型
字符串,日期型需要单引号
------大小写敏感!!
------可以使用大小写转换函数
SQL>l
1selectemployee_id,last_name,job_id,department_idDID
2fromemployees
3*wherelast_name='whalen'
SQL>/
norowsselected
——————————————————————
SQL>l
1selectemployee_id,last_name,job_id,department_idDID
2fromemployees
3*wherelast_name='Whalen'
SQL>/
EMPLOYEE_IDLAST_NAMEJOB_IDDID
--------------------------------------------------------
200WhalenAD_ASST10
————————————————————————
SQL>l
1selectemployee_id,last_name,job_id,department_idDID
2fromemployees
3*whereupper(last_name)='WHALEN'
SQL>/
EMPLOYEE_IDLAST_NAMEJOB_IDDID
--------------------------------------------------------
200WhalenAD_ASST10
日期
日月年(DD—MON-RR)
ComparisonOperators
=>...
**********
Between--and--
______
SQL>l
1selectlast_name,salary
2fromemployees
3wheresalarybetween2500and3500
4*
*********
IN(SET)速度不是很快,但是逻辑思维很清楚
_________
SQL>selectemployee_id,last_name,salary,manager_id
2fromemployees
3wheremanager_idIN(100,101,201);
EMPLOYEE_IDLAST_NAMESALARYMANAGER_ID
--------------------------------------------------------
201Hartstein13000100
SQL>l
1selectemployee_id,last_name,salary,manager_id
2fromemployees
3*wherelast_namein('Hartstein','Vargas')
SQL>/
EMPLOYEE_IDLAST_NAMESALARYMANAGER_ID
--------------------------------------------------------
201Hartstein13000100
144Vargas2500124
***********
LIKEpatternmatching模式匹配
%匹配0个或多个字符串
_匹配1个字符
使用escape'\'来定义\为转移字符
SQL>l
1selectfirst_name
2fromemployees
3*wherefirst_namelike'S%'
SQL>/
FIRST_NAME
--------------------
Sundar
Shelli
Sarah
SQL>selectemployee_id,last_name,job_id
2fromemployees
3wherejob_idlike'%SA\_%'escape'\';
EMPLOYEE_IDLAST_NAMEJOB_ID
----------------------------------------------
145RussellSA_MAN
146PartnersSA_MAN
********
ISnull
SQL>selectlast_name,manager_id
2fromemployees
3wheremanager_idisnull;
LAST_NAMEMANAGER_ID
-----------------------------------
King
逻辑运算符
与AND
或OR
非NOT
AND
SQL>selectemployee_id,last_name,job_id,salary
2fromemployees
3wheresalary>=1000
4andjob_idlike'%MAN%';
EMPLOYEE_IDLAST_NAMEJOB_IDSALARY
--------------------------------------------------------
201HartsteinMK_MAN13000
114RaphaelyPU_MAN11000
120WeissST_MAN8000
121FrippST_MAN8200
分组:ORDERby
ASC默认的
DESC
放在最后
可以使用别名
SQL>l
1selectlast_name,job_id,department_id,hire_date
2fromemployees
3*orderbyhire_datedesc
SQL>/
LAST_NAMEJOB_IDDEPARTMENT_IDHIRE_DATE
------------------------------------------------------------
BandaSA_REP8021-APR-00
KumarSA_REP8021-APR-00
AndeSA_REP8024-MAR-00
MarkleST_CLERK5008-MAR-00
使用别名排序
SQL>selectemployee_id,last_name,salary*12annsal
2fromemployees
3orderbyannsal;
EMPLOYEE_IDLAST_NAMEANNSAL
----------------------------------------------
132Olson25200
136Philtanker26400
128Markle26400
多个列进行排序
SQL>selectlast_name,department_id,salary
2fromemployees
3orderbydepartment_id,salaryDESC;
LAST_NAMEDEPARTMENT_IDSALARY
------------------------------------------------
Whalen104400
替换变量SubstitutionVariables
客户端的概念功能
&;/&;&;+变量名
SQL>selectemployee_id,last_name,salary,department_id
2fromemployees
3whereemployee_id=&;employee_num;
Entervalueforemployee_num:100
old3:whereemployee_id=&;employee_num
new3:whereemployee_id=100
EMPLOYEE_IDLAST_NAMESALARYDEPARTMENT_ID
-----------------------------------------------------------
100King2400090
做不同的查询,很方便。
如果是字符串和日期的话必须加‘’
SQL>selectlast_name,department_id,salary*12
2fromemployees
3wherejob_id='&;job_title';
Entervalueforjob_title:IT_PROG
old3:wherejob_id='&;job_title'
new3:wherejob_id='IT_PROG'
LAST_NAMEDEPARTMENT_IDSALARY*12
------------------------------------------------
Hunold60108000
Ernst6072000
Austin6057600
Pataballa6057600
Lorentz6050400
关于&;/&;&;的区别
SQL>selectemployee_id,last_name,job_id,&;column_name
2fromemployees
3orderby&;column_name;
Entervalueforcolumn_name:department_id
old1:selectemployee_id,last_name,job_id,&;column_name
new1:selectemployee_id,last_name,job_id,department_id
Entervalueforcolumn_name:department_id
old3:orderby&;column_name
new3:orderbydepartment_id
EMPLOYEE_IDLAST_NAMEJOB_IDDEPARTMENT_ID
-----------------------------------------------------------
200WhalenAD_ASST10
变量使用多次,则可以使用&;&;
SQL>l
1selectemployee_id,last_name,job_id,&;&;column_name
2fromemployees
3*orderby&;column_name
SQL>/
Entervalueforcolumn_name:department_id
old1:selectemployee_id,last_name,job_id,&;&;column_name
new1:selectemployee_id,last_name,job_id,department_id
old3:orderby&;column_name
new3:orderbydepartment_id
EMPLOYEE_IDLAST_NAMEJOB_IDDEPARTMENT_ID
-----------------------------------------------------------
200WhalenAD_ASST10
201HartsteinMK_MAN20
202FayMK_REP20
Define
使用定义命令来定义一个变量
undefine取消该变量
verify
setverifyon/off
设置old/new的开关
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
UsingSingle-Rowfunciton
sigle-rowfuncitons
输入一个输出一个//对一行进行操作
multiple-rowfunctions
输入多个输出一个//对很多行进行操作
单行函数:
对每一行进行操作
对每一行返回一个结果
可以嵌套函数
输入参数可以是列名可以是表达式和常值
类型:
通用:
字符型
数字
日期
转换
字符串函数
1.case-conversionfunctions
lower
SQL>selectemployee_id,last_name,department_id
2fromemployees
3wherelower(last_name)='higgins';
EMPLOYEE_IDLAST_NAMEDEPARTMENT_ID
-------------------------------------------------
205Higgins110
upper
initcap(首字母大写,其余小写)
SQL>selectinitcap('sdlcoUse')
2fromdual;
INITCAP('
---------
SdlCouse
2.charater-manipulationfunctions(字符串操作函数)
concat//拼接函数
substr//剪切函数字符串,起始位置,字符串长度
length//读取字符串的长度
instr//定位子字符串字符串,首次出现的子字符串
lpad//左填充列名,总长度,填充内容(‘’引起来)
rpad//右填充同上
repalce//替换指定内容
trim//去掉空格,去掉制定字符‘H’form‘**’
colnamefromata10
instr
1SELECTemployee_id,CONCAT(first_name,last_name)NAME,
2job_id,LENGTH(last_name),
3INSTR(last_name,'a')"Contains'a'?"
4FROMemployees
5*WHERESUBSTR(job_id,4)='REP'
数字函数
NumberFunctions
ROUND四舍五入
TRUNC截取固定
MOD取余叔
参数:小数点后数正值
小数点前数负值
SQL>SELECTROUND(45.923,2),ROUND(45.923,0),ROUND(45.923,-1)
2FROMdual;
ROUND(45.923,2)ROUND(45.923,0)ROUND(45.923,-1)
----------------------------------------------
45.924650
SQL>L
1SELECTTRUNC(45.923,2),TRUNC(45,923),TRUNC(45.923,-1)
2*FROMDUAL
SQL>/
TRUNC(45.923,2)TRUNC(45,923)TRUNC(45.923,-1)
--------------------------------------------
45.924540
日期函数
默认显示格式:DD-MON—RR
YY当前世纪+年
内部存储4位,显示2位
SYSDATE
返回当前系统时间
日期函数数学操作
MONTHS_BETWEEN
ADD_MONTHS
NEXT_DAY
LAST_DAY
ROUND
TRUNC
SQL>SELECTlast_name,hire_date
2FROMemployees
3WHEREhire_date<'01-FEB-88';
LAST_NAMEHIRE_DATE
-------------------------------------
Whalen17-SEP-87
King17-JUN-87
查询部门编号为90的人呆了多少周
:
SQL>SELECTlast_name,(SYSDATE-hire_date)/7asWEEKS
2FROMemployees
3WHEREdepartment_id=90;
LAST_NAMEWEEKS
-----------------------------------
King1297.67634
Kochhar1179.53348
DeHaan1006.67634
||||||||||||||||||||||||||||||||||||||||||
conversionfunctionandconditonalexperssion
两种数据类型转换
Implicit:隐试转换
Explicit:显示转换,使用函数指定转换结果
组函数:countmaxminsumavg
分组:groupby
再过滤:having
不能在where语句里面使用组函数
1.先执行where
2.执行groupby
3.执行组函数
having
先分组
执行组函数
再次进行限制过滤
4.having
+++++++++++++++++
equiljoin:基于两者相等,进行连接
oracle:
SQL>l
1SELECTemployees.employee_id,employees.last_name,
2employees.department_id,departments.department_id,
3departments.location_id
4FROMemployees,departments
5*WHEREemployees.department_id=departments.department_id
SQL>/
表别名:
fromemployeese,departmentsd
国际标准加as
如果定义了表名,则只能使用表名,不能使用原名
sql国际标准三中连接
自然连接:
找到相同列名,并且列的数据类型相同
寻找两张表中,值相同的行进行连接
1SELECT*
2FROMdepartments
3*NATURALJOINLOCATIONS
using名字相同,数据类型不同
字句的列不用加表前缀
onON(e.department_id=d.department_id)and
()
三层join
oracle:
SELECTemployee_id,city,department_name
FORMemployeese,departmentsd,locationl
WHEREe.department_id=d.department_idANDd.location_id=l.location_id
SQL:
SELECTemployee_id,city,department_name
FROMemployeese
JOINdepartmentsd
ONd.partment_id=e.department_id
JOINlocationsl
ONd.location_id=l.location_id;
使用AND或WHERE来再过滤
SELECTe.last_name,d.department_name,l.city
FROMemployeese,departmentsd,locationsl
WHEREe.department_id=d.department_id
ANDd.location_id=l.location_id;
//ANDd.department_idIN(20.50);
自连接:
sql:
SELECTworker.last_nameemp,manager.last_namemgr
FROMemployeesworkerJOINemployeesmanager
ON(worker.manager_id=manager.employee_id);
oracle:
SELECTworker.last_name||'worksfor'||manager.last_name
FROMemployeesworker,employeesmanager
WHEREworker.manager_id=manager.employee_id;
================================
Nonequijoins
oracle:
SELECTe.last_name,e.salary,j.grade_level
FROMemployeese,job_gradesj
WHEREe.salary
BETWEENj.lowest_salANDj.highest_sal
==================================
outerjoin
=inerjoin+没有匹配的
leftouterjoin
-------显示左边没有匹配的项
sql:
SELECTe.last_name,e.department_id,d.department_name
FROMemployeeseLEFTOUTERJOINdepartmentsd
ON(e.department_id=d.department_id);
rightouterjoin
fullouterjoin
oracle
SELECTtable1.column,table2.column
FROMtable1,table2
WHEREtable1.column(+)=table2.column;
左边连接+写在右边
右连接+写在左边
但是不支持左右都写full连接
SELECTe.last_name,e.department_id,d.department_name
FROMemployeese,departmentsd
WHEREe.department_id(+)=d.department_id;
=============================
笛卡尔乘积M*N
1.连接条件被忽略或无效则产生
2.故意产生的,用来产生大量数据
-
sql
使用corssjoin来产生笛卡尔乘积
SELELCTlast_name,department_name
FROMemployees
CROSSJOINdepartments;
oracle
不需要写连接条件
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
usingsubqueriestosolvequeries
字句放在fromwherehaving三个关键字后面
子查询先执行
子查询结果被主查询使用
SELECTlast_name,salary
FROMemployees
WHEREsalary>
(SELECTsalary
FROMemployees
WHERElast_name='Abel');
子查询要包含在括号内。
将子查询放在比较条件的右侧。
除非进行Top-N分析,否则不要在子查询中使用ORDERBY子句。
单行操作符对应单行子查询,多行操作符对应多行子查询。
单行子查询:
只返回一行。
使用单行比较操作符。
操作符
=
>
>=
<
<=
<>//不等于
SELECTlast_name,job_id,salary
FROMemployees
WHEREjob_id=
(SELECTjob_id
FROMemployees
WHEREemployee_id=141)
ANDsalary>
(SELECTsalary
FROMemployees
WHEREemployee_id=143);
在子查询中使用组函数
SELECTlast_name,job_id,salary
FROMemployees
WHEREsalary=
(SELECTMIN(salary)
FROMemployees);
子查询中的HAVING子句
首先执行子查询。
向主查询中的HAVING子句返回结果。
SELECTdepartment_id,MIN(salary)
FROMemployees
GROUPBYdepartment_id
HAVINGMIN(salary)>
(SELECTMIN(salary)
FROMemployees
WHEREdepartment_id=50);
SELECTjob_id,AVG(salary)
FROMemployees
GROUPBYjob_id
HAVINGAVG(salary)=
(SELECTMIN(AVG(salary))
FROMemployees
GROUPBYjob_id);
IN可以解决多行问题
子查询中的空值问题
SELECTlast_name,job_id
FROMemployees
WHEREjob_id=
(SELECTjob_id
FROMemployees
WHERElast_name='Haas');
=算数表达式。当一个结果包含null的时候,整个结果都是null
SELECTlast_name,job_id
FROMemployees
WHEREdepartment_idISNULL
多行子查询
返回多行。
使用多行比较操作符。
操作符
IN//列表中的任何一个
ANY//子查询中的任何一个
ALL//子查询中所有值
any返回空值的时候执行为false
all返回控制的时候执行为true
SELECTemployee_id,last_name,job_id,salary
FROMemployees
WHEREsalary
(SELECTsalary
FROMemployees
WHEREjob_id='IT_PROG')
ANDjob_id<>'IT_PROG';
>any>any里面的最小值
=anyIN
SELECTemployee_id,last_name,job_id,salary
FROMemployees
WHEREsalary (SELECTsalary
FROMemployees
WHEREjob_id='IT_PROG')
ANDjob_id<>'IT_PROG';
>all>all里面的最大值
=allnorowsselected
子查询中的空值问题
SELECTemp.last_name
FROMemployeesemp
WHEREemp.employee_idNOTIN
(SELECTmgr.manager_id
FROMemployeesmgr);
norowsselected
//查询没有上司的哥们名字
NOTIN<>all有空值返回异常
IN=any有空值正常
|||||||||||||||||||||||||||||||||||||||||||||||
usingthesetoperators
1.了解set操作符那些类型
2.使用set操作符将多个查询合并成一个查询
3.如何控制返回结果的显示次序
先交集后并集
UNION
INTERSECT交集
MINUS在A里面,但是不再B里面
列的数量数据类型要一样
ORACLE自动消除重复的升序排列
UNION
取并集(去掉了重复行)
SELECTemployee_id,job_id
FROMemployees
UNION
SELECTemployee_id,job_id
FROMjob_history;
UNIONALL操作符返回两个查询的结果集的并集以及两个结果集的重复部分(不去重)
SELECTemployee_id,job_id,department_id
FROMemployees
UNIONALL
SELECTemployee_id,job_id,department_id
FROMjob_history
ORDERBYemployee_id;
不自动排序。
ORDERBY是对整个集合之后进行排序
INTERSECTOpertot
操作符返回两个结果集的交集
并不忽略NULL值
SELECTemployee_id,job_id
FROMemployees
INTERSECT
SELECTemployee_id,job_id
FROMjob_history;
MINUS操作符返回两个结果集的补集
SELECTemployee_id,job_id
FROMemployees
MINUS
SELECTemployee_id,job_id
FROMjob_history;
从来没有换过工作的人
规范化:
SELECTdepartment_id,TO_NUMBER(null)
location,hire_date
FROMemployees
UNION
SELECTdepartment_id,location_id,TO_DATE(null)
FROMdepartments;
SELECTemployee_id,job_id,salary
FROMemployees
UNION
SELECTemployee_id,job_id,0
FROMjob_history;
ORDERBY字句
1.只能出现一次,并且出现在复合查询的最后
2.他只能用于认识第一列查询的名字
3.缺省情况第一个查询的第一列升序排序
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
处理数据
使用DML语句
向表中插入数据
更新表中数据
从表中删除数据
将表中数据和并
控制事务
DML可以在下列条件下执行:
向表中插入数据
INSERTINTOtable[(column[,column...])]
VALUES(value[,value...]);
使用这种语法一次只能向表中插入一条数据。
INSERTINTOdepartments(department_id,department_name,
manager_id,location_id)
VALUES(70,'PublicRelations',100,1700);
//如果每一列都有值,可以简写。
//主键,外键,非空,等等约束,不能够违反这些条件
//插入特殊值,用函数代替该值
INSERTINTOemployees(employee_id,
first_name,last_name,
email,phone_number,
hire_date,job_id,salary,
commission_pct,manager_id,
department_id)
VALUES(113,
'Louis','Popp',
'LPOPP','515.124.4567',
SYSDATE,'AC_ACCOUNT',6900,
NULL,205,100);
//&;替换变量
INSERTINTOdepartments
(department_id,department_name,location_id)
VALUES(&;department_id,'&;department_name',&;location);
//从其他表中筛选数据批量插入
INSERTINTOsales_reps(id,name,salary,commission_pct)
SELECTemployee_id,last_name,salary,commission_pct
FROMemployees
WHEREjob_idLIKE'%REP%';
更新现存数据
UPDATEtable
SETcolumn=value[,column=value,...]
[WHEREcondition];
//更新多少记录,取决于where字句
UPDATEcopy_emp
SETdepartment_id=110;
使用子查询:
Syntax
UPDATEtable
SETcolumn=
(SELECTcolumn
FROMtable
WHEREcondition)
[,
column=
(SELECTcolumn
FROMtable
WHEREcondition)]
[WHEREcondition];
Note:Ifnorowsareupdated,amessage“0rowsupdated.”isreturned.
删除现存数据
DELETE[FROM]table
[WHEREcondition];
TRUNCATE清空表,并且不能回滚
事务是由完成若干项工作的DML,DDL,DCL语句组成的。
以第一个DML语句的执行作为开始
以下面的其中之一作为结束:
COMMIT或ROLLBACK语句
DDL或DCL语句(自动提交)
用户会话正常结束
系统异常终了
使用COMMIT和ROLLBACK语句,我们可以:
确保数据完整性。
数据改变被提交之前预览。
将逻辑上相关的操作分组。
----DDL语言
执行前commit
执行后commit
----DCL语言
DML语句不提交,其他用户看不到结果
在DML语句中使用WITHCHECKOPTION关键字
使用子查询表示DML语句中使用的表
WITHCHECKOPTION关键字避免修改子查询范围外的数据
使用DEFAULT关键字表示默认值
可以使用显示默认值控制默认值的使用
显示默认值可以在INSERT和UPDATE语句中使用
||||||||||||||||||||||||||||||||||||||||
使用DDL创建和管理表
知道数据库对象的类型
了解表的结构
了解每一列容许的数据类型
创建表
如何添加约束
了解schma对象如何工作
数据库对象
表//存储在表空间中,
视图//一般只读,
序列//产生不重复的列
索引//提高某些查询的效率
同义词//对一个对象棋别名方便引用
表起名规则:
1.必须以字母开头
2.小于30字符
3.字母+数字_$#
4.在一个用户的模式下,所拥有的对象不要重名,类型不同可以同名
5.不能包含ORACLE的包含关键字
USER_OBJECTS
创建表
必须具备:
CREATETABLE权限
存储空间
CREATETABLE[schema.]table
(columndatatype[DEFAULTexpr][,...]);
必须指定:
表名
列名,数据类型,尺寸
创建表后,oracle会自动更新相关数据字典
DEFAULT选项
插入时为一个列指定默认值
...namechar(10)DEFAULT'ABC',hire_dateDATEDEFAULTSYSDATE,...
字符串,表达式,或SQL函数都是合法的
其它列的列名和伪列是非法的
默认值必须满足列的数据类型定义
创建约束可以起名,也可以被oracle自动赋值为SYS_Cn
一个约束可以在列级别,也可以在表级别
CREATETABLE[schema.]table
(columndatatype[DEFAULTexpr]
[column_constraint],
...
[table_constraint][,...]);
列级别
column[CONSTRAINTconstraint_name]constraint_type,
表级别
column,...
[CONSTRAINTconstraint_name]constraint_type
(column,...),
NOTNULL约束
只能定义在列级别
CREATETABLEemployees(
employee_idNUMBER(6),
last_nameVARCHAR2(25)NOTNULL,
salaryNUMBER(8,2),
commission_pctNUMBER(2,2),
hire_dateDATE
CONSTRAINTemp_hire_date_nn
NOTNULL,
)
UNIQUE约束
既可以定义在列级别,也可以定在表级别
null是无法比较的,不违反UNIQUE的规则
CREATETABLEemployees(
employee_idNUMBER(6),
last_nameVARCHAR2(25)NOTNULL,
emailVARCHAR2(25),
salaryNUMBER(8,2),
commission_pctNUMBER(2,2),
hire_dateDATENOTNULL,
...
CONSTRAINTemp_email_ukUNIQUE(email));
PRIMARYKEY约束
可以定义在表级或列级
一个表最多有一个主键
CREATETABLEdepartments(
department_idNUMBER(4),//PRIMARYKEY
department_nameVARCHAR2(30)
CONSTRAINTdept_name_nnNOTNULL,
manager_idNUMBER(6),
location_idNUMBER(4),
CONSTRAINTdept_id_pkPRIMARYKEY(department_id));
FOREIGNKEY约束
可以定义在表级或列级
CREATETABLEemployees(
employee_idNUMBER(6),
last_nameVARCHAR2(25)NOTNULL,
emailVARCHAR2(25),
salaryNUMBER(8,2),
commission_pctNUMBER(2,2),
hire_dateDATENOTNULL,
...
department_idNUMBER(4),
CONSTRAINTemp_dept_fkFOREIGNKEY(department_id)
REFERENCESdepartments(department_id)
ONDELETESETNULL,
CONSTRAINTemp_email_ukUNIQUE(email));
FOREIGNKEY:在表级指定子表中的列
REFERENCES:标示在父表中的列
ONDELETECASCADE:当父表中的列被删除时,子表中相对应的列也被删除
ONDELETESETNULL:子表中相应的列置空
____________针对数据类型固定
————————————CHECK约束,自定义约束
定义每一行必须满足的条件
以下的表达式是不允许的:
出现CURRVAL,NEXTVAL,LEVEL,和ROWNUM伪列
使用SYSDATE,UID,USER,和USERENV函数
在查询中涉及到其它列的值
使用子查询创建表
CREATETABLEtable
[(column,column)]
ASsubquery;
指定列名别名默认值
只传递NULL/NOTNULL约束,其余的不传递
子查询中含有表达式则新建表必须指定列名,或子查询加列明
CREATETABLEdept80
AS
SELECTemployee_id,last_name,
salary*12ANNSAL,
hire_date
FROMemployees
WHEREdepartmentid=80;
只创建对应表结构,而不添加原有数据
CREATETABLEmyjobASSELECT*FROMuser_objectsWHERE1=0;
ALTERTABLE改变表
增加删除重命名列
改变读写状态
READONLY
READWRITE
但是不会妨碍删除表
DROP表之后将其放入recyclebin
同时会删除一些视图索引等等
|||||||||||||||||||||||||||||||||||||||||||||||||||
创建其他东东
创建视图
创建索引
创建管理序列
创建管理同义词
使用视图:
控制数据访问
简化查询
数据独立性
避免重复访问相同的数据
*****视图创建视图???
使用子查询创建视图
约束并不会继承,重新添加,设置只读
CREATE[ORREPLACE][FORCE|NOFORCE]VIEWview
[(alias[,alias]...)]
ASsubquery
[WITHCHECKOPTION[CONSTRAINTconstraint]]
[WITHREADONLY[CONSTRAINTconstraint]];
示例:
创建别名:子查询添加别名或view后面添加列明
CREATEVIEWempvu80
ASSELECTemployee_id,last_name,salary
FROMemployees
WHEREdepartment_id=80;
修改视图
简单视图:一一对应于基表
复杂视图:使用了groupdistinct等不能增删改
视图中使用DML的规定
当视图定义中包含以下元素之一时不能使用update:
组函数
GROUPBY子句
DISTINCT关键字
ROWNUM伪列
列的定义为表达式
当视图定义中包含以下元素之一时不能使用insert:
组函数
GROUPBY子句
DISTINCT关键字
ROWNUM伪列
列的定义为表达式
表中非空的列在视图定义中未包括(有缺省值例外)
withcheckoptionconstraint
拒绝修改和where字句有冲突的字段
使用WITHCHECKOPTION子句确保DML只能在特定的范围内执行
CREATEORREPLACEVIEWempvu20
ASSELECT*
FROMemployees
WHEREdepartment_id=20
WITHCHECKOPTIONCONSTRAINTempvu20_ck;
Viewcreated.
任何违反WITHCHECKOPTION约束的请求都会失败
删除视图
删除视图只是删除视图的定义,并不会删除基表的数据
DROPVIEWview;
序列:
自动提供唯一的数值
共享对象
主要用于提供主键值
代替应用代码
将序列值装入内存可以提高访问效率
语法:
CREATESEQUENCEsequence
[INCREMENTBYn]
[STARTWITHn]
[{MAXVALUEn|NOMAXVALUE}]//10+27
[{MINVALUEn|NOMINVALUE}]//10-26
[{CYCLE|NOCYCLE}]
[{CACHEn|NOCACHE}];
NEXTVAL和CURRVAL伪列
NEXTVAL返回序列中下一个有效的值,任何用户都可以引用
CURRVAL中存放序列的当前值
NEXTVAL应在CURRVAL之前指定,二者应同时有效
INSERTINTOdepartments(department_id,
department_name,location_id)
VALUES(dept_deptid_seq.NEXTVAL,
'Support',2500);
序列DEPT_DEPTID_SEQ的当前值
SELECTdept_deptid_seq.CURRVAL
FROMdual;
将序列值装入内存可提高访问效率
序列在下列情况下出现裂缝:
回滚
系统异常
多个表同时使用同一序列
如果不讲序列的值装入内存(NOCACHE),可使用表USER_SEQUENCES查看序列当前的有效值
修改序列的增量,最大值,最小值,循环选项,或是否装入内存
ALTERSEQUENCEdept_deptid_seq
INCREMENTBY20
MAXVALUE999999
NOCACHE
NOCYCLE;
修改sequence的注意事项:
必须是序列的拥有者或对序列有ALTER权限
只有将来的序列值会被改变
改变序列的初始值只能通过删除序列之后重建序列的方法实现
其它的一些限制使用DROPSEQUENCE语句删除序列
删除之后,序列不能再次被引用
DROPSEQUENCEdept_deptid_seq;
索引(indexes)
一种数据库对象
通过指针加速Oracle服务器的查询速度
通过快速定位数据的方法,减少磁盘I/O
索引与表相互独立
Oracle服务器自动使用和维护索引
索引创建
自动创建:在定义PRIMARYKEY或UNIQUE约束后系统自动在相应的列上创建唯一性索引
手动创建:用户可以在其它列上创建非唯一的索引,以加速查询
在一个或多个列上创建索引
CREATE[UNIQUE][BITMAP]INDEXindex
ONtable(column[,column]...);
在表EMPLOYEES的列LAST_NAME上创建索引
CREATEINDEXemp_last_name_idx
ONemployees(last_name);
以下情况可以创建索引:
列中数据值分布范围很广
列中包含大量空值
列经常在WHERE子句或连接条件中出现
表经常被访问而且数据量很大,访问的数据大概占数据总量的2%到4%
下列情况不要创建索引:
表很小
列不经常作为连接条件或出现在WHERE子句中
查询的数据大于2%到4%
表经常更新
加索引的列包含在表达式中
使用DROPINDEX命令删除索引
DROPINDEXindex;
删除索引UPPER_LAST_NAME_IDX
DROPINDEXupper_last_name_idx;
只有索引的拥有者或拥有DROPANYINDEX权限的用户才可以删除索引
同义词:
方便访问其它用户的对象
缩短对象名字的长度
CREATE[PUBLIC]SYNONYMsynonym
FORobject;
存在于公用的地方,
为视图DEPT_SUM_VU创建同义词
CREATESYNONYMd_sum
FORdept_sum_vu;
删除同义词
DROPSYNONYMd_sum;