【task09】集合运算---内连结
目录
- 1.1内连接
- 1.1.1使用内连接使两个表获取信息
- 1.1.2结合where子句使用内连接
- 1.1.3结合group by 子句使用内连接
- 1.1.4自连结
- 1.1.5内连结与关联子查询
- 1.1.6自然连结
- 1.1.7使用连结求交集
1.1内连接
内连结的语法格式是:
-- 内连结
FROM <tb_1> INNER JOIN <tb_2> ON <condition(s)>
1.1.1使用内连接使两个表获取信息
用到的两张表
①product
②shopproduct
隐士内连结的代码如下:
select p.product_id,shop_id,shop_name,product_name,product_type,sale_price,quantity
from product p,shopproduct s
where p.product_id = s.product_id;
显式自连结的代码如下:
select p.product_id,shop_id,shop_name,product_name,product_type,sale_price,quantity
from product p
inner join shopproduct s
on p.product_id = s.product_id;
得到的结果如下:
注:运行时遇到的错误
列’product_id’在字段列表中重复,其实就是两张表有相同的字段,但是使用时表字段的名称前没有加表名,导致指代不明。
关于内连结,需要注意以下三点:
要点一: 进行连结时需要在 FROM 子句中使用多张表.
要点二:必须使用 ON 子句来指定连结条件.
要点三: SELECT 子句中的列最好按照 表名.列名 的格式来使用.
1.1.2结合where子句使用内连接
如果需要在使用内连结的时候同时使用 WHERE 子句对检索结果进行筛选, 则需要把 WHERE 子句写在 ON 子句的后边.
例如, 对于上述查询问题, 我们可以在前一步查询的基础上, 增加 WHERE 条件.
增加 WHERE 子句的方式有好几种,我们先从最简单的说起.
第一种增加 WEHRE 子句的方式, 就是把上述查询作为子查询, 用括号封装起来, 然后在外层查询增加筛选条件
SELECT *FROM (-- 第一步查询的结果SELECT SP.shop_id,SP.shop_name,SP.product_id,P.product_name,P.product_type,P.sale_price,SP.quantityFROM ShopProduct AS SPINNER JOIN Product AS PON SP.product_id = P.product_id) AS STEP1WHERE shop_name = '东京'AND product_type = '衣服' ;
但实际上, 如果我们熟知 WHERE 子句将在 FROM 子句之后执行, 也就是说, 在做完 INNER JOIN … ON 得到一个新表后, 才会执行 WHERE 子句, 那么就得到标准的写法:
select s.shop_id,s.shop_name,s.product_id,p.product_name,p.product_type,p.sale_price,s.quantity
from shopproduct as s inner join product as p on s.product_id=p.product_id where s.shop_name = '京东' and p.product_name = '衣服';
我们首先给出上述查询的执行顺序:
FROM 子句->WHERE 子句->SELECT 子句
也就是说, 两张表是先按照连结列进行了连结, 得到了一张新表, 然后 WHERE 子句对这张新表的行按照两个条件进行了筛选, 最后, SELECT 子句选出了那些我们需要的列.
此外, 一种不是很常见的做法是,还可以将 WHERE 子句中的条件直接添加在 ON 子句中, 这时候 ON 子句后最好用括号将连结条件和筛选条件括起来.
SELECT SP.shop_id,SP.shop_name,SP.product_id,P.product_name,P.product_type,P.sale_price,SP.quantityFROM ShopProduct AS SPINNER JOIN Product AS PON (SP.product_id = P.product_idAND SP.shop_name = '东京'AND P.product_type = '衣服') ;
但上述这种把筛选条件和连结条件都放在 ON 子句的写法, 不是太容易阅读, 不建议大家使用. 另外, 先连结再筛选的标准写法的执行顺序是, 两张完整的表做了连结之后再做筛选,如果要连结多张表, 或者需要做的筛选比较复杂时, 在写 SQL 查询时会感觉比较吃力. 在结合 WHERE 子句使用内连结的时候, 我们也可以更改任务顺序, 并采用任务分解的方法,先分别在两个表使用 WHERE 进行筛选,然后把上述两个子查询连结起来.
SELECT SP.shop_id,SP.shop_name,SP.product_id,P.product_name,P.product_type,P.sale_price,SP.quantityFROM (-- 子查询 1:从 ShopProduct 表筛选出东京商店的信息SELECT *FROM ShopProductWHERE shop_name = '东京' ) AS SPINNER JOIN -- 子查询 2:从 Product 表筛选出衣服类商品的信息(SELECT *FROM ProductWHERE product_type = '衣服') AS PON SP.product_id = P.product_id;
练习题:
找出每个商店里的衣服类商品的名称及价格等信息. 希望得到如下结果:
-- 参考答案 1--不使用子查询
SELECT SP.shop_id,SP.shop_name,SP.product_id ,P.product_name, P.product_type, P.purchase_priceFROM shopproduct AS SP INNER JOIN Product AS P ON SP.product_id = P.product_idWHERE P.product_type = '衣服';
-- 参考答案 2--使用子查询
SELECT SP.shop_id, SP.shop_name, SP.product_id,P.product_name, P.product_type, P.purchase_priceFROM shopproduct AS SP
INNER JOIN --从 Product 表找出衣服类商品的信息(SELECT product_id, product_name, product_type, purchase_priceFROM Product WHERE product_type = '衣服')AS P ON SP.product_id = P.product_id;
练习题:
分别使用连结两个子查询和不使用子查询的方式, 找出东京商店里, 售价低于 2000 的商品信息,希望得到如下结果.
1.连接两个子查询
select s.shop_name,s.shop_id,s.quantity,p.product_id,p.product_name,p.product_type,p.sale_price
from (
select *
from product
where sale_price<2000) as p
inner join
(select *
from shopproduct
where shop_name = '京东') as s
on s.product_id = p.product_id;
2.不使用子查询
select s.shop_name,s.shop_id,s.quantity,p.product_id,p.product_name,p.product_type,p.sale_price
from product as p inner join shopproduct as s on s.product_id = p.product_id
where p.sale_price <2000 and s.shop_name = '京东';
1.1.3结合group by 子句使用内连接
结合 GROUP BY 子句使用内连结, 需要根据分组列位于哪个表区别对待.
最简单的情形, 是在内连结之前就使用 GROUP BY 子句.
但是如果分组列和被聚合的列不在同一张表, 且二者都未被用于连结两张表, 则只能先连结, 再聚合.
练习题:
每个商店中, 售价最高的商品的售价分别是多少?
SELECT SP.shop_id,SP.shop_name,MAX(P.sale_price) AS max_priceFROMshopproduct AS SPINNER JOINproduct AS PON SP.product_id = P.product_idGROUP BY SP.shop_id,SP.shop_name
1.1.4自连结
之前的内连结, 连结的都是不一样的两个表. 但实际上一张表也可以与自身作连结, 这种连接称之为自连结. 需要注意, 自连结并不是区分于内连结和外连结的第三种连结, 自连结可以是外连结也可以是内连结, 它是不同于内连结外连结的另一个连结的分类方法.
1.1.5内连结与关联子查询
找出每个商品种类中售价高于高于该类商品平均的售价的商品
SELECT product_type, product_name, sale_priceFROM product AS P1WHERE sale_price > (SELECT AVG(sale_price)FROM product AS P2WHERE P1.product_type = P2.product_typeGROUP BY product_type);
使用内连结同样可以解决这个问题: 首先, 使用 GROUP BY 按商品类别分类计算每类商品的平均价格.
SELECT product_type,AVG(sale_price) AS avg_price FROM Product GROUP BY product_type;
使用内连结的
SELECT P1.product_id,P1.product_name,P1.product_type,P1.sale_price,P2.avg_priceFROM Product AS P1INNER JOIN (SELECT product_type,AVG(sale_price) AS avg_price FROM Product GROUP BY product_type) AS P2 ON P1.product_type = P2.product_typeWHERE P1.sale_price > P2.avg_price;
1.1.6自然连结
自然连结并不是区别于内连结和外连结的第三种连结, 它其实是内连结的一种特例–当两个表进行自然连结时, 会按照两个表中都包含的列名来进行等值内连结, 此时无需使用 ON 来指定连接条件.
select * from shopproductnatural joinproduct
上述查询得到的结果, 会把两个表的公共列(这里是 product_id, 可以有多个公共列)放在第一列, 然后按照两个表的顺序和表中列的顺序, 将两个表中的其他列都罗列出来.
练习题:
试写出与上述自然连结等价的内连结.
select p.product_id,s.shop_id,s.shop_name,s.quantity,p.product_name,p.product_type,p.sale_price,p.purchase_price,p.regist_datefrom product as pinner join shopproduct as son p.product_id = s.product_id;
使用自然连结还可以求出两张表或子查询的公共部分, 例如教材中 7-1 选取表中公共部分–INTERSECT 一节中的问题: 求表 Product 和表 Product2 中的公共部分, 也可以用自然连结来实现:
SELECT * FROM product NATURAL JOIN productins
如果我们将查询语句进行修改:
select *
from(select product_id,product_name,product_type from product) as a
natural join(select product_id,product_name,product_type from productins) as b
1.1.7使用连结求交集
练习题:
使用内连结求 Product 表和 Product2 表的交集.
SELECT P1.*FROM Product AS P1INNER JOIN Product2 AS P2ON (P1.product_id = P2.product_idAND P1.product_name = P2.product_nameAND P1.product_type = P2.product_typeAND P1.sale_price = P2.sale_priceAND P1.regist_date = P2.regist_date)
如果我们仅仅用 product_id 来进行连结:
SELECT P1.*FROM Product AS P1INNER JOIN Product2 AS P2ON P1.product_id = P2.product_id
这样结果就一致了
【task09】集合运算---内连结相关推荐
- mysql基础 Task04:集合运算
1. 表的加减法 新建表 tbl_product2 ,供后面学习. create table tbl_product2 (product_id char(4) primary key,product_ ...
- python基础之集合运算
博主简介:原互联网大厂tencent员工,网安巨头Venustech员工,阿里云开发社区专家博主,微信公众号java基础笔记优质创作者,csdn优质创作博主,创业者,知识共享者,欢迎关注,点赞,收藏. ...
- SQL学习笔记——task4:集合运算与内连结
文章目录 1. 表的加减法 1.1 什么是表集合运算 1.2 表的加法--UNION 1.3 MYSQL 8.0 不支持交运算INTERSECT 1.4 差集,补集与表的减法 1.5 对称差 2. 连 ...
- Task04:集合运算-表的加减法和join等-天池龙珠计划SQL训练营
4.1表的加减法 4.1.1 什么是集合运算 集合在数学领域表示"各种各样的事物的总和", 在数据库领域表示记录的集合. 具体来说,表.视图和查询的执行结果都是记录的集合, 其中的 ...
- MySQL的集合运算
文章目录 集合运算 1.表的加减法 1.1 什么是集合运算 2.表的加法--union 2.1 UNION 2.2 UNION 和 OR 谓词 2.3 包含重复行的集合运算 UNION ALL 2.4 ...
- 本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql;Task4:集合运算-JOIN
一. 连结(JOIN) 前一节我们学习了 UNION和INTERSECT 等集合运算, 这些集合运算的特征就是以行方向为单位进行操作. 通俗地说, 就是进行这些集合运算时, 会导致记录行数的增减. 使 ...
- MySQL教程四——集合运算
文章目录 一.表的加减法 1. 什么是集合运算? 2. 表的加法--UNION 练习题: 2.2 UNION 与 OR 谓词 练习题 : 2.3 包含重复行的集合运算 UNION ALL 练习题: 2 ...
- 阿里云天池龙珠计划SQL训练营Task04:集合运算-表的加减法和join等
本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql: 4.1表的加减法 4.1.1 ...
- Task04:集合运算
笔记: 一.集合运算 1表的加减法 1.1什么是集合运算 在标准 SQL 中, 分别对检索结果使用 UNION, INTERSECT, EXCEPT 来将检索结果进行并,交和差运算, 像UNION,I ...
最新文章
- Datawhale来厦大啦!
- 组合计数 ---- 2020 EC final B. Rectangle Flip 2(枚举+组合计数)
- YOLO-6D论文的一些相关知识
- 第八课.简单的图像分类(二)
- window对象方法之setTimeout(),setInterval()
- OCP12C题库,63数据库管理( Administration Workshop- 63)(新增)
- react native 原生模块桥接的简单说明
- UVA 10273 Eat or not to Eat?
- Angular NgModule里定义的注解和NgModuleRef$1运行时
- java perl5compiler,Java中正则表达式使用方法详解(四)
- docker server 容器连接sql_docker 容器连接 host的sql server失败
- java 多线程——一个定时调度的例子
- codeforces 1221 A B C D
- 项目管理学习总结(11)——项目管理怎么做
- 大数据系列之Java调用elasticsearch的增删查改聚合
- kafka的offset理解
- 离散数学-图的运算与基本概念、导出子图、路与连通
- 有关爬虫浏览量的问题
- Unity程序框架总结归置系列(1)——单例基类
- 【mybatis】学习笔记 1配置 搭建 入门案例