Oracle数据库学习资料课件_第1页
Oracle数据库学习资料课件_第2页
Oracle数据库学习资料课件_第3页
Oracle数据库学习资料课件_第4页
Oracle数据库学习资料课件_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

1、Oracle的历史 Oracle 公司( 甲骨文 ) 创始人 : Larry Ellison 32岁,公司提供数据库服务. 公司成立于 1977 年, 83 年公司更名为 Oracle ,原名为”软件开发实验室”. Oracle 数据库适用于大型企业 竞争对手 微软的SQLServer IBM 的DB2 目前的版本 2.07.0 , 8.0 , 8i , 9i , 10gOracle的服务:我的电脑右键选择管理-服务和应用程序服务OracleServer<ORACLE_SID>数据库服务,进程为ORACLE.exeOracle<HOME_NAME>TNSListener

2、监听器服务,进程TNSLSNR.exe默认端口1521、1526OracleDBConsole<ORACLE_SID>对应用于OEMOracle<HOME_NAME>iSQL*Plus对于于iSQL*Plus<ORACLE_SID>-是数据库或例程的系统标识符<HOME_NAME>-是Oracle主目录名称这几个服务之间的关系:启动顺序:1、Oracle<HOME_NAME>TNSListener必须启动 2、OracleServer<ORACLE_SID>必须启动 3、OracleDBConsole<ORACLE_

3、SID>启动依赖于OracleServer<ORACLE_SID>SqlPlusSqlPlus是Oracle任何版本都自带的数据库操作工具,使用它可以完成大部分的数据库操作。SqlPlus可以“开始à程序àOracle”启动,也可以命令行启动(互动)1.命令行启动sqlPlussqlplus 用户名/密码orcl或sqlplus 用户名orcl如果用户是管理员要在sqlplus 用户名/密码主机字符串 as sysdba“/”是用户名和密码分隔符号“”是密码和数据库的分隔符号“orcl”是数据库的名称,在安装时指定常用命令(互动)connect 切换用户s

4、how user 显示当前用户set linesize 1000 设置行显示长度set pagesize 1000 设置分页长度desc dept 查看表结构 select table_name from user_tables查询当前用户的表/ 运行上一条SQL语句 clear screen 清除屏幕edit 编辑spool d:/a 保存输出结果到某个位置spool off 保存结束quit 退出list 查看最后一条语句 文件名.sql 运行外部文件中的SQL语句Sql*plus的常用命令是一个oracle提供的工具,使用此工具可以完成数据库的操作和管理。SQL*Plus有两种工作方式:

