多表查询的方式—联合—连接—子查询

如何多表联查?在什么地方进行什么样的查询?

多表联查的方式:

           联合查询:

                   概念:联合查询是可合并多个相似的选择查询的结果集。等同于讲一个表追加到另一个表,从而实现两个表的查询组合到一起.(将多个查询的结果合并到一起,字段数不变,多个查询的记录数合并(使用的不是太多))

                  应用场景:

                                 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(列子查询):不等于其中所有;

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值