数据查询(4)-----------基于学生信息数据库study

连接查询

4.4.1 交叉连接

交叉连接,又称笛卡尔积,其连接结果为由第一个表的每行与第二个表的每行连接起来后形成的表

语法格式:select * from table1 cross join table2;

                  或

                  select * from table1,table2;

查询电商专业的同学和选课课程的所有可能组合。

select 姓名,课程名 from 学生 cross join 课程
    where 所在班级 = '19电商1';


        交叉连接返回结果集的行数等于所连接的两个表行数的乘积。例如,第一个表有100条记录,第二个表有200条记录,交叉连接后结果集的记录有100×200=20000条。由于交叉连接查询结果集十分庞大,执行时间长,消耗大量计算机资源,而且结果集中很多记录没有意义,所以在实际工作中很少用到,因此需要避免使用交叉连接,也可在from子句后面使用where子句设置查询条件,减少返回结果集的行数。

4.4.2 内连接


在内连接中,使用比较运算符进行表间某些字段值的比较操作,并将与连接条件相匹配的数据行组成新记录,以消除交叉连接中没有意义的数据行。

1)inner  join的显式语法结构

语法格式:select 目标列表达式1,目标列表达式2,…,目标列表达式n,

                        from table1 [ inner ] join table2 on 连接条件

                        [ where 过滤条件 ]

2)用where子句定义连接条件的隐式语法结构

语法格式:select 目标列表达式1,目标列表达式2,…,目标列表达式n,

                        from table1 ,table2

                        where 连接条件[ AND 过滤条件]

说明:

(1)目标列表达式:需要检索的列的名称。

(2)table1,table2:进行内连接的表名。

(3)连接条件:连接查询中用来连接两个表的条件,其格式为:[ <表名1.> ] < 列名1 > < 比较运            算符 > [ <表名2.> ] <列名2>

(4)在使用inner join的连接中,连接条件放在from子句的on子句中,过滤条件放在where子句中

(5)在使用where子句定义连接条件的连接中,连接条件和过滤条件都放在where子句中 。

(6)内连接是系统默认的,可省略inner。

1.等值连接与非等值连接

查询每个学生选修课程的情况。

select 学生. *, 选课. * from 学生,选课
    where 学生.学号 = 选课.学号;
 
select 学生. *, 选课. *
    from 学生 inner join 选课 on 学生.学号 = 选课.学号;


注: SQL允许在查询中使用表的别名,可在from子句中为表定义别名,然后在查询中引用。

查询选修了大学英语课程且成绩在85以上的学生情况。

select a.学号,姓名,课程名,成绩
    from 学生 a,选课 b,课程 c
    where a.学号 = b.学号 and b.课程号 = c.课程号 and 课程名 = '大学英语' and 成绩 >= 85;
 
select a.学号,姓名,课程名,成绩
    from 学生 a join 选课 b on a.学号 = b.学号 join 课程 c on b.课程号 = c.课程号
    where 课程名 = '大学英语' and 成绩 >= 85;


该语句采用内连接,省略inner关键字,使用了where子句。

2.自然连接


自然连接在from子句中使用关键字nature join,自然连接在目标列中去除相同的字段名。

对“查询每个学生选修课程的情况”指令进行自然连接查询。

select *
    from 学生 nature join 选课;


(结果行数太多,就不在此放置整张图片了,可以在自己电脑上试一下)

3. 自链接

举例如下。

查询选修了c01课程的成绩高于学号为060102的成绩的学生姓名。

select a.课程号,a.学号,a.成绩
    from 选课 a,选课 b
    where a.成绩 > b.成绩 and a.课程号 = 'c01' and b.课程号 = 'c01' and b.学号 = '060102'
    order by a.成绩 desc;
 
select a.课程号,a.学号,a.成绩
    from 选课 a join 选课 b on a.成绩 > b.成绩
    where a.课程号 = 'c01' and b.课程号 = 'c01' and b.学号 = '060102'
    order by a.成绩 desc;


4.4.3 外连接

(1)左外连接。结果表中除了包括满足连接条件的行外,还包括左表的所有行,当左表有记录而            在右表中没有匹配记录时,右表对应列被设置为空值null。

(2)右外连接。结果表中除了包括满足连接条件的行外,还包括右表的所有行,当右表有记录而            在左表中没有匹配记录时,左表对应列被设置为空值null。

采用左外连接查询各班级自习室的使用情况。

select 班级名称,自习室
    from 学生 left join 班级 on(学生.所在班级 = 班级.班级名称);


右外连接的用法同理。

------------------------------------------------------------END---------------------------------------------------------------

  • 25
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值