oacl-sql查询(DQL)操作

单表操作:简单查询

--查询一张表的所有数据
select * from 表名
select * from dept;

--条件查询 where
select * from 表名 where  条件
select * from dept where deptno=34;

--查询指定的字段的值
select dname,loc from dept;

--多条件查询
select * from emp;
--查询工作SALESMAN  and 工资大于1000的
select * from emp where job='SALESMAN' and sal > 1000;
--查询20号和30号部分的所有员工  or
select * from emp where deptno=20 or deptno = 30;
--order by排序(升、降desc)、between。。。and,like,
select * from emp order by hiredate desc;
select * from emp order by sal ;

select * from emp order by sal, deptno;

select * from emp where sal>=1100 and sal <= 1600;

select * from emp where sal between 1100 and 1600;

--模糊查询、匹配查询
select * from emp where job like 'C%'
select * from emp where job like '%N'
select * from emp where ename like '%L%'   
--like查询效率相当低下,搜索的时候可以使用,但是效率相当低下


--group by  分组查询  -- 分组函数
--1group by不能和* 以及分组字段以外的字段关联
select deptno from emp group by deptno;
--2、group by只能和分组函数连用    sum:求和  max:求最大值  min:最最小值  avg:平均数  count(*)统计数量
--统计各个部门工资最高的金额
select deptno,max(sal) from emp group by deptno;
--统计各个部门的人数
select deptno, count(*) from emp group by deptno;
--各个部门平均工资
select deptno,avg(sal) from emp group by deptno;
--求各个部门工资综合
select deptno, sum(sal) from emp group by deptno; 


select * from emp;

--统计每年入职的员工个数
select  to_char(hiredate,'yyyy'), count(*) from emp group by to_char(hiredate,'yyyy');

--统计那些年份入职员工超过2人
select  to_char(hiredate,'yyyy'), count(*)  from emp group by to_char(hiredate,'yyyy')
having count(*) > 1

oracle提供了很多函数对字符串进行操作,如截取,长度,拼接
oracle提供了很多函数对数字进行操作,如四舍五入,绝对值,随机数,抹掉位数。

链接操作: join,链接查询是指的当数据来源超过1一张表的时候,需要同时从几张表获取数据的操作, 能进行链接查询一定是又外键关系

主键和外键:
主键:在一张表中数据唯一而且不为空的一列
外键:外键指的是我们本表的数据类容来源另外一张表的主键

左链接、右链接

left join
right join

–打印所员工信息emp,以及部门名字dept
select d.,e. from dept d left join emp e on d.deptno = e.deptno

select d.,e. from dept d right join emp e on d.deptno = e.deptno

对于左链接和有链接实际上指的的就是以哪一张表为主。为主的表就会现实全部数据,为辅的表就会现实匹配到的数据。

全链接:
全链接,一般不使用,目的是为了显示两张表的所有信息 full join
select d.,e. from dept d full join emp e on d.deptno = e.deptno

我们的做链接、右链接、左链接,都统称外连接,实际上还有内链接
inner join
select d.,e. from emp d inner join dept e on d.deptno = e.deptno

left join: 左表显示全,右表显示匹配到的数据
right join: 右表显示全,左表显示匹配到的数据
full join: 左边和右边全部显示,无法匹配的补空
inner join: 只显示匹配到的数据,没匹配到的不显示

并集查询:union
– 尽量减少访问服务器、数据库的次数,
select deptno,dname from dept union select empno, ename from emp;
本来要通过多次访问才能获取不同表的数据,我们可以通过并集查询实现sql优化,一次性查询出我们需要的数据。并且重复的数据会被覆盖。

子查询:
子查询指的是吧我们通过sql查询到的数据当做临时表来进行二次操作。 就是吧我们的select查询到的结果当一个子集来进行操作,
子集当临时表二次查询
select * from (select * from emp where deptno= 10) t where t.sal > 2000 ;
子集当结果作为结果条件
注意:结果的数据如果是一个我们可以使用= 如果是多个使用 in 关键字

–1. 查询工资比’ALLEN’高的所有员工的姓名和工资
select * from emp where sal+nvl(comm,0) >
(select (sal+nvl(comm,0)) as sal from emp where ename=’ALLEN’)

–2. 显示与’SCOTT’从事相同工作的员工的详细信息

select * from emp where job = (select job from emp where ename=’SCOTT’)

–4. 显示与30号部门名字以A开头员工工资相同的员工的姓名和工资

select * from emp where sal in (select sal from emp where ename like ‘A%’)

分页查询:
oracle 没有类似mysql的limit关键字做分页,只有通过子查询来完成, 在讲解分页之前,先了解一个概念,伪列 rownum
数据库没一张表都又一个默认的伪列叫rownum
查询的时候生成了临时表也会又一个伪列rownum
所以oracle的分页是三层嵌套:

select * from (
  select t.*, rownum as r  from (
         select e.* from emp e order by hiredate desc
  ) t
) temp 
where temp.r>10 and temp.r<=15
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值