MySQL数据查询语言DQL数据连接语法及实例
连接
合并思想. N个表 --> 1个表
连接的定义
将2个或2个以上的表通过一定的条件拼接起来形成一个虚表的过程。连接是from子句的一部分.
从2个表的连接开始.
左表: 放置在你左手边的表. left_tab
右表: 放置在你右手边的表. right_tab
连接语法 select list from left_tab join_type right_tab on join_condition;1、连接类型
三种基本类型: 交叉连接,内连接与外连接
交叉连接
返回的就是一个笛卡尔积. #数学中 A = {1,2,3} B = {4,5} AXB = {<1,4>,<1,5>,<2,4>,<2,5>,<3,4>,<3,5>} #数据库中 表就是一个集合,每一行就是一个元素 A表: a1 a2 1 1 1 2 1 3 B表: b1 b2 2 2 2 3 2 4 a1 a2 b1 b2 1 1 2 2 1 1 2 3 1 1 2 4 1 2 2 2 1 2 2 3 1 2 2 4 1 3 2 2 1 3 2 3 1 3 2 4 left_tab: m rows x cols right_tab: n rows y cols left_tab*right_tab: m*n rows x+y cols
交叉连接语法 select list from left_tab cross join right_tab;
内连接
在交叉连接的基础上,仅返回满足连接条件的行.
连接条件
1.使用on关键字来指定.
2.on的用法与where类似.
3.on可以使用连接的所有表中的列值进行判断 #连接条件 on A.a2 = B.b2 #tab_name.col_name #交叉连接返回的结果 a1 a2 b1 b2 1 1 2 2 1 1 2 3 1 1 2 4 1 2 2 2 1 2 2 3 1 2 2 4 1 3 2 2 1 3 2 3 1 3 2 4 #内连接返回的结果 a1 a2 b1 b2 1 2 2 2 1 3 2 3
内连接的语法 select list from left_tab inner join right_tab on join_condition;
外连接
在内连接的基础上,返回一些额外的行.
左外连接(左连接)
在内连接的基础上,左表除了返回满足连接条件的行之外,剩下的所有不满足连接条件的行也要一并返回,右表中与之没有匹配的行的列值设置为null #连接条件 on A.a2 = B.b2 #tab_name.col_name #内连接返回的结果 a1 a2 b1 b2 1 2 2 2 1 3 2 3 #左外连接返回的结果 a1 a2 b1 b2 1 2 2 2 1 3 2 3 1 1 null null
右外连接(右连接)
在内连接的基础上,右表除了返回满足连接条件的行之外,剩下的所有不满足连接条件的行也要一并返回,左表中与之没有匹配的行的列值设置为null #连接条件 on A.a2 = B.b2 #tab_name.col_name #内连接返回的结果 a1 a2 b1 b2 1 2 2 2 1 3 2 3 #右外连接返回的结果 a1 a2 b1 b2 1 2 2 2 1 3 2 3 null null 2 4
外连接语法 select list from left_tab left|right outer join right_tab on 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;2、内连接应用
语法: select list from left_tab inner join right_tab on join_condition where search_condition order 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_price FROM ecs_goods INNER JOIN ecs_order_goods ON 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_id FROM ecs_goods AS g INNER JOIN ecs_order_goods AS og ON 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_price FROM ecs_goods AS g INNER JOIN ecs_goods_type AS gt ON 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 amount FROM (ecs_order_goods og INNER JOIN ecs_order_info oi ON og.order_id = oi.order_id) INNER JOIN ecs_users u ON oi.user_id = u.user_id ORDER BY u.user_id,og.order_id; 假设有三个表:t1,t2,t3 (t1,t2),t3 t1,(t2,t3) 转换成连接语法的方法: 将","改为连接类型,在右表(连接类型后的表)后加上连接的条件 select list from (t1 inner join t2 on jc1) inner join t3 on jc2; select list from 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 list from ((t1 inner join t2 on jc1) inner join t3 on jc2) inner join t4 on jc3;3、外连接应用
语法: select list from left_tab left|right outer join right_tab on 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_id FROM ecs_goods g LEFT OUTER JOIN ecs_order_goods og ON g.goods_id = og.goods_id WHERE og.goods_id IS NULL; #商品类型表中哪些商品类型没有出现在商品表中 SELECT gt.* FROM ecs_goods AS g RIGHT OUTER JOIN ecs_goods_type AS gt ON g.goods_type = gt.cat_id WHERE 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.email FROM (ecs_order_goods og INNER JOIN ecs_order_info oi ON og.order_id = oi.order_id AND og.goods_name = "诺基亚E66") RIGHT OUTER JOIN ecs_users u ON oi.user_id = u.user_id WHERE oi.user_id IS NULL;
关于go语言中的协程相关知识点总结(二)接上一篇关于go语言中的协程相关知识点总结(一)继续分享关于go协程之间进行相互通信的机制的知识点关于Channel(通道)通道是go提供的一种通信机制,允许协程间进行数据传输,通
小米集团第三季度总收入达781亿元,境外市场占比52。4小米集团11月23日晚间在港交所公告,2021年第三季度,小米集团总收入达到人民币781亿元,同比增长8。2经调整净利润达到人民币52亿元,同比增长25。4。其中,智能手机业务收入
如何看待知识付费?你愿意付费吗?总的看来知识付费是趋势是进步,还需要不断完善。我只对值的付费。一在线内容付费潮流正在兴起,应破除一些人的双重标准,不能一边嫌自媒体平台稿费太少,一边喷知识付费是忽悠。广义的知识付费
美媒感叹中国疫苗敏捷的接种速度,敏捷如何提升用户的体验?我们来看一下敏捷的开发流程图用户极致的体验需要产品的快速迭代,服务的敏捷反应等,我们梳理了产品运营在做敏捷scrum的核心要点(3355)3个核心角色Scrum的三个核心角色分别是
想买空调,哪个牌子好(柜机挂机都要)?不要买格力,其它牌子都可选三菱电机,三伏天能让你在室内穿棉袄,而且几乎能用一辈子,当然了价格也几乎是国产品牌的二倍,而且三菱定频的比国产变频的都贵,这就看你注重什么了,要质量还是要
为什么你们都放弃了QQ等级?真让人难以琢磨说到现如今的互联网发展,那可谓是日新月异了。尤其是我们的互联网社交,已经发展到移动互联网社交的阶段。像是什么微信QQ之类的,基本上已经在我们的日常生活当中习以为常了。而要说现如今最
(科技)新型人工智能交通信号系统有望减少拥堵新华社北京5月16日电英国阿斯顿大学近日发布的一项研究显示,由该校研发团队开发的一种新型人工智能交通信号系统可通过深度强化自主学习,快速调整交通信号灯的反应,从而减少拥堵。研究公报
盘点一下下周新品发布会周一,5月16日1430,全新荣耀MagicBook14发布会同天,1930,TCL万象星河Q10GMiniLED电视新品发布会。周二,5月17日1900,一加Ace竞速版发布会同
十年老电脑升级改造这台ThinkPadE420是12年初买的,到现在已经陪伴了我十年光景,从买来到现在开机都是贼慢的,一直都想给它来个升级改造,这不最近老婆工作需要使用一段时间,还没开始用就跟我吐槽
未保价的快递不能要求全额赔偿?随着我国交通运输网的建设发展,快递运输从商业交易走进了人们的日常生活。实践中在使用快递公司提供的网上下单服务时,人们往往直接跳过冗长的服务条款,这种便捷迅速的下单方式一方面为人们提
推特到手在即,马斯克为何喊停?美国企业家马斯克5月13日在推特上宣布,暂缓对推特的收购,等待核查这家社交媒体上存在多少垃圾虚假账户。此言一出,推特股价暴跌逾20。此后不久,马斯克又表示仍致力于完成这笔交易,推特