Oracle——单列函数,多表连接

学习了常用的单列函数,以及表与表之间的连接,练习题目如下:

<单行函数>
–(1)写一个查询,用首字母大写,其他字母小写显示雇员的 ename ,显示名字的长度,并
–给每列一个适当的标签,条件是满足所有雇员名字的开始字母是J、A或 M的雇员,并对查
–询结果按雇员的ename升序排序。 (提示:使用initcap 、length 、substr)
SELECT initcap(ename) 首字母大写的姓名,LENGTH(ename) 姓名的长度 FROM emp
WHERE SUBSTR(ename,1,1) IN (‘J’,’A’,’M’)
ORDER BY ename

–(2)查询 员工姓名中中包含大写或小写字母 A的 员工姓名。
SELECT ename 员工姓名 FROM emp
WHERE INSTR(ename,’A’)>0 OR INSTR(ename,’a’)>0

–(3)查询部门编号为10或20 ,入职日期在1981年5月1日之后,并且姓名中包含大写
–字母 A 的 员工姓名,员 工 姓 名 长 度。(提 示:要 求 使 用INST R 函 数,不 能 使 用like进 行 判
–断)
SELECT ename 员工姓名,LENGTH(ename) 姓名长度 FROM emp
WHERE deptno IN (10,20) AND hiredate>’1-5月-81’ AND INSTR(ename,’A’)>0

–(4)查询每个职工的编号、姓名、工资。要求:1 将查询到的数据按照一定的格式合并成一个字符串。2 前10位表示编号,不足部分用填充,左对齐。3 中间10位表示姓名,不足部分用填充,左对齐。4 后10位表示工资,不足部分用*填充,右对齐。
SELECT concat(CONCAT(RPAD(empno,10,’‘),RPAD( ename,10,’‘)),LPAD( sal,10,’*’)) 职工编号加姓名加工资 FROM emp

–(5)写一个查询,分别计算100 .456 四舍五入到小数点后第2位、第1位、整数位的值。
SELECT ROUND(100.456,2) 小数点后两位四舍五入,ROUND(100.456,1) 小数点后一位四舍五入,ROUND(100.456,0) 整数四舍五入
FROM dual

–(6)写一个查询,分别计算100 .456 从小数点后第2位、第1位、整数位截断的值。
SELECT TRUNC(100.456,2) 小数点后两位截取,TRUNC(100.456,1) 小数点后一位截取,TRUNC(100.456,0) 整数位截取 FROM dual

–(7)查询每个员工截止到现在一共入职多少天?
SELECT ename 姓名,TRUNC (SYSDATE-hiredate,0) 入职天数 FROM emp

–(9)查询服务器当前时间。
SELECT SYSDATE FROM dual

–(10)查询10号和20号部门的员工截止到2000年1月1日,工作了多少个月,入职的
–月份。(提示:使用 months ,between ,extract)
SELECT ename, MONTHS_BETWEEN(‘1-1月-00’,hiredate) 工作月数,EXTRACT(YEAR FROM hiredate) 入职月份
FROM emp

–(11)如果员工试用期6个月,查询职位不是 MANAGER的 员工姓名、入职日期、转正日
–期、入职日期后的第一个星期一、入职当月的最后一天日期。
SELECT ename 员工姓名,hiredate 入职时间,add_months(hiredate,6) 转正日期,
next_day(hiredate,’星期一’) 第一个星期一,last_day(hiredate) 最后一天日期
FROM emp

–(12)显示服务器系统当前时间,格式为2007-10-12 17 :11 :11 。
SELECT to_char(SYSDATE,’YYYY-MM-DD HH24:MI:SS’) 当前时间 FROM dual

–(13)显示ename、hiredate和雇员开始工作日是星期几,列标签 DAY 。
SELECT ename,hiredate,to_char(hiredate,’DAY’) DAY FROM emp

–(14)查询 员工姓名、工资、格式化的工资(¥ 999 ,999 .99)。
SELECT ename 员工姓名,sal 工资,to_char(sal,’L999,999.99’) 格式化工资 FROM emp

