Oracle之旅-复杂查询

Oracle的复杂查询

1、SQL简介

在这里插入图片描述

2、SQL命令分类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、Oracle中的函数

3.1.单行函数

在这里插入图片描述

3.1.1.字符函数

在这里插入图片描述
大小写控制函数
在这里插入图片描述
字符控制函数
在这里插入图片描述
示例:
在这里插入图片描述
–伪表:Oracle中为了构成SQL语法的完整性,一张虚拟的表 dual
–大小写转化
– 字符型函数(小写变大写)
select upper(‘hello 嗯嗯’) from dual;
– 字符型函数(大写变小写)
select lower(‘HELLO’) from dual;
– 首字母大写
select initcap(‘HELLO xiao’) from dual;
–拼接字符串 ||
– 字符拼接concat
select concat(‘A’,‘bc’) from dual;
– 字符拼接||
select ‘AA’||‘bb’||‘Cc’ from dual;
select ename||‘的工资为:’||sal from emp;
–截取字符串
select substr(‘abcdefj’,2,3) from dual;
–计算字符串的长度
select length(‘abcdefj’) from dual;
select * from emp where LENGTH(ename)=5;
–查询指定字符的位置
select instr(‘abcdefj’,‘c’) from dual;
–Trim
– trim(只能去除首尾字符)
select trim(‘a’ from ‘javascript’) from dual
– trim去除首尾空格
select trim(’ abc ‘) from dual;
–LPAD
SELECT LPAD(‘haha’,10,’#’) FROM dual;

3.1.2.数字处理函数

  • ROUND: 四舍五入
    例:ROUND(45.926, 2) ,结果 45.93
  • TRUNC: 截断
    例:TRUNC(45.926, 2) ,结果 45.92
  • MOD: 求 余
    例:MOD(1600, 300) ,结果 100
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    –数学函数
    select MOD(100,3) 结果 from dual;
    select MOD(100,3) as 结果 from dual; select MOD(100,3) as “结果” from dual; select MOD(100,3) “结 果” from dual;
    注意:取别名,别名中有特殊字符例如空格,需要家双引号

3.1.3.日期函数

获取系统日期:sysdate
在这里插入图片描述

  • 在日期上加上或减去一个数字结果仍为日期。加减的是天数
  • 两个日期相减返回日期之间相差的天数
  • 可以用数字除 24 来向日期中加上或减去小时。
    在这里插入图片描述–获得当前系统日期+2天
    select sysdate+2 from dual;
    –计算所有的员工入职的周数
    select (SYSDATE-hiredate)/7 “周数”,ename from emp;
    –获得当前系统日期+10个小时
    select sysdate+(10/24) from dual;

3.1.4.转换函数

to_char
在这里插入图片描述
– 转化为字符串
– 时间转字符串

select to_char(sysdate,‘yyyy-fmmm-dd hh24:mi:ss’) from dual;

select to_char(sysdate,‘yyyy"年"mm"月"dd"日" hh24"时"mi"分"ss"秒"’) from dual;
– 获取年份
select to_char(sysdate,‘yyyy’) from dual;
–获取月
select to_char(sysdate,‘mm’) from dual;
–获取星期
select to_char(sysdate,‘day’) from dual;
语法:TO_CHAR(number, ‘format_model’)
下面是在TO_CHAR 函数中经常使用的几种格式:
在这里插入图片描述
9 的地方如果有数字就显示如果没有数字就不显示,有 0 的地方在没有数字的时候也会有0来占位.
在这里插入图片描述
在这里插入图片描述
to_date()
在这里插入图片描述
to_number()
在这里插入图片描述
– 字符串转数字
select to_number(‘100’)+1 from dual; – 101
– 自动转化为100数字
select ‘100’+1 from dual; --101
select ‘100’||1 from dual; --1001

3.1.5.条件判断函数

NVL(A,B)
在这里插入图片描述
NVL2(A,B,C)
在这里插入图片描述
– 输出每个人的总薪资
select sal+NVl(comm,0),ename from emp;
select sal+NVL2(comm,comm,0),ename from emp;
DECODE( a ,A,A1,B,B1,Z )跟Java里的swich一样
在这里插入图片描述
select ename,decode(
to_char(emp.hiredate,‘MM’),
‘01’,‘1月’,
‘02’,‘2月’,
‘03’,‘3月’,
‘04’,‘4月’,
‘05’,‘5月’,
‘61’,‘6月’,
‘下半年’) mon from emp;

3.1.6.聚合函数

在这里插入图片描述

扫描二维码关注公众号,回复: 10542033 查看本文章

3.2.分析函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
SELECT ename, job, deptno, sal, ROW_NUMBER() OVER (ORDER BY sal DESC) AS 名次 FROM EMP;

SELECT ename, job, deptno, sal, RANK() OVER (ORDER BY sal DESC) AS 名次 FROM EMP;

SELECT ename, job, deptno, sal, DENSE_RANK() OVER (ORDER
BY sal DESC) AS 名次 FROM EMP;

SELECT ename, job, deptno, sal, ROW_NUMBER() OVER (ORDER BY sal DESC) AS SAL_RANK
FROM SCOTT.EMP;

SELECT deptno, ename, sal, comm, RANK() OVER
(PARTITION BY deptno ORDER BY sal DESC, comm ASC)
RANK
FR OM emp;

SELECT deptno, ename, sal, comm, DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal DESC, comm) RANK

4、伪列

