文章目录
序言
在我研一(18年春)上《大规模数据存储与处理》的时候,老师在课堂里给我讲过SQL的知识。课堂上老师举了几个经典的例子,把select、where、group by、having、order by给讲完了,感觉是很好懂的。其实那时我还选了一门《数据库新技术》的课。这些课对我来讲有点收获,但大体的评价是:所谓新数据库技术、大数据处理,在我只是听到了几个新名词而已。再加之后来没有再接触过数据库的东西,也就渐渐忘得没影了。然而,SQL这个东西在校招面试中是有问到的。可是由于一向的懒惰,加之也没想到以后会用到,所以SQL至今也不怎么会。我想可以说SQL是基础,而大数据和新技术这些书潮流。之前看过一篇文章,一个教授劝勉道:“你应该花大把时间那些基础之上,而不是一直追逐潮流。”这话现在回想起来,愈发觉得有理了。
年前(2019年末)我借了《SQL必知必会》一书,书中内容倒是简单,易上手,但光看书只是假把式罢了。浏览知乎时遇到一个好的答案,其中提及了一个好的练习网站,昨夜(20200302)上手练习之后就有点欲罢不能——有那种“读书破万卷,下笔如有神”的意思。今日练习之后,更觉SQL功力大增,差不多掌握五六成的样子吧。知识得来不易,然而记忆却是不可靠的,因此记录下来,以便日后回忆和复习。 ——2020年3月3日于武汉
在如何学习 SQL 语言? - 佰初的回答 - 知乎中,提到了一个练习网站:https://zh.sqlzoo.net/wiki/Aggregates_with_DISTINCT,提供了很好的练习题。
PS:以下提到的页码如p86,是指来自《SQL必知必会》第四版(中文)的第86页
常识
- 1 SQL中的关键字不区分大小写;
- 2 select子句及其顺序:
group by
1 group by可以用多个列来分组
书中p86有提到,下面是一个例子
having
1、having与where的差别
where过滤指定的是行而不是分组。where在分组前过滤,他所排除的行不会出现在分组中。having是基于组进行过滤。
2、使用having
The_nobel_table_can_be_used_to_practice_more_SUM_and_COUNT_functions
row_number、over、partition的例子
来自The nobel table can be used to practice more SUM and COUNT functions./zh
concat、百分比、保留小数
来自SELECT within SELECT Tutorial/zh
all 以及 内外表格
SELECT within SELECT Tutorial/zh
all的这个很经典
分组中的字母序
SELECT within SELECT Tutorial/zh
distinct
The nobel table can be used to practice more SUM and COUNT functions./zh
CASE WHEN
The JOIN operation/zh这里只用join(返回笛卡尔积)结果不对,答案中少了部分结果。左外连接的结果是正确的,可能原因是笛卡尔积
More join
使用多个join
SELECT name
FROM (
SELECT * FROM (SELECT * FROM movie WHERE title='Alien'
) a /*只从movie中选择alien,减少中间结果*/ LEFT JOIN casting ON a.id=movieid
) b
LEFT JOIN actor c ON b.actorid=c.id;