–(15)把字符串2015-3月-18 13:13:13转换成日期格式,并计算和系统当前时间间隔多
–少天 。
SELECT to_date(‘2015-3月-18 13:13:13’,’YYYY-MONTH-DD HH24:MI:SS’) 转为日期格式,
TRUNC (SYSDATE-to_date(‘2015-3月-18 13:13:13’,’YYYY-MONTH-DD HH24:MI:SS’),0) 和当前相差天数
FROM dual

–(16)计算2000年1月1日到现在有多少月、多少周(四舍五入)。
SELECT round(months_between(SYSDATE,’1-1月-00’),0) 月数,
ROUND((SYSDATE-to_date(‘1-1月-00’))/7,0) 周数
FROM dual

–(17)查询员工 ENAME的第三个字母是 A的员工的信息(使用2个函数)。
SELECT ename FROM emp
WHERE SUBSTR(ename,3,1)=’A’
SELECT ename FROM emp
WHERE INSTR(ename,’A’)=3

–(18)使用trim函数将字符串’hello’、’Hello’、 ‘bllb’、 ‘hello’分别处理得到下列字符串ello 、
–H ello 、ll 、hello 。
SELECT TRIM(‘h’ FROM ‘hello’),REPLACE(‘Hello’,’H’,’H ‘),
TRIM(‘b’ FROM ‘bllb’),TRIM(’ ’ FROM ‘hello’)
FROM dual
–(19)将员工工资按如下格式显示:123,234.00 RMB。
SELECT concat(to_char(sal,’999,999.99’),’RMB’) 工资 FROM emp

–(20)查询员工的姓名及其经理编号,要求对于没有经理的显示“No Manager”字符串。
SELECT ename 员工姓名,nvl(to_char(mgr),’No Manager’) 经理编号
FROM emp

–(21)将员工的参加工作日期按如下格式显示:月份/年份。
SELECT to_char(hiredate,’MM/YYYY’) 月份/年份 FROM emp

–(22)在员工表中查询出员工的工资,并计算应交税款:如果工资小于1000 ,税率为0 ;如
–果工资大于等于1000并小于2000 ,税率为10% ;如果工资大于等于2000并小于3000 ,税率
–为15% ;如果工资大于等于3000 ,税率为20% 。
SELECT ename 员工,sal 工资,(CASE
WHEN (sal>0 AND sal<1000) THEN sal*0
WHEN (sal >=1000 AND sal<2000)THEN sal*0.1
WHEN (sal>=2000 AND sal<3000)THEN sal*0.15
when sal>=3000 THEN sal*0.2
END
) 税款 FROM emp

–(23)创建一个查询显示所有雇员的 ename和 sal。格式化sal为 15个字符长度,用 , S A L A R Y S E L E C T L P A D ( e n a m e , 15 , ’) SALARY,sal FROM emp

<多表连接>
–(1)写一个查询,显示所有 员工姓名、部门编号、部门名称。
SELECT e.ename 员工姓名,e.deptno 部门编号,d.dname 部门名称
FROM emp e,dept d
WHERE e.deptno=d.deptno

–(2)写一个查询,显示所有工作在CHICAGO并且奖金不为空的 员工姓名、工作地点、
–奖金。
SELECT e.ename 员工姓名,d.loc 工作地点
FROM emp e,dept d
WHERE e.deptno=d.deptno AND d.loc=’CHICAGO’
AND e.comm IS NOT NULL

–(3)写一个查询,显示所有姓名中含有 A字符的 员工姓名 、工作地点。
SELECT e.ename 员工姓名,d.loc 工作地点
FROM emp e,dept d
WHERE e.deptno=d.deptno AND INSTR(e.ename,’A’)>0

–(4)查询每个员工的编号 、姓名、工资、工资等级、所在工作城市 ,按照工资等级进行升序
–排序。(非等值连接)
SELECT e.empno 员工编号,e.ename 员工姓名,e.sal 工资,s.grade 工资等级,d.loc 工作城市
FROM emp e,dept d,salgrade s
WHERE e.deptno=d.deptno AND e.sal
BETWEEN s.losal AND s.hisal

