注:本书是2022年春节期间阅读的笔记,之前发布在微信公众号中,这里整理到博客中,并必要调整。
2024年 ㊗️ 新年慢乐·喜乐平安
喜乐君按:假期居家修订《数据可视化分析》一书,期间阅读了一些不错的书籍,今日将Learning_SQL第三章、第四章做简要笔记,分享读者。SQL并非学习Tableau的必备,但却是深入理解数据的好工具,也是为数不多历经50年没有消失的极少数代码语言之一。
SQL近期的阅读材料为:
Chapter 3 Query Primer
SQL的查询是一个先验证权限和语法(permission and syntax),而后执行(execution)并返回数据集(data sets)的过程。
查询过程中,有多个部分构成(query clauses),不过只有select是必须mandatory。
select部分最好理解,*代表all columns, 或者就指定字段名称(还可以使用as增加别名alias);不过,随着学习的深入,select后面可以使用多个样式:
from ,如果按照难易程度,也可以分为至少两个类型:
单表中又可以分为三种类型,
这和tableau中的数据表类型多有类似,也可以视为是“物理-逻辑”的演进。系统中已有的表、通过create table生成的表是包含数据的物理表,而通过create view创建的视图,则只是一个未来可用的query查询,因此逻辑上存在、内容是空,故名virtual ;临时表介于二者之间,通过subquery子查询临时创建,在短时间内存在,事后就释放,如同很多数据工具中的“影子数据”或者浏览器的缓存cache。不过,SQL中create view生成的view,是数据视图,和tableau的可视化视图viz虽然有类似之处(都是临时的数据集),但最终展现的形式不同,view可以认为是cross table,而tableau viz是可视化visualization
create view employee_view AS默认的join 是inner join, join需要和on condition结合使用;同时多表可以使用AS增加table alias。
select e.emp_id, e.emp_name, d.department书中Charter 4深入介绍了where子句的使用,把它分为四种类型,对我更好地理解tableau筛选,并做进一步分类起到了重要作用。
后面单独分享
从group by开始,我觉得开进入分析的世界。我们可以把数据的query分为两类:(1)query raw data without any maunipulation (2) group datas by columns to find trends.
group by是显形的语法,与之相对的潜在的聚合过程是aggregate。也许是正因此,书中Chapter 8的标题是 grouping and aggregates。在我最近的图书修订中,我发现自己过度的强调了aggregate的部分,而对group的阐述不足,虽然group的进一步抽象是问题的层次 ,但是还需要更具体化的解释才行。后续介绍chapter 8.
having正是对聚合后的数据做的筛选,因此理解它和where的不同至关重要。
- - how many departments and num_employees of each dept -- num_employees more than 2 select d.name, count(e.emp_id) as num_employees from deparment d inner join employee e on d.dept_id = e.dept_id group by d.namehaving count(e.emp_id)>2;
The order by clause is the mechanism sorting your result set using either raw column data or expressions based on column data .
sort by可以是单一字段,可以是多个字段,注意多个字段的排序是有优先级的,从前往后。另外有几个可选项:
⚠️ 排序对于性能是负面影响,因此如果只是出数据,并非必须。
select emp_id, name, title, fname,lnameChapter 4 Filtering
Chapter 3介绍的where 和 having都可以完成类似的筛选,前者是narrow your foucs to a subset of a table's rows,后者则是 fitler conditions pertaining to grouped data 。二者的差异与group by息息相关,或者说where是针对明细的,having 是针对聚合的。
本章介绍rows的筛选
Basic of logic
大学期间学过逻辑学,虽然大部分知识似乎忘却,但是一些关键的逻辑方法却已经深入内心,所以这里关于and、or、not、parentheses(圆括号)等operator就好理解了。
另外,还有两类operators :
之后,作者把filter分为了四类,这里值得我参考借鉴。作者并未像tableau可视化工具一样指出前面的分类是基于discrete and continuous fiels的字段分类,。
使用comparisons operators可以完成equality或者inequality conditions。
……this type of condition is common when working with numeric or temporal data. 这也应了tableau中的连续字段,要么是数字,要么是日期。
这里有几个关键:
SELECT emp_id, fname, lname, start_dateSELECT emp_id, fname, lname, start_dateWHERE avail_balance BETWEEN 3000 AND 5000;
set of values to include or exclude
多个值(注意是离散值)的筛选,书中作为单独一类介绍,可能是为了介绍独特的IN语法吧。
比如下面的一段SQL,locate all accounts whose product code is either 'CHK', 'SAV', 'CD', or 'MM'。
SELECT account_id, product_cd, cust_id, avail_balance--SELECT account_id, product_cd, cust_id, avail_balanceTableau 在2020年版本增加了IN函数,也是为了让此类问题更加简单。同时也可以与“条件筛选”等问题对应,诸如“筛选销售额大于1万的客户”,可以视为是一个简单的in函数。
比如,我可以使用以下SQL查询订单次数大于10的客户:
select `客户 Id` ,count(distinct `订单 Id`)select 地区 ,sum(利润)
match规则有很多,比如以字母T开头,以S结尾,或者包含K(通配符)。SQL中可以使用build-in function完成,或者借助于通配符。
SELECT emp_id, fname, lname作者还给出了一些实例:
正则表达式针对字符串处理,有点难,先跳过吧。
总结:
tableau基于SQL而创造了用于可视化的VizQL,不过它的底层依然是SQL逻辑,二者的相同之处让我在阅读这本书时游刃有余,并能进一步增加对Tableau的理解。
- 🌐 XILEJUN.com 全球 → https://xilejun.com
- 🌐 VIZWISE.cn 国内 → https://vizwise.cn
- 【读书笔记】Learning_SQL by Alan_Beaulieu第三章 → /posts/learning-sql-by-alan-beaulieu
- Learning_SQL by Alan_Beaulieu第七章日期函数 → /posts/learning-sql-by-alan-beaulieu
- [sql]Learning_SQL by Alan_Beaulieu Chapter 8 分组聚合 → https://xilejun.com/reading/sqllearning_sql-by-alan_beaulieu-chapter-8/
- 【读书】Learning_SQL by Alan_Beaulieu-第五/十章 连接 → /posts/learning-sql-by-alan-beaulieu
- 【读书】cross join妙用——在Tableau中借SQL生成“日历表” → /posts/cross-join-calander-table
No comments yet