SQL语句详解——SQL联表查询

Posted 永远是少年啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL语句详解——SQL联表查询相关的知识,希望对你有一定的参考价值。

今天我们继续给大家介绍mysql相关知识,本文主要内容是SQL联表查询。

一、SQL联表查询简介

在前文SQL语句详解(三)——SQL子查询中,我们给大家介绍了SQL子查询的相关知识和使用示例。实际上,如果涉及到SQL多个表之间的查询,使用SQL联表查询的频率比使用SQL子查询的频率要高。SQL联表查询是指以两个表中的一个共同的字段,在这两个表之间建立联系,查询两个表中的全部或部分字段。
SQL联表查询按照表结合方式的不同,可以分为内链接、外链接交叉链接和结果链接四种,其中外链接又可以分为左外链接和右外链接两种。
下面,我们就依次介绍这四种联表查询的使用。
本文中使用的三张表如下:

二、内链接

内链接指的是把两个表关联起来后,只有当两个表中共同有的数据才进行显示,内链接是最普通的联表查询,其使用示例为:

select 字段 from1 inner join2 on 连接条件

例如:

select name,score from student inner join grade on student.Sid=grade.id;

由于在默认情况下join为内链接,因此上例中inner关键字可以省略,至于前面的字段,如果在两个表中没有相同的字段,则可以直接写字段名,如果两个表中有相同的字段名,则必须指名该字段属于哪个表,上述示例修改后,命令如下:

select student.name,grade.score from student join grade on student.Sid=grade.id;

另外,有时,如果表的名字过长,SQL语句在书写起来就不太方便。MySQL支持给一个表起一个别名。例如,在上例中,我们还给student表起一个别名s,给grade表起一个别名g,别名必须在from字段后予以声明,这样,上例修改后如下:

select s.name,g.score from student s join grade g o s.Sid=g.id;

上述命令执行结果如下:

三、外链接

外链接可以分为左外链接和右外链接,其实这两种方式在本质上是相同的。如果说内链接是两个表都有数据时才会显示,那么外链接就是主表中有数据就显示,而不管从表。对于左外链接来说,from后面紧跟着的表就是主表,而对于右外链接来说,则正好相反,join后面紧跟着的表是主表。

四、交叉链接

交叉链接,不设置联表条件,join前面可以加一个关键字cross,也可以不加。交叉链接表示两个表中的元素按照排列组合的方式进行逐个对应。交叉链接SQL示例如下:

select name,score from student s cross join grade g;

执行结果如下:

五、结果链接

所谓结果链接,就是将两个select查询的结果合并显示,union语句用于连接两个不同的select语句,如下所示:

select name from studeng union select score from grade;

执行结果如下:

注意,如果这union结果连接的两个SQL语句存在相同的数据,则在最终的结果中,这些数据会被合并,如果不想让这些数据被合并,则可以在union后面添加关键词all,SQL语句如下:

select id from student union all select id from course;

执行结果如下:
不加all关键字之前:

加all关键字之后:

注意,使用SQL结果链接时,必须保证这两个select语句返回相同的列数,否则MySQL数据库会报错,如下所示:

原创不易,转载请说明出处:https://blog.csdn.net/weixin_40228200

查询延迟加载/查询

存在联表查询中;联表查询必须是多表单独查询

 

概念:将查询的时机推迟

单表查询:不存在延迟查询

联表查询:

      多表一次查询:不存在延迟查询

      多表单独查询:会执行多条sql语句,才会存在延迟查询。

目的:只立马执行需要的数据的sql语句

比如:用户和地址数据

      两条sql语句

      select * from tuser where id = ?       需要立马执行的

      select * from taddress where aid = ?   可以延迟执行,在获取用户的地址的时候才执行

好处:减小数据库的压力

Mybatis的延迟加载方式:

直接加载

执行完主对象的sql语句之后,立马执行关联对象的sql语句

技术图片

 

 

配置

配置Mybatis的主配置文件:

      主配置文件中在proerties标签和typeAliaes标签之间可以配置settings的标签,用来配置全局配置的。

开启延迟加载的属性:

lazyLoadingEnabled:全局性设置懒加载。如果设为‘false’,则所有相关联的sql都会立即执行。默认为false

aggressiveLazyLoading:当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。默认为true

技术图片

 

 

侵入式延迟加载

执行完主对象的sql语句之后,不会立即执行关联对象的sql语句,当访问主对象中的数据时才会执行关联对象的sql语句。

User{id,name,money,birthday,Address address}

User u = userDao.listById(11);

u.getId()的时候立马执行关联sql语句的查询,查询address的数据

配置

技术图片

 

 

运行结果

当没有取获取主对象的属性的值的时候,关联对象的sql语句不执行

技术图片

 

 

当调用对象的属性的值的时候,才执行关联对象的sql语句

技术图片

 

 

深度延迟加载

User{id,name,money,birthday,Address address}

User u = userDao.listById(11);

u.getId()

当执行u.getId()的时候还是不会执行关联对象的sql语句

当执行u.getAddress() ()当获取关联对象里面数据的时候才执行关联对象的sql语句

配置

技术图片

 

 

运行结果

技术图片

 

 

总结

直接加载:

      lazyLoadingEnabled:false

aggressiveLazyLoading:false

侵入式延迟加载:

      lazyLoadingEnabled:true

aggressiveLazyLoading:true

深度延迟加载

      lazyLoadingEnabled:true

aggressiveLazyLoading:false

 

 

以上是关于SQL语句详解——SQL联表查询的主要内容,如果未能解决你的问题,请参考以下文章

mysql语句查询问题

SQL语句批量查询~

SQL查询语句是啥?

用一条SQL(Mysql)语句查询出下表,有2个科目80分以上的人的名字和对应的科目名。

SQL的一些查询语句

SQL语句查询IP段