中国统计网|SQL太难?你离完全理解SQL就差这10步!( 四 )
-- Using IN FROM author WHERE author.id NOT IN (SELECTbook.author_idFROMbook) -- Using EXISTS FROMauthor WHERENOTEXISTS(SELECT1FROMbookWHEREbook.author_id = author.id)关于性能、可读性、表达性等特性也完全可以参考 SEMI JOIN 。这篇博文介绍了在使用 NOT IN 时遇到 NULL 应该怎么办 , 因为有一点背离本篇主题 , 就不详细介绍 , 有兴趣的同学可以读一下CROSS JOIN这个连接过程就是两个连接的表的乘积:即将第一张表的每一条数据分别对应第二张表的每条数据 。 我们之前见过 , 这就是逗号在 FROM 语句中的用法 。 在实际的应用中 , 很少有地方能用到 CROSS JOIN , 但是一旦用上了 , 你就可以用这样的 SQL语句表达:-- Combine every authorwithevery book author CROSS JOIN bookDIVISIONDIVISION 的确是一个怪胎 。 简而言之 , 如果 JOIN 是一个乘法运算 , 那么 DIVISION 就是 JOIN 的逆过程 。我们学到了什么?让我们在脑海中再回想一下 。 SQL 是对表的引用 ,JOIN 则是一种引用表的复杂方式 。 但是 SQL 语言的表达方式和实际我们所需要的逻辑关系之间是有区别的 , 并非所有的逻辑关系都能找到对应的 JOIN 操作 , 所以这就要我们在平时多积累和学习关系逻辑 , 这样你就能在以后编写 SQL 语句中选择适当的 JOIN 操作了 。7
SQL 中如同变量的派生表
在这之前 , 我们学习到过 SQL 是一种声明性的语言 , 并且 SQL 语句中不能包含变量 。 但是你能写出类似于变量的语句 , 这些就叫做派生表:说白了 , 所谓的派生表就是在括号之中的子查询:FROM (SELECT*FROMauthor)派生表可以有效的避免由于 SQL 逻辑而产生的问题 。 举例来说:如果你想重用一个用 SELECT 和 WHERE 语句查询出的结果 , 这样写就可以(以 Oracle 为例):-- Get authors' first and last names, and their age in days SELECTfirst_name, last_name, age FROM( SELECTfirst_name, last_name,current_date- date_of_birth age FROMauthor ) -- If the age is greater than 10000 days WHEREage >10000需要我们注意的是:在有些数据库 , 以及 SQL :1990 标准中 , 派生表被归为下一级——通用表语句( common table experssion) 。 这就允许你在一个 SELECT 语句中对派生表多次重用 。 上面的例子就(几乎)等价于下面的语句:WITHaAS( SELECTfirst_name, last_name,current_date- date_of_birth age FROMauthor ) SELECT* FROMa WHEREage >10000我们学到了什么?我们反复强调 , 大体上来说 SQL 语句就是对表的引用 , 而并非对字段的引用 。 要好好利用这一点 , 不要害怕使用派生表或者其他更复杂的语句 。8
SQL 语句中GROUP BY是对表的引用进行的操作
让我们再回想一下之前的 FROM 语句:FROMa, b现在 , 我们将 GROUP BY 应用到上面的语句中:GROUPBYA.x,A.y,B.z上面语句的结果就是产生出了一个包含三个字段的新的表的引用 。 我们来仔细理解一下这句话:当你应用 GROUP BY 的时候 ,SELECT 后没有使用聚合函数的列 , 都要出现在 GROUP BY 后面 。(译者注:原文大意为“当你是用 GROUP BY 的时候 , 你能够对其进行下一级逻辑操作的列会减少 , 包括在 SELECT 中的列”) 。需要注意的是:其他字段能够使用聚合函数:SELECTA.x,A.y,SUM(A.z) FROMA GROUPBYA.x,A.y还有一点值得留意的是:MySQL 并不坚持这个标准 , 这的确是令人很困惑的地方 。译者注:这并不是说 MySQL 没有 GROUP BY 的功能)但是不要被 MySQL 所迷惑 。 GROUP BY 改变了对表引用的方式 。 你可以像这样既在 SELECT 中引用某一字段 , 也在 GROUP BY 中对其进行分组 。我们学到了什么?GROUP BY , 再次强调一次 , 是在表的引用上进行了操作 , 将其转换为一种新的引用方式 。9
推荐阅读
- 中年|中国-东盟区块链应用创新实验室揭牌
- IT爆料猿|中国电信6月5G用户数净增779万户,累计3784万
- 2020|影谱科技入选“2020中国AI商业落地价值潜力100强榜单”
- 中国航务周刊|港航业再现跨界收购!
- 招生|有道词典与中国教育在线合作,开通“高考招生”直播服务
- CSDN|由 Apache 说开,中国开源项目已经走向世界!
- AI财经社|谷歌云为何“放弃”中国市场?有人为它算了账,投入产出比太低
- 网速|全球网速排名:中国手机网速世界第三,美国第34
- 驱动中国|国内首次应用!支付宝开放宠物鼻纹识别技术:猫狗都能买保险
- 魅族|2020年BrandZ中国全球化品牌50强新鲜出炉,魅族再上榜,位列34名
