10个简单步骤,完全理解SQL(二)

简介: 多年前收藏在笔记中的一篇文章,今天偶然翻出,重读了一遍,依然大有收获。分享出来,大家一起探讨。

4. 灵活引用表能使 SQL 语句变得更强大


灵活引用表能使 SQL 语句变得更强大。一个简单的例子就是 JOIN 的使用。


严格的说 JOIN 语句并非是 SELECT 中的一部分,而是一种特殊的表引用语句。


SQL 语言标准中表的连接定义如下:


<table reference> ::=
  <table name>
  | <derived table>
  | <joined table>


就拿之前的例子来说:


FROM a, b


a 可能输如下表的连接:


a1 JOIN a2 ON a1.id = a2.id


将它放到之前的例子中就变成了:


尽管将一个连接表用逗号跟另一张表联合在一起并不是常用作法,但是你的确可以这么做。结果就是,最终输出的表就有了 a1+a2+b 个字段了。


在 SQL 语句中派生表的应用甚至比表连接更加强大,下面我们就要讲到表连接。


我们学到了什么?


思考问题时,要从表引用的角度出发,这样就很容易理解数据是怎样被 SQL 语句处理的,并且能够帮助你理解那些复杂的表引用是做什么的。


更重要的是,要理解 JOIN 是构建连接表的关键词,并不是 SELECT 语句的一部分。有一些数据库允许在 INSERT 、 UPDATE 、 DELETE 中使用 JOIN 。


5. SQL 语句中推荐使用表连接


我们先看看刚刚这句话:


FROM a, b


高级 SQL 程序员也许给你忠告:尽量不要使用逗号来代替 JOIN 进行表的连接,这样会提高你的 SQL 语句的可读性,并且可以避免一些错误。利用逗号来简化 SQL 语句有时候会造成思维上的混乱,想一下下面的语句:


FROM a, b, c, d, e, f, g, h
  WHERE a.a1 = b.bx
  AND a.a2 = c.c1
  AND d.d1 = b.bc
  -- etc...


我们不难看出使用 JOIN 语句的好处在于:安全。JOIN 和要连接的表离得非常近,这样就能避免错误。


更多连接的方式,JOIN 语句能去区分出来外连接和内连接等。


我们学到了什么?


记着要尽量使用 JOIN 进行表的连接,永远不要在 FROM 后面使用逗号连接表。


6. SQL 语句中不同的连接操作


SQL 语句中,表连接的方式从根本上分为五种:


EQUI JOIN
SEMI JOIN
ANTI JOIN
CROSS JOIN
DIVISION


EQUI JOIN 是一种最普通的 JOIN 操作,它包含两种连接方式:


INNER JOIN(或者是 JOIN )


OUTER JOIN(包括:LEFT 、 RIGHT、 FULL OUTER JOIN)


用例子最容易说明其中区别:



-- This table reference contains authors and their books.
-- There is one record for each book and its author.
-- authors without books are NOT included
author JOIN book ON author.id = book.author_id
-- This table reference contains authors and their books
-- There is one record for each book and its author.
-- ... OR there is an "empty" record for authors without books-- ("empty" meaning that all book columns are NULL)
author LEFT OUTER JOIN book ON author.id = book.author_id
SEMI JOIN


这种连接关系在 SQL 中有两种表现方式:使用 IN,或者使用 EXISTS。“ SEMI ”在拉丁文中是“半”的意思。这种连接方式是只连接目标表的一部分。这是什么意思呢?


再想一下上面关于作者和书名的连接。我们想象一下这样的情况:我们不需要作者 / 书名这样的组合,只是需要那些在书名表中的书的作者信息。那我们就能这么写:


-- Using IN
FROM author
WHERE author.id IN(SELECT book.author_id FROM book)
-- Using EXISTS
FROM author
WHERE EXISTS (SELECT 1 FROM book WHERE book.author_id = author.id)



尽管没有严格的规定说明你何时应该使用 IN ,何时应该使用 EXISTS ,但是这些事情你还是应该知道的:


IN比 EXISTS 的可读性更好

EXISTS 比IN 的表达性更好(更适合复杂的语句)

二者之间性能没有差异(但对于某些数据库来说性能差异会非常大) 因为使用 INNER JOIN 也能得到书名表中书所对应的作者信息,所以很多初学者机会认为可以通过 DISTINCT 进行去重,然后将 SEMI JOIN 语句写成这样:


-- Find only those authors who also have books
SELECT DISTINCT first_name, last_name
FROM author
JOIN book ON author.id = book.author_id


这是一种很糟糕的写法,原因如下:

  • SQL 语句性能低下:因为去重操作( DISTINCT )需要数据库重复从硬盘中读取数据到内存中。
  • 这么写并非完全正确:尽管也许现在这么写不会出现问题,但是随着 SQL 语句变得越来越复杂,你想要去重得到正确的结果就变得十分困难。
相关文章
|
3月前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
326 3
|
3月前
|
SQL 存储 测试技术
SQL在构建系统中的应用:关键步骤与技巧
在构建基于数据库的应用系统时,SQL(Structured Query Language)作为与数据库交互的核心语言,扮演着至关重要的角色
|
3月前
|
SQL 网络安全 数据库
机房电脑下载并安装SQL Server的详细步骤
在机房电脑上下载并安装SQL Server是一个常见的任务,特别是对于学习数据库管理或进行相关项目开发的学生和开发者来说
|
3月前
|
SQL Oracle 关系型数据库
SQL如何添加字段记录:详细步骤与技巧
在数据库管理中,经常需要向已有的表中添加新的字段(列)或向表中插入新的记录
|
3月前
|
SQL 存储 缓存
SQL计算班级语文平均分:详细步骤与技巧
在数据库管理和分析中,经常需要计算某个班级在特定科目上的平均分
|
3月前
|
SQL 数据管理 数据库
文章初学者指南:SQL新建数据库详细步骤与最佳实践
引言:在当今数字化的世界,数据库管理已经成为信息技术领域中不可或缺的一部分。作为广泛使用的数据库管理系统,SQL已经成为数据管理和信息检索的标准语言。本文将详细介绍如何使用SQL新建数据库,包括准备工作、具体步骤和最佳实践,帮助初学者快速上手。一、准备工作在开始新建数据库之前,你需要做好以下准备工作
264 3
|
3月前
|
SQL 关系型数据库 MySQL
创建SQL数据库的基本步骤与代码指南
在信息时代,数据管理显得尤为重要,其中数据库系统已成为信息技术架构的关键部分。而当我们谈论数据库系统时,SQL(结构化查询语言)无疑是其中最核心的工具之一。本文将详细介绍如何使用SQL创建数据库,包括编写相应的代码和必要的步骤。由于篇幅限制,本文可能无法达到您要求的2000字长度,但会尽量涵盖创建数
132 3
|
3月前
|
SQL 安全 关系型数据库
SQL授权用户查看表的详细步骤与技巧
在数据库管理中,控制不同用户对数据的访问权限是至关重要的
|
3月前
|
SQL 存储 数据库
如何查看SQL字符编码:详细步骤与技巧
在数据库管理中,了解SQL字符编码对于确保数据的正确存储、处理和显示至关重要
|
3月前
|
SQL 关系型数据库 MySQL
如何确认SQL查询是否使用了索引:详细步骤与技巧
在数据库管理和优化中,确认SQL查询是否有效利用了索引是提升性能的关键步骤
下一篇
开通oss服务