联结(join)
在开始学习前,说几句题外话,由于自己以前或多或少的接触过一些关于数据库的知识,例如在android开发中的sqlite数据库的操作。里面涉及的关于操作数据库的操作比较简单:”别人口中的增删改查”,因此一直以为操作数据库是一个比较简单的知识,所以以前都没有真正的去学习数据库的相关知识。由于自己现在研二,即将面临的事情就是找工作,现在有时候会看一些面试题,面试题中会涉及一些关于数据库的知识,发现自己还是有很多都不熟悉,也不会。因此,自己在帮老师做项目的空闲时间里,也决定还是来认真的学习下数据库,就算是系统的认知下数据库吧,写关于MySQL必知必会这一系列的学习笔记主要是记录下自己的学习历程,也给以后的自己找工作复习用吧。
上一篇博文是关于子查询的学习,这篇博文就来学习下联结(join)。
这里我们就以一个问题开始吧。
为什么要使用联结??
因为在一般的数据库中,我们都会尽量分解数据为多个表进行存储,这里使得我们更方便的处理,并且具有更大的可伸缩性。但是,如果数据存储在多个表中,怎样用单条select语句检索出数据呢??上一篇博文中提到的子查询可以做到,还有一种方法就是:使用联结。简单地说,联结是一种机制,用来在一条select语句中关联表,因此称之为联结。使用特殊的语法,可以联结多个表返回一组数据,联结在运行时关联表中的正确的行。
创建联结
例如:我们想找出每个客户信息和订单之间的对应关系,而客户信息在customers表中,订单信息在orders表中,他们之间的联结就是靠cust_id来完成。
customers/orders 这两个表中的内容如下:
用如下的命令来进行联结:
select cust_name cust_tel,order_id from customers,orders where customers.cust_id=order.cust_id order by cust_name;
实践结果如下:
在联结两个表时,实际上做的是将第一个表中的每一行与第二个表中的每一行进行配对。where子句作为过滤条件,它只包含哪些匹配给定条件(这里是联结条件)的行。没有where子句,第一个表中的每行将与第二个表中的每行进行配对,而不管他们的逻辑上是否可以配对在一起。即笛卡尔积,因此不要忘了where子句
内部联结
目前为止所用的联结称为等值联结,它基于两个表之间的相等测试,这种联结也称为内部联结。对于这种联结可以使用稍微不同的语法来明确指定联结的类型。
下面的select 语句返回与前面例子完全相同的数据。
联结多个表
假如有这样一个需求:查出所有订单内容中包括了’apple’项的客户信息。
应该怎么做呢??
在上篇博文中,我们学习了子查询,利用子查询可以这样来完成,如下:
select cust_name,cust_tel from customers where cust_id in (select cust_id from orders where order_id in( select order_id from ordersitems where content='apple'));
实践结果如下:
上面是利用子查询来完成的,利用联结也可以完成,如下:
select cust_name , cust_tel from customers,orders,ordersitems where customers.cust_id=orders.cust_id and orders.order_id=ordersitems.order_id and ordersitems.content='apple';
实践结果如下:
想显示更多信息也可以(把订单内容和数量显示出来),如下:
从上面可以看出,完成这样一个功能,不仅可以选择子查询来完成,还可以选择联结表来完成。
关于联结的更多内容将会在下篇博文中继续学习。