网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 交易代码 > SQL语法 > 正文

OracleSQL语法命令

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

【网学网提醒】:网学会员为您提供OracleSQL语法命令参考,解决您在OracleSQL语法命令学习中工作中的难题,参考学习。


    Oracle的几个主要版本:◆Oracle8◆Oracle8ii表示Internet,意味着Oracle公司正式进军互联网◆Oracle9i类似于Oracle8i◆Oracle10gg表示网格Oracle的主要几个用户:◆普通用户:scott密码:tiger◆普通管理员:system密码:manager◆超级管理员:sys密码:sysmanagerSQLPlus的两种命令:◆sqlplus以命令行的方式进入数据库连接输入用户名及密码:scott/tiger
    或者分别输入用户名:scott,口令:tiger(口令以密文形式不显示)
     ◆sqlplusw以窗口的方式进入数据库连接用户名:scott口令:tiger主机字符串:数据库名称
    ◆清屏操作:clearscr;◆退出数据库连接:exit/quit;◆设置环境变量设置行显示宽度:setlinesize宽度;设置页显示行数:setpagesize行数;◆修改SQL语法:ed◆继续执行上次的SQL语法:/◆使用本机记事本编辑:ed文件名◆Oracle中的注释:-◆Oracle中查看错误:showerrors;◆执行本地文件中的SQL语法命令:◎如果文件是*.txt文件,语法为:@路径/文件如:@D:/text.txt或者@D:text.txt◎如果文件是*.sql文件,语法为:@路径/文件(不含后缀)如:@D:/text或者@D:text◆查看当前连接的用户:showuser;◆改变其他用户连接:conn用户名/密码[ASSYSDBA|SYSOPER]◎普通用户:connscott/tiger◎普通管理员:connsystem/manager◎超级管理员:connsys/sysmanagerassysdba;◆查看一个数据库中的全部表:SELECT*FROMtab;◆查看一张表中的记录条数:SELECTCOUNT(*|字段)FROM表名称;◆查看一个具体的表的结构:DESC表名称;◆drop后的表被放在回收站(user_recyclebin)里,而不是直接删除掉。这样,回收站里的表信息就可以被恢复,或彻底清除。1.通过查询回收站user_recyclebin获取被删除的表信息,然后使用语句flashbacktabletobeforedrop[renameto];将回收站里的表恢复为原名称或指定新名称,表中数据不会丢失。若要彻底删除表,则使用语句:droptablepurge;2.清除回收站里的信息清除指定表:purgetable;清除当前用户的回收站:purgerecyclebin;清除所有用户的回收站:purgedba_recyclebin;
     ◆Oracle中主要几种字段类型:NUMBER(4)表示是数字,长度为4NUMBER(7,2)表示是数字,其中小数位占2位,整数位占5位,总共是7位VARCHAR2(20)表示的字符串,长度为20DATE表示日期◆SQL(StructuredQueryLanguage,结构查询语言)分为以下三种:DML(DataManipulationLanguage,数据操作语言)----用于检索或者修改数据DDL(DataDefinitionLanguage,数据定义语言)----用于定义数据的结构,如创建,修改或者删除DCL(DataControlLanguage,
    数据控制语言)----用于定义数据库用户的权限◆简单查询全部语句SELECT*FROM表名称;◆简单查询具体的列SELECT字段1别名1,字段2别名2...FROM表名称;◆消除重复SELECT{DISTINCT}*|字段1别名1,字段2别名2...FROM表名称;◆Oracle中使用“||”连接字符串,字符串使用“'”括起来,例如SELECT'字符串1'||字段1||'字符串2'||字段2||'字符串3'...FROM表名称;◆Oracle查询中也可以使用四则混合运算SELECT字段1(+、-、*、/)numFROM表名称;◆限定查询SELECT{DISTINCT}*|字段1别名1,字段2别名2...FROM表名称{WHERE条件(s)}限定查询中的条件大于:>、大于等于>=、小于:<、小于等于:<=、等于:=、不等于:!=(<>)限定查询中多个条件都必须满足......WHERE条件1AND条件2AND条件3...;限定查询中多个条件有一个满足即可......WHERE条件1OR条件2OR条件3...;限定查询中条件字段为空......WHERE条件ISNULL;限定查询中条件字段不为空......WHERE条件ISNOTNULL;限定查询中条件取反......WHERENOT(条件s);限定查询中指定范围的查询(适用于数字和日期)包含临界值......WHERE字段BETWEEN...AND...;限定查询中指定范围查询(使用与数字,字符串)(指定了额外的内容不影响查询结果)......WHERE字段IN(值1,值2,值3...值Xxx);限定查询中非指定范围查询......WHERE字段NOTIN(值1,值2,值3...);限定查询中的模糊查询,需要注意通配符,没有指定内容“%%”表示全部,适用于数字、字符串“%”:可以匹配任意长度的内容“_”:可以匹配一个长度的内容......WHERE字段LIKE'...';◆对结果进行排序(ASC表示升序,DESC表示降序)SELECT{DISTINCT}*|字段1别名1,字段2别名2...
     FROM表名称{WHERE条件s}{ORDERBY排序字段1ASC|DESC,排序字段2ASC|DESC...};◆单行函数function_name(column|expression,[arg1,arg2...])function_name:函数名称column:数据库列名expression:字符串或计算表达式arg1,arg2...:在函数中使用的参数使用本页输出:...FROMDUAL;单行函数分类:字符函数:接收字符输入并返回字符或数值数值函数:接收数值输入并返回数值日期函数:对日期型数据进行操作转换函数:从一种数据类型转换为另一种数据类型通用函数:NVL函数、DECODE函数◎字符函数将小写字母变为大写字母:upper()SELECTUPPER('小写字母'|字段)FROMDUAL;将大写字母变为小写字母:lower()SELECTLOWER('大写字母'|字段)FROMDUAL;将单词首字母大写:initcap()SELECTINITCAP('xxxyyy...'|字段)FROMDUAL;将字符串连接:concat(){只能接收两个参数}SELECTCONCAT('字符串1','字符串2')FROMDUAL;字符串的截取:sub
    str()(Oracle中字符串的截取位0和1是一样的)(截取起始位也可以为负数)SELECTSUBSTR('字符串',起始位置,截取长度)FROMDUAL;字符串长度:length()SELECTLENGTH('字符串')FROMDUAL;字符串内容替换:replace()SELECTREPLACE('字符串','被替换的字符','替换成的字符')FROMDUAL;◎数值函数四舍五入操作:round(num1,num2)(num1为小数数字,num2为小数点保留位数,也可以为负数)SELECTROUND([小]数数字,[小数]保留位数)FROMDUAL;截断数位,不进行四舍五入trunc(num1,num2)(num1为数字,num2为保留位数,可以为负数)SELECTTRUNC([小]数字,[小数]保留的位数)FROMDUAL;取余(取模):mod(num1,num2)(num1为被除数,num2为除数,取余数)SELECTMOD(数值1,数值2)FROMDUAL;◎日期函数日期+/-日期=数字日期+/-数字=日期Oracle中当前日期:sysdateSELECTSYSDATEFROMDUAL;Oracle中提供了以下的日期函数支持:MONTHS_BETWEEN(date1,date2):求出给定日期范围的月数ADD_MONTHS(date1,num1):在指定日期上加上指定的月数,得到之后的日期NEXT_DAY(date1,'星期X'):求出下一个指定日期(星期几)是哪一天
     LAST_DAY(date):求出给定日期(该月)的最后一天◎转换函数Oracle中提供以下几种转换函数:to_char():转换成字符串(适用于数字/日期)to_number():转换成数字to_date():转换成日期将日期进行拆分:年月日年:y,四位数字,用yyyy表示月:m,两位数字,用mm表示日:d,两位数字,用dd表示...TO_CHAR(date[字段],'yyyy')年别名...TO_CHAR(date[字段],'mm')月别名...TO_CHAR(date[字段],'dd')日别名按指定格式转换日期...TO_CHAR(date[字段],'yyyy-mm-dd')...去掉日期中的前导零,在日期格式前加fm...TO_CHAR(date[字段],'fmyyyy-mm-dd')将数字按位数分割9:表示一位数字...TO_CHAR(num[字段],'99,999')...数字表示区域:$:表示美元L:表示Local,本地语言进行显示...TO_CHAR(num[字段],'$/L99,999')...将字符串变为数字(运算)...TO_NUMBER('num')......TO_NUMBER('num1')+,-,*,/TO_NUMBER('num2')...将字符串变为date型日期(给定字符串要与给定格式相匹配)...TO_DATE('日期字符串','日期格式')...◎通用函数NVL(字段,指定值)将一个指定的null值变为指定的内容...NVL(字段,0)...将指定的null字段值默认为0DECODE()函数,类似于if...elseif...else...DECODE(col/expressioin,search1,result1[,search2,result2...][,default...])col/expression:为列名称或表达式(数字/字符串/字段名)search1、search2...searchx:为用于比较的条件(数字/字符串)result1、result2...resultx:为返回值(数字/字符串)如果col/expression和searchx相比较结果相同则返回resultx,如果没相匹配的则返回默认值default。◆多表查询SELECT{DISTINCT}*
    |字段1别名1,字段2别名2...FROM表名称1别名1,表名称2别名2...{WHERE条件s}{ORDERBY排序字段1ASC|DESC,排序字段2ASC|DESC...};范例:消除笛卡尔积,查询emp表和dept表全部数据select*fromemp,deptwhereemp.deptno=dept.deptno;或select*fromempe,deptdwheree.deptno=d.deptno;范例:emp表自身关联selecte.empno,e.ename,e.job,m.empno,m.ename,m.jobfromempe,empmwheree.mgr=m.empno;
     范例:查询雇员的编号、、工作、部门名称、工资在公司的等级SELECTe.empno,e.ename,e.job,d.dname,s.gradeFROMempe,deptd,salgradesWHEREe.deptno=d.deptnoANDe.salBETWEENs.losalANDs.hisal;◎左、右连接(默认不会显示40部门)(+)在=左边表示右连接,以右表为准(+)在=右边表示左连接,以左表为准范例:显示dept表中的40部门SELECTe.empno,e.ename,d.deptno,d.dnameFROMempe,deptdWHEREe.deptno(+)=d.deptno;◆SQL:1999语法对SQL的支持SELECTtable1.column,table2.columnFROMtable1[CROSSJOINtable2]|[NATURALJOINtable2]|[JOINtable2USING(column_name)]|[JOINtable2ON(table1.column_name=table2.column_name)]|[LEFT|RIGHT|FULLOUTERJOINtable2ON(table1.column_name=table2.column_name)];交叉连接(CROSSJOIN)产生笛卡尔积......表Acrossjoin表B......自然连接(NATURALJOIN)自动进行关联字段的匹配.......表Anaturaljoin表B.......USING()子句,直接关联的操作(子句的列部分不能有限定词,括号里只允许简单的关联字段名)......表Ajoin表Busing(关联字段名)ON()子句(括号里用户自己编写关联条件).......表Ajoin表Bon(表A.column=表B.column)......左连接(左外连接)、右连接(右外连接):LEFT[OUTER]JOIN、RIGHT[OUTER]JOIN......表Aleft[outer]join表Bon(表A.column=表B.column)............表Aleft[outer]join表Busing(column)......◆组函数SQL中常用的组函数有以下几个:COUNT():求出全部的记录数MAX():求出一组中的最大值MIN():求出一组中的最小值AVG():求出一组中的平均值SUM():求出一组的和count()函数......COUNT(*|字段名).....max()函数、min()函数,一般用于数字上,也可以对字母a~z[A~Z]求最大最小......MAX(字段名)....../......MIN(字段名)......sum()函数、avg()函数.......SUM(字段名)....../.......AVG(字段名)......◆分组统计SELECT{DISTINCT}*|字段1别名1,字段2别名2...FROM表1别名1,表2别名2...{WHERE条件(s)}{GROUPBY分组条件}{ORDERBY排序字段1ASC|DESC,排序字段2ASC|DESC...};
     如果程序中使用了分组函数,则有以下两种可以使用的情况:程序中存在了GROUPBY,并指定了分组条件,这样可以将分组条件一起查询出来;如果不使用分组,则只能单独的使用分组函数;使用
    分组函数的时候,不能出现分组函数和分组条件以外的字段;分组函数只能在分组中使用,不允许在WHERE语句中出现,如果要指定分组的条件,则只能通过HAVING指令的形式完成,此时SQL语法如下:SELECT{DISTINCT}*|字段1别名1,字段2别名2...FROM表名称1别名1,表名称2别名2...{WHERE条件s}{GROUPBY分组条件{HAVING分组条件}}{ORDERBY排序字段1ASC|DESC,排序字段2ASC|DESC...};分组函数可以嵌套使用,但在组函数嵌套使用的时候不能再出现分组条件的查询语句例如:SELECTdeptno,MAX(AVG(sal))FROMempGROUPBYdeptno;应该为:SELECTMAX(AVG(sal))FROMempGROUPBYdeptno;◆子查询SELECT{DISTINCT}*|字段1别名1,字段2别名2....FROM表名称1别名1,表名称2别名2....(SELECT{DISTINCT}*|字段1别名1,字段2别名2....FROM表名称1别名1,表名称2别名2.....{WHERE条件s}{GROUPBY分组条件{HAVING分组条件}}{ORDERBY排序字段1ASC|DESC,排序字段2ASC|DESC....};)别名i.....{WHERE条件s(SELECT{DISTINCT}*|字段1别名1,字段2别名2.....FROM表名称1别名1,表名称2别名2.....{WHERE条件s}{GROUPBY分组条件{HAVING分组条件}}{ORDERBY排序字段1ASC|DESC,排序字段2ASC|DESC.....};)......}{GROUPBY分组条件{HAVING分组条件}}{ORDERBY排序字段1ASC|DESC,排序字段2ASC|DESC.....};所有的子查询必须在“()”中编写子查询在操作中分为以下三类:单列子查询:返回的结果是一列的一个内容;单行子查询:返回多个列,有可能是一条完整的记录;多行子查询:返回多条记录;子查询中存在以下三种查询的操作符号:INANYALLIN(......)表示一个范围=ANY(......)与IN(......)类似,表示一个范围>ANY(......)大于其中最小值即满足ALL(......)大于其中最大值即满足     多列子查询,一个子查询中同时返回多个查询列,例如:SELECT*FROMempWHERE(sal,NVL(comm,-1))IN(SELECTsal,NVL(comm,-1)FROMempWHEREdeptno=20);◆数据库更新操作◎数据表完整复制(Oracle中使用)CREATETABLE表名称ASSELECT*FROM源表名;◎数据表部分复制CREATETABLE表名称ASSELECT*FROM源表名WHERE条件s;◎为表添加数据(标准)必须有全部完整的字段名称和相对应的值,其中字符串需要用“'”括起来INSERTINTO表名称(字段名1,字段名2,...)VALUES(值1,值2,...);◎简单添加数据全部字段相对应的值INSERTINTO表名称VALUES(值1,值2,...);◎部分字段添加数据(标准)需要添加数据的字段,及其相对应的值INSERTINTO表名称(字段名1,字段名2,...)VALUES(值1,值2,..
    .);◎部分字段添加数据全部字段按顺序添加数据,没有数据的字段值使用null表示INSERTINTO表名称VALUES(值1,...null,...值2,...null,...);日期按照Oracle固定的格式“xx--xx月--XXxx”或者按照指定的格式“yyyy--mm--dd”TO_DATE('XXxx-xx-xx','yyyy-mm-dd')◎修改表中全部的数据UPDATE表名称SET要修改字段名1=新值1,要修改字段名2=新值2,...;◎修改表中部分数据UPDATE表名称SET要修改字段名1=新值1,要修改字段名2=新值2,...WHERE条件s;◎取消字段的值UPDATE表名称SET要修改字段名1=null,要修改字段名2=null,...WHERE条件s;◎删除表中全部的数据DELETEFROM表名称;◎删除表中部分数据DELETEFROM表名称WHERE条件s;◆事务处理事务提交:commit事务回滚:rollback◆表的创建◎Oracle中常用数据类型No12345◎表的建立CREATETABLE表名称数据类型VARCHAR、VARCHAR2NUMBERDATECLOBBLOB描述表示的是一个字符串,最大长度为255NUMBER(n):表示一个整数,数字长度为n,可以使用intNUMBER(m,n):表示一个小数,小数长度为n,整数长度为m-n,可以使用float表示表示日期类型,日期要按照标准的日期格式进行存储大对象,表示大文本数据,一般可以存储4G的文本大对象,表示二进制数据,最大可以存储4G,如多媒体文件
     (字段名称1,字段名称2,......字段名称n,);◎复制表CREATETABLE表名称AS(子查询);◎表的复制中如果子查询中的条件是一个永不成立的条件则为只复制表结构而不复制表内容,如:CREATETABLE表名称AS(SELECT*FROMempWHERE1=2);◎表的删除DROPTABLE表名称purge;◆表的修改◎为表增加字段ALTERTABLE表名称ADD(字段名称,字段类型,DEFAULT默认值,字段名称,字段类型,DEFAULT默认值...);◎修改表字段(字段修改的长度不能小于原有最大内容的长度)ALTERTABLE表名称MODIFY(字段名称,字段类型,DEFAULT默认值);◆表的重命名(Oracle)RENAME旧表名TO新表名;◆截断表截断表后,表中的数据全部被清除,而且立即释放资源,且无法回滚;TRUNCATETABLE表名称;◆约束使用约束更好的保证数据库中数据的完整性,约束的分类:|-主键约束:主键表示的是一个唯一的标识,本身不能为空;|-唯一约束:在一个表中只允许建立一个主键约束,而其他列如果不希望出现重复值的话,则可以使用唯一约束。|-检查约束:检查一个列的内容是否合法;|-非空约束:字段里的内容不能为空;|-外键约束:在两张表中进行约束操作;◎主键约束(PRIMARYKEY)主键约束一般都是在id上使用,而且本身已经默认了内容不能为空,所以在建表的时候
    指定。CREATETABLE表名称(Xxxid,字段类型字段名称2,字段类型字段名称3,字段类型......字段名称n,字段类型);CREATETABLE表名称(Xxxid,字段类型字段名称2,字段类型字段类型字段类型字段类型[DEFAULT默认值],[DEFAULT默认值],[DEFAULT默认值]
    PRIMARYKEYNOTNULL,[DEFAULT默认值],[DEFAULT默认值],[DEFAULT默认值]
    以上约束属于系统自动分配好的约束名称,也可以通过constraint指定一个约束的名称;
    NOTNULL,[DEFAULT默认值],
     字段名称3,字段类型[DEFAULT默认值],......字段名称n,字段类型[DEFAULT默认值],CONSTRAINT表名称_Xxxid_pkPRIMARYKEY(Xxxid));◎非空约束(NOTNULL)非空约束表示一个字段的内容不允许为空,即插入的数据必须有内容CREATETABLE表名称(Xxxid,字段类型PRIMARYKEYNOTNULL,字段名称2,字段类型NOTNULL[DEFAULT默认值],字段名称3,字段类型NOTNULL[DEFAULT默认值],......字段名称n,字段类型[DEFAULT默认值],【CONSTRAINT表名称_Xxxid_pkPRIMARYKEY(Xxxid)】);◎唯一约束(UNIQUE)唯一约束表示一个字段中的内容是唯一的,其他列不允许重复;CREATETABLE表名称(Xxxid,字段类型PRIMARYKEYNOTNULL,字段名称2,字段类型UNIQUENOTNULL[DEFAULT默认值],字段名称3,字段类型NOTNULL[DEFAULT默认值],......字段名称n,字段类型[DEFAULT默认值],【CONSTRAINT表名称_Xxxid_pkPRIMARYKEY(Xxxid)】);如果有错误也使用自动的约束名称编号,所有也可以通过CONSTRAINT关键字进行命名;CREATETABLE表名称(Xxxid,字段类型PRIMARYKEYNOTNULL,字段名称2,字段类型NOTNULL[DEFAULT默认值],字段名称3,字段类型NOTNULL[DEFAULT默认值],......字段名称n,字段类型[DEFAULT默认值],【CONSTRAINT表名称_Xxxid_pkPRIMARYKEY(Xxxid)】,CONSTRAINT表名称_字段名称x_ukUNIQUE(字段名称x));◎检查约束(CHECK)使用检查约束来判断一个列中插入的内容是否是合法的;CREATETABLE表名称(Xxxid,字段类型字段名称2,字段类型字段名称3,字段类型字段名称4,字段类型......字段名称n,字段类型
    PRIMARYKEYNOTNULL,UNIQUENOTNULLNOTNULLCHECK(条件ageBETWEEN0AND150),NOTNULLCHECK(条件sexIN('男','女')),[DEFAULT默认值],
     【CONSTRAINT表名称_Xxxid_pkPRIMARYKEY(Xxxid)】,【CONSTRAINT表名称_字段名称x_ukUNIQUE(字段名称x)】);如果有错误也使用自动的约束名称编号,所有也可以通过CONSTRAINT关键字进行命名;CREATETABLE表名称(Xxxid,字段类型PRIMARYKEYNOTNULL,字段名称2,字段类型UNIQUENOTNULL字段名称3,字段类型NOTNULL,字段名称4,字段类型NOTNULL,......字段名称n,字段类型[DEFAULT默认值],【CONSTRAINT表名
    称_Xxxid_pkPRIMARYKEY(Xxxid)】,【CONSTRAINT表名称_字段名称x_ukUNIQUE(字段名称x)】,CONSTRAINT表名称_字段名称x_ckCHECK(条件ageBETWEEN0AND150),......CONSTRAINT表名称_字段名称y_ckCHECK(条件sexIN('男','女')));◎检查约束(FOREIGNKEY)主-外键约束主要是针对两张表的约束,它们之间有关联字段;CREATETABLE父表名称(Xxxid,字段类型PRIMARYKEYNOTNULL,字段名称2,字段类型UNIQUENOTNULL字段名称3,字段类型NOTNULL,字段名称4,字段类型NOTNULL,......字段名称n,字段类型[DEFAULT默认值],【CONSTRAINT表名称_Xxxid_pkPRIMARYKEY(Xxxid)】,【CONSTRAINT表名称_字段名称x_ukUNIQUE(字段名称x)】,【CONSTRAINT表名称_字段名称x_ckCHECK(条件ageBETWEEN0AND150)】,......【CONSTRAINT表名称_字段名称y_ckCHECK(条件sexIN('男','女'))】);CREATETABLE子表名称(Yyyid,字段类型PRIMARYKEYNOTNULL,字段名称2,字段类型NOTNULL字段名称3,字段类型NOTNULL,字段名称4,字段类型NOTNULL,......字段名称n,字段类型[DEFAULT默认值],Xxxid,字段类型,CONSTRAINT父表名_子表名_Xxxid_fkFOREIGNKEY(Xxxid)REFERENCES父表(Xxxid));使用主-外键关联时要注意:
     在子表中设置的外键在父表中必须是主键;删除表时应该先删除子表,再删除父表;可以使用强制性的删除手段:DROPTABLE父表CASCADECONSTRAINT(purge);如果在子表中有关联父表的数据,则在级联情况下是无法删除附表中的数据的;在创建表时使用了级联删除条件,则在删除父表中的数据时会自动删除其对应子表的记录;DROPTABLE子表purge;DROPTABLE父表purge;CREATETABLE父表名称(Xxxid,字段类型PRIMARYKEYNOTNULL,字段名称2,字段类型UNIQUENOTNULL字段名称3,字段类型NOTNULL,字段名称4,字段类型NOTNULL,......字段名称n,字段类型[DEFAULT默认值],【CONSTRAINT表名称_Xxxid_pkPRIMARYKEY(Xxxid)】,【CONSTRAINT表名称_字段名称x_ukUNIQUE(字段名称x)】,【CONSTRAINT表名称_字段名称x_ckCHECK(条件ageBETWEEN0AND150)】,......【CONSTRAINT表名称_字段名称y_ckCHECK(条件sexIN('男','女'))】);CREATETABLE子表名称(Yyyid,字段类型PRIMARYKEYNOTNULL,字段名称2,字段类型NOTNULL字段名称3,字段类型NOTNULL,字段名称4,字段类型NOTNULL,......字段名称n,字段类型[DEFAULT默认值],Xxxid,字段类型,CONSTRAINT父表名_子表名_Xxxid_fkFOREIGNKEY(Xxxid)REFERENCES父表(Xxxid)ONDELETECASCADE);◆修改约束ALTERTABLE表名称ADDCONSTRAINT约束名称约束类型(约束字段);约束类型命名要统一:PRIMARYKEY:主键字段_PKUNIQUE:字段_UKCHECK:字段_CKFOREIGNKEY:父字段_子字段_FK范例:为person表(pid,name,
    age,birthday,sex)添加相应的约束ALTERTABLEpersonADDCONSTRAINTperson_pid_PKPRIMARYKEY(pid);ALTERTABLEpersonADDCONSTRAINTperson_name_UKUNIQUE(name);ALTERTABLEpersonADDCONSTRAINTperson_age_CKCHECK(ageBETWEEN0AND150);ALTERTABLEpersonADDCONSTRAINTperson_sex_CKCHECK(sexIN('男','女'));◎增加主-外键约束
     先为子表增加主键约束;ALTERTABLE子表名ADDCONSTRAINT子表名_主键字段_PKPRIMARYKEY(主键字段);ALTERTABLE子表名ADDCONSTRAINT父表名_子表名_父表主键字段_FKFOREIGNKEY(父表主键字段)REFERENCES父表名(父表主键字段)ONDELETECASCADE;◎删除约束ALTERTABLE父表名DROPCONSTRAINT约束名称;范例:删除person表中name和age上的约束,及删除子表book上的主-外键约束ALTERTABLEpersonDROPCONSTRAINTperson_name_UK;ALTERTABLEpersonDROPCONSTRAINTperson_age_CK;ALTERTABLEbookDROPCONSTRAINTperson_book_pid_FK;◆ROUNUM表示行号,也属于一个字段列,但是一个伪列,可以在每一张表中;SELECTROWNUM别名,字段1,字段2...FROM表名称;ROWNUM本身采用编号自动增长的形式出现的;也可以使用ROWNUM进行分批的查询;例如:ROWNUM<=5;SELECTROWNUM,字段1,字段2...FROM表名称WHEREROWNUM<=5;ROWNUM不支持BETWEEN...AND...的操作,如果要查询第6~10条记录,则只能只要子查询,以子查询结果作为主查询要查的表;范例:查询emp表中的6~10条记录SELECT*FROM(SELECTROWNUMrn,empno,ename,jobsalFROMempWHEREROWNUM<=10)tempWHEREtemp.rn>5;◆集合操作在Oracle中提供了三种类型集合操作:并(UNION)、交(INTERSECT)、差(MINUS)UNION:将多个查询的结果组合到一个查询结果中,没有重复内容;UNIONALL:也是将多个查询结果组合到一个查询之中,但是包含重复值;INTERSECT:返回多个查询结果中相同的部分;MINUS:返回多个查询结果的差集;◎UNION(并集)SELECT字段1,字段2,...FROM表1UNIONSELECT字段1,字段2,...FROM表2;◎UNIONALL(并集)SELECT字段1,字段2,...FROM表1UNIONALLSELECT字段1,字段2,...FROM表2;◎INTERSECT(交集)SELECT字段1,字段2,...FROM表1INTERSECTSELECT字段1,字段2,...FROM表2;◎MINUS(差集)SELECT字段1,字段2,...FROM表1MINUSSELECT字段1,字段2,...FROM表2;◆视图视图的功能:一个视图就是封装了一条复杂的查询语句;
     将复杂查询用视图封装,以后需要查询的时候直接查询视图即可;◎视图的创建CREATEVIEW视图名称AS子查询;视图创建完成之后可以像查数据表那样直接对视图进行查询操作;重复创建视图不允许视图重名;◎视图的删除DROPVIEW视图名称(purge);Oracle中为了方便修改视图,提供一个替
    换的命令:CREATEORREPLACE视图名称AS子查询;以上语法在更改视图的时候不用先删除已有的视图,系统会自动进行先删除后重建的功能;◎视图的修改UPDATE视图名称SET字段名称=值WHERE条件;视图创建的时候是有条件的,但一旦修改视图之后,此条件就有可能被破坏,所有在Oracle中提供了两个重要的参数:......WITHCHECKOPTION;......WITHREADONLY;——不能更新视图的创建条件——创建的视图只读
    ◆序列数据库中都存在一个自动增长的列,如果要想在Oracle中完成自动增长的功能,则只能依靠序列完成,所有的自动增长都需要用户手工完成处理;◎序列的创建CREATESEQUENCE序列名称[INCREMENTBYn][STARTWITHm][{MAXVALUEn|NOMAXVALUE}][{MINVALUEn|NOMINVALUE}][{CYCLE|NOCYCLE}][{CACHEn|NOCACHE}];nextVal:取得序列的下一个内容currVal:取得序列的当前内容创建含两个字段的数据表,向表中添加数据时手工使用序列INSERTINTO表名称(字段1,字段2)VALUES(序列名称.nextVal,序列名称.currVal);◎序列的删除DROPSEQUENCE序列名称(purge);◆同义词同义词,可以让其他用户通过一个名称方便的访问“用户名.表名称”(只适用于Oracle);例如之前的DUAL虚拟表是在sys用户下的,但是在scott下可以使用;◎创建同义词:CREATESYNONYM同义词名称FOR用户名.表名称;◎删除同义词DROPSYNONYM同义词名称;◆用户管理(所有操作在sys超级管理员窗口下进行)◎创建用户CREATEUSER用户名IDENTIFIEDBY密码;◎为用户授权GRANT权限1,权限2,...TO用户;授予用户创建SESSION的权限GRANTCREATESESSIONTO用户;----增长幅度n|从m开始----最大值n|没有最大值----最小值n|没有最小值----循环|不循环----缓存n|没有缓存
    其中1    序列创建后所有的自动增长由用户自己处理,所以在序列中提供了以下两种操作:
     如果要想把多个权限一次性赋予一个用户,则可以将这些权限定义成一组角色,Oracle中提供了两个主要的角色:CONNECT、RESOURCEGRANTCONNECT,RESOURCETO用户;◎为用户修改密码ALTERUSER用户名IDENTIFIEDBY新密码;◎让用户密码失效ALTERUSER用户名PASSWORDEXPIRE;让用户密码失效后,下次用户登录时会提示设置新的密码口令;◎将用户锁住ALTERUSER用户名ACCOUNTLOCK;◎为用户解锁ALTERUSER用户名ACCOUNTUNLOCK;◎将其他用户下的表的访问权限赋予新的用户GRANT权限{SELECT|INSERT|UPDATE|DELETE}ON用户名.表名称TO新用户;◎回收新用户对其他用户表的访问权限REVOKE权限{SELECT|INSERT|UPDATE|DELETE}ON用户名.表名称FROM新用户;◆
    数据库的备份与恢复Oracle中使用一下两个命令进行数据库的备份和恢复:|-数据库备份:exp|-数据库恢复:imp在本地硬盘建立一个数据备份存储文件夹,通过命令行方式进入到此文件夹之中,执行exp命令,默认继续下一步...即可将数据库中的全部数据备份出来EXPDAT.DMP文件;备份好数据后,通过命令行方式进入到此备份文件所在文件夹之中,通过imp命令,默认继续执行下一步,即可恢复数据库数据;◆嵌套表嵌套表:在一个表中还包含另一个子表;
    ◆PL/SQL基础在Oracle中所有的过程都是以PL/SQL块开始的;◎PL/SQL块的定义DECLARE声明一些变量;BEGIN程序的开发;DBMS_OUTPUT.PUT_LINE('输出的内容'||变量值);EXCEPTION程序中可能出现的异常END;/Oracle中使用“:=”的形式给变量进行赋值,而“=”是作为判断使用的;◎Oracle中打开SQLPlusw的输出界面SETSERVEROUTPUTON;在PL/SQL块中也可以直接进行数据库的查询操作;可以使用替代变量“&;”;范例:通过输入雇员编号,查询并显示该编号的雇员
     DECLAREenoNUMBER;--接收传入的编号nameVARCHAR2(20);--保存查询出来的雇员BEGINDBMS_OUTPUT.PUT_LINE('请输入雇员编号:');--提示信息eno:=&;empnonumber;--接收输入信息的名称SELECTenameINTOnameFROMempWHEREempno=eno;--将查询到的ename给nameDBMS_OUTPUT.PUT_LINE('编号是:'||eno||'的雇员是:'||name);EXCEPTION--当程序出现错误的时候执行此语句WHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('没有发现此员工!');END;/如果在查询中出现异常,则通过异常处理来解决;而且在PL/SQL块中还可以编写循环、判断等操作语句;◎循环操作:LOOP循环(先执行后判断)DECLAREiNUMBER;BEGINi:=1;--给变量赋予初始值LOOP--循环开始DBMS_OUTPUT.PUT_LINE('i='||i);EXITWHENi>=10;--循环结束条件i:=i+1;--修改循环条件ENDLOOP;--循环结束END;/◎循环操作:WHILE...LOOP循环(先判断后执行)DECLAREiNUMBER;BEGINi:=1;--给变量赋予初始值WHILE(i<=10)LOOP--循环开始,并判断条件DBMS_OUTPUT.PUT_LINE('i='||i);i:=i+1;--修改循环条件ENDLOOP;--循环结束END;/◎循环操作:FOR...循环(先判断后执行)DECLAREiNUMBER;BEGINFORiIN1..10LOOP--循环开始,给变量赋予初始值,并判断修改循环条件DBMS_OUTPUT.PUT_LINE('i='||i);ENDLOOP;--循环结束END;/◎IF条件分支判断操作
     DECLAREnumNUMBER;BEGINnum:=11;--给变量赋予初始值IFnum>10THEN--判断开始DBMS_OUTPUT.PUT_LINE('记录大于10条!');ENDIF;--判断结束END;/◎IF...ELSE分支判断DECLAREnumNUMBER;BEGINnum:=8;--给变量赋予初始值IFnum>10THE
    N--判断开始DBMS_OUTPUT.PUT_LINE('记录大于10条!');ELSEDBMS_OUTPUT.PUT_LINE('记录不大于10条!');ENDIF;--判断结束END;/if...elseif...else...在Oracle中只能使用elsif◎IF...ELSIF...ELSE...分支判断DECLAREnumNUMBER;BEGINnum:=8;--给变量赋予初始值IFnum>10THEN--判断开始DBMS_OUTPUT.PUT_LINE('记录大于10条!');ELSIFnum<10THENDBMS_OUTPUT.PUT_LINE('记录小于10条!');ELSEDBMS_OUTPUT.PUT_LINE('记录等于10条!');ENDIF;--判断结束END;/◆游标游标是内存中用于装载记录的一个区域;如果要使用游标,需要按照以下的步骤进行处理:1、声明游标;2、打开游标;3、取得游标进行PL/SQL的使用,经将内容放到变量之中;4、关闭游标;Oracle中使用ROWTYPE表示可以装载一行数据的类型;范例:ROWTYPE表示一行数据DECLAREerowenoemp%ROWTYPE;emp.empno%TYPE;--此变量可以装载下一行emp的记录--使用emp表中的empno字段的类型定义eno变量
     BEGINeno:=7369;SELECT*INTOerowFROMempWHEREempno=eno;DBMS_OUTPUT.PUT_LINE(':'||erow.ename);END;/◎使用游标依次取出每一行记录(使用ROWTYPE定义的变量,用过游标进行访问)DECLAREerowemp%ROWTYPE;--此变量可以装下一行的emp记录CURSORmycurISSELECT*FROMemp;--声明一个游标,游标的名称是mycurBEGINOPENmycur;--打开游标FETCHmycurINTOerow;--移动游标,并将移动后的内容放到erow之中WHILE(mycur%FOUND)LOOP--如果游标的内容存在DBMS_OUTPUT.PUT_LINE(erow.empno||'-->'||erow.ename);FETCHmycurINTOerow;--输出之后继续移动游标ENDLOOP;CLOSEmycur;--关闭游标END;/◎使用LOOP循环的方式操作游标(手工打开游标,手工关闭游标,手工移动游标)DECLAREerowemp%ROWTYPE;--此变量可以装下一行的emp记录CURSORmycurISSELECT*FROMemp;--声明一个游标,游标的名称是mycurBEGINOPENmycur;--打开游标LOOPFETCHmycurINTOerow;--移动游标,并将移动后的内容放到erow之中EXITWHENmycur%NOTFOUND;--没有发现数据时退出循环DBMS_OUTPUT.PUT_LINE(erow.empno||'-->'||erow.ename);ENDLOOP;CLOSEmycur;--关闭游标END;/◎for循环对游标的支持DECLAREerowemp%ROWTYPE;--此变量可以装下一行的emp记录CURSORmycurISSELECT*FROMemp;--声明一个游标,游标的名称是mycurBEGINFORerowINmycurLOOP--自动打开、关闭、移动游标DBMS_OUTPUT.PUT_LINE(erow.empno||'-->'||erow.ename);ENDLOOP;END;/游标中可以使用%FOUND、%NOTFOUND、%ROWCOUNT、%ISOPEN;其中ROWCOUNT和之前的ROWNUM是一样的;◆过程
     过程=过程的声明+PL/SQL块◎过程的创建CREATEORREPLACEPROCEDURE过程名称(myproc)AS变量...BEGINnullEND;/范例:CREATEORREPL
    ACEPROCEDUREmyproc(enoemp.empno%TYPE)ASesalemp.sal%TYPE;BEGINSELECTsalINTOesalFROMempWHEREempno=eno;DBMS_OUTPUT.PUT_LINE('工资是:'||esal);END;/◎过程是需要调用的,使用exec过程(参数)的形式调用EXECmyproc(7369);◎对应过程的参数有三种类型:IN(传递一个数值,默认值)INOUT(带值进,并且修改后的值可以带出来)OUT(不带值进,但是可以带值出)范例:定义过程:CREATEORREPLACEPROCEDUREmyproc(enoINemp.empno%TYPE,esalOUTemp.sal%TYPE)ASBEGINSELECTsalINTOesalFROMempWHEREempno=eno;END;/调用过程:DECLAREenoemp.empno%TYPE;esalaryemp.sal%TYPE;BEGINeno:=&;empno;myproc(eno,esalary);DBMS_OUTPUT.PUT_LINE(esalary);END;/◆函数◎函数的定义CREATEORREPLACEFUNCTIONmyfun(enoNUMBER)RETURNNUMBER--函数名及返回值ASesalNUMBER;--变量如:execmyproc(7369);
     BEGINSELECTsal+NVL(comm,0)INTOesalFROMempWHEREempno=eno;RETURNesal;--把内容返回END;/◎调用函数SELECTmyfun(7369)FROMDUAL;◆数据库设计范式◎第一范式(1NF)数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等;◎第二范式(2NF)数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。◎第三范式(3NF)在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在“A-->B-->C”的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库应该不存在如下依赖关系:关键字段-->非关键字段X-->非关键字段Y◆数据库设置工具Sybase的PowerDesigner工具的使用
    
    
  • 上一篇资讯: OracleSQL语法和性能优化
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师