一、链表查询
–99链表查询
–笛卡尔积 cross join
select * from emp e,dept d; --92
select deptno from emp e cross join dept d; --99
–查询30部门的员工信息
select * from emp where deptno = 30;
–查询30部门的部门信息
select * from dept where deptno = 30;
–连接之前过滤
select * from (select * from emp where deptno = 30) cross join (select * from dept where deptno = 30);
–连接条件
–等值连接
–自然连接 natural join 自动根据同名字段,主外键关联关系 字段做等值连接
select deptno from emp e natural join dept d;
–注意: 在自然连接中同名字段不能指明出处
--join using(自动做等值连接的同名字段)...
select deptno from emp e inner join dept d using(deptno);
--注意: 在join using中同名字段不能指明出处
–非等值连接
–数据源1 join 数据源2 on 表连接条件 可以做等值,可以做非等值
select e.deptno from emp e join dept d on e.deptno = d.deptno;
--查询员工信息以及员工工资等级信息
select * from emp e inner join salgrade s on e.sal between s.losal and s.hisal;
--查询员工信息以及所在部门信息以及员工工资等级信息,以及上级经理人信息
select *
from emp e
join dept d
on e.deptno = d.deptno
join salgrade s
on e.sal between s.losal and s.hisal
join emp e2
on e.mgr = e2.empno
where deptno in (10,30);
–内连接 : 满足连接条件才能显示 (inner) join
–外连接 : 有的表中的数据不满足连接条件也显示
--主表: 不满足连接条件也显示
--左连接 : left join
--右连接 : right join
--全连接 : full join 两张表都作为主表
select * from emp e1 full join emp e2 on e1.mgr=e2.empno;
– 给20部门的所有员工都涨薪10%,显示出员工的名称, 原来的薪水, 所属部门编号, 涨薪后的薪水
select ename,deptno,sal,sal1.1 涨薪后 from emp where deptno = 20;
– 10部门涨薪10%, 20涨薪20%,30降薪1% , 40部门翻倍3倍
select ename,deptno,sal,decode(deptno,10,sal1.1,20,sal1.2,30,sal0.99,40,sal3) 薪水变化后 from emp;
select ename,deptno,sal,(case deptno when 10 then sal1.1
when 20 then sal1.2
when 30 then sal0.99
when 40 then sal*3
end) 薪水变化后
from emp;
二、rowid 与 rownum
–rowid 与 rownum
–都做伪列存在
–rowid : 行记录的地址,行的唯一标识,数据插入到表中的是决定
–可以实现去重: 对没有主键|唯一字段的表中多条完全重复的数据,根据rowid实现去重
–去重: 如果表中存在主键或者唯一字段,直接 根据主键或者唯一字段去重
select rowid,rownum from dept;
/*
insert into tb_student values(1,‘张三’,‘语文’,81);
insert into tb_student values(2,‘张三’,‘数学’,75);
insert into tb_student values(3,‘李四’,‘语文’,81);
insert into tb_student values(8,‘李四’,‘英语’,90);
insert into tb_student values(4,‘李四’,‘数学’,90);
insert into tb_student values(5,‘王五’,‘语文’,81);
insert into tb_student values(6,‘王五’,‘数学’,100);
insert into tb_student values(7,‘王五’,‘英语’,90);
commit;
*/
select id,name,course,score from tb_student;
–查询到要保留的数据
select max(rowid) from tb_student group by id,name