多表查询

创建工资等级
create table salaryGrade(
id number primary key,
gradename varchar2(20),
minSalary number,
maxSalary number
);
insert into salaryGrade values(1,‘A’,700,1000);
insert into salaryGrade values(2,‘B’,1000,2000);

多表查询
多表查询又称表联合查询,即一条语句涉及到的表有多张,数据通过特定的连接进行联合显示。
基本语法:
select column_name , … from table1,table2 条件 。。。
select dept_id , name from S_emp,s_dep

连接方式:
1Equijoin //等值连接
2Non-equiijoin //非等值连接
3Outer join //外连接
4Self join //自连接
5Set operators(union,minus,union,all,intersect) //集合操作
多表查询_第1张图片
连接查询分类:
为了在多表查询避免笛卡尔积的产生,我们可以使用连接查询来解决这个问题.
连接查询分为:

  1. 等值连接
  2. 不等值连接
  3. 外连接
    1. 左外连接 (left join /left outer join)
    2. 右外连接 (right join /right outer join)
    3. 全外连接 (full join /full outer join )
  4. 自连接
    格式:join 表名 on 条件
    外链接:当一个表的记录在另一张表中不存在的时候,我们依旧需要显示,使用外连接。
    等值连接:利用一张表中某列的值和另一张表中某列的值相等(主键和外键)的关系,把两张表连接起来:
    select * from table1,table2 where table1.col_name=table2.col_name;
    select * from table1,table2 where table1.col_name=table2.col_name and table1.col_name1>1000;

为了简化操作,或者表述更加清楚,可以给每张表起别名
select T.id,T.name from table1 T,table2 T2 where T.id = T2.id;
注意:表里面有相同的列的时候必须加前缀。多个搜索条件用and连接

不为空条件 is not null
不等连接:使用的是除了=以外的操作符号的多表查询
例如:between。。。and
select t1.col1 t2.col1 from t1,t2 where t1.col between t2.col and t2.col

insert into salaryGrade values(3,‘c’,2000,3000);

select salary,minsalary,maxsalary,gradename from s_semp,salaryGrade G where salary between G.minSalary and G.maxsalary;
相当于:
select last_name ,minsalary,maxsalary,gradename from s_semp join salaryGrade G on s_semp.salary bewtten G.minsalary and G.maxsalary;
右外连接语法:
select tb_name ,col_name,… from tb_name1,tb_name2 where tb_name.col_name (+) =tb_name2.col_name;
相当于:
select tb_name,col_name,… from ta_name1 right outer join tb_name2 where …;
注释:加号在等号左边的叫做右外,加号在等号右边叫做左外连接
加号加在数据少的哪一方;
意义:右外连接表示右边表(=号右边的表)中的记录在左边表中不存在时候,右边表的记录依旧显示。
select c.id,c.name,e.lastname from s_ coustomer c ,s_emp e where c.id (+) =e.sales_rep_id;

左外连接的语法:
select c.id,c.name,e.lastname from s_ coustomer c ,s_emp e where c.id =e.sales_rep_id (+);
左外连接意义: 左外连接表示左边表(=号左边的表)中的记录在右边表中不存在时候,左边表的记录依旧显示。

全连接:
select last_name ,dept_id ,s_dept.id ,name from s_emp full join s_dept on s_semp.dept_id = s_dept.id;

自连接: 实质就是一张表当做多张表用,即一张表中的某列的值取决于自己的某一列。
语法:
select …
from b_name t1 , b_name t2
where t1.col_name = t2.ano_col_name;
select e1.id,e1.last_name,e1.manager_id,e2.last_name from s_emp e1,s_emp e2 where e1.manager_id = e2.id;(员工表里面的经理,经理本身就是员工)
select e1.id,e1.last_name,e1.manager_id,e2.last_name from s_emp e1,s_emp e2 where e1.manager_id = e2.id(+);(员工表里面的经理,经理本身就是员工)
集合连接:对查询结果集的操作–集合操作结果集的处理和运算
union:将上下结果取并集,去掉重复记录(重复的只显示一次)
例:
select id, name from s_region; <=5;
select id, name from s_region; >=3 and <=5;
select id,name from s_region where id <=5 union select id,name from s_region where id >=4 or id <=2;
并集
union all:将上下结果全部显示
例:
select id ,name from s_region where id <=5 union all select id,name from s_region where id >=4 or id <=2;
minus:取差集a-b
例:select id ,name from s_region where id <=5 minus select id,name from s_region where id >=4 or id <=2;
intersect:取交集
例:select id ,name from s_region where id <=5 intersect select id,name from s_region where id >=4 or id <=2;

前提条件是:两个结果集查询的列要完全一致

伪列:
oracle中的伪列rownum
伪列rownum,就像表中的列一样,但是在表中并不存在。完全虚拟的列。
伪列只能查询,不能进行增删改操作,他根据返回的结果为每一条数据生成一个序列化的数字,rownum是oracle才有的伪列。
rownum相当于行标,所以他可以查询小于任何值,但是不能大于任何值,只能等于1.
例select id,name rownum from s_emp;
多表查询_第2张图片

 rownum  所能的操作:
 rownum只能等于1,如果等于其他数字,则查询不出来

你可能感兴趣的:(多表查询)