子查询、联合查询和连接查询
子查询:查询中嵌套查询。
如: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填充,只要想做连接查询,必须分析出两个表间的关系