5、1、 基于图形界面的-sqlplusw2、 基于命令行的-sqlplusSql*plus 中可以执行3种类型的命令:1、 SQL语句SELECT * FROM tab;2、 PL/SQL语句CREATE TABLE test(x number,info varchar(20);Commit;编写一个存储过程,向test表中插入20条记录。DECLAREx number :=10;BEGINFOR I IN 1.20 LOOPINSERT INTO test VALUES (x,测试数据);x=x+i;END LOOP;END;3、 SQL*Plus内部命令这些命令用于设置SQL*Plus的环境

6、或格式化输出结果。例如:改变EMP表里SAL列的输出格式COLUMN SAL FORMAT $99,99 HEADING 薪水;使用SQL*Plus可以执行操作系统本身的命令:例如:在下的记事本notepad.exeHOST notepad.exe; 退出SQL*Plus返回操作系统:EXIT (QUIT) 帮助提示:HELP SET HELP  HELP ED 清除屏幕:CLEAR SRC SQL*Plus编辑命令命令缩写作用APPEND texttext将text加到当前行末端CHANGE /old/newC /old/new将当前行中的old改为n

7、ewCHANGE /textC /text从当前行中删除textCLEAR BUFFERCL BUFF清除全部行DEL删除当前行INPUT I加入一行或多行INPUT textI text加入由text组成的行LISTL列出缓冲区中的全部行LIST nL n或 n列出n行LIST lastL last列出最后一行LIST m nL m n列出m到n行运行缓冲区的命令:RUN 或/保存缓冲区中的内容为.sql文件:SAVE f :test 编辑或者读取命令文件.sql:EDIT 文件名;在SQL文件中的注释有3种方法:使用SQL*Plus的REMARK命令;使用SQL注释分界

8、符/*.*/使用ANSI/SQL的“-”型注释读取命令文件在SQL*PLUS中:GET f:test.sql 运行.sql文件中的指令:START或,使用更多建议:尽量使用记事本编写代码,这样有利于修改。所需要的表在所有的讲解中所要使用到的表全部都是scott用户下的表,所以必须了解在此用户下有那几张表,以及每张表的作用是什么。避免出现汉字,因为实际开发中容易出现乱码问题。雇员表(emp) 雇员表中记录的是一个个的雇员的基本信息。雇员表(EMP) No. 字段类型 描述 1 EMPNO NUMBER(4) 表示雇员编号,是唯一编号2 ENAME VARCHAR2(10) 表示雇员姓名

9、3 JOB VARCHAR2(9) 表示工作职位4 MGR NUMBER(4) 表示一个雇员的领导编号5 HIREDATE DATE 表示雇佣日期6 SAL NUMBER(7,2) 表示月薪,工资7 COMM NUMBER(7,2) 表示奖金,或者称为佣金8 DEPTNO NUMBER(2) 部门编号部门表(dept) 表示一个个具体的部门信息 部门表(dept) No. 字段类型 描述 1 DEPTNO NUMBER(2) 部门编号,是唯一编号2 DNAME VARCHAR2(14) 部门名称3 LOC VARCHAR2(13) 部门位置工资等级表(SALGRADE)一个公司工资是有等级制度

10、,那么用此表表示一个工资的等级 工资等级表(SALGRADE) No. 字段类型 描述 1 GRADE NUMBER 等级名称2 LOSAL NUMBER 此等级的最低工资3 HISAL NUMBER 此等级的最高工资奖金表(BONUS) 表示的是一个雇员的工资及奖金奖金表(BONUS) No. 字段类型 描述 1 ENAME VARCHAR2(10) 雇员姓名2 JOB VARCHAR2(9) 雇员工作3 SAL NUMBER 雇员工资4 COMM NUMBER 雇员奖金(佣金) 范例:查询每月可以得到奖金的雇员信息· 奖金是comm字段· 只要字段中存在内容,则表示此内

11、容不为空(null),如果存在内容,则会显示具体的值。· 不为空的表示:字段 IS NOT NULLSELECT * FROM emp WHERE comm IS NOT NULL ; 范例:查询没有奖金的雇员· 没有奖金则comm字段的内容肯定是null,格式:字段 IS NULLSELECT * FROM emp WHERE comm IS NULL ; 范例:要求查询出,基本工资大于1500,同时可以领取奖金的雇员信息。· 此时应该是两个条件,而且两个条件必须同时满足· 既然要求两个条件全部满足,则必须使用AND操作符进行条件的连接。SELECT

12、* FROM emp WHERE sal>1500 AND comm IS NOT NULL ; 同时指定了两个条件,两个条件必须同时满足才可以查询出结果。 范例:要求查询出,基本工资大于1500,或者可以领取奖金的雇员信息。· 如果要表现出或者的概念使用OR进行连接,表示两个条件有一个满足即可。SELECT * FROM emp WHERE sal>1500 OR comm IS NOT NULL ; 之前使用NOT可以取反,把真的条件变为假的,假的变为真的。范例:要求查询出,基本工资不大于1500,同时不可以领取奖金的雇员信息。· 此时相当于是整体的条件取反

13、。SELECT * FROM emp WHERE NOT (sal>1500 OR comm IS NOT NULL); 等价于SELECT * FROM emp WHERE sal<=1500 and comm is null;从程序中可以发现,通过括号表示一组的条件。 范例:查询基本工资大于1500,但是小于3000 的全部雇员信息。· 满足两个:sal > 1500 ,sal < 3000 SELECT * FROM emp WHERE sal>1500 AND sal<3000;在SQL语法中,提供了一个专门的指定范围查询的过滤语句:BET

14、WEENAND 语法格式: 字段 BETWEEN 最小值 AND 最大值例:使用BETWEENAND修改之前的操作SELECT * FROM emp WHERE salBETWEEN1500 AND 3000;实际上BETWEEN AND操作等价:sal>=1500 AND sal<=3000,包含了等于的功能。范例:查询出在1981年雇佣的全部雇员信息· 1981年1月1日 1981年12月31日之间雇佣的雇员· 日期表示的时候要加“'”SELECT * FROM emp WHERE hiredate BETWEEN '1-1月 -81'

15、; AND '31-12月-81' ; 结论:BETWEEN AND查询除了可以支持数字之外,也可以支持日期的查询· 随着深入的学习会发现,日期实际上也是以数字的形式表示出来。范例:要求查询出姓名是smith的雇员信息· 此时告诉了要查询的名字,条件:ename='smith' SELECT * FROM emp WHERE ename='smith' ; 执行以上的查询语句之后,并不会返回查询结果,再次查询数据库表的信息,发现smith是采用大写的形式表示的,在Oracle中是对大小写敏感的,所以此时在查询的时候必须以大写的

16、形式进行条件的编写。代码修改如下:SELECT * FROM emp WHERE ename='SMITH' ; 范例:要求查询出雇员编号是7369、7499、7521的雇员的具体信息· 如果此时按照之前的做法,则设置条件要使用OR连接: empno=7369 OR empno=7499 OR empno=7521SELECT * FROM emp WHERE empno=7369 OR empno=7499 OR empno=7521 ; 实际上,此时是指定了查询的范围,那么既然有范围了在SQL语法中就可以使用IN操作符完成。语法格式:字段 IN (值1,值2,.,

17、值n) 如果现在要求查询的内容不在此范围之中,则可以使用NOT IN,语法如下:字段 NOT IN (值1,值2,.,值n) 范例:使用以上的格式进行修改 SELECT * FROM emp WHERE empno IN (7369,7499,7521) ; 范例:要求查询出雇员编号不是7369、7499、7521的雇员的具体信息SELECT * FROM emp WHERE empno NOT IN (7369,7499,7521) ; 另外,需要说明的是,使用IN操作符不光可以用在数字上,也可以用在字符串的信息上。范例:要求查询出姓名是SMITH、ALLEN、KING的雇员信息SELECT

18、 * FROM emp WHERE ename IN ('SMITH','ALLEN','KING') ; 提示:如果在指定的查询范围中指定了额外的内容,则不影响程序运行。SELECT * FROM emp WHERE ename IN ('SMITH','ALLEN','KING','$#VC') ; 在一般的日常见到的站点中经常发现有模糊查找功能,即:输入一个指定的关键字,把符合的内容全部查询出来,在SQL中使用LIKE语句完成。在使用LIKE语句的时候要注意通配符的问题,在LI

19、KE语句中主要使用以下两种通配符:· “%”:可以匹配任意长度的内容· “_”:可以匹配一个长度的内容范例:查询出所有雇员姓名中第二个字母包含“M”的雇员信息SELECT * FROM emp WHERE ename LIKE '_M%' ; 范例:查询出雇员姓名中包含字母M的雇员信息· 此时,表示可以在任意的位置上出现字母MSELECT * FROM emp WHERE ename LIKE '%M%' ; 但是,要提醒大家的是:“如果在使用LIKE的时候没有指定查询的关键字,则表示查询全部”SELECT * FROM emp W

20、HERE ename LIKE '%' ; 使用LIKE还可以方便的进行日期的查找功能。范例:要求查询出在1981年雇佣的雇员信息SELECT * FROM emp WHERE hiredate LIKE '%81%' ; 范例:查询工资中包含6的雇员信息SELECT * FROM emp WHERE sal LIKE '%6%' ; 在操作条件中还可以使用:>、>=、=、<、<=等计算符号不等于符号:在SQL中如果要想使用不等于符号,可以有两种形式:“<>”、“!=” 范例:查询雇员编号不是7369的雇员信息

21、· 使用“<>”完成SELECT * FROM emp WHERE empno<>7369 ; · 使用“!=”完成SELECT * FROM emp WHERE empno!=7369 ; 对结果进行排序(ORDER BY子句)(重点)在SQL中可以使用ORDER BY子句对查询的结果进行排序,例如,现在使用查询全部的语句:SELECT * FROM emp ; 此时,从查询结果可以发现,是按照雇员的编号进行排序的,那么此时如果要对使用指定的列进行排序,则就必须使用ORDER BY语句,语法格式如下:SELECT DISTINCT * | 具体的列

22、别名 FROM 表名称WHERE 条件(s) ORDER BY 排序的字段1,排序的字段2 ASC|DESC ASC表示升序、DESC表示降序范例:要求按照工资由低到高排序SELECT * FROM emp ORDER BY sal ; 之前是按照由低到高的顺序完成,是采用的升序的形式,现在要求使用降序的形式完成。实际上如果在排序的时候没有指定排序规则,则默认的排序规则是升序排列。SELECT * FROM emp ORDER BY sal ASC ; 要想使用降序的方式完成,则使用DESC即可。SELECT * FROM emp ORDER BY sal DESC ; 范例:要求查询出10部

23、门的所有雇员信息,查询的信息按照工资由高到低排序,如果工资相等,则按照雇佣日期由早到晚排序。· 此时存在两个排序条件,第一个是降序,第二个升序SELECT * FROM emp WHERE deptno=10 ORDER BY sal DESC,hiredate ASC ; 排序的操作肯定是放在整个SQL语句的最后执行。单行函数(重点)数据库系统中,每个数据库之间唯一不同的最大区别点就在与函数的支持上,使用函数可以完成一系列的操作功能。单行函数语法:function_name(column|expression,arg1,arg2,) 参数说明: · function_na

24、me:函数名称· column:数据库列名· expression:字符串或计算表达式· arg1,arg2:在函数中使用参数单行函数分类: · 字符函数:接受字符输入并且返回字符或数值· 数值函数:接受数值输入并返回数值· 日期函数:对日期型数据进行操作· 转换函数:从一种数据类型转换为另一种数据类型· 通用函数:NVL函数、DECODE函数字符函数Oracle中的dual表 Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中,用来构成select的语法规则,

25、oracle保证dual里面永远只有一条记录。这是因为ORACLE对DUAL表的操作做了一些内部处理,尽量保证DUAL表中只返回一条记录.当然这写内部操作是不可见的 .以下是dual的一些使用方法:1、查看当前用户,可以在 SQL Plus中执行下面语句select user from dual;2、用来调用系统函数select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;-获得当前系统时间select SYS_CONTEXT('USERENV','TERMINAL') from dual

26、;-获得主机名select SYS_CONTEXT('USERENV','language') from dual;-获得当前localeselect dbms_random.random from dual;-获得一个随机数3、可以用做计算器select 7*9 from dual;1. ACII(x)返回字符x的ASCII码select ascii('a') from dual;2. 求ACSII(a),ASCII(A”),ASCII(0),ASCII(XYZ)的值3. CHR(X)返回ASCII码为X的字符4. CONCAT(x,y)字符串

27、拼接函数select concat(concat(ename,' is a'),job) from emp;5. INITCAP(x)首字母大写select initcap(ename) from emp;6. INSTR(x,y,n,m)确定y在x中的位置。n是起始查找的位置,m第几次出现的位置。select instr('HelloWorld!','l',2) from dual;select instr('HelloWorld!','l',2,3) from dual;7. LENGTH(x)字符串长度sel

28、ect ename,length(ename) from emp where empno=7698;8. LOWER(x)转换小写select lower(ename) from emp;9. UPPER(x)转换大写10. LPAD(x,n,y)在字符串x的左边补充字符串y,得到总长为n个字符的字符串。可选参数y用于指定在x左边补充的字符串;省略参数y,默认值为空串。select lpad(ename,15,'$#') from emp;11. RPAD(x,n,y)select rpad(ename,15,'#$') from emp;12. LTRIM(x

29、,y)从字符串x的左边截去包含在字符串y中的字符。如果不指定参数y,则默认截去空格。select ltrim('abcdab','a') from dual;13. RTIME(x,y)14. trim(x)去除左右空格15. SUNSTR(x,n,m)返回字符串x中的一个子串,这个子串从字符串x的第n字符开始,截取参数m个字符。select substr('abcsdfsdwfg',3,4) from dual;16. replace(x,y,z)将字符串x中所具有的子串y用子串z替换select replace('jack and j

30、ue','j','bl') from dual;19. TRANSLATE(string,if,then) 根据“if”中字符的位置,并检查“then”的相同位置,然后用该位置的字符替换“string”中的字符。select translate(ename,'AE','12') from emp;是专门处理字符的,例如,可以将大写字符变为小 ,还能求出字符的长度。范例:将小写字母变为大写字母SELECT UPPER('smith') FROM DUAL ; 范例:一般用户在查询一个人姓名的时候有可能考虑到这

31、个人的姓名是大写字母存的还是小写字母保存的呢?· 那么此时,为了方便用户的使用就可以使用upper函数完成。SELECT * FROM emp WHERE ename=UPPER('Smith') ; 还可以使用lower()函数将一个字符串变为小写字母表示。SELECT LOWER('HELLO WORLD') FROM dual ; 还可以使用initcap()函数将单词的第一个字母大写SELECT INITCAP('HELLO WORLD') FROM dual ; 范例;使用此函数将雇员表中的雇员姓名变为开头字母大写SELECT

32、 INITCAP(ename) FROM emp ; 字符串除了可以使用“|”连接之外,还可以使用CONCAT()函数进行连接操作。SELECT CONCAT('hello ','world') FROM DUAL ; 此时已经完成了连接,但是此种方式肯定不如“|”好使。在字符函数中可以进行字符串的截取、求出字符串的长度、进行指定内容的替换 · 字符串截取:substr() · 字符串长度:length() · 内容替换:replace()SELECT substr('hello',1,3) -截取字符串 , len

33、gth('hello') -字符串长度 , replace('hello','l','x') -字符串替换FROM DUAL ; 但是在substr()函数的时候有一点需要提醒大家注意,跟面试有关: · Oracle中substr()函数的截取点是从0还是从1开始。 |- 从0或从1开始效果是一样的,因为Oracle比较智能。范例:要求显示所有雇员的姓名及姓名的后三个字符· 因为雇员姓名的字符串长度不一样,所以只能求出整个的长度再减去2,这样进行截取操作。SELECT ename,SUBSTR(ename,LE

34、NGTH(ename)-2) FROM emp ; 此时,功能已经实现了,但是操作比较麻烦。实际上在substr()函数中提供了一种非常方便的机制,可以采用倒着截取的方式,只要输入的位置是负数就表示倒着进行。SELECT ename,SUBSTR(ename,-3,3) FROM emp ; 数值函数数值函数只要是包含以下几种: · 四舍五入:ROUND() · 截断小数位:TRUNC() · 取余(取模):MOD 范例:执行四舍五入操作SELECT ROUND(789.536) FROM dual ; 当然,在ROUND()函数中也可以指定四舍五入的位数范例:保

35、留两位小数SELECT ROUND(789.536,2) FROM dual ; 在使用ROUND()函数中还有一点非常有意思,可以直接对整数进行四舍五入的进位。SELECT ROUND(789.536,-2) FROM dual ; TRUNC()与ROUND()不同的是,在TRUNC()操作中,不会保留任何的小数,而且小数点也不会执行四舍五入的操作。范例:验证TRUNC()函数SELECT TRUNC(789.536) FROM DUAL ; 范例:通过TRUNC()也可以指定小数点的保留位数SELECT TRUNC(789.536,2) FROM DUAL ; 范例:使用负数表示位数SE

36、LECT TRUNC(789.536,-2) FROM DUAL ; 范例:使用MOD()函数可以进行取余的操作SELECT MOD(10,3) FROM DUAL ; 日期函数函数功能Add_months(x,n)返回日期x加上n个月所对应的日期。N为正数,则返回值表示x之后的日期;n为负数,则返回值表示x之前的日期。current_date返回当前会话时区所对应的日期时间curren_timestamp(x)返回当前会话时区所对应的日期时间,可选参数x表示精度,如果不指定参数x,则默认精度值为6dbtimezone返回数据库所在的时区extract(year|month|day from

37、x)从日期x中摘取所需要的年或月或日数据last_day(x)返回日期x所在月份的最后一天的日期localtimestamp(x)返回当前会话时区所对应的日期时间,可选参数x表示精度,如果不指定参数x,则默认精度值为6months_between(x,y)返回日期x和日期y两个日期之间相差的月数next_day(x,week)返回日期x后的由week指定的星期几所对应的日期round(x,fmt)返回日期x的四舍五入结果。 Fmt可以取YEAR,MONTH,DAY三者之一sysdate返回当前系统的日期时间systimestamp返回当前系统的日期时间trunk(x,fmt)返回截断日期x时间

38、数据。Fmt可以取YEAR,MONTH,DAY三者之一1.SYSDATE 返回当前的日期和时间SQL> select sysdate from dual;2.add_months(x,y) 在x上加上y个月SQL> select hiredate,add_months(hiredate,1) from emp 2 where ename='SMITH'3.last_day(时间) 返回当前时间所在月的最后一天SQL> select sysdate,last_day(sysdate) from dual;4.months_between(d1,d2) 返回日期d

39、1和d2之间的月份数。如果d1晚于d2,结果为正,否则返回负数SQL> select months_between(sysdate,hiredate) from emp;5.next_date(x,week) 返回x后由week指定的第一个工作日SQL> select sysdate,next_day(sysdate,'星期三') from dual;SQL> select sysdate,next_day(sysdate,3) from dual6.extract(year|month|day from x) 抓取日期的指定部分SQL> select

40、extract(year from sysdate) from dual;SQL> select extract(month from sysdate) from dual;SQL> select extract(day from to_date('23-03-2010','dd-mm-yy') from dual;7.round(x,fmt)日期的四舍五入SQL> select round(to_date('16-3月-08'),year) from dual;SQL> select round(to_date('

41、;16-3月-08'),'month') from dual;SQL> select round(to_date('16-3月-08'),'day') from dual;格式符说明举例yyyy年份2008mmmonthmon月份02dd天28day星期几星期五am/pm上午/下午 hh/hh12/hh24小时2:30mi分钟30ss秒 rr 可以把yy替换成rr有不同的效果fm 去掉数字前面的零l 观察结果select to_char(sysdate,'yyyy-mm-dd hh:mi:ss pm

42、9;) from dual;select to_char(sysdate,'yyyy-mon-dd hh24:mi:ss pm') from dual;select to_char(sysdate,'yyyy-month-dd day hh24:mi:ss ') from dual;select to_char(sysdate,'"公元"yyyy"年"-month-dd"日" day hh24:mi:ss ') from dual;select to_char(sysdate,'

43、fm yyyy-mm-dd hh:mi:ss pm') from dual;select to_char(to_date('98-02-23','rr-mm-dd'),'yyyy-mm-dd') from dual;在Oracle中提供了很多与日期操作相关的函数,包括加减日期等等。但是在日期进行加或减结果的时候有一些规律: · 日期 数字 = 日期· 日期 + 数字 = 日期· 日期 日期 = 数字(天数) 范例:显示10部门雇员进入公司的星期数· 如果要想完成此操作,则首先必须知道当前的日期,在O

44、racle中可以通过以下的操作求出当前日期,使用sysdate表示。SELECT SYSDATE FROM DUAL ;· 求出星期数:当前日期 雇佣日期 = 天数 / 7 = 星期数SELECT empno,ename,ROUND(SYSDATE-hiredate)/7) FROM emp ; 在Oracle中提供了以下的日期函数支持: · MONTHS_BETWEEN():求出给定日期范围的月数· ADD_MONTHS():在指定日期上加上指定的月数,求出之后的日期· NEXT_DAY():下一个的今天是那一个日期· LAST_DAY():

45、求出给定日期的最后一天日期范例:验证MONTHS_BETWEEN()SELECT empno,ename,MONTHS_BETWEEN(sysdate,hiredate) FROM emp ; 程序查询时包含了小数点,可以使用ROUND()进行四舍五入的操作。范例:验证ADD_MONTHS()函数SELECT ADD_MONTHS(SYSDATE,4) FROM DUAL ; 范例:验证NEXT_DAY()函数· 此函数求出下一次给定日期数SELECT NEXT_DAY(SYSDATE,'星期一') FROM DUAL ; 范例:验证LAST_DAY()函数·

46、; 求出一个日期的最后一天SELECT LAST_DAY(SYSDATE) FROM DUAL ; 转换函数转换函数主要有以下几种: · TO_CHAR():转换成字符串· TO_NUMBER():转换成数字· TO_DATE():转换成日期范例:查询所有雇员的雇员编号、姓名、雇佣日期SELECT empno,ename,hiredate FROM emp ; 但是现在要求可以将年、月、日进行分开,此时就可以使用TO_CHAR()函数进行拆分,拆分的时候必须指定拆分的通配符: · 年:y,年是四位的数字,所以使用yyyy表示· 月:m,月是二位

47、的数字,所以使用mm表示· 日:d,日是二位的数字,所以使用dd表示还可以使用to_char()函数进行日期显示的转换功能。· Oracle中默认的日期格式:19-4月 -87 · 中国的喜欢格式:1987-04-19从运行结果中可以发现,如果是5月,则会使用05表示。那么这个0称为前导0,如果不希望显示前导0的话,则可以使用fm去掉这些0。 to_char()函数除了可以用在日期上,也可以用在数字上。双引号("):在Oracle中单双引号含义区别双引号被用来将包含特定或者空格列别名括起来SELECT empno “ ”,ename,sal as “工资

48、” FROM emp ;双引号还被用来将文本放入日期格式SELECT TO_CHAR(sysdate,'fmyyyy"年"mm"月"dd"日"')FROM DUAL;例如:要查询全部的雇员编号、姓名、工资SELECT empno,ename,sal FROM emp ; 最好在数字中加入一些符号,以分割太长的数字,一般中国使用“,”,所以,此时,可以使用to_char()函数进行格式化: · 9:表示一位数字SELECT empno,ename,TO_CHAR(sal,'99,999') FR

49、OM emp ; 如果,此时,希望数字可以明确的表示出区域,可以使用以下两种符号:· $:表示美元SELECT empno,ename,TO_CHAR(sal,'$99,999') FROM emp ; · L:表示Local的缩写,以本地的语言进行金额的显示SELECT empno,ename,TO_CHAR(sal,'l99,999') FROM emp ; TO_NUMBER是可以将字符串变为数字的一种函数。SELECT TO_NUMBER('123') + TO_NUMBER('123') FROM D

50、UAL ; 以上就表示把字符串变为数字,之后进行数字的加法操作。TO_DATE()函数可以将一个字符串变为DATE型的数据。· 例如:有2009-2-16是一个字符串,现在要变为DATE类型。SELECT TO_DATE('2009-02-16','yyyy-mm-dd') FROM DUAL ; SELECT TO_CHAR(TO_DATE('2009-02-16','yyyy-mm-dd'),'yyyy"年"mm"月"dd"日"')FROM

51、DUAL通用函数范例:要求求出每个雇员的年薪· 求出年薪的时候应该加上奖金的,格式(sal+comm)*12SELECT empno,ename,(sal+comm)*12 FROM emp ; 之所以造成这样的结果,是因为有些雇员的奖金是NULL,NULL值计算之后结果还是NULL。所以,面对这样的情况,就可以使用NVL函数,可以将一个指定的null值变为指定的内容。SELECT empno,ename,NVL(comm,0), (sal+NVL(comm,0)*12 income FROM emp ; 如果需要进行计算的时候,对于null必须使用NVL()函数进行一个转换操作。l

52、 NVL(x,y)如果x为null,则返回y值;否则返回x的值。select ename,sal+nvl(comm,0) from emp;l NVL2(x,y,z)如果x不为空返回y的值,否则返回z的值select ename,nvl2(comm,'奖金:'|comm,'无奖金') from emp DECODE()函数,此函数是在面试最有可能问到的问题。DECODE()类似于IFELSEIFELSE语句。语法:DECODE(col/expression,search1,result1,search2,result2,.,default) 说明:col/exp

53、ression:为列名或表达式search1、search2searchi:为用于比较的条件result1、result2resulti为返回值如果col/expression和searchi相比较,结果相同的话,则返回resulti,如果没有与col/expression相匹配的结果,则返回默认枝default。 范例:验证DECODE()函数SELECT DECODE(1,1,'内容是1',2,'内容是2',3,'内容是3') FROM DUAL ; 从运行结果上看,程序将内容进行更改,显示的结果变了。 可以直接在emp表上使用此函数,例如,

54、现在有如下的要求:· 雇员的工作: |- CLERK:业务员 |- SALESMAN:销售人员 |- MANAGER:经理 |- ANALYST:分析员 |- PRESIDENT:总裁范例:要求查询出雇员的编号,姓名,雇佣日期及工作,将工作替换成以上的信息SELECT empno 雇员编号 ,ename 雇员姓名 ,hiredate 雇佣日期 , DECODE(job,'CLERK','业务员','SALESMAN', '销售人员','MANAGER','经理', 'ANALYST

55、','分析员','PRESIDENT','总裁') 职位FROM emp ; 从运行结果上发现,使用DECODE函数已经让输出的职位信息有所更改。总结 1、 Oracle的主要用户: · 超级管理员:sys/change_on_install · 普通管理员:system/manager · 普通用户:scott/tiger 2、 sqlplusw的一些常用命令· 设置行显示数量:set linesize 长度· 设置页显示数量:set pagesize 长度· ed及指令

56、83; 连接:conn 用户名 / 密码 AS SYSDBA 3、 SQL基础语法的格式 4、单行函数,这些函数应该随着开发的增长逐步掌握,DECODE()函数最重要。补充oracle运算符使用l 用于where比较条件有:l 等于:=、<、<=、>、>=、<>l 包含:in、not in exists、not existsl 范围:between.and、not between.andl 匹配测试:like、not likel Null测试:is null、is not nulll 布尔链接:and、or、notoracle通配符:在查询数据时,会出现这样

57、一种情况数据本身含有”%” 或者 “_”符号,如果此时我们查询含有“%”的数据,我们要把”%”进行转义,让他失去原先的通配符的含义,而仅仅表现字面的意思。在Oracle中没有转义符号“”这个字符,需要我们用ESCAPE进行定义,比如“ESCAPE '#'”这时#符号就是转义字符了,对于转义字符我们最好选用一些不常用的字符。任何字符前出现#符号,那么这个字符将被转义,比如'A#%第一个%被转义代表字面意义的“%”而第二个是通配符。在where子句中通配符可和like条件起使用在Oracle中:l %(百分号): 用来表示任意数量或者可能根本没有l _(下划线): 表示确切

58、未知l ?(问号): 用来表示确切未知l #(井号): 用来表示确切阿拉伯数字0到9l a-d(方括号):用来表示范围在这里是从a到dl 单引号('):在Oracle中应该只使用单引号将文本和和日期括起来,不能使用引号(包括单双引号)将数字括起来l 双引号("):在Oracle中单双引号含义区别双引号被用来将包含特定或者空格列别名括起来双引号还被用来将文本放入日期格式l 双竖线(|):Oracle使用双竖线表示串连接l 星号(*):select *意味着选择所有列count(*)意味着计算所有行表示通配符时表示0个或任意多个l 正斜杠(/):在Oracle中用来终止SQL语句更准确说是表示了“运行现在位于缓冲区SQL代码”正斜杠也用作分隔项l 多行注释:/*.*/l 不等于:有多种表达方式:!=、=、<>、not xxx=yyy、not(xxx=yyy)多表查询的基本语法(重、难点) 之前的查询都是在一张表里进行的,如果现在使用一张以上的表,就称为多表查询。多表查询语法如下:

温馨提示

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

评论

0/150

提交评论