有很多粉丝反应表示没看懂这个?
就专门拉出来讲一下这个多表查询吧
任务描述
查询每位用户的每个订单购买的商品名称和数量。
本关任务要用到用户表account、订单表orders、订单详情表lineitem,商品表product。
其中orders表结构如下:
account表结构如下:
product表结构如下:
Lineitem表结构如下:
测试如下:
一,join on的理解:
这里很多人都不是很理解
首先看题干:查询每位用户的每个订单购买的商品名称和数量。
有一个筛选的操作:
笛卡尔积问题
笛卡尔积问题:把多张表放在一起,同时去查询,会得到一个结果,而这结果并不是我们想要的数据,这个结果称为笛卡尔积。
笛卡尔积的数据,对程序是没有意义的, 我们需要对笛卡尔积中的数据再次进行过滤。
对于多表查询操作,需要过滤出满足条件的数据,需要把多个表进行连接,连接之后需要加上过滤的条件。
他要查询每个订单购买的商品名称和数量,这里我也对上表的英文翻译一下
第一个表意思是:订单表, 关于订单信息这里不详细说明
第二个:账户表(用户表) ,关于用户信息这里不详细说明
第三个:产品表 ,关于产品信息这里不详细说明
第四个:(项目表) 关于项目信息这里不详细说明
语法说明:
内连接查询是最常见的连接查询,内连接查询可以查询两张或两张以上的表
内连接:[inner] join:从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留.
基本语法:左表 [inner] join 右表 on 左表.字段 = 右表.字段;
on表示连接条件: 条件字段就是代表相同的业务含义(如my_student.c_id和my_class.id)当两个表中存在相同意义的字段的时候,就可以通过该字段来连接查询这两个表,当该字段的值相同时就可以查出该记录。
内连接可以没有连接条件: 没有on之后的内容,这个时候系统会保留所有结果。
理解:
首先这里第一行应该看的懂吧,有用户名称,订单购买的商品名称和数量,
这个题目对那些英文不好的有些挑战哈
他lineitem中orderid与orders中orderid一样
account中userid与orderid中userid 一样
product中productid与lineitem中itemid一样
这里我截取了没有筛选的情况
出现这种情况就比较有趣味:
我这里来解释一下
他是把匹配某个条件在所有表中相同结果保留,这样
就有好多好多好多的数据数不清了
就好像你新生报到你去报到然后那个人没有写你是哪个系的人没有写你是哪个班的人这些条件,他就把你当做每个系都有你,每个班都有你,全部都是你
所以on后面就要加条件了确定好系,确定好班级.
####相关知识
为了完成本关任务,你需要掌握:多表查询
语法
SELECT的查询对象由FROM子句指定,其格式为:
FROM 表名1 [ [AS] 别名1 ] [ , 表名2[ [AS] 别名2]] … /查询表/ | JOIN子句 /连接表/ ● 引用单个表的两种方式:
可以用两种方式引用一个表,第一种方式是使用USE语句让一个数据库成为当前数据库,在这种情况下,如果在FROM子句中指定表名,则该表应该属于当前数据库。第二种方式是指定的时候在表名前带上表所属数据库的名字。例如,假设当前数据库是db1,现在要显示数据库db2里的表tb的内容,使用如下语句:
SELECT * FROM db2.tb;
当然,在SELECT关键字后指定列名的时候也可以在列名前带上所属数据库和表的名字,但是一般来说,如果选择的字段在各表中是唯一的,就没有必要去特别指定。