select语句中的多表查询

select语句中的多表查询:
连接条件放在where语句中
如果没有where限定,则会产生笛卡尔积,如果1张表有1000多个元素,那么三个表将会产生几十亿的笛卡尔积
所以要消除笛卡尔积就得使用where添加限定条件。如果有n张表连接需要添加n-1个限定条件来消除笛卡尔积
一、等连接
限定条件使用=连接
一般两个表连接时,将一张表的外键值=另一张表的主键值
例如:(两张表的等连接查询学生选课信息)
select *
from student,class
where student.c_id=class.id;
注意:多表连接一般先写连接条件在写限定性条件,可以增加查询效率
二、不等连接
限定条件使用 "<" ">" 或 between ....and.....
例如:(查询所有学生奖学金在县级以上奖学金的学生名单信息)
奖学金等级根据 金额分为 5000国家级奖学金 4000省级奖学金 3000县级奖学金 2000院级奖学金
select s.id,s.name,b.number,b.grade
from Student s,bursary b
where b.number between 3000 and 5000;
三、外连接
当外键的值为空时,不能使用等连接,就可以使用外连接
oracle数据库中 可以使用(+) 规则:(+)放在数据少的一边
注意:(+)只支持oracle数据库
1.左外连接:
例如:(查询所有获得奖学金的学生及奖金信息,包括没有获得奖学金的学生信息)
select s.id,s.name,b.number
from student s,bursary b
where s.bur_id=b.id(+);
以上只用于oracle数据库,如果想用在其他数据库中,则:
select s.id,s.name,b.number
from student s left join bursary b
on where s.bur_id=b.id;
2.右外连接
where 语句中(+)与左外连接相反
其他数据库中 right jion .... on ....
3.全连接
例如:(查询所有学生信息及奖学金信息,包括没有得奖学金的学生和该奖项没有学生的信息)
select s.id,s.name,b.number,b.grade
from student s,bursary b
where s.bur_id(+)=b.id(+);
其他数据库的sql语句
select s.id,s.name,b.number,b.grade
from student s full jion bursary b
on s.bur_id=b.id;
四、自连接
同一张表当多张表使用,则需要自连接
例如:(查询所有学生的班长信息,及没有班长的学生信息)
select s.id,s.name,m.id,m.name
from Student s,Student m
where s.monitor_id=m.id;
班长和普通学生都是学生,所以他们的信息都来自同一张表
五、集合连接
union:并集,重复的列只显示一行
union all:并集,不会消除重复的行
minus:差集
intersect:交集
使用以上集合将两个查询语句连接起来实现逻辑查询
例如:(查询学生表第3行到第5行的信息)
select *
from Student
where rownum<6
minus
select *
from Student
where rownum<3;

rownum:伪列,可以分页技术,逻辑位置
只能等于1
不能大于或者大于等于任何正整数
可以小于或者小于等于任何正整数
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值