SQL必知必会 - 创建表的联结
目录
一、不同类型的联结
1 外联结
2 内联结
二、用union联结
三、用where创建联结
1 用where简单联结
2 用where and的结合
四、 创建高级联结(用AS设置表别名)
inner join:2表值都存在
outer join:附表中值可能存在null的情况。
①A inner join B:取交集
②A left join B:取A全部,B没有对应的值,则为null
③A right join B:取B全部,A没有对应的值,则为null
④A full outer join B:取并集,彼此没有对应的值为null
上述4种的对应条件,在on后填写。
一、不同类型的联结
1 外联结
- 用于联结没有关联的表。LEFT和RIGHT表示要联结的表,位于from表的左边还是右边
- 外联结会设置主表,主表即以该表的数据为主,作为整体的主键。
外联结类型 | 语句 | 补充说明 |
---|---|---|
右外联结 | RIGHT OUTER JOIN | 右边的表 b 是主表,把右边关系中要舍弃的元组保留 |
左外联结 | a LEFT OUTER JOIN b |
以左边表a的列为主,取两列的交集, 对于不在右边列存在的取null |
全外联结 | FULL OUTER JOIN | 检索所有行(包含两个表的不关联的行),把两个关系中要舍弃的元组保留 |
e.g1. 用左外联结,检索出所有顾客的顾客id和订单编号,包括没有订单的顾客
SELECT customers.cust_id,orders.order_numFROM customers
LEFT OUTER JOIN orders ON customers.cust_id = orders.id;
2 内联结
形式:
- 即等值联结,是基于两个表的相等测试。等价于 JOIN
- inner join只会对非null值作join,并且两边都有才会匹配上
- 等值语法 INNER JOIN...ON 取两个表的交集,理解图如下:
e.g1. 上述同一个例子,用 INNER JOIN...ON来表述
SELECT vend_name,prod_name,prod_priceFROM vendors
INNER JOIN productsON vendors.vend_id = products.vend_id;
e.g2. 返回prod_id 为BR01 产品的所有顾客的电子邮件(Customers 表中的 cust_email)最内层的从 OrderItems 表返回 order_num,中间的从 Customers 表返回 cust_id。
select cust_email
from Orders
inner join OrderItems on Orders.order_num=OrderItems.order_num
inner join Customers on Orders.cust_id=Customers.cust_id
where prod_id='BR01'
【示例结果】返回顾客email cust_email
e.g3. 【同表数据源的内联结】可以只写join
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| recordDate | date |
| temperature | int |
+---------------+---------+
查找与之前(昨天的)日期相比温度更高的所有日期的 id 。
SELECTweather.id AS id
FROMweatherJOINweather w ON DATEDIFF(weather.recordDate, w.recordDate) = 1AND weather.Temperature > w.Temperature;
二、用union联结
- 用来合并两条sql的结果集
- union--连接表,对行操作。join---连接表,对列操作
- union--将两个表做行拼接,同时自动删除重复的行。
- union all---将两个表做行拼接,保留重复的行。
e.g1. 表OrderItems包含字段prod_id代表产品id、quantity代表产品数量。将两个 SELECT 语句结合。一个 SELECT 语句过滤数量为100的行,另一个过滤 id 以BNBG开头的产品
select prod_id,quantity
from OrderItems
where prod_id like 'BNBG%'
union
select prod_id,quantity
from OrderItems
where quantity=100;
e.g2. 从user_profile表中分别查看学校为山东大学或者性别为女性用户的device_id、gender、age和gpa数据,结果不去重
select device_id, gender, age, gpa
from user_profile
where university='山东大学'union allselect device_id, gender, age, gpa
from user_profile
where gender='male';
三、用where创建联结
1 用where简单联结
表现形式
指定要联结的所有表、联结它们的方式
e.g.输出vendors表中的经销商名称,products表中的商品名称和商品价格,其中两个表的关联是 经销商id是对应的
SELECT vend_name,prod_name,prod_price
FROM vendors,products
WHERE vendors.vend_id = products.vend_id;
注意要点
- 多个表被引用时,需要使用完全列名 (用点隔开表名&列名)
- 直接在from后面加上引用的多个表名
- 作为过滤条件,将多个表中的行对应匹配
- 要保证所有的联结,都有where子句
2 用where and的结合
① 自然联结
- 作用:排除同个列多次返回出现,使每列都只返回一次
- 即只选择那些唯一的列 → 只对一个表使用通配符 * → 其他表作为子集,用明确的限定列名
e.g. 选择出customers表中购买了RGAN01产品的顾客的所有信息,以及orders表的订单编号和订单日期,orderitems表的item_price,联结关系是c表和o表的顾客id对应一致,oi表和o表的订单编号对应一致
SELECT c.*, o.order_num, o.order_date, oi.item_price
FROM customers AS c, orders AS o, orderitems AS oi
WHERE c.cust_id = o.cust_id AND oi.order_num = o.order_numAND prod_name = 'RGAN01';
② 联结多个表
- 列出待联结的所有表 → 定义各个表的关系条件 → 用where和and联结各个条件
- 可联结的表一般不限制数目
e.g1. 从orderitems,products,vendors表中,输出订单号为20007的产品名称,经销商名称,产品价格和数量。其中的限定条件是products和vendors表的经销商id一致,orderitems和products表的产品id一致
SELECT prod_name,vend_name,prod_price,quantity
FROM orderitems,products,vendors
WHERE products.vend_id = vendors.vend_id,AND orderitems.prod_id = products.vend_idAND order_num ='20007';
e.g2. 从customers表中返回 购买了产品RGAN01的顾客的姓名和联系方式,其中customers表和orders表的关联是顾客id对应,orderitems和orders的订单编号对应
SELECT cust_name,cust_contact
FROM customers,orders,orderitems
WHERE customers.cust_id = orders.cust_idAND orderitems.order_num = orders.order_numAND prod_name = 'RGAN01';
e.g.3 给和jim jones同公司的顾客发邮件(先找出Jim Jones的公司 → 找出公司的所有顾客)表为customers,列为顾客id,顾客姓名和顾客的联系方式。
--联结的语句
SELECT c1.cust_id,c1.cust_name,c2.cust_contact
FROM customers AS c1,customers AS c2
WHERE c1.cust_name = c2.cust_nameAND c2.cust_contact = 'jim jones';--子查询语句
SELECT cust_id,cust_name,custt_contact
FROM customers
WHERE cust_name = (SELECT cust_nameFROM customersWHERE cust_contact = 'jim jones');
四、 创建高级联结(用AS设置表别名)
- 作用:缩短语句;允许一条select语句中多次引用同一张表
- 注:表别名只在查询执行中使用,不会返回到客户端
e.g. 以同样的例子为例 从customers表中返回 购买了产品RGAN01的顾客的姓名和联系方式,其中customers表和orders表的关联是顾客id对应,orderitems和orders的订单编号对应
SELECT cust_name,cust_contact
FROM customers AS C, orders AS O, orderitems AS OI
WHERE C.cust_id = O.cust_idAND OI.order_num = O.order_numAND prod_name = 'RGAN01';
SQL必知必会 - 创建表的联结相关推荐
- 《SQL必知必会》第十三课 创建高级联结表 使用不同类型的联结 使用带聚集函数的联结 使用联结时应注意的问题
第十三课 创建高级联结表 #使用表别名的原因 #不同的联结类型以及每类联结所使用的语法 #如何与联结一起使用聚集函数 #使用联结时的注意问题 一.使用表别名 [1]前面(第七课)介绍使用别名引用被检索 ...
- mysql日期维表sql文件_《MySQL必知必会》笔记(SQL练习+建表语句)
站在巨人的肩上 Standing On Shoulders Of Giants 部分转自:https://www.jianshu.com/p/294502893128 https://blog.csd ...
- 1.《SQL必知必会》第五版 附录A样例表的添加
mysql+workbench的初步使用 一.安装mysql+workbench 二.导入附录A的样例表 最近工作需要学习SQL,查阅了相关知识购买了图书<SQL必知必会>第五版.这本书没 ...
- asp sql ip地址排序_SQL必知必会读书笔记,30分钟入门SQL!
点击上方SQL数据库开发,关注获取SQL视频教程 SQL专栏 SQL数据库基础知识汇总 SQL数据库高级知识汇总 来源:https://segmentfault.com/p/1210000011760 ...
- GitHub#SQL#:SQL必知必会
https://github.com/CyC2018/Interview-Notebook 一.基础 二.创建表 三.修改表 四.插入 五.更新 六.删除 七.查询 八.排序 九.过滤 十.通配符 十 ...
- sql必知必会的数据初始化
之前已经配置好mysql的工作环境,但是还缺少可以进行操作的文件,即缺少对应的一个数据库和其中的5个表. 下载相关代码 在网址http://www.forta.com/books/0672325675 ...
- 《MySQL必知必会》SQL文件
<MySQL必知必会>SQL文件: 表的创建和外键绑定: # 在Mysql中取消外键约束 SET FOREIGN_KEY_CHECKS=0; DROP TABLE customers; D ...
- SQL Server必知必会
SQL Server必知必会 2009-10-27-17:57:57 Structure Query Language:SQL 结构化 查询 语言 数据库产品: ...
- MySQL必知必会——第十五章联结表
联结表 本章将介绍什么是联结,为什么要使用联结,如何编写使用联结的SELECT语句. 联结 SQL最强大的功能之一就是能在数据检索查询的执行中联结(join)表. 在能够有效地使用联结前,必须了解关系 ...
- 【SQL必知必会笔记(3)】SELECT语句的WHERE子句数据过滤操作
上个笔记主要介绍了利用SELECT语句检索单个/多个/所有列,并利用DISTINCT关键字检索具有唯一性的值.利用LIMIT/OFFSET子句限制结果:以及利用ORDER BY子句排序检索出的数据,主 ...
最新文章
- 不想CRUD干到老,就来看看这篇OOM排查的实战案例!
- Facebook最新Libra币开发指南---接口服务器开发2
- Swift编程语言学习2.1——基础运营商(在)
- 新手赛(2) 第五题 因素和问题
- Spark集群无法停止的原因分析和解决
- 手动触发事件_HBase中MemStore的刷写触发机制
- 管道|符与xargs命令
- Fedora14硬盘安装
- QT 调用OCX控件
- 如何将360浏览器兼容IE8、IE7
- JAVA办公管理系统(OA)
- 这款神器,不仅仅解决你的证件照需求
- 数组之entries
- services.msc 无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动
- Intel汇编-无符号整数的乘法操作
- 高德地图 定位 设置文本
- 启动模式,BOOT0和BOOT1详解
- 6.3 Annihilating Polynomials
- centos7—DNS域名系统
- Kong(二)通过案例快速了解使用
热门文章
- NASA准备在2021年推出最大望远镜!哈佛用棉花糖机造“肉”?
- 2022java:eclipse编译器下载与配置详细
- cef异常处理_cef2623程序在xp下无法启动 出现c06d007f异常的解决方法
- 动视暴雪宣布裁员约8% 780多名员工将被裁-千氪
- 详解C盘Windows文件夹里重要文件的作用
- 15种顶级分析思维模型。
- php对plc的TCP通信,西门子1200PLC进行TCP通讯配置详解
- markdown支持的脑图工具
- ultraISO如何把ISO镜像文件加载虚拟光驱
- ASR6601牛羊定位器芯片GPS国内首颗支持LoRa的LPWAN SoC