目录

  • 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】集合运算---内连结相关推荐

  1. mysql基础 Task04:集合运算

    1. 表的加减法 新建表 tbl_product2 ,供后面学习. create table tbl_product2 (product_id char(4) primary key,product_ ...

  2. python基础之集合运算

    博主简介:原互联网大厂tencent员工,网安巨头Venustech员工,阿里云开发社区专家博主,微信公众号java基础笔记优质创作者,csdn优质创作博主,创业者,知识共享者,欢迎关注,点赞,收藏. ...

  3. SQL学习笔记——task4:集合运算与内连结

    文章目录 1. 表的加减法 1.1 什么是表集合运算 1.2 表的加法--UNION 1.3 MYSQL 8.0 不支持交运算INTERSECT 1.4 差集,补集与表的减法 1.5 对称差 2. 连 ...

  4. Task04:集合运算-表的加减法和join等-天池龙珠计划SQL训练营

    4.1表的加减法 4.1.1 什么是集合运算 集合在数学领域表示"各种各样的事物的总和", 在数据库领域表示记录的集合. 具体来说,表.视图和查询的执行结果都是记录的集合, 其中的 ...

  5. MySQL的集合运算

    文章目录 集合运算 1.表的加减法 1.1 什么是集合运算 2.表的加法--union 2.1 UNION 2.2 UNION 和 OR 谓词 2.3 包含重复行的集合运算 UNION ALL 2.4 ...

  6. 本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql;Task4:集合运算-JOIN

    一. 连结(JOIN) 前一节我们学习了 UNION和INTERSECT 等集合运算, 这些集合运算的特征就是以行方向为单位进行操作. 通俗地说, 就是进行这些集合运算时, 会导致记录行数的增减. 使 ...

  7. MySQL教程四——集合运算

    文章目录 一.表的加减法 1. 什么是集合运算? 2. 表的加法--UNION 练习题: 2.2 UNION 与 OR 谓词 练习题 : 2.3 包含重复行的集合运算 UNION ALL 练习题: 2 ...

  8. 阿里云天池龙珠计划SQL训练营Task04:集合运算-表的加减法和join等

    本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql: 4.1表的加减法 4.1.1 ...

  9. Task04:集合运算

    笔记: 一.集合运算 1表的加减法 1.1什么是集合运算 在标准 SQL 中, 分别对检索结果使用 UNION, INTERSECT, EXCEPT 来将检索结果进行并,交和差运算, 像UNION,I ...

最新文章

  1. Datawhale来厦大啦!
  2. 组合计数 ---- 2020 EC final B. Rectangle Flip 2(枚举+组合计数)
  3. YOLO-6D论文的一些相关知识
  4. 第八课.简单的图像分类(二)
  5. window对象方法之setTimeout(),setInterval()
  6. OCP12C题库,63数据库管理( Administration Workshop- 63)(新增)
  7. react native 原生模块桥接的简单说明
  8. UVA 10273 Eat or not to Eat?
  9. Angular NgModule里定义的注解和NgModuleRef$1运行时
  10. java perl5compiler,Java中正则表达式使用方法详解(四)
  11. docker server 容器连接sql_docker 容器连接 host的sql server失败
  12. java 多线程——一个定时调度的例子
  13. codeforces 1221 A B C D
  14. 项目管理学习总结(11)——项目管理怎么做
  15. 大数据系列之Java调用elasticsearch的增删查改聚合
  16. kafka的offset理解
  17. 离散数学-图的运算与基本概念、导出子图、路与连通
  18. 有关爬虫浏览量的问题
  19. Unity程序框架总结归置系列(1)——单例基类
  20. 【mybatis】学习笔记 1配置 搭建 入门案例

热门文章

  1. 编程c语言零基础知识,零基础学习C语言都需要掌握哪些基础知识
  2. 市场调研报告-皮革离型纸市场现状及未来发展趋势
  3. Oracle gc等待事件的发现、处理与预防
  4. 强网杯2018_core
  5. OpenGL中显示背景贴图
  6. 超好用的图标搜索网站
  7. SAR学习笔记-代码部分
  8. android4.4 fragment,在Activity和多个Fragment之间共享资源
  9. centos7 后端部署文档
  10. ORACLE违反协议异常