前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sql 中 join 的复杂示例解读

sql 中 join 的复杂示例解读

作者头像
java达人
发布2018-01-31 16:54:09
1.4K0
发布2018-01-31 16:54:09
举报
文章被收录于专栏:java达人

inner join(等值连接) 只返回两个表中联结字段相等的行

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录

right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录

on 指定表间联结字段及其关系的等号

"=" 表达式, 返回 true 或 false. 当表达式返回 true 时, 则查询中包含该记录.

update (ctarticle as a left join ctclass as c on a.classid = c.classid) left join cttag as b on a.articleid = b.articleid set tag=tag+' ', b.articleid=a.articleid, b.classid=a.classid, b.nclassid=a.nclassid where a.classid=23 and a.nclassid=0 and tagid is not null update (ctarticle as a left join (ctnclass as c left join ctclass as d on c.classid = d.classid) on a.nclassid = c.nclassid and a.classid = c.classid) left join cttag as b on a.articleid = b.articleid set tag=d.class+' '+c.nclass, b.articleid=a.articleid, b.classid=a.classid, b.nclassid=a.nclassid where a.classid=23 and a.nclassid=197; 更新操作 左连接中数据的筛选 insert into cttag(articleid,classid,nclassid) select a.articleid,a.classid,a.nclassid from ctarticle a left join cttag b on a.articleid=b.articleid where b.articleid is null //本语句功能为, 显示主表的全部内容, 插入数据到副表中没有的数据 //主要作用为: 让数据减少冗余 上例中的延续 select a.*, b.*, c.*, d.* from cttag as d left join ((ctarticle as a left join ctclass as b on a.classid=b.classid) left join ctnclass as c on a.nclassid=c.nclassid) on d.articleid=a.articleid; 显示文章表中的全部, 调用类别表中的栏目 select a.*, b.*, c.* from (ctarticle a left join ctclass b on a.classid=b.classid) left join ctnclass c on a.nclassid=c.nclassid //作用, 有时在文章表中包含了在个别类别表中没有的数据, 用这个语法可以读出文章表的全部数据 //a 为 文章表, b 为主类别, c 为子类别 同上例, 选择追加数据时加上空格 insert into cttag(articleid,classid,nclassid,tag) select a.articleid,a.classid,a.nclassid,d.class+' '+c.nclass from (ctarticle as a left join (ctnclass c left join ctclass d on c.classid=d.classid) on a.classid=c.classid and a.nclassid=c.nclassid) left join cttag as b on a.articleid = b.articleid where a.classid=4 and a.nclassid=154; 连接n个表, 并追加数据到其中一个表, n=4 insert into cttag(articleid,classid,nclassid,tag) select a.articleid,a.classid,a.nclassid,d.class+c.nclass from (ctarticle as a left join (ctnclass c left join ctclass d on c.classid=d.classid) on a.classid=c.classid and a.nclassid=c.nclassid) left join cttag as b on a.articleid = b.articleid where a.classid=1 and a.nclassid=1; //解读 插入到 表2(栏1,栏2,栏3,栏4) 选择 别名a.栏1, 别名a.栏2, 别名a.栏3, 别名d.栏4 加上 别名c.栏5 从 (表1 别名a 左连接 (表3 别名c 左连接 表4 别名d 在 别名c.栏2 等于 别名d.栏2) 在 别名a.栏2 等于 别名c.栏2 和 别名a.栏3=别名c.栏3) 左连接 表2 别名b 在 别名a.栏1 等于 别名b.栏1 在那里 别名a.栏2=1 和 别名a.栏3=1 连接两个表, 并追加数据到其中一个表 insert into cttag(articleid,classid,nclassid) select a.articleid,a.classid,a.nclassid from ctarticle as a left join cttag as b on a.articleid = b.articleid where a.classid=1 and a.nclassid=1; //解读 插入到 表2(栏1,栏2,栏3) 选择 别名a.栏1, 别名a.栏2, 别名a.栏3 从 表1 别名a 左连接 表2 别名b 在 别名a.栏1 等于 别名b.栏1 在那里 别名a.栏4=1 和 别名a.栏5=1 左连接 同步两表的数据 update ctarticle a inner join cttag b on a.articleid = b.articleid set b.classid=a.classid, b.nclassid=a.nclassid; //解读 更新 表1 别名a 联接 表2 别名2 在 别名a.栏1 等于 别名b.栏1 设置 别名b.栏2 更新为 别名a.栏2, 别名b.栏3 更新为 别名a.栏3 右外连接 select a.*, b.* from bunclass a right join ctclass b on a.classid=b.classid where a.nclassid=20 查询别名 a,b 表, 只匹配 b 表中的内容. 添加数据到连接表之一 insert into cttag ( tag, articleid ) select top 1 b.tag, a.articleid from ctarticle as a left join cttag as b on a.articleid = b.articleid where a.articleid order by a.articleid desc; 变通中的用法二 insert into bureply select b.*, a.classid, a.nclassid from article as a inner join reply as b on a.articleid = b.articleid where classid=50; 实际应用中的变通 insert into butag ( tag, articleid, classid, nclassid) select b.tag, a.articleid, a.classid, a.nclassid from article as a inner join tag as b on a.articleid = b.articleid where classid=24; 添加数据到其他表 insert into butag ( tag, articleid ) select b.tag, a.articleid from article as a inner join tag as b on a.articleid = b.articleid where a.articleid<>false; //解读 添加到 接收表(列1,列2) 选择 别名b.列1, 别名a.列2 从 表1 表名a 联接 表2 表名b 在 别名a.列c 等于 别名b.列c 在哪里 别名a.列c 不等于 没有 实际应用中的变通 select b.tag, a.articleid, a.classid, a.nclassid from article as a inner join tag as b on a.articleid = b.articleid where a.classid=24; 查询 select b.tag, a.articleid from article as a inner join tag as b on a.articleid = b.articleid where a.articleid<>false; //解读 选择 别名b.列, 别名a.列 从 表1 别名a 联接 表2 别名b 在 别名a.列c = 别名b.列c 在哪里 别名a.列c 不等于 没有 注: as 不是必要

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java达人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档