–(5)查询所有工作在 NEWYORK和CHICAGO的 员工姓名、员工编号,以及他们的经
–理姓名、经理编号。(自连接)
SELECT e.ename 员工姓名,e.empno 员工编号,m.ename 经理姓名,m.empno 经理编号
FROM emp e,emp m,dept d
WHERE e.mgr=m.empno
AND e.deptno=d.deptno
AND d.loc IN (‘NEW YORK’,’CHICAGO’)

–(6)查询所有员工编号 、姓名、部门名称,包括没有部门的员工也要显示出来 。(外连接)
SELECT e.empno 员工编号,e.ename 员工姓名,d.dname 部门名称
FROM emp e,dept d
WHERE e.deptno=d.deptno(+)

–(7)使用SQL-99写法,完成如下练习 。
–创建一个员工表和部门表的交叉连接。(cross join 等同于迪卡尔乘积)
SELECT * FROM emp CROSS JOIN dept

–使用自然连接,显示入职日期在1980年5月1日之后的 员工姓名、部门名称、入职日期。(natural join)
SELECT ename 员工姓名,dname 部门名称,hiredate 入职日期
FROM emp NATURAL JOIN dept
WHERE hiredate>’1-5月-80’

–使用USING子句,显示工作在 CHICAGO的 员工姓名、部门名称、工作地点。
SELECT e.ename 员工姓名,d.dname 部门名称,d.loc 工作地点
FROM emp e JOIN dept d USING(deptno)
WHERE d.loc=’CHICAGO’

–使用ON子句,显示工作在 CHICAGO的 员工姓名、部门名称、工作地点、薪资等级。
SELECT e.ename 员工姓名, d.dname 部门名称,d.loc 工作地点,s.grade 薪资等级
FROM emp e
JOIN dept d
ON(e.deptno=d.deptno)
JOIN salgrade s
ON(e.sal BETWEEN s.losal AND s.hisal)
WHERE d.loc=’CHICAGO’

–使用左连接,查询每个员工的姓名 、经理姓名,没有经理的 King也要显示出来 。(左边是满的,右边是空的)
SELECT e.ename 员工姓名,m.ename 经理姓名
FROM emp e
LEFT OUTER JOIN emp m
ON (e.mgr=m.empno)

–使用右连接,查询每个员工的姓名 、经理姓名,没有经理的 King也要显示出来 。(右边是满的)
SELECT e.ename 员工姓名,m.ename 经理姓名
FROM emp m
RIGHT OUTER JOIN emp e
ON(e.mgr=m.empno)

–(8)显示员工SMITH的姓名、部门名称、直接上级名称 。
SELECT e.ename 员工姓名,d.dname 部门名称,m.ename 直接上级名称
FROM emp e,emp m,dept d
WHERE e.deptno=d.deptno AND e.ename=’SMITH’ AND e.mgr=m.empno

–(9)显示 员工姓名 、部门名称、工资、工资级别,要求工资级别大于 4级。
SELECT e.ename 员工姓名,d.dname 部门名称,e.sal 工资,s.grade 工资级别
FROM emp e,dept d,salgrade s
WHERE e.deptno=d.deptno AND s.grade>4
AND e.sal BETWEEN s.losal AND s.hisal

–(10)显示员工KING和FORD管理的 员工姓名及其经理姓名
SELECT a.员工,a.管理的员工,m.ename 经理姓名
FROM (SELECT p.mgr,p.ename 员工,e.ename 管理的员工
FROM emp e,emp p
WHERE p.ename IN (‘KING’,’FORD’) AND e.mgr=p.empno) a,emp m
WHERE a.mgr=m.empno(+)

–(11)显示 员工姓名 、参加工作时间 、经理名、参加工作时间 ,要求参加时间比经理早 。
SELECT e.ename 员工姓名,e.hiredate 员工工作时间,m.ename 经理姓名,m.hiredate 经理工作时间
FROM emp e,emp m
WHERE e.mgr=m.empno AND e.hiredate

猜你喜欢

转载自blog.csdn.net/wu_lie_xin/article/details/81569271