当前位置: 移动技术网 > IT编程>数据库>Oracle > Oracle表连接的内连接、外连接

Oracle表连接的内连接、外连接

2020年05月03日  | 移动技术网IT编程  | 我要评论

公交车上的性经历,安溪铁观音批发,视网膜屏幕


oracle表连接:内连接、外连接。外连接分左连接、右连接。

多表查询时,如果表之间没有条件关联,则会把所有匹配的结果查找出来,例如a表6条数据,b表7条数据,查出来就是42条。

--笛卡尔积:返回两张表中所有匹配的结果,没有意义。所以多表查询,必须写关联条件。
select * from staff,department where staff.id=department.staff_id;

内连接的表如果多于两个,则每个表必须要直接或者间接的关联。例如查a、b、c表,条件a.某列=b.某列 and a.某列=c.某列,则b表和c表有间接的关联。

多表关联时,其中某列必须唯一,例如查表a、b、c,a.column1 = b.column2 and a.column3=c.column4,其中column1和column2至少有一列在自己的表里是唯一值,

column3和column4至少有一列在自己的表里是唯一值。

非等值表连接:

select ename,sal from emp e,salgrade g
where e.sal between g.losal and g.hisal 
--这个losal到hisal的区间范围是唯一的
grade losal hisal
1    700    1200
2    1201    1400
3    1401    2000
4    2001    3000
5    3001    9999

 自连接:自己关联自己,但是作为不同表的定义,自连接一般可以使用子查询替代,使用子查询会更加清晰。

--自连接,将emp看做是两张不同的表,e是员工表,m是领导表
select distinct m.empno, m.ename, m.sal
  from emp e, emp m
 where e.mgr = m.empno
--自连接用的情况不多,可以使用子查询实现
  select * from emp m where m.empno in (select distinct mgr from emp)

外连接:主表中的数据全部选出,从表只选匹配的数据,不匹配的数据会用null替代。

外连接中的左外连接,左边是主表,右边是从表。外连接中的右外连接,右边是主表,左边是从表。

create table testa(
id number(3),
name varchar2(10),
age number(2)
);

insert into testa values(1,'a',23);
insert into testa values(2,'b',24);
insert into testa values(3,'c',25);
insert into testa values(4,'d',26);

create table testb(
id number(3),
salary number(8,2)
);

insert into testb values(1,9000);
insert into testb values(2,9000);
insert into testb values(3,9000);

select * from testa left join testb on testa.id=testb.id;
select * from testa right join testb on testa.id=testb.id;

分页查询:借助“rownum”伪列进行分页查询。

--分页查询,每页五条,查询第二页数据6-10
--使用伪列,不真正的存在表里
select rownum from emp ;
select a.*,rownum from emp a;
select * from (select a.*,rownum r from emp a) x where x.r>5 and x.r<=10;
最内层:即将被分页的全部数据,可能会被排序,定义成x表。
select * from emp;
中间层:启动行编号伪列,定义成y表
select x.*,rownum r from x;
最外层:数据过滤,分页开始
select * from y where y.r >0 and r<=10

 

日期添加与转换:

--查询系统日期
select sysdate from dual;
--向前走一天 明天
select sysdate+1 from dual;
--向后走一天 昨天
select sysdate-1 from dual;
--下个月的今天
select add_months(sysdate,1) from dual;
--上个月的今天
select add_months(sysdate,-1) from dual;
-- 加1小时,1分,1秒
select sysdate+1/24+1/(24*60) + 1/(24*60*60) from dual

 日期截取:

select trunc(sysdate) from dual; --默认精确到天
select trunc(sysdate,'dd') from dual; --精确到天
select trunc(sysdate,'mm') from dual;--精确到月
select trunc(sysdate,'yyyy') from dual;--精确到年
select trunc(sysdate,'hh') from dual;--精确到时
select trunc(sysdate,'mi') from dual;--精确到分
转自:https://www.cnblogs.com/bibi-feiniaoyuan/p/oracle_four.html

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网