连接查询
关系型数据库管理系统中,通常将每个实体的所有信息存放在一张表中,当查询数据时,通过连接操作查询多个表中的实体信息,当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查询,连接查询包括交叉连接查询、内连接查询、外连接查询,本节将针对这些连接查询进行详细的讲解。
1、交叉连接查询
交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积。
简化说明为:两列数据各从各列中取一个组成不同的组合,一共有多少种方式。
那为了我们能够进行数据查询,我们首先要往我们的数据库中插入部分数据。
insert into class (classname) values ('软件161'),('移应161'),('移应171');
注意:我们这里要先插入class表格的数据,再插入student表格的数据,这是由我们外键约束决定的:必须要先有班级才能将学生归为该班内。
insert into student(name , classid) values ('赵','1'),('钱','2'),('孙','3'),('李','2');
之后再插入学生数据,这个学生分班情况,要和学校实际有的班级相对应,既符合逻辑又符合外键。
然后咱们再来做咱们的交叉连接,首先是交叉连接的基本格式:
SELECT * FROM table1 CROSS JOIN table2;
那我们实际项目中的交叉连接应该怎么写?
最后我们通过查询交叉连接查询出来的内容应该是有3X4,这么多条的。
不过,实际开发中这种业务需求是很少见的,一般不会使用交叉连接,而是使用具体的条件对数据进行有目的的查询。
2、内连接
内连接(Inner Join)又称简单连接或自然连接,是一种常见的连接查询。
内连接使用比较运算符对两个表中的数据进行比较,并列出与连接条件匹配的数据行,组合成新的纪录。
也就是说只有满足内连接条件的记录才能出现在查询结果中。
SELECT row_name FROM table1 [INNER可以省略] JOIN table2 ON table1.row_name = table2.row_name;
row_name指的是字段,那我们来看一下具体查询
SELECT * FROM class JOIN student ON class.id = student.classid;
查询的结果是我们对应班级的同学被归类到对应的班级上了。
当然了,我们实现需求的方法不止一个,对吧:
SELECT class.classname , student.name FROM class,student WHERE class.id = student.classid;
从查询结果看,使用WHERE子句查询结果与使用INNER JOIN 的查询结果是一致的。
需要注意的是,这两个语句的查询结果虽然相同,但是INNER JOIN是内连接语句,WHERE是条件判断语句,在WHERE语句后可以直接添加其他条件,而INNER JOIN语句不可以。
2.1、自连接
如果在一个连接查询中,涉及的两个表是同一个表,这种查询称为自连接查询。
自连接是一种特殊的内连接,它是指相互连接的表在物理上为同一个表,但逻辑上分为两个表,例如要查询‘李’这个同学班级里面还有哪些同学。
SELECT p2.* FROM student p1 JOIN student p2 ON p1.classid = p2.classid where p1.name='李';
但是在教学过程中,学生出现了这样的一个问题,命令行如下:
SELECT p2.* FROM student p1 JOIN student p2 ON p1.classid = p2.classid where p2.name='李';
查询结果如下:
原因分析:
原因分析方法:数据库学习时分析原因的方法类似于断点调试法,将命令行分段修改,查找原因。
SELECT * FROM student p1 JOIN student p2 ;
SELECT p2.* FROM student p1 JOIN student p2 where p2.name='李';
SELECT p2.* FROM student p1 JOIN student p2 ON p1.classid = p2.classid ;
3、外连接
内连接查询中,返回的结果只包含符合查询条件和连接条件的数据,然而有时还需要包含没有关联的数据,即返回查询结果中不仅包含符合条件的数据,而且还包括左表(左连接或左外连接)、右表(右连接或右外连接)或两个表(全外连接)中的所有数据,此时就需要使用外连接查询,外连接分为左连接和右连接。
首先我们先看一下外连接的语法格式
SELECT row_name FROM table1 LEFT||RIGHT [OUTER可以省略] JOIN table2 ON table1.row_name = table2.row_name WHERE condition.
那同样的两张表格怎样区分左表和右表呢?这个内容就简单粗暴了:以JOIN关键字做区分,关键字左边的被称为左表,关键字右边的被称为右表。
废话不多说,咱们直接上案例代码
为了显示效果的不同,我们先向class表中插入一条数据
insert into class (classname) values ('软件171');
3.1左连接
我们利用一下左连接,查出如下效果。
左连接的结果包括LEFT JOIN子句中指定的左表的所有记录,以及满足连接条件的记录。如果左表的某条记录在右表中不存在,则在右表中显示为空。
从实际的结果来看,显示了五条记录,并且软件171班没有记录在册的学生。
咱们同学开动一下脑筋,右连接应该有什么样的一个效果?
复合条件连接查询
符合条件查询就是在连接查询的过程中,通过添加过滤条件来限制查询结果,是查询结果更加精确。
本文多出自于传智播客教学内容。
网友评论