avatar

一条在知识海洋的咸鱼

这个家伙很懒,啥也没有留下😋

  • 首页
  • Linux
  • OCJP
  • Java核心技术卷
  • J2EE相关标准
  • 深入理解Java虚拟机
  • NIO与SOcket编程技术指南
  • Java多线程编程核心技术
  • Redis开发与运维
  • Spring Cloud Alibaba 微服务原理与实践
  • DevOps
  • Docker
  • MySQL必知必会
  • AI自学路线
  • Spring Boot 编程思想(核心篇)
主页 第十六章 创建高级联结
文章

第十六章 创建高级联结

发表于 2021-06-30 更新于 2026-06- 10
作者 Administrator
12~15 分钟 阅读

对被联结的表使用别名和聚集函数

  • 使用表别名
    • 注意
  • 使用不同类型的联结
    • 自联结
      • 用自联结而不用子查询
    • 自然联结
    • 外部联结 LEFT (OUTER) JOIN
      • LEFT RIGHT
      • 注意
  • 使用带聚集函数的联结
  • 使用联结和联结条件

使用表别名

  • 使用CONTACT联合搜索组合列并且起别名
SELECT
	CONCAT( RTRIM( vend_name ), "(", RTRIM( vend_country ), ")" ) AS vend_title 
FROM
	vendors 
ORDER BY
	vend_name;

image.png
除此之外,MySQL允许给表起别名,其有2个理由:
1.缩短SQL语句
2.允许在单条SELECT语句中多次使用相同的表

SELECT
	cust_name,
	cust_contact 
FROM
	customers AS c,
	orders AS o,
	orderitems AS oi 
WHERE
	c.cust_id = o.cust_id 
	AND oi.order_num = o.order_num 
	AND prod_id = "TNT2";

image.png

注意

表别名不仅能用于WHERE子句,还可以用于SELECT的列表、ORDER BY子句以及语句的其他部分。
表别名只能在查询执行中使用。

使用不同类型的联结

除了内联结还有自联结、自然联结和外部联结3种联结

自联结

自联结可以代替SELECT子查询

  • 例
    通过查询某个商品获得其制造商,再查询其制造商ID获得该制造商所制造的所有产品
    1.通过SELECT子查询
SELECT
	prod_id,
	prod_name 
FROM
	products 
WHERE
	vend_id =(
	SELECT
		vend_id 
	FROM
		products 
	WHERE
	prod_id = "DTNTR" 
	);

image.png
2.使用自联结查询

SELECT
	p1.prod_id,
	p1.prod_name 
FROM
	products AS p1,
	products AS p2 
WHERE
	p1.vend_id = p2.vend_id 
	AND p2.prod_id = "DTNTR";

注意因为是查询vend_id所以,WHERE的条件有VEND_ID

用自联结而不用子查询

自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句,其处理速度往往比处理子查询快得多。

自然联结

自然联结排除多次出现,使每个列只返回一次,一般是通过SELECT *,对所有其他表的列使用明确的子集来完成的

SELECT
	c.*,
	o.order_num,
	o.order_date,
	oi.prod_id,
	oi.quantity,
	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_num 
	AND prod_id = "FB";

通配符支队第一个表使用,其他列明确给出,所以没有重复的列被检索出来
image.png
事实上,迄今为止我们建立的每个内部联结都是自然联结,也基本不会用到不是自然联结的内部联结

外部联结 LEFT (OUTER) JOIN

将表中的行与另一个表中的行相关联,包含哪些没有关联的行,称为外部联结

  • 例
    检索所有客户订单信息,包含没有订单的客户
SELECT
	customers.cust_id,
	orders.order_num 
FROM
	customers
	LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id;

其中outer可以不写,即简写为LEFT JOIN
image.png

LEFT RIGHT

在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字指定包括其所有行的表
LEFT表示左边表中所有的行,RIGHT表示有表的表中选择所有的行
左外部联结和右外部联结其唯一差别时所关联的表的顺序不同,左外部联结可通过颠倒FROM或WHERE子句中表的顺序转换为右外部联结。具体使用哪种联结纯粹是根据个人喜好和方便而定

注意

MySQL不支持简化字符*=和=*的使用,虽然这2种操作符在其他DBMS种很流行

使用带聚集函数的联结

聚集函数用来汇总数据,其也可以与联结一起使用。

  • 例
SELECT
	customers.cust_name,
	customers.cust_id,
	COUNT( orders.order_num ) AS num_ord 
FROM
	customers
	INNER JOIN orders ON customers.cust_id = orders.cust_id 
GROUP BY
	customers.cust_id;

image.png

使用联结和联结条件

  • 一般使用内部联结,但使用外部联结也是有效的
  • 保证正确的联结条件,否则将返回不正确的数据
  • 提供联结条件,否则会返回笛卡尔乘积
  • 联结中可以包含多个表,对于每个联结也可以采用不同的联结类型。但应该在联结一起时注意分别测试每个联结,方便排出故障
MySQL必知必会
SQL
许可协议: 
分享

相关文章

7月 6, 2021

第二十九章 数据库维护

7月 6, 2021

第二十八章 安全管理

确保数据的安全和完整需要利用访问控制访问控制root账户不要使用root管理用户创建用户账号简单创建一个新用户账号使用GRANT或INSERT创建重命名用户账号删除用户账号设置访问权限访问控制用户需要对其数据具有适当的访问权,既不能过多,也不能过少,例如多数用户需要对表进行读写,少数用户需要创建和删

7月 6, 2021

第二十七章 全球化和本地化

MySQL处理不同字符集和语言的基础知识字符集和校对顺序校对的重要性使用字符集和校对顺序字符集和校对顺序数据库表被用来存储和检索数据。不同的语言和字符集需要以不同的方式存储和检索MySQL需要适应不同的字符集(字母和字符),应应不同的排序和检索数据的方法字符集:字母和符号的集合编码:某个字符集成员的

下一篇

第十七章 组合查询

上一篇

第十五章 联结表JOIN

最近更新

  • 55 异常兜底:工具失败、非法输出、空检索与超时
  • 54 Agent Memory:短期记忆、用户上下文与摘要
  • 53 Human-in-the-loop:让关键动作暂停、确认与恢复
  • 52 工单 Tool:字段校验、创建结果与失败补偿
  • 51 订单 Tool:Mock、鉴权、状态解析与脱敏

热门标签

java基础 微服务 maven Spring Tomcat DDD Linux Linux基础 SQL基础 数据结构算法

目录

©2026 一条在知识海洋的咸鱼. 保留部分权利。

使用 Halo 主题 Chirpy