数据库19:带 WHERE 子句的多表查询(头歌云课)


任务描述

本关任务:使用带 WHERE 子句的多表查询方法,检索数据表中的指定内容。

相关知识

为了完成本关任务,你需要掌握:如何使用带 WHERE 子句的方法查询多表数据。

理解连接

SQL 最强大的功能之一,就是能使用数据检索语句来连接多张数据表。 连接 (Join) 是使用数据库时最重要的操作,所以理解什么情况下,能连接和如何连接是学习 SQL 中极其重要的部分。

在你使用连接查询之前,一定要搞清楚数据表之间的关系。那怎么理解数据表之间是有关系的呢?

举个例子 假设现在你有一张商品的列表,这张列表里包含了每个商品的名称、信息以及价格。现在的问题是,如果这些产品有一部分来自相同的生产厂家,你打算在哪里存储这些厂家的信息(比如厂家地址、信息及联系方式)?

有两种选择,一种是把厂家的信息和产品信息存储在一张数据表里,另一种是建立新的数据表来存储厂家的信息。

不知道你会选哪一种存储方式?

我们推荐选第二种,因为:

  • 有很多商品来自同一厂家,在存储的时候,就势必会造成大量的重复信息涌入商品数据表,这样既浪费时间,又浪费空间;

  • 如果厂家更换了信息(比如地址或者电话),你将要更新每一个出现在商品数据表中的厂家信息,这太费劲儿了!

  • 当信息内容大量重复时,你没有办法保证写入的每一条信息都和其他的一模一样,很有可能会在字符上有些许差异,数据不一致将来很难进行操作。

Tips:

一张数据表里出现多条相同的数据并不是一件好事,这个原则也同样适用于关系数据库的设计。我们推荐把不同种类的信息放在不同的数据表中,但是有关系的两张表,可以被同一种数据所关联。

用WHERE子句创造一个连接

两张数据表是如何被关联起来的呢?

你只需要列出所有被关联到的表,并写出他们是怎样的关系就可以了。抽象吗?

举个例子 我们现在有两张数据表,student 表中存储了学生信息,class 表中存储了班级信息。但是很显然,student 数据表里并没有存储学生的班级,而是学生班级的 id。我们只有将两张表关联起来,才能查询到学生所属的班级,但是,如何将两张数据表关联起来呢?

输入:

SELECT *
FROM student, class
WHERE student.class_id = class.class_id

该例中,我们在 WHERE 关键字后使用student.class_id = class.class_id 语句用来关联这两张表。我们可以理解为,当 student 表与 class 表中的 class_id 字段内容相同时,我们可以将两张表中 class_id 字段对应的内容行拼接成一张表。

输出:

注意到,class 表中的 class_id = 308 的内容行,并没有出现在我们的关联后的新表中。因为 student 表中的 class_id 并没有出现过内容 308 。现在我们可以大大方方的说,我们关联后的表是取了表 student 和表 class 的交集,如下图所示:

检索过程:

有的同学可能会注意到,这里出现了重复的显示项 class_id ,我们将在下一关里介绍如何去掉它。

编程要求

我们已经为你建好了数据库与数据表,并添加了相应的数据内容。你只需在右侧 Begin-End 区域内补充代码,用 WHERE 子句关联表 Products 和表 Vendors 。

表 Products 和表 Vendors 的内容如下图所示:

测试说明

测试过程:

  • 本关涉及到的测试文件是 step1_test.sh ,平台将运行用户补全的 step1.sql 文件,得到数据;

  • 将得到的数据与答案比较,判断代码是否正确。

如果操作正确,你将得到如下的结果:


开始你的任务吧,祝你成功!

实验代码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值