mysql中的联结类型

讲技术之前,先聊一下语文。注意这里是’联结类型’ 而不是连接类型。
嗯,专业!
先聊一下为什么会出现 ‘联结’ 这个知识点。首先,mysql是关系型数据库
下面是我百度百科中扒拉到的关于关系型数据库的定义。
。。。。。。。
关系型数据库,是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。
。。。。。。。。
看不懂。。。。
我也看不懂。
我聊一下我的理解吧,入门还是没问题的
mysql是关系型数据库,数据库中的表是关系表,每张表之间是具有一定的关系。举个例子,比如教师表和学生表(很典型的表),二者具有很多关系(具体看业务逻辑),比如学生交作业给老师,那教师表中必须要有学生的编号,否则老师怎么知道谁交的作业?

就聊到这吧(下面我也不是很懂。。。)

说重点,为什么使用联结?
如果数据存储在多个表中,怎么用一条select语句查询出数据呢?
答案是使用联结。

那mysql中有几种联结呢?
我这边搬下课本上的,如果还有欢迎补充!

内联结(等值联结)

先交代测试表的结构!
两张表,products(产品表)与vendors(供应商表)
products含有p_name,p_price,v_id(外键)
vendors含有v_id(主键),v_name
上代码!

这是大家最熟悉的联结,mysql默认使用的就是内联结
写条sql,具体字段就不解释了,蛮简单的一条sql
select v_name,p_name,p_price 
from vendors,products
where vendors.v_id = products.p_id

这条sql使用的就是内联结,相信大家都用过吧,只不过你可能不知道你用
的是内联结这个知识点而已
那我们把它换一下。
select v_name,p_name,p_price 
from vendors inner join products
on vendors.v_id = products.p_id
这样子写就是标准的内联结语法。
这两条sql作用一样,写法不同,第二条是sql规范推荐的
你可能觉得用where更清晰一点,没错
但是使用明确的联结语法能确保不会忘记联结条件,有时候也会提升性能

自联结

自联结就是在一次select语句中多次引用相同的表
举个例子
表结构同上
select p_name,p_price 
from products 
where v_id = (select v_id 
			from 
			products where p_id = 'DTNTR')
这是用子查询实现的sql
我们换成自联结
select p1.p_id,p1.p_name 
from products AS p1,products AS p2 
where p1.v_id = p2.v_id and p2.p_id = 'DTNTR'
对比一下   ‘自联结就是在一次select语句中多次引用相同的表’  这句话
应该不难明白。

自然联结

关于这个大家可能就很陌生了,在网上查了一下,说的最多的就是下面这句话。
	
‘使用自然连接mysql会自动判断,以两个表中相同的字段为连接条件
返回查询结果’

我在书上面找到了不同的说法
原话很饶,我翻译并总结下
自然联结可以排除多次出现的列。
我的理解就是自然联结的结果集中不会有重复的列被检索出来
就是返回的表中没有重复的字段。
说法不一,还是听课本的吧。。。
而且我感觉目前为止我返回的表中的字段好像都是不重复的。。。

外联结

说下外联结的出现原因
有时候查询的时候会需要包含没有关联的行
比如
列出所有客户,包括没有订单的客户
表结构我就不说了,sql很简单,相信大家能看懂(我好懒。。。。)
这时候使用内联结就无法查询出  ‘没人订单的客户’这一行
怎么办?
使用外联结!
当然外联结这里又分为左外联结和右外联结,其实二者是可以互换的
我这边使用左外联结举例
select customers.c_id,order.o_num
from customers left outer join orders
on customers.c_id = orders.c_id;
这条sql语句可以返回这样一行数据
如果不使用外联结,使用mysql默认的内联结就不会出现这行数据。
c_id      order_num 
1002       null
使用外联结时,必须指定left和right
left表示外联结联结的是outer join 左边的表(也就是customers表)

暂时就想到这么多,哪些地方写的有问题欢迎留言。