数据库连接查询与实例(内连接和外连接)

查询是建立数据库最重要的目的,查询类型概况来说可以包括以下几种:

1、单表查询

包括按列查询、查询经过计算的值、消除取值重复的行、条件查询、对查询结果进行排序、使用集合函数对查询结果分组。

2、连接查询

等值与非等值连接查询、自身连接、符合条件连接

3、嵌套查询

带有in谓词的子查询、带有比较运算符的子查询

4、集合查询

带有group by,order by等。

下面主要看看连接查询

1、内连接,inner join,返回连接表中符合连接条件和查询条件的数据行。如果没有on条件判断,则结果为两张表的笛卡尔积,如果有on条件判断 ,则结果为on条件刷选之后的笛卡尔积。它的特性就是显示符合连接条件记录。

剖析内连接的本质,实际上内连接就是两张表形成一张笛卡尔积表,然后再通过条件筛选相应的数据。

那么我们现在创建2张表,一张学生表,一张班级表,对应的数据和字段如下截图 

现在我们要查询001班级的所有学生,那么第一步我们写了如下的sql语句

SELECT * FROM student s
INNER JOIN class a 

得到如下结果

这就是第一步得到的笛卡尔积表,即 3*4=12条数据的表,下面我再加个条件,如下

 SELECT * FROM student s 

INNER JOIN class a ON s.`classId`=a.`classId`

得到笛卡尔积的之后,数据库会根据on后的条件进行筛选,得到上图所有学生信息的结果。

2、外连接

 在某些情况下,我们查询的集合不仅是两张基本表的交集部分,而且期望将没有处于交集部分的数据信息也查询出来,这个时候就必须要使用外连接,外连接不仅会将两个数据集中相互重叠的属性涉及的元素抽出,而且会将重叠部分以外非匹配的那些元祖一并纳入集合中来。

假设我们在上面一个列子上再加一个学生选课表记录表,我们需要查询每个学生的选课信息,如果使用内连接方法,结果将是那些选修了课程的学生记录,而将没有选课的学生记录丢失,显然不符合查询的初衷。

外连接又分为左外连接和右外连接。

本质上说左右外连接没有任何区别!左和右仅仅是人为的感觉,所谓的左和右用于指定无论是否具有匹配的行都要保留全部行的那个表称作为外部连接表,通常我们将用户定义的第一个表习惯性称作“外部连接表”,也称作“驱动表”,所以左外连接就成为了经常使用的方法了。

学生表数据如下

课程记录表数据如图所示

如果我们通过内连接查询,则只能查询部分数据

 

SELECT * FROM student s
INNER JOIN `coursereocd` r ON r.`stuNo`=s.`stuNo`

那么我们使用外连接看看效果

---------------------------左连接-----------------------------------------

SELECT * FROM student s
LEFT JOIN `coursereocd` r ON r.`stuNo`=s.`stuNo`

 

结果:

 

-------------------------右连接-------------------------------------------------------
SELECT * FROM `coursereocd` r
RIGHT JOIN student s ON r.`stuNo`=s.`stuNo`

结果:

 

 

posted @ 2017-09-24 16:02  huangpu311  阅读(486)  评论(0)    收藏  举报