版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.:.;Oracle的历史Oracle 公司( 甲骨文 ) 开创人 : Larry Ellison 32岁,公司提供数据库效力.公司成立于 1977 年, 83 年公司更名为 Oracle ,原名为软件开发实验室.Oracle 数据库适用于大型企业竞争对手微软的SQLServerIBM 的DB2目前的版本2.07.0 , 8.0 , 8i , 9i , 10gOracle的效力:我的电脑右键选择管理-效力和运用程序效力OracleServer数据库效力,进程为ORACLE.exeOracleTNSListener监听器效力,进程TNSLSNR.exe默许端口1521、1526OracleDBC
2、onsole对运用于OEMOracleiSQL*Plus对于于iSQL*Plus是数据库或例程的系统标识符是Oracle主目录称号这几个效力之间的关系:启动顺序:1、OracleTNSListener必需启动 2、OracleServer必需启动 3、OracleDBConsole启动依赖于OracleServerSqlPlusSqlPlus是Oracle任何版本都自带的数据库操作工具,运用它可以完成大部分的数据库操作。SqlPlus可以“开场程序Oracle启动,也可以命令行启动互动1.命令行启动sqlPlussqlplus 用户名/密码orcl或sqlplus 用户名orcl假设用户是管理
3、员要在sqlplus 用户名/密码主机字符串 as sysdba“/是用户名和密码分隔符号“是密码和数据库的分隔符号“orcl是数据库的称号,在安装时指定常用命令互动connect 切换用户show 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 退出li
4、st 查看最后一条语句 文件名.sql 运转外部文件中的SQL语句Sql*plus的常用命令是一个oracle提供的工具,运用此工具可以完成数据库的操作和管理。SQL*Plus有两种任务方式:基于图形界面的sqlplusw基于命令行的sqlplusSql*plus 中可以执行3种类型的命令:SQL语句SELECT * FROM tab;PL/SQL语句CREATE TABLE test(x number,info varchar(20);Commit;编写一个存储过程,向test表中插入20条记录。DECLAREx number :=10;BEGINFOR I IN 1.20 LOOPINSE
5、RT INTO test VALUES (x,测试数据);x=x+i;END LOOP;END;SQL*Plus内部命令这些命令用于设置SQL*Plus的环境或格式化输出结果。例如:改动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编辑命令命令缩写作用APPE
6、ND texttext将text加到当前行末端CHANGE /old/newC /old/new将当前行中的old改为newCHANGE /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
7、文件名;在SQL文件中的注释有3种方法:运用SQL*Plus的REMARK命令;运用SQL注释分界符/*/运用ANSI/SQL的“-型注释读取命令文件在SQL*PLUS中:GET f:test.sql;运转.sql文件中的指令:START或,运用更多建议:尽量运用记事本编写代码,这样有利于修正。所需求的表在一切的讲解中所要运用到的表全部都是scott用户下的表,所以必需了解在此用户下有那几张表,以及每张表的作用是什么。防止出现汉字,由于实践开发中容易出现乱码问题。雇员表emp 雇员表中记录的是一个个的雇员的根本信息。雇员表EMP No. 字段类型 描画 1 EMPNO NUMBER(4) 表示
8、雇员编号,是独一编号2 ENAME VARCHAR2(10) 表示雇员姓名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
9、) 部门位置工资等级表SALGRADE一个公司工资是有等级制度,那么用此表表示一个工资的等级 工资等级表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字段 只需字段
10、中存在内容,那么表示此内容不为空null,假设存在内容,那么会显示详细的值。 不为空的表示:字段 IS NOT NULLSELECT * FROM emp WHERE comm IS NOT NULL ; 范例:查询没有奖金的雇员 没有奖金那么comm字段的内容一定是null,格式:字段 IS NULLSELECT * FROM emp WHERE comm IS NULL ; 范例:要求查询出,根本工资大于1500,同时可以领取奖金的雇员信息。 此时应该是两个条件,而且两个条件必需同时满足 既然要求两个条件全部满足,那么必需运用AND操作符进展条件的衔接。SELECT * FROM emp
11、WHERE sal1500 AND comm IS NOT NULL ; 同时指定了两个条件,两个条件必需同时满足才可以查询出结果。 范例:要求查询出,根本工资大于1500,或者可以领取奖金的雇员信息。 假设要表现出或者的概念运用OR进展衔接,表示两个条件有一个满足即可。SELECT * FROM emp WHERE sal1500 OR comm IS NOT NULL ; 之前运用NOT可以取反,把真的条件变为假的,假的变为真的。范例:要求查询出,根本工资不大于1500,同时不可以领取奖金的雇员信息。 此时相当于是整体的条件取反。SELECT * FROM emp WHERE NOT (s
12、al1500 OR comm IS NOT NULL); 等价于SELECT * FROM emp WHERE sal 1500 ,sal 1500 AND sal=1500 AND sal、=、=、=等计算符号不等于符号:在SQL中假设要想运用不等于符号,可以有两种方式:“、“!= 范例:查询雇员编号不是7369的雇员信息 运用“完成SELECT * FROM emp WHERE empno7369 ; 运用“!=完成SELECT * FROM emp WHERE empno!=7369 ; 对结果进展排序ORDER BY子句重点在SQL中可以运用ORDER BY子句对查询的结果进展排序,例
13、如,如今运用查询全部的语句:SELECT * FROM emp ; 此时,从查询结果可以发现,是按照雇员的编号进展排序的,那么此时假设要对运用指定的列进展排序,那么就必需运用ORDER BY语句,语法格式如下:SELECT DISTINCT * | 详细的列别名 FROM 表称号WHERE 条件(s) ORDER BY 排序的字段1,排序的字段2 ASC|DESC ASC表示升序、DESC表示降序范例:要求按照工资由低到高排序SELECT * FROM emp ORDER BY sal ; 之前是按照由低到高的顺序完成,是采用的升序的方式,如今要求运用降序的方式完成。实践上假设在排序的时候没有
14、指定排序规那么,那么默许的排序规那么是升序陈列。SELECT * FROM emp ORDER BY sal ASC ; 要想运用降序的方式完成,那么运用DESC即可。SELECT * FROM emp ORDER BY sal DESC ; 范例:要求查询出10部门的一切雇员信息,查询的信息按照工资由高到低排序,假设工资相等,那么按照雇佣日期由早到晚排序。 此时存在两个排序条件,第一个是降序,第二个升序SELECT * FROM emp WHERE deptno=10 ORDER BY sal DESC,hiredate ASC ; 排序的操作一定是放在整个SQL语句的最后执行。单行函数重点
15、数据库系统中,每个数据库之间独一不同的最大区别点就在与函数的支持上,运用函数可以完成一系列的操作功能。单行函数语法:function_name(column|expression,arg1,arg2,) 参数阐明: function_name:函数称号 column:数据库列名 expression:字符串或计算表达式 arg1,arg2:在函数中运用参数单行函数分类: 字符函数:接受字符输入并且前往字符或数值 数值函数:接受数值输入并前往数值 日期函数:对日期型数据进展操作 转换函数:从一种数据类型转换为另一种数据类型 通用函数:NVL函数、DECODE函数字符函数 HYPERLINK cn
16、blogs/Madream/articles/1261013.html Oracle中的dual表 Dual 是 Oracle中的一个实践存在的表,任何用户均可读取,常用在没有目的表的Select语句块中,用来构成select的语法规那么,oracle保证dual里面永远只需一条记录。这是由于ORACLE对DUAL表的操作做了一些内部处置,尽量保证DUAL表中只前往一条记录.当然这写内部操作是不可见的 .以下是dual的一些运用方法:1、查看当前用户,可以在 SQL Plus中执行下面语句select user from dual;2、用来调用系统函数select to_char(sysdat
17、e,yyyy-mm-dd hh24:mi:ss) from dual;-获得当前系统时间select SYS_CONTEXT(USERENV,TERMINAL) from dual;-获得主机名select SYS_CONTEXT(USERENV,language) from dual;-获得当前localeselect dbms_random.random from dual;-获得一个随机数3、可以用做计算器select 7*9 from dual;ACII(x)前往字符x的ASCII码select ascii(a) from dual;求ACSII(a),ASCII(A),ASCII(0
18、),ASCIIXYZ的值CHRX前往ASCII码为X的字符CONCAT(x,y)字符串拼接函数select concat(concat(ename, is a),job) from emp;INITCAP(x)首字母大写select initcap(ename) from emp;INSTRx,y,n,m确定y在x中的位置。n是起始查找的位置,m第几次出现的位置。select instr(HelloWorld!,l,2) from dual;select instr(HelloWorld!,l,2,3) from dual;LENGTH(x)字符串长度select ename,length(e
19、name) from emp where empno=7698;LOWER(x)转换小写select lower(ename) from emp;UPPER(x)转换大写LPAD(x,n,y)在字符串x的左边补充字符串y,得到总长为n个字符的字符串。可选参数y用于指定在x左边补充的字符串;省略参数y,默许值为空串。select lpad(ename,15,$#) from emp;RPAD(x,n,y)select rpad(ename,15,#$) from emp;LTRIM(x,y)从字符串x的左边截去包含在字符串y中的字符。假设不指定参数y,那么默许截去空格。select ltrim(
20、abcdab,a) from dual;RTIME(x,y)trim(x)去除左右空格SUNSTR(x,n,m)前往字符串x中的一个子串,这个子串从字符串x的第n字符开场,截取参数m个字符。select substr(abcsdfsdwfg,3,4) from dual;replacex,y,z将字符串x中所具有的子串y用子串z交换select replace(jack and jue,j,bl) from dual;19. TRANSLATE(string,if,then) 根据“if中字符的位置,并检查“then的一样位置,然后用该位置的字符交换“string中的字符。select tra
21、nslate(ename,AE,12) from emp;是专门处置字符的,例如,可以将大写字符变为小 ,还能求出字符的长度。范例:将小写字母变为大写字母SELECT UPPER(smith) FROM DUAL ; 范例:普通用户在查询一个人姓名的时候有能够思索到这个人的姓名是大写字母存的还是小写字母保管的呢? 那么此时,为了方便用户的运用就可以运用upper函数完成。SELECT * FROM emp WHERE ename=UPPER(Smith) ; 还可以运用lower()函数将一个字符串变为小写字母表示。SELECT LOWER(HELLO WORLD) FROM dual ; 还
22、可以运用initcap()函数将单词的第一个字母大写SELECT INITCAP(HELLO WORLD) FROM dual ; 范例;运用此函数将雇员表中的雇员姓名变为开头字母大写SELECT INITCAP(ename) FROM emp ; 字符串除了可以运用“|衔接之外,还可以运用CONCAT()函数进展衔接操作。SELECT CONCAT(hello ,world) FROM DUAL ; 此时曾经完成了衔接,但是此种方式一定不如“|好使。在字符函数中可以进展字符串的截取、求出字符串的长度、进展指定内容的交换 字符串截取:substr() 字符串长度:length() 内容交换:r
23、eplace()SELECT substr(hello,1,3) -截取字符串 , length(hello) -字符串长度 , replace(hello,l,x) -字符串交换FROM DUAL ; 但是在substr()函数的时候有一点需求提示大家留意,跟面试有关: Oracle中substr()函数的截取点是从0还是从1开场。 |- 从0或从1开场效果是一样的,由于Oracle比较智能。范例:要求显示一切雇员的姓名及姓名的后三个字符 由于雇员姓名的字符串长度不一样,所以只能求出整个的长度再减去2,这样进展截取操作。SELECT ename,SUBSTR(ename,LENGTH(ena
24、me)-2) FROM emp ; 此时,功能曾经实现了,但是操作比较费事。实践上在substr()函数中提供了一种非常方便的机制,可以采用倒着截取的方式,只需输入的位置是负数就表示倒着进展。SELECT ename,SUBSTR(ename,-3,3) FROM emp ; 数值函数数值函数只需是包含以下几种: 四舍五入:ROUND() 截断小数位:TRUNC() 取余取模:MOD 范例:执行四舍五入操作SELECT ROUND(789.536) FROM dual ; 当然,在ROUND()函数中也可以指定四舍五入的位数范例:保管两位小数SELECT ROUND(789.536,2) FR
25、OM 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 ; 范例:运用负数表示位数SELECT TRUNC(789.536,-2) FROM DUA
26、L ; 范例:运用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 x)从日期x中摘取所需求的年或月或日数据last_day
27、(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时间数据。Fmt可以取YEAR,MONTH,DAY三者之一
28、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) 前往日期d1和d2之间的月份数。假设d1晚于d2,结果为正,否那么前往负数SQL select month
29、s_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 extract(year from sysdate) from dual;SQL select extract(month from sysdat
30、e) from dual;SQL select extract(day from to_date(23-03-2021,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(16-3月-08),month) from dual;SQL select round(to_date(16-3月-08),day) from dual;格式符阐明举例yyyy年份2021mmmonthmon月份02dd天28day星期几星期五a
31、m/pm上午/下午hh/hh12/hh24小时2:30mi分钟30ss秒rr 可以把yy交换成rr有不同的效果fm 去掉数字前面的零察看结果select to_char(sysdate,yyyy-mm-dd hh:mi:ss pm) 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
32、:mi:ss ) from dual;select to_char(sysdate,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部门雇员进入公司的星期数 假设要想完成此操作,那么首先必需知道当前的日期,在Oracle中可以经过以下的操作求出当前
33、日期,运用sysdate表示。SELECT SYSDATE FROM DUAL ; 求出星期数:当前日期 雇佣日期 = 天数 / 7 = 星期数SELECT empno,ename,ROUND(SYSDATE-hiredate)/7) FROM emp ; 在Oracle中提供了以下的日期函数支持: MONTHS_BETWEEN():求出给定日期范围的月数 ADD_MONTHS():在指定日期上加上指定的月数,求出之后的日期 NEXT_DAY():下一个的今天是那一个日期 LAST_DAY():求出给定日期的最后一天日期范例:验证MONTHS_BETWEEN()SELECT empno,ena
34、me,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()函数 求出一个日期的最后一天SELECT LAST_DAY(SYSDATE) FROM DUAL ; 转换函数转换函数主要有以下几种: TO_CH
35、AR():转换成字符串 TO_NUMBER():转换成数字 TO_DATE():转换成日期范例:查询一切雇员的雇员编号、姓名、雇佣日期SELECT empno,ename,hiredate FROM emp ; 但是如今要求可以将年、月、日进展分开,此时就可以运用TO_CHAR()函数进展拆分,拆分的时候必需指定拆分的通配符: 年:y,年是四位的数字,所以运用yyyy表示 月:m,月是二位的数字,所以运用mm表示 日:d,日是二位的数字,所以运用dd表示还可以运用to_char()函数进展日期显示的转换功能。 Oracle中默许的日期格式:19-4月 -87 中国的喜欢格式:1987-04-1
36、9从运转结果中可以发现,假设是5月,那么会运用05表示。那么这个0称为前导0,假设不希望显示前导0的话,那么可以运用fm去掉这些0。 to_char()函数除了可以用在日期上,也可以用在数字上。双引号():在Oracle中单双引号含义区别双引号被用来将包含特定或者空格列别名括起来SELECT empno “ ,ename,sal as “工资 FROM emp ;双引号还被用来将文本放入日期格式SELECT TO_CHAR(sysdate,fmyyyy年mm月dd日)FROM DUAL;例如:要查询全部的雇员编号、姓名、工资SELECT empno,ename,sal FROM emp ; 最
37、好在数字中参与一些符号,以分割太长的数字,普通中国运用“,,所以,此时,可以运用to_char()函数进展格式化: 9:表示一位数字SELECT empno,ename,TO_CHAR(sal,99,999) FROM 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是可以将字符串变
38、为数字的一种函数。SELECT TO_NUMBER(123) + TO_NUMBER(123) FROM DUAL ; 以上就表示把字符串变为数字,之后进展数字的加法操作。TO_DATE()函数可以将一个字符串变为DATE型的数据。 例如:有2021-2-16是一个字符串,如今要变为DATE类型。SELECT TO_DATE(2021-02-16,yyyy-mm-dd) FROM DUAL ; SELECT TO_CHAR(TO_DATE(2021-02-16,yyyy-mm-dd),yyyy年mm月dd日)FROM DUAL通用函数范例:要求求出每个雇员的年薪 求出年薪的时候应该加上奖金的,
39、格式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()函数进展一个转换操作。NVLx,y假设x为null,那么前往y值;否那么前往x的值。select ename,sal
40、+nvl(comm,0) from emp;NVL2x,y,z假设x不为空前往y的值,否那么前往z的值select ename,nvl2(comm,奖金:|comm,无奖金) from emp DECODE()函数,此函数是在面试最有能够问到的问题。DECODE()类似于IFELSEIFELSE语句。语法:DECODE(col/expression,search1,result1,search2,result2,.,default) 阐明:col/expression:为列名或表达式search1、search2searchi:为用于比较的条件result1、result2resulti为前往
41、值假设col/expression和searchi相比较,结果一样的话,那么前往resulti,假设没有与col/expression相匹配的结果,那么前往默许枝default。 范例:验证DECODE()函数SELECT DECODE(1,1,内容是1,2,内容是2,3,内容是3) FROM DUAL ; 从运转结果上看,程序将内容进展更改,显示的结果变了。 可以直接在emp表上运用此函数,例如,如今有如下的要求: 雇员的任务: |- CLERK:业务员 |- SALESMAN:销售人员 |- MANAGER:经理 |- ANALYST:分析员 |- PRESIDENT:总裁范例:要求查询出
42、雇员的编号,姓名,雇佣日期及任务,将任务交换成以上的信息SELECT empno 雇员编号 ,ename 雇员姓名 ,hiredate 雇佣日期 , DECODE(job,CLERK,业务员,SALESMAN, 销售人员,MANAGER,经理, ANALYST,分析员,PRESIDENT,总裁) 职位FROM emp ; 从运转结果上发现,运用DECODE函数曾经让输出的职位信息有所更改。总结 1、 Oracle的主要用户: 超级管理员:sys/change_on_install 普通管理员:system/manager 普通用户:scott/tiger 2、 sqlplusw的一些常用命令
43、设置行显示数量:set linesize 长度 设置页显示数量:set pagesize 长度 ed及指令 衔接:conn 用户名 / 密码 AS SYSDBA 3、 SQL根底语法的格式 4、单行函数,这些函数应该随着开发的增长逐渐掌握,DECODE()函数最重要。补充oracle运算符运用用于where比较条件有:等于:=、=、包含:in、not in exists、not exists范围:between.and、not betweenand匹配测试:like、not likeNull测试:is null、is not null布尔链接:and、or、notoracle通配符:在查询数据
44、时,会出现这样一种情况数据本身含有% 或者 “_符号,假设此时我们查询含有“%的数据,我们要把%进展本义,让他失去原先的通配符的含义,而仅仅表现字面的意思。在Oracle中没有本义符号“这个字符,需求我们用ESCAPE进展定义,比如“ESCAPE #这时#符号就是本义字符了,对于本义字符我们最好选用一些不常用的字符。任何字符前出现#符号,那么这个字符将被本义,比如A#%第一个%被本义代表字面意义的“%而第二个是通配符。在where子句中通配符可和like条件起运用在Oracle中:%(百分号): 用来表示恣意数量或者能够根本没有_(下划线): 表示确切未知?(问号): 用来表示确切未知#(井号
45、): 用来表示确切阿拉伯数字0到9a-d(方括号):用来表示范围在这里是从a到d单引号():在Oracle中应该只运用单引号将文本和和日期括起来,不能运用引号(包括单双引号)将数字括起来双引号():在Oracle中单双引号含义区别双引号被用来将包含特定或者空格列别名括起来双引号还被用来将文本放入日期格式双竖线(|):Oracle运用双竖线表示串衔接星号(*):select *意味着选择一切列count(*)意味着计算一切行表示通配符时表示0个或恣意多个正斜杠(/):在Oracle中用来终止SQL语句更准确说是表示了“运转如今位于缓冲区SQL代码正斜杠也用作分隔项多行注释:/*/不等于:有多种表
46、达方式:!=、=、not xxx=yyy、not(xxx=yyy)多表查询的根本语法重、难点 之前的查询都是在一张表里进展的,假设如今运用一张以上的表,就称为多表查询。多表查询语法如下: SELECT DISTINCT * |查询列1 别名1,查询列2 别名2,FROM 表称号1 别名1,表称号2,别名2,WHERE 条件(s )ORDER BY 排序字段1 ASC|DESC ,排序字段2 ASC|DESC范例:下面运用多表查询,同时查询emp和dept表SELECT * FROM emp,dept; 以上的查询运用了两个表。从查询结果上发现前往的数据是56行,但是emp是14行。范例:查询e
47、mp 表中的记录数SELECT COUNT(*) FROM emp; 从查询结果上看emp中有14条范例:查询dept 表中的记录数SELECT COUNT(*) FROM dept; 从查询结果上看dept中有4条56条记录=emp表的14条dept表的4条运用多表查询会产生笛卡尔积。假设表的数据越多,那么笛卡尔积就会越大,假设如今假设有5张表,每张表有100000条记录,1000005所以多表查询在是不建议挂在开发中过多运用的。要想去掉笛卡尔积那么必需运用字段进展关联的操作。在emp中表存在一个deptno的字段, 在dept表里也存在一个deptno的字段,而且emp表中的deptno中
48、的字段是与dept表中的deptno关联的,所以deptno 属于关联字段。在多表查询中要用WHERE 子句来消除笛卡尔积。范例:修正前面的查询SELECT * FROM emp,deptWHERE emp.deptno=dept.deptno; 查询结果是14行,此时消除了笛卡尔积,但是假设如今表称号过长时过长时不是很好用,一边会对表起个别名。SELECT * FROM emp e,dept dWHERE e.deptno=d.deptno; 结果是一样的,所以普通在开发中运用多表查询,最好指定表的别名范例:要求查询出雇员的编号、雇员的姓名、部门的编号、部门称号及部门位置SELECT e.e
49、mpno,e.ename,d.deptno,d.dname,d.locFROM emp e,dept dWHERE emp.deptno=dept.deptno; 范例:要求查询出每个雇员姓名、任务、雇员的直接上级指点的姓名在emp表中mgr字段表示一个雇员的上级指点的编号,假设要查询一个雇员的上级指点的姓名,那么一定要将emp和emp本人和本人进展关联,这种叫自相关。SELECT e.ename,e.job,m.enameFROM emp e,emp mWHERE e.mgr=m.empno; 范例:要求进一步扩展,将雇员所在的部门称号同时列出部门称号在dept表中SELECT e.enam
50、e,e.job,m.ename,d.dnameFROM emp e,emp m, dept dWHERE e.mgr=m.empno AND e.deptno=d.deptno; 思索题:要求查询出每个雇员的姓名、工资、部门称号、工资在公司的等级salgrade,及其指点的姓名及工资所在公司的等级。思绪分析:首先查询每个雇员的姓名、工资、部门称号、工资在公司的等级,涉及到的表有emp表、salgrade表、dept表SELECT e.ename,e.sal,d.dname,s.gradeFROM emp e, dept d ,salgrade sWHERE e.deptno=d.deptno
51、AND e.sal BETWEEN s.losal AND s.hisal; 然后思索指点的姓名和工资等级SELECT e.ename,e.sal,d.dname,s.grade,m.ename,m.sal,ms.gradeFROM emp e, dept d ,salgrade s,emp m,salgrade msWHERE e.deptno=d.deptno AND e.sal BETWEEN s.losal AND s.hisalAND e.mgr=m.empno AND m.sal BETWEEN ms.losal AND ms.hisal; 进一步思索要求将工资等级按以下款式输出:
52、1:五级工资2:四级工资3:三级工资4:二级工资5:一级工资这需求运用DECODE()函数SELECT e.ename,e.sal,d.dname,DECODE(s.grade,1,五级工资,2,四级工资,3,三级工资,4,二级工资,5,一级工资),m.ename,m.sal, DECODE(ms.grade,1,五级工资,2,四级工资,3,三级工资,4,二级工资,5,一级工资)FROM emp e, dept d ,salgrade s,emp m,salgrade msWHERE e.deptno=d.deptno AND e.sal BETWEEN s.losal AND s.hisal
53、AND e.mgr=m.empno AND m.sal BETWEEN ms.losal AND ms.hisal; 左衔接、右衔接重点 在dept表中存在4条记录如今将emp表和dept表关联查询,查询一下指定的字段。SELECT e.empno,e.ename,d.deptno,d.dnameFROM emp e,dept dWHERE e.deptno=d.deptno;此时发如今查询结果中,deptno字段里没有出现40的记录,我们查看在dept表中的的部门编号有40,这是为什么?由于在雇员表中没有是40部门的雇员SELECT e.empno,e.ename,d.deptno,d.dn
54、ameFROM emp e,dept dWHERE e.deptno(+)=d.deptno; 假设想要40部门显示出来在WHERE子句中+写在等号的左边,发现40部门出现。这个时候是右衔接。因此,+在=右边是左衔接衔接的时候以左边为准+在=左边是右衔接衔接的时候以右边为准留意:在开发中左、右衔接运用较多,特别要了解实践上在之间的查询中查找雇员姓名及每一位雇员的指点的时候就应该运用左、右衔接了。SELECT e.empno,e.ename,m.empno,m.enameFROM emp e,emp mWHERE e.mgr=m.empno;一共13行数据,但是emp表中有14条记录SELECT
55、 e.empno,e.ename,m.empno,m.enameFROM emp e,emp mWHERE e.mgr=m.empno(+);以上运用了左衔接,显示了14条信息,多出来了 7839 KING应为7839 KING是最高指点,mgr字段为nullSELECT e.empno,e.ename,m.empno,m.enameFROM emp e,emp mWHERE e.mgr(+)=m.empno;假设我们用了右衔接,发现记录有21条规范SQL语法知道SELECT table1.column,table2.columnFROM table1 CROSS JOIN table2 |N
56、ATURAL JOIN table2 | JOIN table2 USING(column_name) |JOIN table2 ON(table1.colunm_name =table2.column_name) |LEFT |RIGHT |FULL OUTER JOIN table2 ON(table1.column_name=table2.column_name);交叉衔接CROSS JOIN table2 产生笛卡尔积SELECT * FROM emp CROSS JOIN dept;产生了56条记录,效果和以下查询一样SELECT * FROM emp,dept;自然衔接CROSS
57、JOIN table2 自动进展关联字段的匹配SELECT * FROM emp NATURAL JOIN dept;查询的结果是条记录,自动的进展了字段的关联匹配,不用写WHERE子句的关联条件,效果和以下的查询一样SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;JOIN table2 USING(column_name) 直接指定关联的操作列SELECT * FROM emp JOIN dept USING(deptno);效果和上面的一样,可以自行指定关联的字段JOIN table2 ON(table1.colunm_name =t
58、able2.column_name) 用户本人编写衔接的条件SELECT * FROM emp JOIN dept ON(emp.deptno=dept.deptno);效果和上面的一样LEFT OUTER JOIN table2 ON(table1.column_name=table2.column_name) 左外衔接RIGHT OUTER JOIN table2 ON(table1.column_name=table2.column_name)右外衔接SELECT * FROM emp e RIGHT OUTER JOIN dept d ON (e.deptno =d.deptno);效
59、果和我们上面的右衔接是一样的SELECT * FROM emp e,dept dWHERE e.deptno(+)=d.deptno;以上的的语法应该作为了解,看到要求认识。组函数和分组统计组函数也称为聚合函数。例如:我们把学生可以分为男生和女生两个组,假设想求每组的人数,平均身高,平均年龄等,就需求用到分组函数了。在SQL中常用的组函数有以下几个:COUNT():求出全部的记录数MAX():求出一组中的最大值MIN():求出一组中的最小值AVG():求出一组中的平均值SUM():求和范例:COUNT()函数SELECT COUNT(empno) FROM emp;我们常用COUNT(*),最
60、好可以用字段替代*范例:MAX()、MIN()函数,求最大最小值,普通是针对于数值的字段的,求出一切员工的的最高工资,和最底工资和平均工资。SELECT MAX(sal) 最高工资,MIN(sal) 最底工资,AVG(sal) 平均工资FROM emp;范例:求出部门的一切员工工资的总合SELECT SUM(sal) 工资综合 FROM emp WHERE deptno=10;假设如下查询输出部门编号和其部门一切员工的工资总和,会产生错误。SELECT deptno ,SUM(sal) 工资综合 FROM emp WHERE deptno=10;发生以上的错误信息,是由于这样的查询需求进展分组
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广东建筑安全员知识题库附答案
- 贵州财经职业学院《现代西方哲学专题》2023-2024学年第一学期期末试卷
- 蚕豆产业基地建设项目可行性研究报告-蚕豆市场需求持续扩大
- 贵阳康养职业大学《医疗健康商务沟通》2023-2024学年第一学期期末试卷
- 广州中医药大学《生物统计附试验设计实验》2023-2024学年第一学期期末试卷
- 2025年-吉林省安全员知识题库附答案
- 广州现代信息工程职业技术学院《心理咨询与心理辅导》2023-2024学年第一学期期末试卷
- 2025年-河北省安全员B证考试题库
- 2025建筑安全员A证考试题库
- 2025年山西省建筑安全员-C证考试(专职安全员)题库及答案
- 一元一次含参不等式教学设计83
- 生物医学研究的统计学方法课后习题答案 2014 主编 方积乾
- 100道凑十法练习习题(含答案)
- 牛仔面料成本核算
- 加拿大矿业政策
- 客情关系的建立和维护
- 2022年合理使用抗生素试题
- 简单娱乐yy频道设计模板
- 110kV变压器保护整定实例
- 健康体检的八大意义
- 销售顾问初级认证笔试题
评论
0/150
提交评论