中国统计网|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 语句能去区分出来外连接和内连接等
简约框线标题
SQL 语句中 , 表连接的方式从根本上分为五种:
- EQUI JOIN
- SEMI JOIN
- ANTI JOIN
- CROSS JOIN
- DIVISION
-- 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 语句变得越来越复杂 , 你想要去重得到正确的结果就变得十分困难 。
推荐阅读
- 中年|中国-东盟区块链应用创新实验室揭牌
- IT爆料猿|中国电信6月5G用户数净增779万户,累计3784万
- 2020|影谱科技入选“2020中国AI商业落地价值潜力100强榜单”
- 中国航务周刊|港航业再现跨界收购!
- 招生|有道词典与中国教育在线合作,开通“高考招生”直播服务
- CSDN|由 Apache 说开,中国开源项目已经走向世界!
- AI财经社|谷歌云为何“放弃”中国市场?有人为它算了账,投入产出比太低
- 网速|全球网速排名:中国手机网速世界第三,美国第34
- 驱动中国|国内首次应用!支付宝开放宠物鼻纹识别技术:猫狗都能买保险
- 魅族|2020年BrandZ中国全球化品牌50强新鲜出炉,魅族再上榜,位列34名
