ImageVerifierCode 换一换
格式:DOCX , 页数:33 ,大小:80.08KB ,
资源ID:7301656      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7301656.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(经典Oracle的sql语句百例训练汇总.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

经典Oracle的sql语句百例训练汇总.docx

1、经典Oracle的sql语句百例训练汇总Oracle系列一:简单SQL与单行函数使用scott/tiger用户下的emp表和dept表完成下列练习,表的结构说明如下 emp员工表(empno员工号/ename员工姓名/job工作/mgr上级编号/hiredate受雇日期/sal薪金/comm佣金/deptno部门编号) dept部门表(deptno部门编号/dname部门名称/loc地点) 工资 薪金 佣金登录Oracle数据库1、sqlplus scott/tiger2、sqlplus /nologSQLconn scott/tiger若是使用SYS的账号进行登录的话,则使用以下语句SQLc

2、onn / as sysdba【1】EMP表内容查询SQL SELECT * FROM emp;出错,原因是没有找到该表,因为该表时SCOTT用户的表,所以查询时应该加上scott.emp就可以了【2】显示当前用户SQL show user【3】查看当前用户的所有表SQL SELECT * FROM tab;【4】若想重复执行上一条SQL语句,则在sqlplus命令行下输入/即可【5】查询一张表的结构,例如dept表SQL desc dept【6】在雇员表中查询雇员的编号、姓名、工作SQL SELECT empno,ename,job FROM emp;【7】可以为列名取别名,在Linux下O

3、racle如果英文别名不加上双引号则会变成大写SQL SELECT empno 编号,ename 姓名,job 工作 FROM emp;【8】查询所有的工作SQL SELECT DISTINCT job FROM emp;工作可能会重复,加上DISTINCT关键字【9】若要求按照以下的格式进行结果输出,如 NO:7469,Name:SMITH,Job:CLERKSQL SELECT NO:|empno|,Name:|ename|,Job:|job FROM emp;【10】要求列出每个雇员的姓名及年薪SQL SELECT ename,sal*12 income FROM emp;这里年薪最好用

4、别名进行标识,可以一眼就能明白【11】查看每月可以得到奖金的雇员信息SQL SELECT * FROM emp WHERE comm is NOT NULL;【12】要求基本工资大于1500,同时可以领取奖金的雇员信息SQL SELECT * FROM emp WHERE sal1500 AND comm is NOT NULL;如果是或的是关系,则使用 OR【13】查询基本工资不大于1500,同时不可以领取奖金的雇员信息SQL SELECT * FROM emp WHERE NOT(sal1500 AND comm is NOT NULL);【14】查询在1981年雇佣的全部雇员信息,BET

5、WEEN . AND 包含等于的情况SQL SELECT * FROM empWHERE hiredate BETWEEN 01-JAN-81 AND 31-DEC-81;【15】Oracle对大小敏感,所以查询时名字要区分大小写【16】要求查询出雇员编号不是 7369、7499的雇员信息SQL SELECT * FROM empWHERE empno NOT IN(7369,7499);【17】SQL中LIKE语句要注意通配符 % 和 _SQL SELECT * FROM empWHERE hiredate LIKE %81%;【18】查看雇员编号不是7369的雇员信息,使用或!=SQL S

6、ELECT * FROM empWHERE empno7369;【19】要求对雇员的工资由低到高进行排序,升序为默认(ASC),降序(DESC)SQL SELECT * FROM empGROUP BY sal;【20】查看出部门号为10的雇员信息,查询的信息按照工资从高到低,若工资相等则按雇用日期从早到晚排列SQL SELECT * FROM empWHERE deptno=10GROUP BY sal DESC,hiredate ASC;数据库系统中,每个数据库之间区别最大的就是在函数的支持上,单行函数是最简单的函数,单行函数分为1、字符函数:接受字符输入并且返回字符或数值2、数值函数:接

7、受数值输入并返回数值3、日期函数:对日期型数据进行操作4、转换函数:将一种数据类型转换为另一种数据类型5、通用函数:NVL、DECODE 函数字符函数:【1】大小写转换 UPPER 和 LOWERSQL SELECT UPPER(smith) FROM dual;【2】将雇员姓名变为开头字母大写,INITCAPSQL SELECT INITCAP(ename) FROM emp;字符函数中有连接函数CONCAT,但不如 | 好用,还有字符串处理的一些函数字符串截取:substr()字符串长度:length()内容替换:replace()SQL SELECT substr(hello,1,3),

8、length(hello),replace(hello,l,x) FROM dual;这里注意的是Oracle中字符串截取从0和从1开始都是一样的,谨防面试提问【3】要求显示所有雇员的姓名及姓名的后3个字符SQL SELECT ename,SUBSTR(ename,LENGTH(ename)-2) FROM emp;以上操作显得较为麻烦,substr()函数是可以倒着截取SQL SELECT ename,SUBSTR(ename,-3,3) FROM emp;数值函数:1、四舍五入:ROUND()2、截断小数位:TRUNC()3、取余(取模):MODSQL SELECT ROUND(789.5

9、36) FROM dual;【1】保留2位小数,(如果是-2则对整数进行四舍五入,变为800了)SQL SELECT ROUND(783.56,2) FROM dual;【2】使用MOD()函数进行取余操作SQL SELECT MOD(10,3) FROM dual;日期函数:1、日期 - 数字 = 日期2、日期 + 数字 = 日期3、日期 - 日期 = 数字(天数)【1】求出当前日期SQL SELECT SYSDATE FROM dual;Oracle提供了以下的日期函数支持:MONTHS_BETWEEN():求出给定日期范围的月数ADD_MONTHS():在指定日期上加上指定的月数,求出之

10、后的日期NEXT_DAY():下一个的今天的日期LAST_DAY():求出给定日期的最后一天日期【2】求出从雇用日期到今天所有雇员的雇员编号、姓名和月数SQL SELECT empno,ename,ROUND(MONTHS_BETWEEN(SYSDATE,hiredate) FROM emp;【3】验证 ADD_MONTHS()、NEXT_DAY()、LAST_DAY()SQL SELECT ADD_MONTHS(SYSDATE,4) FROM DUAL;SQL SELECT NEXT_DAY(SYSDATE,MON) FROM DUAL;SQL SELECT LAST_DAY(SYSDATE

11、) FROM DUAL;转换函数:1、TO_CHAR(): 将日期或数值转换成字符串2、TO_NUMBER():将字符串转换成数字3、TO_DATE(): 将字符串转换成日期【1】将年月日进行分开,要指定拆分的通配符,yyyy-mm-ddSQL SELECT empno,ename,TO_CHAR(hiredate,yyyy) datetime FROM emp;【2】将薪水的数字进行格式化,$99,999表示美元,L99,999表示当地货币SQL SELECT empno,ename,TO_CHAR(sal,99,999) salary FROM emp;【3】TO_NUMBER()验证SQ

12、L SELECT TO_NUMBER(123)+TO_NUMBER(123) FROM DUAL;【4】TO_DATE()验证,如下例子执行后显示为 11-JUL-11SQL SELECT TO_DATE(2011-7-11,yyyy-mm-dd) FROM DUAL;通用函数:【1】求出每个雇员的年薪(应算上奖金)SQL SELECT empno,ename,(sal+comm)*12 FROM emp;由于comm中有NULL,NULL值计算后还是NULL,正确如下:SQL SELECT empno,ename,NVL(comm,0),(sal+NVL(comm,0)*12 income

13、FROM emp;NVL可以理解为将NULL值转换为具体的内容,这里是0【2】DECODE()函数,该函数类似于 IF . ELSEIF.ELSE语法如下:DECODE(col/expression,选择1,结果1,选择2,结果2,.,默认)验证DECODE()函数SQL SELECT empno,ename,hiredate,DECODE(job,CLERK,业务员,SALESMAN,销售人员,MANAGER,经理,ANALYST,分析员,PRESIDENT,总裁) 职位FROM emp;SQL简单语句练习:【1】找出佣金高于薪金的60%的员工SQL SELECT * FROM emp WH

14、ERE commsal*0.6【2】找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK)的详细资料SQL SELECT * FROM empWHERE (deptno=20 AND job=MANAGER)OR (deptno=10 AND job=CLERK);【3】找出既不是经理又不是办事员但其薪金大于或等于2000的所有员工的资料SQL SELECT * FROM empWHERE job NOT IN(MANAGER,CLERK) AND sal = 2000;【4】找出有奖金的员工的不同国祚SQL SELECT DISTINCT job FROM empWHE

15、RE comm IS NOT NULL;【5】找出各月倒数第3天受雇的所有员工SQL SELECT * FROM empWHERE LAST_DAY(hiredate)-2=hiredate;【6】找出早于12年前受雇的员工SQL SELECT * FROM empWHERE MONTHS_BETWEEN(sysdate,hiredate)/12 12;【7】显示刚好为5个字符的员工的姓名SQL SELECT ename FROM empWHERE length(ename)=5;【8】显示不带有R的员工的姓名SQL SELECT ename FROM empWHERE ename NOT L

16、IKE %R%;【9】显示员工的姓名和受雇日期,将最老的员工排在最前SQL SELECT * FROM empGROUP BY hiredate;【10】显示所有员工的姓名,加入公司的年份和月份,按受雇日期所在月排序,若月份相同则按年份排序SQL SELECT ename,TO_CHAR(hiredate,yyyy) year,TO_CHAR(hiredate,mm) month FROM empORDER BY month,year;【11】找出在2月受聘的员工SQL SELECT * FROM empWHERE TO_CHAR(hiredate,mm)=2;【12】以年月日方式显示所有员工

17、服务年限SQL SELECT ename,TRUNC(MONTHS_BETWEEN(sysdate,hiredate)/12) year,TRUNC(MOD(MONTHS_BETWEEN(sysdate,hiredate),12) month,TRUNC(MOD(sysdate-hiredate,30) dayFROM emp;Oracle系列二:多表复杂查询和事务处理多表查询应该注意去除笛卡尔积,一般多个表时会为表起个别名【1】要求查询雇员的编号、姓名、部门编号、部门名称及部门位置SQL SELECT e.empno,e.ename,d.deptno,d.dname,d.locFROM em

18、p e,dept dWHERE e.deptno = d.deptno;【2】要求查询每个雇员的姓名、工作、雇员的直接上级领导的姓名(表自关联)SQL SELECT e.ename,e.job,m.enameFROM emp e,emp mWHERE e.mgr = m.empno;【3】对【2】进行扩充,将雇员所在部门名称同时列出SQL SELECT e.ename,e.job,m.ename,d.dnameFROM emp e,emp m,dept dWHERE e.mgr = m.empno AND e.deptno=d.deptno;【4】查询每个雇员的姓名、工资、部门名称,工资在公司

19、的等级(salgrade),及其领导的姓名所在公司的等级先确定工资等级表的内容SQL SELECT * FROM salgrade;查询每个雇员的姓名、工资、部门名称和工资在公司的等级SQL SELECT e.ename,e.sal,d.dname,s.gradeFROM emp e,dept d,salgrade sWHERE e.deptno=d.deptno AND e.sal BETWEEN s.losal AND s.hisal;查询其领导姓名及工资所在公司的等级SQL SELECT e.ename,e.sal,d.dname,s.grade,m.ename,m.sal,ms.gra

20、deFROM 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;【5】左连接与右连接的概念,+在等号左边表示右连接,反之,左连接查询雇员的编号、姓名及其领导的编号、姓名SQL SELECT e.empno,e.ename,m.empno,m.enameFROM emp e,emp mWHERE e.mgr = m.emp

21、no(+);就发现将KING的那条记录也连过来了SQL1999语法中有如下几种连接(了解)1、交叉连接CROSS JOIN,产生笛卡尔积SQL SELECT * FROM emp CROSS JOIN dept;2、自然连接NATURAL JOIN,自动进行关联字段的匹配SQL SELECT * FROM emp NATURAL JOIN dept;3、使用USING子句,直接关联操作列SQL SELECT * FROM emp JOIN dept USING(deptno)WHERE deptno=30;4、使用ON子句,用户自己编写的条件SQL SELECT * FORM emp JOIN

22、 dept ON(emp.deptno = dept.deptno)WHERE deptno=30;5、左连接(左外连接、LEFT (OUTER) JOIN)、右连接(右外连接、RIGHT (OUTER) JOIN)组函数及分组统计1、COUNT():求出全部记录数2、MAX():求出一组中最大值3、MIN():求出最小值4、AVG():求出平均值5、SUM():求和【1】求出每个部门的雇员数量SQL SELECT deptno,count(empno)FROM empGROUP BY deptno;【2】按部门分组,并显示部门的名称,及每个部门的员工数SQL SELECT d.dname,C

23、OUNT(e.empno)FROM emp e,dept dWHERE e.deptno=d.deptnoGROUP BY d.dname;【3】要求显示平均工资大于2000的部门编号和平均工资SQL SELECT deptno,AVG(sal)FROM empWHERE AVG(sal)2000GROUP BY deptno;出错,WHERE子句中不能出现分组函数的条件,要使用HAVING子句上述语句应该改为如下SQL SELECT deptno,AVG(sal)FROM empGROUP BY deptnoHAVING AVG(sal)2000【4】显示非销售人员工作名称以及从事同一工作雇

24、员的月工资总和,并且要求从事同一工作的雇员月工资合计大于$5000,输出结果按月工资的合计升序排序按工作分组,求出非销售人员的月工资总和SQL SELECT job,SUM(sal)FROM empWHERE jobSALESMANGROUP BY job;对分组条件进行限制,然后进行排序,HAVING子句不能使用别名SQL SELECT job,SUM(sal) totalSalFROM empWHERE jobSALESMANGROUP BY jobHAVING SUM(sal) 5000ORDER BY totalSal;【3】分组函数可以嵌套使用,但是在SELECT列中就不能再出现该分

25、组条件的列名了SQL SELECT deptno,MAX(AVG(sal)FROM empGROUP BY deptno;出错!修改如下SQL SELECT MAX(AVG(sal)FROM empGROUP BY deptno;【4】查询出比7654工资要高的全部雇员的信息首先要查询雇员编号7654的工资SQL SELECT sal FROM emp WHERE empno=7654;以上述条件的结果最后后续查询的依据SQL SELECT * FROM empWHERE sal(SELECT sal FROM emp WHERE empno=7654);子查询在操作中分为以下三类:1、单列子

26、查询:返回的结果是一列的内容2、单行子查询:返回多个列,也可能是一条记录3、多行子查询:返回多个记录【1】要求查询工资比7654高,同时与7788从事相同工作的全部雇员SQL SELECT * FROM empWHERE sal(SELECT sal FROM emp WHERE empno=7654)AND job=(SELECT job FROM emp WHERE empno=7788);【2】要求查询 部门名称、部门员工数、部门平均工资,部门的最低收入雇员的姓名查询部门员工数、部门平均工资SQL SELECT deptno,COUNT(empno),AVG(sal)FROM empGR

27、OUP BY deptno;查询部门的名称,及最低收入雇员姓名,要进行表关联(子查询)SQL SELECT d.dname,ed.c,ed.a,e.enameFROM dept d,( SELECT deptno,COUNT(empno) c,AVG(sal) a,MIN(sal) min FROM emp GROUP BY deptno) ed, emp eWHERE d.deptno=ed.deptno AND e.sal = ed.min;若上述存在两个最低工资的情况,则会出错,在子查询中存在以下3种查询的操作符号IN:指定一个查询范围,例如查询每个部门的最低工资(返回值有多个)SQL

28、SELECT * FROM empWHERE sal IN(SELECT MIN(sal) FROM emp GROUP BY deptno);ANY:=ANY(与IN操作一样)、ANY(比最小大)、 SELECT * FROM empWHERE sal ALL(比最大要大)、 SELECT * FROM empWHERE (sal,NVL(comm,-1) IN (SELECT sal,NVL(comm,-1) FROM emp WHERE deptno=20);数据库更新操作INSERT、UPDATE、DELETE【1】复制一张表,例如复制EMP表为MYEMPSQL CREATE TABL

29、E MYTEMP AS SELECT * FROM emp;【2】将编号为7899的雇员的领导取消SQL UPDATE myemp SET mgr=null WHERE empno=7899;【3】更新时,一定要注意不能批量更新(加上WHERE子句),多列更新例子如下SQL UPDATE myemp SET mgr=null,comm=null WHERE empno IN(7369,8899);【4】删除掉全部领取奖金的雇员SQL DELECT FROM emp WHERE comm is NOT NULL;事务处理 ACIDA:Atomicity 原子性:事务中的操作或者都完成,或者都取消C:Consistency 一致性:事务中的操作保证数据库中的数据不会出现逻辑上不一致的情况I:Isolation 隔离性:当前的事务与其他未完成的事务是隔离的D:Durability 持久性:在COMMIT之后,数据永久保存在数据库中,在此之前,事务的操作都可以回滚验证事务过程:创建一张临时表,只包含部门10SQL CREATE TABLE emp10 AS SELECT * FROM emp WHERE empno=10;删除emp10中的7782雇员SQL DELETE FROM emp10 WHERE empno=7782;再打开另

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1