
“
每天一个测试技术
只需几分钟
川石信息 带你学点更好的


川石信息|腾讯课堂
免费试学 | 性能测试
连 接
合并思想. N个表 --> 1个表
▲ 连接的定义
将2个或2个以上的表通过一定的条件拼接起来形成一个虚表的过程.连接是from子句的一部分.
从2个表的连接开始.
左表: 放置在你左手边的表. left_tab
右表: 放置在你右手边的表. right_tab
▲ 连接语法
select listfrom left_tab join_type right_tabon join_condition;
左右拉动查看完整代码
三种基本类型: 交叉连接,内连接与外连接
交叉连接
返回的就是一个笛卡尔积.
#数学中A = {1,2,3} B = {4,5}AXB = {<1,4>,<1,5>,<2,4>,<2,5>,<3,4>,<3,5>}#数据库中表就是一个集合,每一行就是一个元素A表:a1 a21 11 21 3B表:b1 b22 22 32 4a1 a2 b1 b21 1 2 21 1 2 31 1 2 41 2 2 21 2 2 31 2 2 41 3 2 21 3 2 31 3 2 4left_tab: m rows x colsright_tab: n rows y colsleft_tab*right_tab:m*n rows x+y cols
左右拉动查看完整代码
▲ 交叉连接语法
select listfrom left_tab cross join right_tab;
左右拉动查看完整代码
内连接
在交叉连接的基础上,仅返回满足连接条件的行.
▲ 连接条件
使用on关键字来指定.
on的用法与where类似.
on可以使用连接的所有表中的列值进行判断
#连接条件on A.a2 = B.b2 #tab_name.col_name#交叉连接返回的结果a1 a2 b1 b21 1 2 21 1 2 31 1 2 41 2 2 21 2 2 31 2 2 41 3 2 21 3 2 31 3 2 4#内连接返回的结果a1 a2 b1 b21 2 2 21 3 2 3
左右拉动查看完整代码
▲ 内连接的语法
select listfrom left_tab inner join right_tabon join_condition;
左右拉动查看完整代码
外连接
在内连接的基础上,返回一些额外的行.
▲ 左外连接(左连接)
在内连接的基础上,左表除了返回满足连接条件的行之外,剩下的所有不满足连接条件的行也要一并返回,右表中与之没有匹配的行的列值设置为null
#连接条件on A.a2 = B.b2 #tab_name.col_name#内连接返回的结果a1 a2 b1 b21 2 2 21 3 2 3#左外连接返回的结果a1 a2 b1 b21 2 2 21 3 2 31 1 null null
左右拉动查看完整代码
▲ 右外连接(右连接)
在内连接的基础上,右表除了返回满足连接条件的行之外,剩下的所有不满足连接条件的行也要一并返回,左表中与之没有匹配的行的列值设置为null
#连接条件on A.a2 = B.b2 #tab_name.col_name#内连接返回的结果a1 a2 b1 b21 2 2 21 3 2 3#右外连接返回的结果a1 a2 b1 b21 2 2 21 3 2 3null null 2 4
左右拉动查看完整代码
▲ 外连接语法
select listfrom left_tab left|right outer join right_tabon join_condition;
#查询示例SELECT * FROM a;SELECT * FROM b;SELECT * FROM a CROSS JOIN b;SELECT * FROM a INNER JOIN b ON a.a2 = b.b2;SELECT * FROM a LEFT OUTER JOIN b ON a.a2 = b.b2;SELECT * FROM a RIGHT OUTER JOIN b ON a.a2 = b.b2;
左右拉动查看完整代码
语法:
select listfrom left_tab inner join right_tabon join_conditionwhere search_conditionorder by sort_columns;
#哪些商品被用户购买过?#思路1.确定表数据来源于哪些表中,或需要将哪些表结合起来查询SELECT * FROM ecs_goods;SELECT * FROM ecs_order_goods;2.确定连接条件找出左表与右表中有逻辑关系的列,将两个表中的列值进行比较来描述连接条件3.确定连接类型若仅返回满足连接条件的行则使用内连接;否则使用外连接SELECT DISTINCT ecs_goods.goods_id, ecs_goods.goods_name, ecs_goods.shop_priceFROM ecs_goods INNER JOIN ecs_order_goodsON ecs_goods.goods_id = ecs_order_goods.goods_id;
左右拉动查看完整代码
▲ 表的别名
select list from tab_name alias_name ... #表名 别名select list from tab_name as alias_name ... #表名 AS 别名
左右拉动查看完整代码
注意: 一旦给表设置了别名,则以后只能通过别名引用表中的列.别名会隐藏表名.
SELECT DISTINCT g.goods_id, g.goods_name, g.shop_price#此处不能写成 ecs_goods.goods_idFROM ecs_goods AS g INNER JOIN ecs_order_goods AS ogON g.goods_id = og.goods_id;#此处不能写成 ecs_goods.goods_id
#列出商品表中商品类型编号对应的类型名称SELECT * FROM ecs_goods;SELECT * FROM ecs_goods_types;SELECT g.goods_id,g.goods_name,gt.cat_name,shop_priceFROM ecs_goods AS g INNER JOIN ecs_goods_type AS gtON g.goods_type = gt.cat_id;
左右拉动查看完整代码
▲ join嵌套
可以在一个join中嵌套另外一个join
一般来说,当连接的表的个数N>=3时需要使用嵌套join.
当连接的表的个数为N时,则至少需要N-1个连接条件.
#列出哪些用户购买了哪些商品,每一次购买该商品的花费是多少?SELECT * FROM ecs_users;SELECT * FROM ecs_order_info;SELECT * FROM ecs_order_goods;
SELECT u.user_id,u.user_name,og.order_id,og.goods_name,og.goods_price*og.goods_number amountFROM (ecs_order_goods og INNER JOIN ecs_order_info oiON og.order_id = oi.order_id) INNER JOIN ecs_users uON oi.user_id = u.user_idORDER BY u.user_id,og.order_id;假设有三个表:t1,t2,t3(t1,t2),t3t1,(t2,t3)转换成连接语法的方法:将","改为连接类型,在右表(连接类型后的表)后加上连接的条件select listfrom (t1 inner join t2 on jc1) inner join t3 on jc2;select listfrom t1 inner join (t1 inner join t3 on jc1) on jc2;四个表: t1,t2,t3,t4((t1,t2),t3),t4(t1,t2),(t3,t4)t1,((t2,t3),t4)t1,(t2,(t3,t4))select listfrom ((t1 inner join t2 on jc1) inner join t3 on jc2) inner join t4 on jc3;
#练习1)列出客户信息和订单日期,并按订单日期排序;#FROM_UNIXTIME()2)列出被购买过的商品的商品名称,类型名称与交易价格;3)显示各订单下每个商品与商品类型以及该商品的销售额,按照订单号排序;4)列出被购买过的商品的商品名称,品牌名称与客户信息;5)找出ecshop用户所有的订单信息;
左右拉动查看完整代码
语法:
select listfrom left_tab left|right outer join right_tabon join_condition[where keyword is null] #过滤满足条件的数据,保留不满足条件的数据order by sort_columns;
#哪些商品没有被客户购买过?SELECT * FROM ecs_goods;SELECT * FROM ecs_order_goods;SELECT DISTINCT g.goods_id, g.goods_name, g.shop_price,og.goods_idFROM ecs_goods g LEFT OUTER JOIN ecs_order_goods ogON g.goods_id = og.goods_idWHERE og.goods_id IS NULL;#商品类型表中哪些商品类型没有出现在商品表中SELECT gt.*FROM ecs_goods AS g RIGHT OUTER JOIN ecs_goods_type AS gtON g.goods_type = gt.cat_idWHERE g.goods_type IS NULL;
左右拉动查看完整代码
▲ join嵌套
与内连接中的join嵌套用法类似.
#找出没有购买过诺基亚E66商品的客户信息SELECT * FROM ecs_users;SELECT * FROM ecs_order_info;SELECT * FROM ecs_order_goods;SELECT u.user_id,u.user_name,u.emailFROM (ecs_order_goods og INNER JOIN ecs_order_info oi ONog.order_id = oi.order_id AND og.goods_name = '诺基亚E66') RIGHT OUTER JOIN ecs_usersuON oi.user_id = u.user_idWHERE oi.user_id IS NULL;
#练习7)列出从来没有购买过手机的客户名单;8)所有订单中哪种邮寄方式没有被采用过;9)列出所有商品和各商品相关的所有订单的日期;
左右拉动查看完整代码

今天的内容就学习到这里了,每个工作日小编都会更新一个有关测试的小知识,希望大家多多关注我们,一起来学习喔!
温馨提示:添加老师微信【13691729932】可以获取全套软件测试自学资料!

往期回顾 






