第十五章 联结表

学习目标:

了解什么是联结,为什么要使用联结,如何编写使用联结的SELECT语句。

联结:

SQL最强大的功能之一就是能在数据检索查询的执行中联结(join)表。

关系表:

关系表的设计就是要保证把信息分解成多个表,一类数据 一个表。各表通过某些常用的值(即关系设计中的关系(relational))互相关联。

外键(foreign key)外键为某个表中的一列,它包含零一个表的主键值,定义了两个表之间的关系。

可伸缩性(scale)能够适应不不断增加的工作量而不失败。设计良好的数据库或应用程序称之为可伸缩性好(scale well)。

为什么要使用联结:

为了解决用单条SELECT语句检索出存储在多个表中的数据。

维护引用完整性:

联结不是物理实体,它在实际的数据库表中不存在。联结是由MySQL根据需要建立, 它存在于查询的执行当中。

在使用关系表时,仅在关系列中插入合法的数据非常重要。如果products表中插入拥有非法供应商ID(即没有在venders表中出现)的供应商生产的产品,则这些产品是不可以访问的,因为它们没有关联到某个供应商。

为了防止这种情况的发生,可指示MySQL只允许在products表的供应商ID列出现合法值(及出现在venders表中的供应商)。这就是维护引用完整性,它是通过表的定义中指定主键和外键来实现的。

创建联结:

联结的创建非常简单,规定要联结的所有表及它们如何关联即可。

SELECT vend_name, prod_name,prod_price

FROM vendors, products

WHERE vendors.vend_id = products.vend_id (完全限定列名)

ORDER BY vend_name, prod_name;

WHERE子句的重要性:

WHERE子句作为过滤条件指示MySQL如何对表进行联结。

笛卡尔积(cartesian product):

由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。

SELECT vend_name, prod_name,prod_price

FROM vendors, products

ORDER BY vend_name, prod_name;

不要忘了WNERE子句,应该保证所有联结都有WHERE子句,否则MySQL将返回比想要的数据多得多的数据。同理,应该保证WHERE子句的正确性。不正确的过滤条件将导致MySQL返回不正确的数据。

叉联结(cross join)

内部联结(equijoin):

目前为止所用的联结称为等值联结(equijoin),它基于两个表之间的 相等测试。这种联结也称为内部联结。

SELECT vend_name, prod_name,prod_price

FROM vendors INNER JOIN products

ON vendors.vend_id = products.vend_id;

ANSI SQL规范首选INNER JOIN语法。

联结多个表:

SQL对一条SELECT语句中可以联结的表的数目没有限制。创建联结的基本规则也相同。

Q:显示编号为20005的订单中的物品。

SELECT `prod_name`, vend_name, prod_price, quantity

FROM orderitems, products, vendors

WHERE products.vend_id = vendors.vend_id

AND orderitems.`prod_id` = products.`prod_id`

AND order_num = 20005;

性能考虑:

MySQL在运行时关联指定的每个表以处理联结。这种处理可能是非常耗费资源的,因此应该仔细,不要联结不必要表。联结的表越多,性能下降的越厉害。

##Q返回订购产品TNT2的客户列表;语句的书写层次,从外到里。

SELECT cust_name, cust_contact

FROM customers, orders, orderitems

WHERE  customers.cust_id = orders.cust_id

AND orderitems.order_num = orders. order_num

AND prod_id = ‘TNT2‘;

原文地址:https://www.cnblogs.com/mumulin99/p/9838405.html

时间: 2024-10-25 16:27:02

第十五章 联结表的相关文章

第十五章联结表

1.相同数据出现多次不是一件好事,此因素是关系型数据库设计的基础.关系表的设计就是要保证把信息分解成多个表,一类数据一个表.各表通过某些常用的值互相关联. 2.外键:外键为某个表的一列,它包含另一个表的主键值,定义了两个表之间的关系. 3.联结是一种机制,用来在一条select语句中关联表. 4.基于两个表之间的相等测试,这种联结也称为内部联结 5.sql对一条select语句可以联结的表的数目没有限制 注意点:不要联结不必要的表,联结的表越多,性能下降的越厉害 6.笛卡尔积: 由没有联结条件的

MYSQL必知必会读书笔记 第十五和十六章 联结表

为什么要使用联结? 如果数据存储在多个表中,怎样使用单条SELECT语句检索出数据?答案就是使用联结.简单地说,可以联结多个表返回一组输出,联结在运行时关联表中正确的行. 1.创建联结 SELECT vend_name,prod_name,prod_price from vendors,products WHERE vendors.vend_id=products.vend_id ORDER BY vend_name,prod_name; 注意:在引用列可能出现二义性时,必须使用完全限定列名.

SQL必知必会 笔记 第十二章 联结表

12.1联结 SQL最强大的功能之一即是在数据查询的执行中联结(join)表. 12.1.1关系表 相同数据出现多次绝不是一件好事,此因素是关系数据库设计的基础.关系表的设计就是要保证把信息分解成多个表,一类数据一个表.各表通过某些常用的值(即关系设计中的关系(relational))互相关联. 可伸缩性(scale):能够适应不断增加的工作量而不失败.设计良好的数据库或应用程序称之为可伸缩性好(scale well). 12.1.2为什么要使用联结 如果数据存储在多个表中,怎样用单条SELEC

深入浅出Zabbix 3.0 -- 第十五章 Zabbix 协议与API

今天是六.一儿童节,祝小朋友们节日快乐!发完此文就带我家小朋友出去玩耍了. 第十五章 Zabbix 协议与API 本章将介绍和开发相关的Zabbix协议和API的内容,通过对Zabbix协议和API的深入了解,你可以利用Zabbix协议编写客户端程序并将其嵌入的产品或系统中,并将数据发送到Zabbix server,这在无法安装Zabbixagent等程序的场景(例如专用的嵌入式系统)中非常有用.你也可以利用Zabbix API开发自己的业务系统,或灵活的与现有系统整合集成. 15.1 Zabb

第十五章 文件属性类的实现

                  第十五章    文件属性类的实现        根用户的权限也不能是无限大.必须考虑到保护用户的隐私!用户的文件内容.程序代码可设置为根用户也不能观看,只能是文件拥有者可以查看.修改.但根用户可以删除一切非根用户的文件.也可以查看用户的目录.所以,i_mode字符更改如下:      BU16 i_mode; // 描述文件的访问权限:文件的读.写.执行权限  // i_mode.15-13  ftype; 文件类型: 0-符号软连接文件, // 1-硬连接文

CSS3秘笈复习:十三章&十四章&十五章&十六章&十七章

第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮动元素.关键字:left.right或both. (2).浮动外围元素:让包含浮动元素的<div>也浮动.选择这种方法一定要在浮动容器后面的任何元素中添加一个clear属性,确保浮动元素落到容器的下方. (3).利用overflow : hidden.另一种常见的方法是在外围的样式中添加以下属性:

C++ Primer Plus学习:第十五章

第十五章 友元.异常和其他 友元 友元类 表 0-1 class Tv { public: friend class Remote; } Remote类可以使用Tv的数据成员,Remote类在Tv类后定义 . 友元成员函数 表 0-2 class Tv; //前向声明 class Remote { public: void chanup(Tv &t); } class Tv { public: friend void Remote::set_chan(Tv& t, int c); } 异常

Gradle 1.12用户指南翻译——第四十五章. 应用程序插件

文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc 本文翻译所在分支: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/usergu

Gradle 1.12用户指南翻译——第二十五章. Scala 插件

其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个程序浏览文档,带缓存功能的,目前