MySQL必知必会 学习笔记 第十六章 创建高级联结
可给表起别名,理由是:
1.缩短SQL语句。
2.允许在单条SELECT语句中多次使用相同的表(自联结时可用)。
SELECT title, name
FROM film f, language l
WHERE f.language_id = l.language_id;
以上SQL返回值与上一章取电影及其所用语言的SQL的返回值相同。
表别名只在查询执行中使用,不会像列别名一样返回到客户机。
找出film表中与某电影所用语言相同的电影名:
SELECT f1.title
FROM film f1, film f2
WHERE f1.language_id = f2.language_id AND f2.film_id = 1;
以上查询SELECT子句必须使用限定的列名,因为不能分清列来自于哪张表。
以上查询使用子查询也可完成:
SELECT title
FROM film
WHERE film.language_id = (SELECT language_id
FROM film
WHERE film_id = 1
);
联结通常比子查询效率高。
对表进行联结时,应该至少有一个列出现在不止一个表中(被联结的列)。标准的联结返回所有列,两表中都有的列会出现多次,而自然联结是两表中都出现的相同列只保留一列。但需要手动完成自然联结,SELECT子句中两表中都有的列只列出一次即可。
外部连结可返回没有被关联的行,如列出使用一个语言的电影数时,有的语言没有使用它的电影,此时内部连结就不会返回此语言的电影数:
SELECT COUNT(f.title), l.name
FROM film f INNER JOIN language l
ON f.language_id = l.language_id
GROUP BY l.name;
运行它:
而外联结可选出另一个表中没有的行:
SELECT COUNT(f.title), l.name
FROM film f RIGHT OUTER JOIN language l
ON f.language_id = l.language_id
GROUP BY l.name;
运行它:
左右连结取决于想保留哪个表中的所有行,如上例想保留所有的语言行,即使没有电影使用该语言,就使用右连结,如果语言表在左边,电影表在右边,要想达到相同目的,就要使用左连结。
上例中的COUNT函数选的是电影名列,而非全部列*
,这是因为由于使用了外联结,总会返回一行(即没有该语言的电影时,电影名为null),如使用COUNT(*)
,则没有使用该语言的电影时会返回1,而没有电影时,电影名是NULL,因此使用COUNT列名可以忽略此种行,用列名参数调用COUNT只会计算非NULL行。
MySQL不支持*=
(左联结)和=*
(右联结)操作符,它俩在其他DBMS中很流行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)