我个人关于ORACLE课程提纲的总结
1.简单介绍下ORACLE的总体框架
oracle的体系很庞大,要学习它,首先让我们了解oracle的框架。在这里,简要的讲一下oracle的架构
1、物理结构(由控制文件、数据文件、重做日志文件、参数文件、归档文件、密
码文件组成)
控制文件:包含维护和验证数据库完整性的必要信息、一个数据库至少需要一
个控制文件
数据文件:存储数据的文件
重做日志文件:含对数据库所做的更改记录,这样万一出现故障可以启用数据恢复。一个数据库至少需要两个重做日志文件
参数文件:定义Oracle例程的特性,例如它包含调整SGA中一些内存结构大小的参数
归档文件:是重做日志文件的脱机副本,这些副本可能对于从介质失败中进行恢复很必要。
密码文件:认证哪些用户有权限启动和关闭Oracle例程
2、逻辑结构(表空间、段、区、块)
表空间:是数据库中的基本逻辑结构,一系列数据文件的集合。段:是对象在数据库中占用的空间
区:是为数据一次性预留的一个较大的存储空间
块:ORACLE最基本的存储单位,在建立数据库的时候指定
3、内存分配(SGA和PGA)
SGA:是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含
Oracle服务器的数据和控制信息,它是在Oracle服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。
PGA:包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA正相反PGA是只被一个进程使用的区域,PGA在创建进程时分配在
终止进程时回收
4、后台进程(数据写进程、日志写进程、系统监控、进程监控、检查点进程、归
档进程、服务进程、用户进程)
数据写进程:负责将更改的数据从数据库缓冲区高速缓存写入数据文件日志写进程:将重做日志缓冲区中的更改写入在线重做日志文件
系统监控:检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复
进程监控:负责在一个Oracle进程失败时清理资源
检查点进程:负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。
归档进程:在每次日志切换时把已满的日志组进行备份或归档服务进程:用户进程服务。
用户进程:在客户端,负责将用户的SQL语句传递给服务进程,并从服务器段拿回查询数据。
5、oracle例程:Oracle例程由SGA内存结构和用于管理数据库的后台进程组成。
例程一次只能打开和使用一个数据库。6、SCN(SystemChangeNumber):系统改变号,一个由系统内部维护的序列号。当系统需要更新的时候自动增加,他是系统中维持数据的一致性和顺序恢复的重要标志。
2.介绍项目中常用的标准SQL知识点
oracle左/右/全连接
innerjoin--内连接和where相同;相当于join;
leftjoin--左向外连接,返回左边表所有符合条件的rightjoin--右向外连接,返回右边表所有符合条件的
fulljoin--完整外部连接,左向外连接和右向外连接的合集--建立测试数据
createtablea(idnumber);createtableb(idnumber);createtablec(idnumber);
insertintoavalues(1);insertintoavalues(2);insertintoavalues(3);insertintobvalues(1);insertintobvalues(2);insertintobvalues(4);insertintocvalues(1);--左:
--主流数据库通用的方法
select*fromaleftjoinbona.id=b.id;
--Oracle特有的方法--最好不要用这样,不便于sql语句的移植。select*froma,bwherea.id=b.id(+);IDID
--------------------11223
--右:
--主流数据库通用的方法
select*fromarightjoinbona.id=b.id;--Oracle特有的方法
select*froma,bwherea.id(+)=b.id;
IDID
--------------------1124--内
--主流数据库通用的方法
select*fromajoinbona.id=b.id;--where关联
select*froma,bwherea.id=b.id;
IDID
--------------------11
22--全外
--主流数据库通用的方法
select*fromafulljoinbona.id=b.id;--Oracle特有的方法select*froma,b
wherea.id=b.id(+)union
select*froma,b
wherea.id(+)=b.id;
IDID
--------------------11223
4对于多表查询,如下:select*froma
leftjoinbona.id=b.idleftjoinconc.id=b.id;
IDID
--------------------11223
相当于先进行第一个leftjoin,得到结果集A(3条记录);结果集A再与第二个leftjoin进行查询;select*froma
leftjoinbona.id=b.idrightjoinconc.id=b.id;相当于先进行第一个leftjoin,得到结果集A(3条记录);结果集A再与rightjoin进行查询,即以c表为主,因为C表只有一个记录,所以最终才显示一条记录;
3.查询效率优化方式介绍
表索引介绍,表索引的建立技巧索引优点:
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。第四,在使用分组和排序子句进行数据检索时,同样可以显着减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。(哪给表中的所有列加上索引是否合理)
索引缺点:
第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的
物理空间,如果要建立聚簇索引,那么需要的空间就会更大。第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就
降低了数据的维护速度。
(索引是建立在数据库表中的某些列的上面。因此,在创建Oracle数据库索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。)
建议创建索引的列:
在经常需要搜索的列上,可以加快搜索的速度;
在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
不该创建索引的列:
对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索
引,反而降低了系统的维护速度和增大了空间需求。对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索
速度。
对于那些定义为text,image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建Oracle数据库索引。
NESTEDLOOP:
对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择。在嵌套循环中,内表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回的结果集不能太大(大于1万不适合),要把返回子集较小表的作为外表(CBO默认外表是驱动表),而且在内表的连接字段上一定要有索引。当然也可以用ORDERED提示来改变CBO默认的驱动表,使用USE_NL(table_name1table_name2)可是强制CBO执行嵌套循环连接。
Nestedloop一般用在连接的表中有索引,并且索引选择性较好的时候.
步骤:确定一个驱动表(outertable),另一个表为innertable,驱动表中的每一行与inner表中的相应记录JOIN。类似一个嵌套的循环。适用于驱动表的记录集比较小(
扩展阅读:Oracle课程小结1 整本书内容
Oracle课程小结
1.Dual
Dual是Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中
DUAL就是个一行一列的表,如果你往里执行insert、delete、truncate操作,就会导致很多程序出问题
不要去执行dropdual的操作,否则会使系统不能用,数据库起不了
DUAL是属于SYSschema的一个表,然后以PUBLICSYNONYM的方式供其他数据库USER使用
2.Null
在Oracle中,值null被看作一个未知值,任何包含NULL值的算术运算都会得到结果NULL,。因此,下面的select语句返回nullselect5+7+null+9fromdual;selectnull*9fromdual;
空字符串:Oracle把空字符串("")当作null,因此length("")的值是null,而不是0。
一个null值与任何其它值比较,包括null值,结果都是null,因此,对NULL的=、!=、>、=、
3.函数
函数是一种有零个或多个参数并且有一个返回值的程序。在SQL中Oracle内建了一系列函,也可自定义函数数单行函数,多行函数(组函数)
Lower(c)--小写转换返回c小写字符
Concat(c1,c2)--连接字符串
c1,c2均为字符串,函数将c2连接到c1的后面,如果c1为null,将返回c2.如果c2为null,则返回c1,如果c1、c2都为null,则返回null,如果c1,c2其中之一为数字,或都为数字
Concat("10",10)Concat(10,10)
Substr(string,start_position,[length])--取字串参数1:string要处理的字符串参数2:截取字符串的开始位置
参数3:截取的字符串的长度(而不是字符串的结束位置),如果省略,则返回从start_position开始到string尾之间的字符串SelectSUBSTR("Hello",2)FromDual
Instr(column|expression,"string",[m],[n])--查询指定字符在字符串中的位置
参数1:被搜索的字符串或者是表达式参数2:要查找的字符
参数3:从什么位置开始查询
参数4:这个字符出现的位置比如说:第一次出现的位置,第二次出现的位置。如果此参数3为正,从左到右开始检索,如果此参数为负,从右到左检索最后两个参数是默认的是1和1
SELECTinstr("abc","d")FROMdual;--返回0
SELECTinstr("syranmo","a",1,2)FROMdual;--返回0SELECTINSTR("oWo","W")FROMDUAL;--?
Round(number,[decimalplaces])--四舍五入函数参数1:要处理的数值(数值表达式)
参数2:四舍五入时取的小数的位数,不填则返回整数selectround(123.456)fromdual;得到123selectround(123.456,0)fromdual;得到123selectround(123.456,1)fromdual;得到123.5selectround(123.456,2)fromdual;得到123.46selectround(123.456,3)fromdual;得到123.456selectround(-123.456,2)fromdual;得到-123.
Mod(number,divisor)--返回一个number除以divisor的余数参数1:为被除数。
参数2:为除数。如果divisor为零,函数MOD返回值为原来number
MOD(3,2)等于1MOD(3,0)等于3MOD(2,3)等于2
To_char(date,"format_model")--日期转为字符To_char(number,"format_model")--数字转为字符
格式化元素,用于显示字符形式的数字值:"9"表示一个数,"."打印一个小数点","打印一个千位指示
SELECTTO_CHAR(12345.529,"999,999.99")FROMDUAL;--12,345.53
Replace(text,search_string,replacement_string)--替换字符串
从字符串(text)查找一个文本表达式(search_string),如果找到,用指定的置换串(replacement_string)代替它
如果replacement_string为空,那么所有的search_string都被移除。如果search_string为null,那么就返回原来的
SELECTREPLACE("hello","ello","i")FROMDUAL;--hi
To_number([,,])
是将一些处理过的按一定格式编排过的字符串变回数值型的格式SELECTTO_NUMBER("20")*5FROMDUAL;--100
To_date(string1,[format_mask],[nls_language])--转换为日期Format_mask"yyyy-MM-ddHH24:mi:ss"
selectTo_Date("1981-1-1","YYYY-MM-DD")fromdual--1981-1-1
Length(string)--返回字符串的长度
selectlength("我")fromdual--1selectlength("AB")fromdual-2
4.dbms_output
如果dbms_output.put_line的内容不能显示,需要在命令行中先敲入setserveroutputon;
put和put_line
当使用过程put_line时,会自动在行的尾部追加行结束符;当使用过程put时,需要使用过程new_line追加行结束符.
setserverouton
begin
dbms_output.put_line("伟大的中华民族");
dbms_output.put("中国");
dbms_output.put(",伟大的祖国");
dbms_output.new_line;
end;/
伟大的中华民族
中国,伟大的祖国
new_line
该过程用于在行的尾部追加行结束符.当使用过程PUT时,必须调用NEW_LINE过程来结束行.
5.PL/SQL块DECLARE/*
*定义部分(可选)定义常量、变量、复杂数据类型、游标、例解*/
BEGIN/*
*执行部分(必须)PL/SQL语句和SQL语句*/
EXCEPTION/*
*异常处理部分(可选)处理运行错误*/
END;/*块结束标记*/命名块:指具有特定名称标识的PL/SQL块,在PL/SQL块前使用加以标记
begin
dbms_output.put_line("Hello,World!");begin
dbms_output.put_line("Good");end;--end;--
赋值操作符“:=”变量名:=值
定义变量
变量名数据类型
StudScoreNUMBER(5,2);StudNameVARCHAR(20);
定义常量
添加关键字CONSTANT并赋值
PICONSTANTNUMBER(8,7):=3.1415926;
条件控制
有三种语句形式IF-THEN
IF-THEN-ELSEIF-THEN-ELSIF
IFTHEN语句;ENDIF;
IFTHEN语句;ELSE语句;ENDIF;
IFTHEN语句;
ELSIFTHEN语句;
ELSIFTHEN语句;ELSE语句;ENDIF;
CASE
WHENTHEN语句;
WHENTHEN语句;
WHENTHEN语句;[Else]语句;EndCase;
CASE
WHENTHEN语句;
WHENTHEN语句;
WHENTHEN语句;[Else]语句;
EndCase;
有三种形式的LOOP语句LOOP
WHILE-LOOPFOR-LOOP
LOOP语句;
[EXIT]
[EXIT-WHEN]ENDLOOP;
EXIT强制循环无条件完成立即退出循环
EXITWHEN;EXIT语句时对WHEN子句中的条件进行判断如果判定条件为TRUE,则循环完成
WHILELOOP
语句;ENDLOOP;
FORIN[Reverse]lower_bound..higher_boundLOOP语句;ENDLOOP;
6.子程序过程
用于执行某项操作函数
用于执行某项操作并返回值
存储过程语法
CREATE[ORREPLACE]PROCEDURE[(参数1,参数N)]IS|AS[局部声明]BEGIN
可执行语句;EXCEPTION
[例外处理程序];END[];参数说明
变量名[IN|OUT|INOUT]
IN:输入,接受值,默认模式
OUT:输出,将值返回给子程序的调用程序INOUT:输入输出,接受值并返回已更新的值对于IN模式的实参可以是常量或变量,但对于OUT和INOUT模式的实参必须是变量。
CreateOrReplaceProcedureProcGetName(StudNameinoutvarchar2)isBegin
StudName:=substr(StudName,instr(StudName,"明",2));End;/
declare
StudNamevarchar2(15):="明小明";begin
ProcGetName(StudName);
DBMS_OUTPUT.PUT_LINE(StudName);end;函数语法
CREATE[ORREPLACE]FUNCTION[(参数1,参数N)]RETURNdatatypeIS[局部声明]BEGIN可执行语句;[EXCEPTION][例外处理程序]END[];
仅接受IN参数
CreateOrReplaceFunctionGetItemScore(Stand_Ansvarchar2,Custor_Ansvarchar2)returnintis
LenCustorint:=length(Custor_Ans);begin
ifLenCustor>length(stand_ans)orCustor_AnsISNULLthenreturn0;endif;
foriin1..LenCustorloop
ifinstr(stand_ans,substr(custor_ans,i,1))=0thenreturn0;endif;endloop;
returnLenCustor;end;/
SelectGetItemScore("ABC","AC")FromDual;
7.OracleSQL*Plus命令
setlinesize设置每行显示的长度SETLINESIZE100
start或@告诉SQLPLUS执行已经存储到sql文件中语句
执行一个SQL脚本文件SQL>startfile_nameSQL>@file_name
我们可以将多条sql语句保存在一个文本文件中,这样当要执行这个文件中的所有的sql语句时,用上面的任一命令即可
修改用户密码
ALTERUSER用户名IDENTIFIEDBY密码;
oracle中逻辑运算符(not,and,or)及其优先级
这3种逻辑运算符中,NOT运算符的优先级最高,而后是AND,最后是OR
Oracle中的SPOOL命令是假脱机命令,可用于转储执行的命令和结果,其效果有点像DOS命令中的转向命令。SPOOL命令也可以用于转出数据库系统中的数据。
例如在SQL*Plus命令行中可以直接输入:SPOOL假脱机文件名启动假脱机操作。
关闭假脱机操作可以在SQL*Plus中输入:SPOOLOFF例:假脱机命令的使用。spoolc:\\SpoolFile.txtsetpagesize300setlinesize300select*fromemp;select*fromdept;spooloff;
执行完毕后,可以在C盘中找到SpoolFile.txt,打开后可以看到通过Spool假脱机命令转向到该文件中的内容。
8.记录类型
定义一个RECORD类型TYPEISRECORD(
fieldname1[NOTNULL]:
fieldnameN[NOTNULL]);
属性的类型
%TYPE引用数据库列
%ROWTYPE代表表中的行
%type和%rowtype可以用来指定列的数据类型
SNameStudInfo.StudName%Type;Stud_RecStudInfo%ROWTYPE;
TypeVIPStudRecisrecord(
VIPIDVarchar2(15),VIPNamevarchar2(20));
声明记录类型变量
StudRecVIPStudRec;
引用字段的语法是
recordname.columnname用于给列赋值的语法是
recordname.columnname:=expression;
语法
SELECTINTOFROMWHERE;
SELECTStudNo,StudNameINTOStudRecFROMStudInfoWHEREStudNo=‘99070470’;fetchmycurintoStudRec;
TIDTeacherInfo.TeacherNo%Type;TNameTeacherInfo.TeacherName%type;
9.游标
CURSORIS;
CURSORmycuris
selectTeacherNo,TeacherNameFromTeacherInfo
WhereTeacherBirthDay>=To_Date("1981-2-5","YYYY-MM-DD");控制显式游标OPENFETCHCLOSE
在使用OPEN、CLOSE或FETCH语句引用这些语句之前必须对游标进行声明
OPENopenmycur;
FETCHINTOvar1,…,varN;OR
FETCHINTOrecord_variable;fetchmycurintoTID,TName;
每个游标有四个属性可以用于访问游标的环境区域%NOTFOUND%FOUND%ROWCOUNT%ISOPEN
循环取记录
whilemycur%foundloopdbms_output.put_line(TID||TNAME);fetchmycurintoTID,TName;endloop;
CLOSE;
closemycur;
10.表
CREATETABLE[schema.]table
(columndatatype[DEFAULTexpr][,...]);指定:表名
列名、列数据类型和列的大小
数据类型
VARCHAR2(size)可变长度的字符数据长度可以到4000字节CHAR(size)固定长度的字符数据NUMBER(p,s)可变长度的数字数据DATE日期和时间值NCHAR、NVARCHAR2,国家字符集,与环境变量NLS指定的语言集密切相关,使用方法和CHAR、VARCHAR2相同。
在创建表时,为一个列指定一个默认值createtablec(c1char(10)DEFAULT"1111")
altertabletestaddsyddatedefaultsysdate;
altertabletmodify(cccdefault"ccc");altertabletmodify(cccdefaultnull);
INSERTINTOdepartments
(department_id,department_name,manager_id)VALUES(300,"Engineering",DEFAULT);
UPDATEdepartments
SETmanager_id=DEFAULTWHEREdepartment_id=10;
约束类型NOTNULLUNIQUE
PRIMARYKEYFOREIGNKEYCHECK
列级约束
column[CONSTRAINTconstraint_name]constraint_type,表级约束column,...
[CONSTRAINTconstraint_name]constraint_type(column,...),
NOTNULL约束
只能定义在列级,不能定义在表级.
防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值
CREATETABLEemployees(
employee_idNUMBER(6),
last_nameVARCHAR2(25)NOTNULL,salaryNUMBER(8,2),commission_pctNUMBER(2,2),hire_dateDATE
CONSTRAINTemp_hire_date_nnNOTNULL,...
UNIQUE约束
用来保护一个表中的一个或者多个列没有任何两行在收到保护的列中具有重复的数据.ORACLE在唯一键列上自动生成一个唯一索引以实现唯一性
CREATETABLEemployees(
employee_idNUMBER(6)unique,
last_nameVARCHAR2(25)NOTNULL,emailVARCHAR2(25),salaryNUMBER(8,2),commission_pctNUMBER(2,2),hire_dateDATENOTNULL,...
CONSTRAINTemp_email_ukUNIQUE(email));
PRIMARYKEY约束
唯一键的所有特征都适用于主键约束,只是在主键列中不允许有NULL值CREATETABLEdepartments(
department_idNUMBER(4),emailVARCHAR2(25),location_idNUMBER(4),CONSTRAINTdept_id_pkPRIMARYKEY(department_id));
FOREIGNKEY约束
通过使用公共列在表之间建立一种父子(parent-child)关系,在表上定义的外部键可以指向主键或者其他表的唯一键.
CREATETABLEemployees(
employee_idNUMBER(6),...
department_idNUMBER(4),
CONSTRAINTemp_dept_fkFOREIGNKEY(department_id)REFERENCESdepartments(department_id),
CHECK约束
检查在约束中指定的条件是否得到了满足.
createtableemployees(salnumber(7,2)
constraintemp_sal_ck1check(sal>0))
createtabley(
idvarchar2(7)
check(ascii(substr(id,1,1))between65and90andsubstr(id,1,1)isnotnullandascii(substr(id,2,1))between65and90andsubstr(id,2,1)isnotnullandascii(substr(id,3,1))between65and90andsubstr(id,3,1)isnotnullandascii(substr(id,4,1))between65and90andsubstr(id,4,1)isnotnullandascii(substr(id,5,1))between65and90andsubstr(id,5,1)isnotnull));
CREATETABLETT(
department_idNUMBER(4)check(department_idlike"trj%"),emailVARCHAR2(25)PRIMARYKEY);
CREATETABLETT(
department_idNUMBER(4),
emailVARCHAR2(25)PRIMARYKEY,
STUDSEXVARCHAR2(2)CHECK(STUDSEXIN("男","女")));
添加一个新行到表中INSERTINTOtable[(column[,column...])]VALUES(value[,value...]);
INSERTINTOdepartmentsVALUES(100,"Finance",NULL,NULL,SYSDATE,TO_DATE("FEB3,1999","MONDD,YYYY");
改变表中的数据UPDATEtableSETcolumn=value[,column=value,...][WHEREcondition];
UPDATEcopy_emp
SETdepartment_id=110
WHEREdepartment_name="HELLO";
从表中删除行
DELETE[FROM]table[WHEREcondition];
DELETEFROMdepartments
WHEREdepartment_name="Finance";
11.视图
视图是一个SQL查询,它永久存在于数据库中,并被赋予了一个名称,视图是从基表中生成的虚拟表
CREATE[ORREPLACE][FORCE|NOFORCE]VIEWview[(alias[,alias]...)]ASsubquery
[WITHCHECKOPTION[CONSTRAINTconstraint]][WITHREADONLY[CONSTRAINTconstraint]];
withcheckoption:表名只有子查询检索的行才能被插入、删除、更新withreadonly:说明只能对基表中的行进行只读访问
onstraint_name:指定withcheckoption或readonly约束的名称。
CREATEVIEWsalvu50
ASSELECTemployee_idID_NUMBER,last_nameNAME,salary*12ANN_SALARYFROMemployees
WHEREdepartment_id=50;
SELECT*FROMsalvu50;
内建视图是一个带有别名(或相关名)的可以在SQL语句中使用的子查询
Top-N分析
SELECTROWNUMasRANK,last_name,salaryFROM(SELECTlast_name,salaryFROMemployeesORDERBYsalaryDESC)AWHEREROWNUMWHEREexproperator(SELECTselect_listFROMtable);
查询的结果进行排序处理。排序处理是通过ORDERBY子句来实现的。ORDERBYorder_list[ASC|DESC]
13.组函数AVGCOUNTMAXMINSUM
SELECT[column,]group_function(column),...FROMtable
[WHEREcondition][GROUPBYcolumn][ORDERBYcolumn];
SELECTAVG(salary),MAX(salary),MIN(salary),SUM(salary)FROMemployees
WHEREjob_idLIKE"%REP%";
SELECTCOUNT(*)FROMemployees
WHEREdepartment_id=50;
SELECTCOUNT(DISTINCTdepartment_id)FROMemployees;
约束分组结果:HAVING子句GROUPBY子句
SELECTdepartment_id,AVG(salary)FROMemployees
WHEREAVG(salary)>8000GROUPBYdepartment_id;
14.综合知识
1.学生信息表(StudInfo)数据类字段是否P字段名称约束型长度为空KStudNoVarchar215Y字段描述举例StudNameVarchar220StudSexChar2男,女StudBirthDDateYayClassNameVarchar250班级名称计本012.课程信息表(CourseInfo)字段是否字段名称数据类型PK字段描述举例长度为空CourseIDVarchar210Y课程编号A0101CourseNamVarchar2eCourseDescVarchar250100Y课程名称Oracle课程描述OracleDB学生学号201*070470学生姓名李明学生性别男出生年月1980-10-33.学生成绩表(StudScoreInfo)字段名数据类字段是否PK约束称型长度为空StudNoVarchar215Y字段描述举例CourseIDVarchar210YStudScorNumber4,1[0,100e]注:一个学生可选修多门课,同一门课可由多个学生选修。
学生学号201*070470课程编号A0101学生成绩80.51.分别写出向以上各表插入一条记录的SQL语句。(记录为举例中的数据)2.写出更新学生成绩表(StudScoreInfo)中学号为201*070470,课程编号为A0101的成绩为85.5的SQL语句。
3.写出在课程信息表(CourseInfo)中删除课程编号为B0101的SQL语句。4.写出查询姓李的学生基本信息的SQL语句。
5.在学生成绩表(StudScoreInfo)中,写出将课程编号为A0101成绩从高到低排序的SQL语句。
6.写出在学生成绩表(StudScoreInfo)中查询学生成绩大于等于90小于等于100或者大于等于70小于等于80的SQL语句。7.在学生成绩表(StudScoreInfo)中,写出统计各学生总分、平均分、课程门数、最高分、最低分的SQL语句。
8.写出统计学生平均分大于80的SQL语句。
9.写出查询平均分最高的5个学生成绩统计信息(包括学号、平均分字段)中的SQL语句。10.写出查询重修(学生成绩小于60即为重修)15门以上的学生基本信息的SQL语句。11.综合利用所学知识,用SQL语句实现将各学生平均分(需统计)按以下等级输出,包括学生学号(StudNo)、平均分(PScore)、成绩等级(ScoreLevel)字段。
平均分(PScore)成绩等级(ScoreLevel)PScore>=90
优秀
良好中等及格
80= 友情提示:本文中关于《我个人关于ORACLE课程提纲的总结》给出的范例仅供您参考拓展思维使用,我个人关于ORACLE课程提纲的总结:该篇文章建议您自主创作。 来源:网络整理 免责声明:本文仅限学习分享,如产生版权问题,请联系我们及时删除。
《我个人关于ORACLE课程提纲的总结》
由互联网用户整理提供,转载分享请保留原作者信息,谢谢!
http://m.bsmz.net/gongwen/712076.html