Bootstrap

《mysql存储过程编程》之连接分类

在查询多张表时总会用到用到连表查询,那么连表查询的连接方法到底有几种呢?今天就一起看看

1、交叉连接(只做笛卡尔积)

 

 XML Code 

1

 

select * from A cross join B

它等同于

 

 

 XML Code 

1

 

select * from A,B

准备如下数据

 

 

 XML Code 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

 

create table clazz(id int,name varchar(20),remark varchar(100))
insert into clazz (id,name,remark)
            values
            (1,'手机1班','做手机我们专业'),
            (2,'通讯2班','通信我们拿手'),
            (3,'测评3班','独立_第三方'),
            (4,'美术4班','人体模特'),
            (5,'魔术5班','我们是骗人的')

create table student (id int,name varchar(20),age int,salary int ,category varchar(100),feature varchar(50),seq char(1),cid int)
insert into student (id,name,age,salary,category,feature,seq,cid)
                                                
                                    values(1,'罗永浩',45,8000,'phone','工匠','A',1)
                                                ,(2,'雷军',49,1000,'phone','性价比','A',1)
                                                ,(3,'余承东',20,9,'tongxin','高端','A',2)
                                                ,(4,'黄章',50,9000,'phone','做工','B',1)
                                                ,(5,'王自如',18,188,'phone_test','第三方','B',3)
                                                ,(5,'刘翔',24,800,'run','飞人','C',9)

 

学生表如下

 

 

班级表如下

 

 

 

 

 XML Code 

1

 

select * from student s cross join clazz c 

 

 

 

 

实测得

 

 XML Code 

1

 

select * from student,clazz 

 

 

 

所得的结果集一样

结论一:交叉连接(cross join )  <==> 只做笛卡尔积

2、内连接(inner join)

 

 XML Code 

1

 

select s.name,s.age,s.salary,s.category,s.feature,s.seq,c.name,c.remark from student s inner join clazz c on s.cid = c.id

内连接是做笛卡尔积后再根据on后面的条件筛选出符合条件的行

 

运行上面的SQL得出以下结果集

 

内连接等价于

 

 XML Code 

1

 

select s.name,s.age,s.salary,s.category,s.feature,s.seq,c.name,c.remark from student s ,clazz c where s.cid = c.id

结论二:内连接(inner join )  <==> 做完笛卡尔积后根据on后面的条件筛选出符合条件的记录

 

3、外连接(left/right [outer] join)

 

 XML Code 

1

 

select s.name,s.age,s.salary,s.category,s.feature,s.seq,c.name,c.remark from student s left OUTER join clazz c on s.cid = c.id

运行以上的sql得到以下结果集

 

 

注意仔细观察,这个结果集和内连接的结果集相比多了一行,这是因为外连接比内连接多了一个步骤

即外连接1、做笛卡尔积 2、根据on条件筛选 3、把左表中没有匹配的行加结果集中进来

所以才会多了最后的一行

结论三:外连接(left/right [outer] join) <==> 通过on条件筛选笛卡尔积的结果后再把没有匹配的行加入到结果集中来

这就是mysql常用的3中连接方式

 

 

 

 

;