什么是内连接?什么是左连接什么是右连接?什么是组合查询 - Go语言中文社区

什么是内连接?什么是左连接什么是右连接?什么是组合查询


什么是关联关系?

单表查询不能满足要求,通过多表关联实现预期的需求
订单详情表orderdetail中有订单表的订单order_id和商品表的商品items_id,这两个字段称为orderdetail表的外键,他们之间存在关联关系
在这里插入图片描述

为什么会存在关联信息?

订单详情表orderdetail和商品表items为例,为什么要进行分开呢,以商品表为例,因为会存在很多一样的商品,如果每一件这种商品都使用订单表进行存储,那么订单表中存储了多个相同的商品,就要存储每一个商品的值。除此之外,对于如果商品信息发生变化,对于商品表来说,只要进行一次修改就行,如果是存储在订单表上的话,就要将订单表上每一个相同的商品进行修改,修改的内容太多
分表虽然分解数据为多个表能狗有效的存储,方便处理数据,但是也存在一定的代价,在查询预期数据的时候要进行多表关联查询,影响查询效率

订单详情表和商品表
在这里插入图片描述

内连接

查出每个订单详情的商品名称、商品价格,购买数量,购买总价

select items.name,items.items.price,orderdetail.items_num,(items.price*orderdetail.items_num) as sum_price from orderdetail  inner join items on order detail.items_id=items.id

使用了内联的方式进行,其中分别使用了as操作符创建了商品表的别名tm和订单详情表的别名od,并在在各自表中需要查询的字段前面添加了别名,比如tm.name,tm.price,od.items_num,这种好处是表名字段来自那一张表,有些时候不同的表中可能存在重复的字段名,标明字段的出处是一个好的习惯,如果确定某些字段不存在重复的名称,不添加前缀也是可以的,在关联表的时候使用了inner join on进行了关联,表示查询订单表中和商品表中相同的商品信息,select 列名 from 表1 inner join 表2 on 表1.外键=表2.外键,在这个语句的后面再添加其他的查询条件,需要注意的是,内关联表1和表2的时候两张表不需要进行顺序的区分,同时内关联使用on子句关联条件,也可以使用and操作符添加其他条件

外链接

外关联分为左连接和右链接

左连接

左外链接的结果集中包含left
outer指定的左表的所有行,不仅仅是链接列所匹配的,内链接的话查出的数据仅仅是链接匹配的行,左连接的话,如果左表中的某行在右表中没有相匹配的行,但是在结果集中可以看到左表的所有内容,右表中没有相互匹配的话就为空值。

select 列名1,列名2....from 表1 left outer join 表2 on 表1.外键=表2.外键,后面添加where或者是order by子句等等

查询所有用户的订单信息,(用户名称,订单编号,订单创建时间),哪些没有订单的用户也要查询出来,就是说即使user表中的用户在order表中没有数据也要查询出来,此时适合利用左外链接:

先用内链接进行查询 select u.username,o.number,o.createtime from user as u left join orders as o on u.id=o.uer_id

用左连接进行查询 select u.username,o.number,o.createtime from user as u left outer join orders as o  on u.id=o.uer_id

在这里插入图片描述
如执行结果所示,即使没有订单的用户也将会被全部的列举出来,使用null进行填充,这就左连接,左边的表总是显示所有的信息,无论右边的表是否有对应的信息,左连接的时候要注意表之间的顺序,left outer join表2 on

右连接

有链接的作用与左连接相反,右边的表总是显示所有信息,无论左表中是否有信息,表之间的顺序也影响查询结果

select 列名1,列名2,列名3 from 表1 right outer join 表2 on 表1.外键=表2.外键 后面添加where orderby等语句

使用右链接查询出与左连接相同的结果,只是表中的顺序发生了变化

复杂的关联查询
查询每个订单中所购买的商品的详细信息,这个时候设计到了三张表,(每个订单,说明有一张订单总表,里面记录着每一个订单,订单中所购买的商品的详细信息,说明有一个订单详情表,一个订单中可能有多个商品,商品的详细信息,说明有一张表,表中记录了商品的相关信息,一共有三张表:order orderdetail items

查询每个订单中所购买的商品的详细信息
select from (orders as o inner join ordertail as od on o.id=od.order_id)inner join items as tm on od.items_id=tm.id

先通过订单表和订单详情表关联出订单详情的信息,再通过ordertail和items关联处每个订单详情的商品信息,在这条语句中使用了两次inner join on 语句,如果想要知道这个订单哪个用户,还要内连接一张表:

select from( (order as o inner join orderdetail as od on o.id=od.order_id) inner join items as tm on od.items_id=tm.id ) inner join user as u on o.user_id=user.id

在这里插入图片描述
似乎关联查询可以永远的无限关联下去,但是这种方式并不是可取的,因为sql语句太复杂,并且还会造成查询效率低下。应当尽量避免多表的关联查询

子查询

子查询就是嵌套在查询中的查询
基本子查询:

select 列名1,列名2,列名3…from 表名 where 列名 比较运算符 (select 命令)

查询商品价格在平均商品价格之上的所有商品
先查出所有的商品,之后在缩小范围:商品价格在平均商品价格之上
select from items where price > (select avg(price) from items);

多返回值的查询
select username ,address from user where id not in(select user_id from orders);
not in 的用法,指定一组数据,数据可以是数字类型可以是字符串类型,判断是否在这组数据之中

组合查询

组合查询指的是使用union连接的两种查找,组合查询中要求union连接的两个查询包含相同的内容,出现的顺序可以不相同,列的数据类型必须是可以兼容的,但是不需要完全相同

select id ,name,price from items where price<3000 union select id ,name, price from  items where id in (1,2,3) order by price;

通过上面可以看出,使用组合查询的时候还是可以使用where条件子句的,这是将两个查询放在了一起,需要注意的是:使用组合查询的时候,union默认会过滤查询中出现的重复数据,使用union all的时候不会过滤查询中出现的重复信息。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_41174684/article/details/91345387
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