Oracle数据库教案_第1页
Oracle数据库教案_第2页
Oracle数据库教案_第3页
Oracle数据库教案_第4页
Oracle数据库教案_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Oracle数据库教案 Oracle的四大创始人Oracle数据库中有个默认用户SCOTT,就是Bruce Scott,而SCOTT用户的默认密码tiger,是当时Scott养的一只猫的名字。 xx年4月Oracle公司以74亿美元收购SUN公司。 1.2Oracle的版本Oracle8i(inter):表示Oracle公司开始正式进入互联网。 Oracle9i:与Oracle8i相关,性能更佳,管理更人性化。 Oracle10g(grid):网格技术Oracle11g(grid):网格技术网格是利用互联网把地理上广泛分布的各种资源(包括计算资源、存储资源、带宽资源、软件资源、数据资源、信息资源、知识资源等)连成一个逻辑整体,就像一台超级计算机一样,为用户提供一体化信息和应用服务(计算、存储、访问等),彻底消除资源“孤岛”,最充分的实现信息共享。 1.3Oracle的安装(演示)重要概念21.全局数据库名与SID1)全局数据库名是数据库的名称,当数据库处于网络中时,为标识该数据库的网络位置,需要用数据库名和网络位置组成其全局数据库名,其命名格式是database_name.database_domain。 例如sales.atg.,其中sales为数据库名,atg.为数据库域。 指定全局数据库名时,尽量为数据库选择能够反映其用途的名称,例如sales。 数据库域用于将数据库与分布式环境中的其他数据库区分开来。 例如在上海的数据库可以命名为sales.shanghai.,北京的数据库可以命名为sales.beijing.。 即使数据库名都相同,但数据库域不同,所以也能区分开。 2)SID(数据库实例名)用于对外相连时使用。 Oracle实例(Instance)是用来访问数据库文件集的存储结构与后台程序的集合。 Oracle数据库其实是磁盘上的一堆文件;为了启动数据库即访问这堆文件,需要在内存中创建它的一个实例,然后由实例加载并打开数据库。 用户连接数据库时,实际上是连接到实例,然后由实例负责与数据库通信,再将处理结果返回给用户。 Oracle中一个数据库至少有一个实例与之对应,但一个数据库也可以对应多个实例,被多个实例访问。 因此SID主要用于区分同一台计算机上不同的实例。 对于单实例数据库,其SID通常与数据库名相同。 一个运行着的ORACLE数据库可以看成是一个ORACLE SERVER,该SERVER由数据库(Database)和实例(Instance)组成,Oracle服务器Oracle数据库Oracle实例一般情况下一个ORACLE SERVER包含一个实例和一个与之对应的数据库,但是在特殊情况下,如8i的OPS,9i的RAC,一个SERVER中一个数据库可以对应多个实例。 当某一实例出现故障时,其他实例自动服务。 2.Oracle的常用账户3用户名sys角色超级管理员默认密码说明change_on_install system普通管理员manager scott普通用户(练习常用)tiger所有oracle的数据字典的基表和视图都存放在sys用户中,这些基表和视图对于oracle的运行是至关重要的,由数据库自己维护,任何用户都不能手动更改。 sys用户拥有dba,sysdba,sysoper等角色或权限,是oracle权限最高的用户。 用于存放次一级的内部数据,如oracle的一些特性或工具的管理信息。 system用户拥有普通dba角色权限。 可用来创建其他用户。 在默认情况下从Oracle10g开始,scott不能登陆。 被禁用了。 需要手工解锁。 3.安装后的注意事项Oracle安装完成后至少要启动两个服务OracleOraDb11g_home1TNSListener:监听器,监听程序的服务进程。 OracleServiceORCL:主服务,是Oracle数据库实例的服务进程。 建议将启动类型改为手动。 1.4Oracle的常用管理工具1.使用SQL*Plus在Oracle中,用户对数据库的操作主要是通过SQL*Plus工具来实现的。 应用举例 (1).查看当前连接用户SQLshow user (2).查看全局数据库名SQLSELECT*FROM global_name; (4).清空屏幕SQLcl scr;2.使用Oracle EnterpriseManager(OEM)Oracle EnterpriseManager(OEM)提供了基于Web界面的、可管理单个数据库的工具。 4使用步骤 (1).启动OracleDBConsoleorcl服务 (2).启动浏览器,输入OEM的URL地址(s:/主机名:1158/em),或者直接在【开始】菜单的Oracle程序组中选择Database Controlorcl命令即可。 (3).注意事项只能用sys和system用户登陆,sys必须用SYSDBA身份登陆。 3.使用DBCA创建数据库如果在安装Oracle时选择仅安装数据库服务器软件,而不创建数据库,就需要安装后手动创建数据库。 如果在系统中已经存在Oracle数据库,为了充分利用服务器的资源,建议不要再创建一个数据库。 DBCA(Database ConfigurationAssistant)是一个图形化用户界面的工具,DBA通过它可以快速、直观地创建数据库。 选择【开始】【程序】Oracle-OraDb11g_home1|【配置和移置工具】Database ConfigurationAssistant命令,打开DBCA界面。 用户只需要根据DBCA的提示逐步进行设置,就可以根据相应配置创建数据库。 5第2章SQL*Plus命令2.1用户管理命令1.更改用户登录命令格式conn用户名/密码AS SYSDBA注意如果连接的是超级管理员(SYS),必须写上AS SYSDBA2.用户加锁和解锁加锁SQLalter user用户名aount lock;解锁SQLalter user用户名aount unlock;3.更改用户密码命令格式SQLalter user用户名identified by密码;注意,如果忘记所有用户的密码,可启动SQL*Plus,输入以下命令conn/as sysdbaSQLalter user用户名identified by密码;2.2其他常用命令1.help命令SQL*Plus有许多命令,而且每个命令都有大量的选项,要记住每一个命令的所有选项是很困难的。 SQL*Plus提供了内建的帮助系统,可以使用HELP命令查询相关的命令信息。 命令格式SQLhelp命令名示例查看conn命令的帮助信息SQLhelp conn;查看SQL*Plus的命令清单SQLhelp index;查看SQL*Plus的关键字清单SQLhelp reservewords;2.describe命令describe命令可以缩写为desc,用来列出表或视图各个列的名称以及属性。 命令格式SQLdesc object_name;示例查看scott用户的emp表的结构SQLdesc scott.emp;3.set linesize命令6系统默认每行打印80个字符,当SQL*Plus输出linesize指定数量的字符后,随后的数据就会折叠到下一行显示。 命令格式SQLset linesizenumber示例SQLshow linesize;SQLset linesize800;4.set pagesize命令当SQL*Plus执行查询语句时,set pagesize命令可以设置一页显示的行数。 命令格式SQLset pagesizenumber示例SQLshow pagesize;SQLset pagesize30;5.pause命令如果在SQL*Plus中运行的查询语句可以返回多行数据,以至于无法在窗口中一次显示完,输出窗口会快速滚动显示。 可以设置环境变量pause为on来控制显示完一页后暂停显示,直到按回车键才继续显示下一页数据。 pause选项还可以设置暂停后显示的字符串,以便提示用户。 命令格式SQLset pauseon;SQLset pause?按回车键继续?;6.命令用于执行脚本文件。 命令格式SQL文件名;注意需写文件路径;sql文件的后缀可以不写。 7.继续使用上次命令命令格式SQL/2.3常用数据字典视图数据字典是Oracle数据库的核心组件,是数据库中的所有对象信息的知识库,提供了数据库结构、数据库对象空间分配和数据库用户等有关的信息。 任何数据库用户都无法对数据字典中的内容进行修改,但可以查看数据字典中的内容。 数据字典中的信息通过表和视图的形式组织。 数据字典中的信息实际上保存在基础表中,只有Oracle系统才有权读取和写入基础表。 基础表中存储的信息通常是经过加密处理的。 而视图是一种虚拟表,它本身并不包含数据,用户可以通过数据字典视图来获取信息,而不需访问数据字典表。 7数据字典视图分类视图类型USER视图说明USER视图的名称以user_为前缀,用来记录用户对象的信息。 例如user_tables视图,它记录用户的表信息ALL视图的名称以all_为前缀,是USER视图的扩展。 用来记录用户对象的信息以及被授权访问的对象信息。 例如all_synonyms视图,它记录用户可以存取的所有同义词信息DBA视图的名称以dba_为前缀,用来记录数据库实例的所有对象的信息。 例如dba_tables视图,通过它可以访问所有用户的表信息V$视图的名称以v$为前缀,用来记录与数据库活动相关的性能统计动态信息。 例如v$datafile视图,它记录有关数据文件的统计信息GV$视图的名称以gv$为前缀,用来记录分布式环境下所有实例的动态信息。 例如gv$lock视图,它记录出现锁的数据库实例的信息说明所有用户的所有表的信息所有用户的表的字段信息所有用户的所有视图信息所有用户的同义词信息所有用户的序列信息所有用户的表的约束信息所有用户的表的索引简要信息所有用户的索引的字段信息所有用户的触发器信息所有用户的存储过程信息所有用户的段的使用空间信息所有用户的段的扩展信息所有用户对象的基本信息当前用户可以访问的所有基表当前用户创建的所有基表、视图和同义词等构成数据字典的所有表的信息数据字典中的表或视图v$datafile dba_tablespaces dba_free_space控制文件v$controlfile说明记录系统的运行情况记录系统表空间的基本信息记录系统表空间的空闲空间的信息记录系统控制文件的基本信息8ALL视图DBA视图V$视图GV$视图基本数据字典视图字典名称dba_tables dba_tab_columns dba_views dba_synonyms dba_sequences dba_constraints dba_indexes dba_ind_columns dba_triggers dba_sources dba_segments dba_extents dba_objects cattab dict数据库组件数据库表空间与数据库组件相关的数据字典v$controlfile_record_section记录系统控制文件中记录文档段的信息v$parameter数据文件dba_data_files v$filestat v$datafile_header段数据区日志dba_segments dba_extents v$thread v$log v$logfile归档数据库实例内存结构v$archived_log v$archive_dest v$instance v$system_parameter v$sga v$sgastat v$db_object_cache v$sql v$sqltext v$sqlarea后台进程v$bgprocess v$session常用动态性能视图视图名称v$fixed_table v$instance v$latch v$librarycache v$rollstat v$rowcache v$sga v$sgastat v$sort_usage v$sqlarea v$sqltext v$stsstat v$system_event v$waitstat应用举例9记录系统各参数的基本信息记录系统数据文件以及表空间的基本信息记录控制文件的数据文件信息记录数据文件头部分的基本信息记录段的基本信息记录数据区的基本信息记录日志线程的基本信息记录日志文件的基本信息记录日志文件的概要信息记录归档日志文件的基本信息记录归档日志文件的路径信息记录实例的基本信息记录实例当前有效的参数信息记录SGA区的大小信息记录SGA的使用统计信息记录对象缓存的大小信息记录SQL语句的详细信息记录SQL语句的语句信息记录SQL区的SQL基本信息显示后台进程信息显示当前会话信息说明显示当前发行的固定对象的说明显示当前实例的信息显示锁存器的统计数据显示有关库缓存性能的统计数据显示联机的回滚段的名字显示活动数据字典的统计显示有关系统全局区的总结信息显示有关系统全局区的详细信息显示临时段的大小及会话显示SQL区的SQL信息显示在SGA中属于共享游标的SQL语句内容显示基本的实例统计数据显示一个事件的总计等待时间显示块竞争统计数据1.查看所有用户SQLSELECT username,aount_status FROMdba_users;*OPEN表示账户为解锁状态;EXPIRED表示账户为过期状态(需要设置口令才能解除此状态);LOCKED表示账户为锁定状态。 2.查看SID SQLSELECT instance_name FROMv$instance;3.查看当前用户所有的表信息SQLSELECT*FROM tab;*table(表)view(视图)synonym(别名,与视图类似)4.查看所有用户的表信息SQLSELECT table_name,owner FROMdba_tables;5.查看指定用户的表信息SQLSELECT table_name,owner FROMdba_tables whereowner=?SCOTT?;10第3章SQL语句基础scott用户有4个案例表,可在日常练习中使用。 113.1Oracle内置字段数据类型数据类型字符型数据型日期时间型ROWID型LOB型1.字符型CHAR型定长字符串,短则用空格填充,长则出错。 VARCHAR2型变长字符串。 字段长度根据实际字符串长度自动调整,不用空格填充。 2.数值型NUMBER(PRECISION,SCALE)精度PRECISION指定所有数字位的个数,范围SCALE指定小数的位数,两个参数均是可选的。 如果插入的字段数据超过指定位数,将自动四舍五入。 3.日期时间数据类型DATE可以存储日期和时间的组合数据。 ORACLE默认的日期格式是DD-MON-YY。 4.LOB数据类型用于大型的、未被结构化的数据,如二进制文件、图片文件等。 LOB数据类型又分为BLOB、CLOB和BFILE三种。 BLOB类型用于存储二进制对象。 如图像、音频、视频。 CLOB类型用于存储字符格式的大型对象。 Oracle将数据转换成Unicode格式。 BFILE类型将二进制文件作为操作系统文件存储在数据库外部,BFILE类型的字段仅保存二进制文件的指针。 5.ROWID类型亦称伪列类型,用于保存表中每条记录的物理地址。 每条记录都有唯一的rowid。 ORACLE自动为每个表建立名称为ROWID的字段。 可以对该字段进行查询。 rowid确定了每条记录属于哪一个数据对象、数据文件、块、行。 是基于64位编码的18个字符显示。 其格式如下示例ROWID是隐含的,检索表时不会看到,须显式指定名称。 SQLSELECT rowid,ename FROM emp;123.2SQL简介SQL(Structured QueryLanguage)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。 SQL语言分为3类1数据定义语言(DDL)用来定义和管理数据库中的对象(如表、视图、存储过程、触发器)。 由CREATE、ALTER、DROP命令构成。 2数据操纵语言(DML)针对数据库中存储的数据进行相关操作,主要包括增加(insert)、删除(delete)、更新(update)和查询(select)四种操作。 在实际工作中增加、删除和更新所占使用DML比例为20%,而查询所占比例为80%。 3数据控制语言(DCL)用来管理用户对指定数据库对象的使用权限。 常用操作有分配(grant)和回收(revoke)。 3.3SELECT语句的用法在众多SQL语句中,使用频率最高的是SELECT语句,该语句主用于检索数据。 虽然在前面已经使用了一些SELECT语句,但这些使用是零散的、不完整的。 本节将对SELECT语句进行系统地、完整地介绍。 SELECT语句的完整语法格式如下SELECTALL|DISTINCT*|expression|column1_name,column2_name,.FROMtable1_name|(subquery)alias,table2_name|(subquery)alias,.WHERE conditionCONNECT BYconditionSTART WITHconditionGROUP BYexpression,.HAVING condition,.UNION|INTERSECT|MINUSORDER BYexpressionASC|DESC,.FOR UPDATEOFschema.table_name|viewcolumnNOW AIT;133.3.1检索单表数据检索单表数据是指从单个表中检索数据,检索的结果都是于同一个表中。 在检索数据的过程中,既可以检索所有的列,也可以检索部分列。 数据将按照SELECT子句后面指定的列的顺序显示。 如果使用星号*,则表示检索所有的列,这时数据将按照定义表时指定的列的顺序显示。 示例SQLSELECT*FROM emp;SQLSELECT empno,ename,job,sal,deptno FROM emp;SQLSELECT enameAS姓名,job AS职位,hiredate AS工作日期,sal AS工资FROM emp;SQLSELECT ename姓名,job职位,hiredate工作日期,sal工资FROM emp;SQLSELECT编号是|empno|的雇员,姓名是|ename|的工作是|job FROM emp;SQLSELECT DISTINCTjob FROM emp;3.3.2过滤数据在SELECT语句中可以使用WHERE子句过滤数据,只检索那些满足过滤条件的数据。 通过过滤数据,可以从大量的数据中获取自己所需要的数据。 1.比较运算符比较操作符=、!=SELECT ename,job,hiredate,sal FROM emp WHERE empno=7521;SQLSELECT ename,job,hiredate,sal FROM emp WHERE job=any(CLERK,ANAL YST);2.SQL运算符SQL运算符BETWEEN LIKEIN IS NULL说明指定条件在两个值之间,包括边界值匹配的字符样式,一般用于模糊查询匹配的一个列表值匹配空值注意表中SQL运算符可以与NOT运算符取反处理,例如,NOT LIKE,NOT BETWEEN和IS NOTNULL等。 14示例SQLSELECT empno,ename,job,sal FROM emp WHERE ename LIKES%;SQLSELECT empno,ename,job,sal FROM emp WHERE empno IN(7369,7521,7789);SQLSELECT empno,ename,job,sal FROM emp WHERE empno NOTIN(7369,7521,7789);SQLSELECT empno,ename,job,sal FROM emp WHERE sal BETWEEN1500AND2000;SQLSELECT*FROM emp WHERE mISNULL;3.逻辑运算符使用逻辑运算符可以将简单的条件组合起来。 运算符NOT ANDOR说明取反,当条件为真时,结果为假;当条件为假时,结果为真。 与,当两个条件为真时,结果为真或,当两个条件中有一个为真时,结果为真示例SQLSELECT empno,ename,job,sal FROM emp WHEREsal=1500AND salSELECT empno,ename,job,sal FROM emp WHERE job=CLERKOR job=SALESMAN;3.3.3排序数据在SELECT语句中,可以使用ORDER BY子句对检索的结果集进行排序。 语法格式SELECT字段列表FROM表名WHERE条件ORDER BY字段名ASC|DESC示例SQLSELECT ename,job,sal FROM emp ORDER BY sal;SQLSELECT ename,job,sal FROM emp ORDERBY sal,ename DESC;SQLSELECT ename,job,sal FROM emp ORDERBY3;3.3.4多表检索在实际应用中,经常会碰到需要检索的数据存在于两个或两个以上的表中。 这时就需要使用SELECT语句执行多表检索。 为了更好地理解多表检索操作,需要理解表的别名,笛卡尔积、内连接、外连接、自然连接和交叉连接等概念。 1.表的别名在多表查询时,如果多个表之间存在同名的列,则必须使用表名限定列引用。 但随着查询变得越来越复杂,语句会由于每次限定列时输入表名而变得冗长。 因此SQL语言提供了一种机制表的别名。 可以在SELECT语句中为表定义临时性名称,简化对表的引用。 示例检索某一部门的职工信息 (1)没有使用表的别名SQLSELECT ename姓名,job职位,sal工资,dname部门FROM emp,dept WHEREemp.deptno=dept.deptno ANDdept.dname=SALES;15 (2)使用表的别名SQLSELECT e.ename姓名,e.job职位,e.sal工资,d.dname部门FROM emp e,dept dWHEREe.deptno=d.deptno ANDd.dname=SALES;注意一旦为表指定了别名,则必须在整个剩余语句中使用表的别名,不允许再使用表原来的名称。 2.内连接内连接是指满足连接条件的连接操作。 语法格式SELECT字段列表FROM表名1INNERJOIN表名2ON连接表达式示例SQLSELECT e.ename,e.job,e.sal,d.deptno,d.dname FROM emp ejoin dept d ON e.deptno=d.deptno;SQLSELECT e.ename,e.job,e.sal,d.deptno,d.dname FROM emp e,dept dWHEREe.deptno=d.deptno;3.外连接如果某个表中的数据不满足连接条件,而又要出现在检索结果中,可以使用外连接。 外连接可以分为左外连接LEFTOUTERJOIN右外连接RIGHTOUTERJOIN全外连接FULLOUTERJOIN示例 (1)左外连接SQLINSERT INTOemp(empno,ename,job,sal)VALUES(8000,ATG,CLERK,950);SQLSELECT e.ename,e.job,e.sal,d.deptno,d.dname FROM emp eLEFT JOIN dept dON e.deptno=d.deptno; (2)右外连接SQLSELECT e.ename,e.job,e.sal,d.deptno,d.dname FROM emp eRIGHT JOINdept dON e.deptno=d.deptno; (3)全外连接SQLSELECT e.ename,e.job,e.sal,d.deptno,d.dname FROM empeFULL JOINdeptdONe.deptno=d.deptno;164.自然连接使用自然连接检索多个表时,Oracle会将第一个表中的列与第二个表中具有相同名称的列进行连接。 用户不需要明确指定进行连接的列,系统会自动完成这一任务。 示例SQLSELECT empno,ename,job,sal,deptno,dname FROM emp NATURALJOINdeptWHERE dname=SALES;注意自然连接的实际应用性较差,它需要连接的各个表之间必须具有相同名称的列,并且不能让表中其他的列具有相同的名称。 假如emp表和dept表中都有一个address地址列,自然连接会尝试使用该列进行连接。 5.交叉连接交叉连接是没有连接条件的连接,即笛卡尔积。 语法形式SELECT字段列表FROM表1CROSS JOIN表2示例SQLSELECT count(*)FROM empCROSS JOINdept;3.4SQL函数数据库产品的主要区别是SQL函数库不同。 3.4.1字符函数1.小写转大写函数upper范例SQLSELECT upper(?smith?)FROM dual;SQLSELECT*FROMempwhere ename=upper(?smith?);2.大写转小写函数lower范例SQLSELECT lower(?HELLO,WORLD?)FROM dual;3.将单词第一个字母大写函数initcap范例SQLSELECT initcap(ename)as姓名,job as职位FROMemp;4.字符串连接函数concat范例SQLSELECT concat(?hello?,?world?)FROM dual;注意字符串连接可使用|运算符实现SQLSELECT?hello?|?world?FROM dual;175.字符串截取函数substr范例SQLSELECT substr(?hello?,1,3)FROM dual;SQLSELECT substr(?hello?,0,3)FROM dual;6.字符串长度函数length范例SQLSELECT length(?hello?)FROM dual;7.字符串内容替换函数replace范例SQLSELECT replace(?hello?,?l?,?x?)FROM dual;3.4.2数学函数1.四舍五入函数round范例SQLSELECT round(789.536,2)FROM dual;SQLSELECT round(789.536)FROM dual;SQLSELECT round(789.536,-2)FROM dual;2.截断小数位函数trunc范例SQLSELECT trunc(789.536,2)FROM dual;SQLSELECT trunc(789.536)FROM dual;SQLSELECT trunc(789.536,-2)FROM dual;3.取模函数mod范例SQLSELECT mod(10,3)FROM dual;3.4.3日期函数1.获取当前日期函数sysdate范例SQLSELECT sysdateFROM dual;2.获取给定日期范围内的月数函数months_between范例SQLSELECT ename,months_between(sysdate,hiredate)FROMemp;3.在指定日期上加上指定月数函数add_months范例SQLSELECT add_months(sysdate,4)FROM dual;184.计算下一个今天是哪个日期next_day范例SQLSELECT next_day(sysdate,?星期一?)FROM dual;5.求出给定日期的当月最后一天日期last_day范例SQLSELECT last_day(sysdate)FROM dual;3.4.4转换函数1.将指定表达式转换成字符串函数to_char范例1SQLSELECT empno,ename,to_char(hiredate,?yyyy?)year,to_char(hiredate,?mm?)months,to_char(hiredate,?dd?)day FROMemp;范例2SQLSELECT empno,ename,to_char(hiredate,?yyyy-mm-dd?)FROMemp;注意可以用fm去掉月份前面的前导0SQLSELECT empno,ename,to_char(hiredate,?fmyyyy-mm-dd?)FROMemp;范例3给工资加千位分隔符SQLSELECT empno,ename,to_char(sal,?99,999?)FROMemp;范例4给工资加货币符号,$是美元,L代表本地货币SQLSELECT empno,ename,to_char(sal,?$99,999?)FROMemp;2.字符串转数字函数to_number范例SQLSELECT to_number(?123?)+to_number(?123?)FROM dual;3.字符串转日期函数to_date范例SQLSELECT to_date(?xx-12-20?,?yyyy-mm-dd?)FROM dual;3.4.5通用函数1.将指定null值变为指定的内容函数nvl范例计算职员年薪(月薪sal+奖金m)*12,奖金可能为null SQLSELECT empno,ename,sal,nvl(m,0),(sal+nvl(m,0)*12ine FROMemp;2.decode函数范例1SQLSELECT decode(1,1,内容是1,2,内容是2,3,内容是3)FROM dual;范例2emp表中雇员的工作有clerk(业务员)、salesman(销售员)、manager(经理)、analyst(分析员)、president(总裁)。 SQLSELECT empno雇员编号,ename雇员姓名,hiredate雇佣日期,decode(job,?clerk?,?业务员?,?salesman?,?销售人员?,?manager?,?经理?,?analyst?,?分析员?,?president?,?总裁?)职位FROMemp;193.4.6统计函数使用统计函数可以对一组数据进行计算。 函数AVG SUMMAX MINCOUNT说明平均值汇总值最大值最小值统计值示例SQLSELECT MAX(sal),min(sal)FROMemp;3.5分组技术在SELECT语句中可以使用GROUP BY子句进行分组操作,并可以使用HAVING子句提供分组条件。 示例统计各部门的员工人数SQLSELECT deptno,count(*)as员工数量FROMemp GROUP BY deptno;使用HAVING子句对分组进行筛选SQLSELECT deptno,count(*)as员工数量FROMempGROUP BYdeptno HAVINGCOUNT(*)=5;3.6子查询如果某个SQL语句依赖于另外一个SELECT语句的检索结果,可以把SELECT语句嵌入到该语句中,就形成了一个子查询。 示例检索某一部门的员工信息SQLSELECT empno,ename,job,sal FROMemp WHEREdeptno=(SELECT deptno FROM deptWHERE dname=SALES);注意?外查询检索一行,子查询就要完整检索一遍。 ?子查询最多可以嵌套255层,层数越多,效率越差。 子查询可以分为3种类型单行子查询、多行子查询和关联子查询203.6.1单行子查询子查询只返回单行单列值,可以作为一个常量使用。 示例查询工资最高和最低的员工信息SQLSELECT empno,ename,job,sal FROMemp WHEREsal=(SELECT MAX(sal)FROMemp)or salSELECT empno,ename,job,sal,deptnoFROMemp WHEREdeptno IN(SELECT deptnoFROM deptWHERE dname=ACCOUNTINGOR dname=RESEARCH); (2)查询大于MANAGER职位中最小工资的员工信息SQLSELECT empno,ename,job,sal FROMemp WHEREsalANY(SELECT sal FROMemp WHEREjob=MANAGER); (3)查询工资大于所有MANAGER职位的员工信息SQLSELECT empno,ename,job,sal FROMemp WHEREsalALL(SELECT sal FROMempWHEREjob=MANAGER);3.6.3关联子查询在前面介绍的子查询中,内查询和外查询是分开执行的,内外查询没有关系。 外查询仅仅使用内查询的最终结果。 如果在子查询中,内查询的执行需要借助于外查询,而外查询的执行又离不开内查询,内外查询是相互关联的,称为关联子查询。 示例检索某个职位的员工工资是否超出了平均水平。 SQLSELECT ename,job,salFROMemp tWHEREsal(SELECT AVG(sal)FROMempWHERE t.job=job);注意表中数据量大时关联子查询效率低。 213.7操作数据包括插入、更新和删除数据。 3.7.1插入数据语法格式INSERT INTO表名(字段列表)VALUES(值列表)示例SQLINSERT INTOemp(empno,ename,job,mgr,hiredate,sal,m,deptno)VALUES(7995,ATG,CLERK,7782,to_date(xx-10-01,yyyy-mm-dd),1300,null,10);向表中所有列添加数据时,可以省略列清单SQLINSERT INTOemp VALUES(7995,ATG,CLERK,7782,to_date(xx-10-01,yyyy-mm-dd),1300,null,10);注意?省略列清单容易出错,不建议使用。 ?可以只为部分列提供数据,被省略的列必须允许为空值、有默认值或可以自动生成值。 ?不能违反主键约束。 可以结合SELECT语句一次向表添加多行数据SQLCREATE TABLEemployee(empno number (4),ename varchar2 (10),job varchar2 (20),hiredate date,sal number(6,2);SQLINSERT INTOemployee SELECT empno,ename,job,hiredate,salFROMemp;3.7.2更新数据语法格式UPDATE表名SET字段名=表达式WHERE条件式3.7.3删除数据语法格式DELETE FROM表名WHERE条件式示例SQLDELETE FROMempWHEREename=ATG;223.8ROWID的应用示例1删除表中重复记录(适用于有大量重复记录的情况)SQLCREATE TABLEempa ASSELECT*FROMemp;SQLINSERT INTOempa SELECT*FROMempWHEREempno=7934;SQLDELETE FROM empa WHERE rowid NOTIN(SELECT MIN(rowid)FROM empaGROUP BYempno);示例2删除表中重复记录(适用于有少量重复记录的情况)SQLDELETE FROMempa aWHERErowid(SELECT MAX(rowid)FROMempaWHEREempno=a.empno);3.9ROWNUM的使用Oracle没有提供TOP N语句,若希望按特定条件查询前N条记录,可以使用伪列ROWNUM。 ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列(注意先要有结果集)。 rownum的值是oracle顺序分配的从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推。 示例建立student表,结构为ID char (6)-学号name VARCHAR2 (10)-姓名SQLCREATE TABLEstudent(ID CHAR (6),name VARCHAR2 (10);-添加测试记录SQLinsert intostudent values(200001,张一);SQLinsert intostudent values(200002,王二);SQLinsert intostudent values(200003,李三);SQLinsert intostudent values(200004,赵四);rownum用于等于某值的查询查询表中第一条记录,可以使用rownum=1作为条件。 SQLSELECT rownum,id,name FROM student WHERE rownum=1;查询表中第n(n1)条记录,使用rownum=n查不到。 SQLSELECT rownum,id,name FROM student WHERErownum=2;说明rownum是一个总是从1开始的伪列,是oracle从数据文件或缓冲区中读取数据的顺序。 它取得第一条记录则rownum值为1,第二条为2,依次类推。 如果用,=,=,between.and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。 23可以使用子查询解决子查询中的rownum必须要有别名,否则还是查不出记录。 因为rownum不是某个表的列,如果不起别名,就无法知道rownum是子查询的列还是主查询的列。 起别名SQLSELECT*FROM(SELECT rownumno,id,name FROM student)WHERE no=2;不起别名SQLSELECT*FROM(SELECT rownum,id,name FROM student)WHERErownum=2;rownum用于大于某值的查询Oracle中rownumn(n1)条件依旧不成立。 SQLSELECT rownum,id,name FROM student WHERErownum2;使用子查询解决SQLSELECT*FROM(SELECT rownumno,id,name FROMstudent)WHERE no2;rownum对于小

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论