单表操作:简单查询
--查询一张表的所有数据
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 分组查询 -- 分组函数
--1、group 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