数据库(6)

1.联合查询

首先创建两张表如下:

对这两张表进行笛卡尔积,会得到如下结果:

观察上述数据,会发现有些不合法的数据,如何操作才能去除不合法的数据,将两张表合并呢?为了查询出的数据正确可以在合并时加上条件,如下:

注意在增加条件时,要添加表名,否则会报错.该语句后面的条件也可以称为连接条件,该操作可以称为连接操作.下面做一个练习:首次创建如下表:

题目一:查询许仙同学的成绩

1.针对要查询的信息,确定信息来自学生表和成绩表.针对这两个表进行笛卡尔积,并且加上连接条件,去掉无效的数据.

2.根据题目条件,在补充其他条件

3.简化显示的内容

题目二:查询许仙同学的计算机原理成绩(方法与前面的一样,如下)

题目三:查询菩提老祖Java成绩

多表查询还有另一种写法:join on

题目一:查询许仙同学的成绩:

1.确定信息来自学生表和成绩表之后,对两张表进行笛卡尔积

可以看到未加筛选的数据是很多的.

2.指定连接条件

3.去掉一些多余的列

题目二:查询除白素贞同学以外同学的成绩

题目三:查询所有同学的总成绩及个人信息.

首先确定要查询的信息来自成绩表和学生表,并且要用到聚合函数.

这里需要注意聚合函数的使用,如果不加group by 语句,将计算所有同学的总成绩.

题目四:查询所有同学的成绩及同学的个人信息.

这次的查询要查询出同学的姓名,课程的的名字和课程的成绩.

当然也可使使用join on 语句,要查询的表比较多的时候,使用join on 会比较好观察.

总结多表查询的一般步骤:1.确定要查的信息来自于那几个表 2.把这些表进行笛卡尔积 3.指定连接条件 4.指定其他补充条件/聚合操作 5.针对列进行精简.接下来继续介绍多表查询的相关操作.

外连接:外连接和内连接一样,也是基于笛卡尔积的方式进行计算的,但是对于空值/不存在的值处理方式是有区别的.首先创建如下表:

实际上这两个表是存在对应关系的,两个表通过id连接起来.在数据一一对应的情况下,进行内连接和外连接的结果是一样的.内连接的结果如下:

外连接只能用join on的方式来写.可以给join前头加上left/right关键字,称为左外连接和右外连接.

对上述的表中的信息进行修改,使数据不在一一对应,此时结果就不同了.

再对上述数据进行内连接,得到的结果,就是只包含两个表中都存在的数据,

对于左外连接,以左侧的表为基准(比如student join score,student就是左侧表,score就是右侧表)会保证左侧表中的每个数据都存在,而左侧表在右侧表中不存在的数据会使用null来填充.

右外连接与左外连接类似,以右表为基准,使右表中的每个数据都存在,对于左表中不存在的数据会用null补齐.

内连接还有一种写法,如下:

自连接:同一个表,自己和自己计算笛卡尔积.还是使用下述表进行举例:

题目一:显示所有计算机原理成绩比java成绩高的成绩信息.

这里涉及到的是比较行和行之间的关系,之前学习的各种条件查询,都是基于列和列之间进行比较,无法直接比较行和行之间的关系,可以通过自连接转换成列和列之间的比较.

题目二:显示所有java成绩比高阶数学成绩高的成绩信息.

还是一样的需要用到自连结,具体如下:

子查询:把多个sql嵌套成一个sql(但是尽量不要使用,代码追求的是简单直观)

单行子查询:返回一行记录的子查询.

查询与不想毕业同学同班的同学.

形如下面的嵌套写法就叫做子查询:

多行子查询:返回多行记录的子查询:

查询语文或英语课程的成绩信息

子查询的写法:

  • 16
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值