子查询、联合查询和连接查询

子查询:查询中嵌套查询。

如:select * from (select CName,CId from TblClass union select DName,DId from Department) as t1 order by cname

联合查询:将多个结果集合并成一个结果集,前提是列数相同,并且相应的列的类型相同。判断标准以第一个表的结果集为准。

执行结果集的特点:结果集的列名以第一个为准;

如上面的语句的结果集为在第一个表的基础上,插入第二个表的数据。列数和原来一致,只增加行数。

使用union关键字,不自动排序,也不消除重复项

使用union all关键字,自动排序、消除重复项

连接查询:做多个表的数据查询。有时,结果集中的数据被包含在多个表中,则需要使用连接查询。

第一种:内连接 inner join... on 或join... on 

匹配两个表中都有的数据

select tClassName,tSName from TblClass inner join tblstudent on TblClass.tClassId=TblStudent.tSClassId

只有两个表中的数据集合on条件,才会显示在结果集中。

第二种:自连接 inner join... on 

在实际开发过程中,如果几个表(实体)满足树状结构,每个表处于单独一级,且观察发现表的结构非常类似,于是考虑将这些表合成一张表,这个时候就可以用自连接。

特点:关系列的值引用的本表中主键列信息

示例数据groups表(对于没有上级的信息,可以使用0来填充)

gid    gname                 gparent

1       总部                     0

2       北京分公司            1

3       上海分公司            1

4       深圳分公司            1

5       广州分公司            1

6       .net部门               2

7       .net部门               5

这个表也可以通过总部、分公司、部门三个表进行联合查询得到。

当前表的含义:第一级分类:总部,第二级分类:分公司,第三级分类:部门,明显满足条件,所以考虑用自连接,即gparent作为关系列。

使用自连接查询部门名称及对应的公司名称

--查询部门名称

select gname from groups as department

--查询公司名称

select gname from groups as company

--需要从部门表和公司表连接查询

select department.gname,company.gname from groups as department inner join groups as company on department.gparent=company.gid

第三种:外连接left join right join full join 

left join:左表中的信息全部出现,右表中的信息必须能够匹配的才出现,未匹配的项使用null填充

right join:右表中的信息全部出现,左表中的信息必须能够匹配的才出现,未匹配的项使用null填充

full join:所有数据都会出现,不匹配的项使用null填充,只要想做连接查询,必须分析出两个表间的关系

原文地址:https://www.cnblogs.com/shuibi/p/6627056.html