笛卡尔积:
假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔
积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。
在数据库中,如果直接查询俩张表,那么其查询结果就会产生笛卡尔积。
为了在多表查询中避免笛卡尔积的产生,可以使用连接查询来解决此问题
1.等值连接:利用一张表中某列的值和另一张表中某列的值相等的关系,把俩张表连接起来。
2.不等值连接
3.外链接(左外连接,右外连接,全连接)
4.自连接(一张表查询多次,自己连接自己)
例子:
等值连接
查询员工的名字、部门编号、部门名字
select se.last_name,se.dept_id,sd.name
from s_emp se,s_dept sd
where se.dept_id=sd.id;
不等值连接
假设数据库中还有一张工资等级表:salgrade
工资等级表salgrade:
gradeName列表示等级名称
losal 列表示这个级别的最低工资数
hisal 列表示这个级别的最高工资数
表中的数据类似于下面内容:
id salgrade losal hisal
1 初级程序员 2000 4000
2 中级程序员 4000 6000
查询出员工的名字、职位、工资、工资等级名称
select last_name,title,salary,gradeName
from s_emp se,salgrade s
where se.salary between s.losal and s.hisal;
左外连接:
查询所有员工 以及对应的部门的名字,没有部门的员工也要显示出来
select se.last_name,se.dept_id,sd.name
from s_emp se,s_dept sd
where se.dept_id=sd.id(+);
或者
select se.last_name,se.dept_id,sd.name
from s_emp se left join s_dept sd
on se.dept_id=sd.id;
右外连接:
查询所有员工 以及对应的部门的名字,没有任何员工的部门也要显示出来,
没有部门的员工也要显示出来
select se.last_name,se.dept_id,sd.name
from s_emp se,s_dept sd
where se.dept_id(+)=sd.id;
或者
select se.last_name,se.dept_id,sd.name
from s_emp se right join s_dept sd
on se.dept_id=sd,id;
全连接:
查询所有员工 以及对应的部门的名字,没有任何员工的部门也要显示出来,
没有部门的员工也要显示出来
select se.last_name,se.dept_id,sd.name
from s_emp se full join s_dept sd
on se.dept_id=sd.id;
自连接:
查询每个员工的名字以及员工对应的管理者的名字
select s1.last_name,s2.last_name manager_name
from s_emp s1,s_emp s2
where s1.manager_id=s2.id;
对查询结果集的操作(如果有俩条sql语句,每一条sql都可以查询出一个结果,这个被称之为结果集)
(前提条件 俩个结果集中【查询的列】要完全一致)
union 获得俩个结果集的并集
union all 把俩个结果集合在一起显示出来
minus 第一个结果集除去第二个结果集和它相同的部分
intersect 获得俩个结果集的交集
例子:
union 获得俩个结果集的并集
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id=s_dept.id(+)
union
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id(+)=s_dept.id;
union all 把俩个结果集 合在一起显示出来
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id=s_dept.id(+)
union all
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id(+)=s_dept.id;
minus 第一个结果集除去第二个结果集和它相同的部分
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id=s_dept.id(+)
minus
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id(+)=s_dept.id;
intersect 求俩个结果集的交集
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id=s_dept.id(+)
intersect
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id(+)=s_dept.id;
Oracle中的伪列(rownum)
伪列rownum,就像表中的列一样,但是在表中并不存储。伪列只能查询,
不能进行增删改操作。它会根据返回的结果为每一条数据生成一个序列化的数字.
伪列的操作:
1.rownum只能等于1
2.rownum只能大于0
3.rownum 可以小于等于任何数
例子:
1.查询s_emp表中的第一个名字
select last_name
from s_emp
where rownum=1;
2.查询s_emp表中的所有名字
select last_name
from s_emp
where rownum>0
3.查询s_emp表中的前八个名字
select last_name
from s_emp
where rownum<8
假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔
积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。
在数据库中,如果直接查询俩张表,那么其查询结果就会产生笛卡尔积。
为了在多表查询中避免笛卡尔积的产生,可以使用连接查询来解决此问题
1.等值连接:利用一张表中某列的值和另一张表中某列的值相等的关系,把俩张表连接起来。
2.不等值连接
3.外链接(左外连接,右外连接,全连接)
4.自连接(一张表查询多次,自己连接自己)
例子:
等值连接
查询员工的名字、部门编号、部门名字
select se.last_name,se.dept_id,sd.name
from s_emp se,s_dept sd
where se.dept_id=sd.id;
不等值连接
假设数据库中还有一张工资等级表:salgrade
工资等级表salgrade:
gradeName列表示等级名称
losal 列表示这个级别的最低工资数
hisal 列表示这个级别的最高工资数
表中的数据类似于下面内容:
id salgrade losal hisal
1 初级程序员 2000 4000
2 中级程序员 4000 6000
查询出员工的名字、职位、工资、工资等级名称
select last_name,title,salary,gradeName
from s_emp se,salgrade s
where se.salary between s.losal and s.hisal;
左外连接:
查询所有员工 以及对应的部门的名字,没有部门的员工也要显示出来
select se.last_name,se.dept_id,sd.name
from s_emp se,s_dept sd
where se.dept_id=sd.id(+);
或者
select se.last_name,se.dept_id,sd.name
from s_emp se left join s_dept sd
on se.dept_id=sd.id;
右外连接:
查询所有员工 以及对应的部门的名字,没有任何员工的部门也要显示出来,
没有部门的员工也要显示出来
select se.last_name,se.dept_id,sd.name
from s_emp se,s_dept sd
where se.dept_id(+)=sd.id;
或者
select se.last_name,se.dept_id,sd.name
from s_emp se right join s_dept sd
on se.dept_id=sd,id;
全连接:
查询所有员工 以及对应的部门的名字,没有任何员工的部门也要显示出来,
没有部门的员工也要显示出来
select se.last_name,se.dept_id,sd.name
from s_emp se full join s_dept sd
on se.dept_id=sd.id;
自连接:
查询每个员工的名字以及员工对应的管理者的名字
select s1.last_name,s2.last_name manager_name
from s_emp s1,s_emp s2
where s1.manager_id=s2.id;
对查询结果集的操作(如果有俩条sql语句,每一条sql都可以查询出一个结果,这个被称之为结果集)
(前提条件 俩个结果集中【查询的列】要完全一致)
union 获得俩个结果集的并集
union all 把俩个结果集合在一起显示出来
minus 第一个结果集除去第二个结果集和它相同的部分
intersect 获得俩个结果集的交集
例子:
union 获得俩个结果集的并集
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id=s_dept.id(+)
union
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id(+)=s_dept.id;
union all 把俩个结果集 合在一起显示出来
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id=s_dept.id(+)
union all
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id(+)=s_dept.id;
minus 第一个结果集除去第二个结果集和它相同的部分
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id=s_dept.id(+)
minus
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id(+)=s_dept.id;
intersect 求俩个结果集的交集
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id=s_dept.id(+)
intersect
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id(+)=s_dept.id;
Oracle中的伪列(rownum)
伪列rownum,就像表中的列一样,但是在表中并不存储。伪列只能查询,
不能进行增删改操作。它会根据返回的结果为每一条数据生成一个序列化的数字.
伪列的操作:
1.rownum只能等于1
2.rownum只能大于0
3.rownum 可以小于等于任何数
例子:
1.查询s_emp表中的第一个名字
select last_name
from s_emp
where rownum=1;
2.查询s_emp表中的所有名字
select last_name
from s_emp
where rownum>0
3.查询s_emp表中的前八个名字
select last_name
from s_emp
where rownum<8