如何多表联查?在什么地方进行什么样的查询?
多表联查的方式:
联合查询:
概念:联合查询是可合并多个相似的选择查询的结果集。等同于讲一个表追加到另一个表,从而实现两个表的查询组合到一起.(将多个查询的结果合并到一起,字段数不变,多个查询的记录数合并(使用的不是太多))
应用场景:
1.将同一张表中不同的结果(需要对应多条查询语句来实现),合并到一起展示数据。
2.最常见:在数据量大的情况下,会对表进行分表操作,需要对每张表进行部分数据统计,实用联合查询来将数据存放到一起显示;
注意:
在使用联合查询时,如果要使用order by ,那么对应的select 语句必须使用括号括起来
order by在联合查询中要生效必须配合使用limit ;
例子: (select *from 表名 where 条件 order by asc limit30)
union all
(select*from表名 where 条件 order by desc limit20)
连接查询:
将多张表连接到一起进行查询(会导致记录数行和字段数列发生改变);
链接意义:
在关系型数据库设计过程中,实体(表)与实体之间存在很多联系的;利用这个链接保证数据完整性
注意:
我们在使用连接查询的时候要注意交叉查询(生成的结果就是笛卡尔积),他是从一张表依次取出记录与另一张表挨个匹配,没有匹配条件 所有结果都会保留。(这是我们要避免的)
内连接:(查询俩表有相同的数据时使用)
inner join 从一张表中去除所有的记录去另一张表中匹配;利用匹配条件进行匹配,成功就保留.(也就是查找两个表中数据的交集)
基本语法
表一[inner] join 表二 on 匹配条件; 例如表一.one=表二.one;
1.如果内连接没有条件(允许),那么其实就是交叉链接(避免);
2.建议使用 表名.字段名;别名;
注: 3.内连接匹配的时候,必须保证匹配到才保存;如果内容为空的话都匹 配不出来;
注: 4.内连接因为不强制必须使用匹配条件(on)因此可以在数据匹配完成之后,使用where条件来限制,效果与on一样(建议使用on);where有些浪费资源;
外连接:
outer join 按照摸一张表作为主表(表中所有记录在最后都会保留),根据条件去链接另一张表从而得到数据;
外连接分为两种:
左外连接 left join:左表为主表 ;
右外连接 right join:右表为主表;
全外连接(full join / full outer join):
满足on条件表达式,返回两个表符合条件的所有行,a表没有匹配的则a表的列返回null,b表没有匹配的则b表的列返回null,即返回的是左连接和右连接的并集。
特点:
1.外连接中主表数据记录一定会保存;链接之后不会出现记录数少于主表;(内连接可能)
2.左连接与右链接其实可以互相转换,但是数据对应的位置会改变;
注: 3.内连接因为不强制必须使用匹配条件(on)因此可以在数据匹配完成之后,使用where条件来限制,效果与on一样(建议使用on);where有些浪费资源;
using关键字
是在链接查询中用来代替对应的on关键字的,进行条件匹配;
原理:
1 .在连接查询时,使用on的地方用using代替;
2.使用using的前提是对应的两张表链接的字段是同名(类似自然连接自动匹配)
3.如果使用using关键字,那么对应的同名字段,最终在结果中只会保 留一个;
语法:
表一 [inner ,left,right] join表二 using (同名字段);链接字段;
子查询:(常用到的包括上边的连接查询)
子查询是一种常用的计算机语言 select-sql语言中嵌套查询下层的程 序模块.当一个查询是另一个查询的条件时, 称之为子查询
简易说:子查询指在一条select语句中,嵌入了另外一条select语句, 那么被嵌入的select语句称为子查询语句;
主查询:
主要的查询对象,第一条select 语句,确定用户所有获取的数据目标(数据源),已及要具体得到的字段信息;
子查询与主查询的关系:
1.子查询是嵌入到主查询的;
2.子查询是辅助主查询的,要么为条件,要么为数据源;
3.子查询其实可以独自存在;是一条完整的select语句;
功能分类:
where 标量子查询:
子查询返回的结果为一个数据一行一列;
语法:select *from 数据源 where 条件判断 (select 字段名 from数据源 where)
where 列子查询:
返回的结果是一列 多行;
语法:select *from 数据源 where 条件 in(select 字段名 from数据源 where);
where 行子查询
返回的结果是一行 多列;
语法:主查询 where 条件[(构造一个行元素,多条件)]=(行子查询);
from 表子查询:
返回的结果是多行多列;
语法:select 字段表 from(表子查询)as别名[where][group by][having][order by][limit]
exists子查询:
返回的结果是1或0(类 似布尔);
语法:where exists(查询语句);//根据查询得到的结果进行判断;如果存在为1否则0;
where 1;永远为真;
特定关键字使用:
in
主查询 where 条件 in(列子查询);
any:
=any(列子查询);条件在查询结果中有任意一个匹配即可;等价于in
<>any(列子查询) ;条件在查询结果中不等于任意一个;
some;
通any;
all;
=all(列子查询):等于里面所有;
<>all(列子查询):不等于其中所有;