联结表

一、联结表基础知识

1、关系表

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

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

3、联结表的优点:

①数据信息不重复,从而不浪费时间和空间

②如果某个数据信息变动,可以只更新该表中的某个记录,相关表数据不用变更

③数据无重复,可以更有效的存储和方便的处理,伸缩性强(能够适应不断增加的工作量而不失败,设计良好的数据库或者应用程序称为可伸缩性好(scale well)

PS:联结是一种机制,用来在一条select语句中关联表,因此称之为联结(联结在运行时关联表中正确的行)

 

二、创建联结

例如:select A_name,B_name,B_mobile

    from A, B

    where A.A_id = B.B_id

    order by A_name, B_name;

该SQL语句中,select语句指定要检索的列(因为是创建关联,所以指定了3个列,区别在于A_name在A表中,B_name和B_mobile在另一个表);from语句列出了2个表分别是A和B,A和B表使用where子句正确联结,

where子句指示MySQL匹配A表中的A_id和B表中的B_id相匹配,要匹配的两列以A.A_id和B.B_id完全限定表名(当引用的列可能存在二义性,必须使用完全限定表名(用一个点分隔的表名和列名)

PS:where子句的重要性

在一条select语句中联结几个表时,相应的关系是在运行中构造的;在联结两个甚至多个表时,实际上是将第一个表中的每一行与第二个表中的每一行配对,where子句作为过滤条件,它只包含匹配的给定条件的行。

没有where子句,第一个表中每个行将与第二个表中的每个行匹配,而不管逻辑上是否可以配在一起。

1、笛卡尔积

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

例如:select A_name,B_name,B_mobile

    from A, B

    order by A_name, B_name;

PS:应保证所有联结都有where子句,否则MySQL将返回比想要的数据多得多的数据,还应保证where子句的正确性。

2、内部联结

等值联结(equijoin):基于两个表之间的相等测试,也称为内部联结

例如:select A_name,B_name,B_mobile

    from A inter join B

    on A_name = B_name;

这条SQL语句中,select语句与之前的相同,相较于上面的from,这里使用了inter join指定(当使用inter join时,联结条件用on子句而不是where子句,在这里on等同于where)

3、联结多个表

SQL对一条select语句中可以联结的表的数目没有限制,创建规则也基本相同(首先列出所有表,然后定义表之间的关系)

PS:MySQL在运行时关联指定的每个表以处理联结,这样很耗费资源,因此使用中应注意,不要联结不必要的表。

 

三、创建高级联结

1、使用表别名

别名除了允许用于列名和计算字段外,SQL还允许给表名起列名,好处在于:

缩短SQL语句;

允许在单条select语句中多次使用相同的表;

例如:select a_name, a_mobile

         from A as a, B as b, C as c

         where A.a_id = B.b_id

         and C.c_num = B.b_num

         and birthday_id = '1992-10-26';

PS:表别名不仅可用于where子句,还可用于select列表,order by子句以及语句其他部分(表别名只在查询执行中使用,表别名不返回到客户端主机)

2、自联结

自联结:自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句。

例如:select p1.user_id, p1.user_name

         from usertable as p1, usertable as p2

         where p1.user_id = p2.user_id

         and p2.user_id = '10086';

这条SQL语句中,usertable表第一次出现为别名p1,第二次为别名p2,在select语句中明确使用p1前缀给出所需列名,否则MySQL将返回错误,因为其无法正确区分想要的具体为哪一列;

3、自然联结

无论何时对表进行联结,应至少有一个列出现在不止一个表中(被联结的列);标准的联结返回所有数据,自然联结排除多次出现,只返回一次。

一般使用select *通配符,对其他表的列使用明确的自己来完成,通配符只对第一个表使用,所有其他列明确列出。

例如:

SELECT  c.*, o.order_num, o.order_date, oi.prod_id, oi.quantity, oi.item_price 

FROM customers AS c, order AS o, orderitems AS oi

WHERE c.cust_id=o.cust_id

AND oi.order_num=o.order_num;

AND prod_id='FB';

4、外部联结

用来检索包含了在相关表中没有关联行的行,这种类型的联结称为外部联结。

例如:select A.cust_id, B.mobile_num

         from A left outer join B

         on A.cust_id = B.mobile_num;

这条select语句使用关键字outer join来指定联结的类型(不是在where子句中指定);在使用outer join语法时,必须使用left或right指定包括其他所有行的表(right指出右边的表,left指出左边的表)

外部联结的类型:

分为左外部联结和右外部联结,唯一差别是关联表的顺序不同,左外部联结可以通过颠倒from或where子句中的表顺序转换为右外部联结,两种类型可以互换使用(聚集函数也可和联结一起使用)。

5、使用带聚集函数的联结

例如:检索所有客户及每个客户所下的订单的数

SELECT customers.cust_name, customers.cust_id,

COUNT (order.order_num) AS num_ord 

FROM customers INNER JOIN orders ON customers.cust_id=order.cust_id

GROUP BY customers.cust_id;

PS:联结使用要点

①注意使用的联结类型

②保证使用正确的联结条件,否则将返回不正确的数据

③应该总是提供联结条件,否则会得到笛卡尔积

④同一个联结下可包含多个表,甚至对每个联结采用不同的联结类型

猜你喜欢

转载自blog.csdn.net/wangjian530/article/details/80549644