中国统计网|SQL太难?你离完全理解SQL就差这10步!( 三 )


SQL 语句中推荐使用表连接
我们先看看刚刚这句:FROMa, b高级 SQL 程序员也许学会给你忠告:尽量不要使用逗号来代替 JOIN 进行表的连接 , 这样会提高你的 SQL 语句的可读性 , 并且可以避免一些错误 。利用逗号来简化 SQL 语句有时候会造成思维上的混乱 , 想一下下面的语句:FROMa, b, c, d, e, f, g, h WHEREa.a1 = b.bx ANDa.a2 = c.c1 ANDd.d1 = b.bc --etc...我们不难看出使用 JOIN 语句的好处在于:

  • 安全 。 JOIN 和要连接的表离得非常近 , 这样就能避免错误
  • 更多连接的方式 , JOIN 语句能去区分出来外连接和内连接等
我们学到了什么?记着要尽量使用 JOIN 进行表的连接 , 永远不要在 FROM 后面使用逗号连接表 。6
简约框线标题
SQL 语句中 , 表连接的方式从根本上分为五种:
  • EQUI JOIN
  • SEMI JOIN
  • ANTI JOIN
  • CROSS JOIN
  • DIVISION
EQUI JOIN这是一种最普通的 JOIN 操作 , 它包含两种连接方式:-- This table reference contains authorsandtheir books. -- Thereisone recordforeach bookandits author. -- authors without books are NOT included author JOIN book ON author.id = book.author_id -- This table reference contains authorsandtheir books -- Thereisone recordforeach bookandits author. -- ... OR thereisan"empty"recordforauthors without books -- ("empty"meaning that all book columns are NULL) author LEFT OUTER JOIN book ON author.id = book.author_id这种连接关系在 SQL 中有两种表现方式:使用 IN , 或者使用 EXISTS 。 “ SEMI ”在拉丁文中是“半”的意思 。 这种连接方式是只连接目标表的一部分 。 这是什么意思呢?再想一下上面关于作者和书名的连接 。 我们想象一下这样的情况:我们不需要作者 / 书名这样的组合 , 只是需要那些在书名表中的书的作者信息 。 那我们就能这么写:-- Using IN FROM author WHERE author.id IN (SELECTbook.author_idFROMbook) -- Using EXISTS FROMauthor WHEREEXISTS(SELECT1FROMbookWHEREbook.author_id = author.id)尽管没有严格的规定说明你何时应该使用 IN, 何时应该使用 EXISTS, 但是这些事情你还是应该知道的:
  • IN比 EXISTS 的可读性更好
  • EXISTS 比IN 的表达性更好(更适合复杂的语句)
  • 二者之间性能没有差异(但对于某些数据库来说性能差异会非常大)
-- Find only those authors who also have books SELECTDISTINCTfirst_name, last_name FROMauthor JOINbookONauthor.id = book.author_id这是一种很糟糕的写法 , 原因如下:
  • SQL 语句性能低下:因为去重操作( DISTINCT )需要数据库重复从硬盘中读取数据到内存中 。 (译者注:DISTINCT 的确是一种很耗费资源的操作 , 但是每种数据库对于 DISTINCT 的操作方式可能不同) 。
  • 这么写并非完全正确:尽管也许现在这么写不会出现问题 , 但是随着 SQL 语句变得越来越复杂 , 你想要去重得到正确的结果就变得十分困难 。
ANTI JOIN这种连接的关系跟 SEMI JOIN 刚好相反 。 在 IN 或者 EXISTS 前加一个 NOT 关键字就能使用这种连接 。 举个例子来说 , 我们列出书名表里没有书的作者:


推荐阅读