在这里插入图片描述
在这里插入图片描述
– 查询薪资最高的5人
select T.,ROWNUM R from
(
select E.
from emp E ORDER by sal desc
) T where ROWNUM<=5
在这里插入图片描述
在这里插入图片描述
– 查询薪资最高的5人
select T.,ROWNUM R from
(
select E.
from emp E ORDER by sal desc
) T where ROWNUM<=5
– 查询薪资第5人
select * from
(
select T.,ROWNUM R from (
select E.
from emp E ORDER by sal desc
) T
) TT where R=5
– 查询薪资第5人到第8个
select * from
(
select T.,ROWNUM R from
(
select E.
from emp E ORDER by sal desc
)T
) TT where R>=4 and R<=0

5、Oracle的序列

序列作用:就是 Oracle 中的主键生成机制。
在这里插入图片描述

5.1.序列的创建

在这里插入图片描述

5.2.序列的使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6、完成下面查询语句

-- 创建数据表
CREATE TABLE dept (
deptno NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
dname VARCHAR2(14) ,
loc VARCHAR2(13) ) ;
CREATE TABLE emp (
empno NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,
ename VARCHAR2(10),
job VARCHAR2(9),
mgr NUMBER(4),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT );
CREATE TABLE bonus (
enamE VARCHAR2(10) ,
job VARCHAR2(9)  ,
sal NUMBER,
comm NUMBER ) ;
CREATE TABLE salgrade ( 
grade NUMBER,
losal NUMBER,
hisal NUMBER );


-- 插入测试数据 —— dept
INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK');
INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');
INSERT INTO dept VALUES (30,'SALES','CHICAGO');
INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON');
-- 插入测试数据 —— emp
INSERT INTO emp VALUES (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO emp VALUES (7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO emp VALUES (7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO emp VALUES (7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO emp VALUES (7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO emp VALUES (7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO emp VALUES (7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO emp VALUES (7788,'SCOTT','ANALYST',7566,to_date('19-04-1987','dd-mm-yyyy')-85,3000,NULL,20);
INSERT INTO emp VALUES (7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO emp VALUES (7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO emp VALUES (7876,'ADAMS','CLERK',7788,to_date('23-05-1987','dd-mm-yyyy')-51,1100,NULL,20);
INSERT INTO emp VALUES (7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO emp VALUES (7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO emp VALUES (7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
-- 插入测试数据 —— salgrade
INSERT INTO salgrade VALUES (1,700,1200);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);


-- 事务提交
COMMIT;

6.1.显示所有员工姓名的前三个字符

select substr(ename,3) 员工姓名前三个字符 from emp;
在这里插入图片描述

6.2.显示正好为5个字符的员工的姓名,工资,部门号

select ename 姓名,sal 工资,deptno 部门号 from emp where length(ename)=5;
在这里插入图片描述

6.3.写一个查询,用首字母大写,其它字母小写显示雇员的 ename,显示名字的长度, 并给每列一个适当的标签,条件是满足所有雇员名字的开始字母是J、A 或 M 的雇员,并对查询结果按雇员的ename升序排序。(提示:使用length、substr)

select initcap(ename) 员工姓名,length(ename) 员工姓名长度 from emp where substr(ename,0,1) in(‘J’,‘A’,‘M’)
order by ename asc;
在这里插入图片描述

6.4.查询员工姓名中包含 大写或小写字母 A的员工姓名

select ename 姓名含A或a的员工 from emp where ename like ‘%a%’ OR ename like ‘%A%’;
在这里插入图片描述

6.5.显示所有员工的姓名,用a替换所有"A"

select replace(ename,‘A’,‘a’) 员工姓名中用a替换A from emp;
在这里插入图片描述

6.6.查询部门编号为10或20,入职日期在81年5月1日之后,并且姓名中包含大写字母A的员工姓名,员工姓名长度

select ename 员工姓名,length(ename) 员工姓名长度,hiredate 入职时间,deptno 部门编号,instr(ename,‘A’) 员工姓名中含A
from emp where deptno in(10,20) and hiredate > ‘01-5月-81’ and instr(ename,‘A’) <> 0;
在这里插入图片描述

6.7.查询每个职工的编号,姓名,工资 要求将查询到的数据按照一定的格式合并成一个字符串.

–前10位:编号,不足部分用填充,左对齐
–中间10位:姓名,不足部分用填充,左对齐
–后10位:工资,不足部分用填充,右对齐
select deptno 部门编号,ename 员工姓名,sal 工资,lpad(deptno,10,’#’) 编号前十位,lpad(ename,10,’$’) 姓名中间十位,
rpad(sal,10,’
’) 工资后十位 from emp;
在这里插入图片描述

6.8.查询服务器当前时间

select sysdate 当前时间 from dual;
在这里插入图片描述

6.9.查询部门10,20的员工截止到2000年1月1日,工作了多少个月,入职的月份

select ename 员工姓名,emp.hiredate 入职时间,round(months_between(to_date(‘2000-01-01’,‘yyyy-MM-dd’),hiredate)) 工作了几个月,
extract(month from hiredate) 入职月份 from emp where deptno=10 or deptno=20;
在这里插入图片描述

6.10.如果员工试用期6个月,查询职位不是MANAGER的员工姓名,入职日期,转正日期,入职日期是第多少月,第多少周

select ename 员工姓名,hiredate 入职日期,add_months(hiredate,6) 转正日期,
to_char(hiredate,‘month’) 入职第多少月,to_char(hiredate,‘iw’) 入职第多少周 from emp where job not in ‘MANAGER’;
在这里插入图片描述

发布了7 篇原创文章 · 获赞 10 · 访问量 1231

猜你喜欢

转载自blog.csdn.net/weixin_46731640/article/details/105348934
今日推荐