23篇大数据系列(三)sql基础知识(上)(史上最全,建议收藏)

简介: 23篇大数据系列(三)sql基础知识(上)(史上最全,建议收藏)

前言


由于介绍的是基础知识,因此本文的主要内容是讲解面向数据分析的SQL基础知识。本文会从4个方面来讲解:


第1部分,数据库体系的一些基本概念。我们会提到数据库相关的一些重要概念,方便大家理解SQL的写法,更重要的是理解这些概念是与他人沟通SQL相关内容的前提。


第2部分,SQL查询的基本语法。我们会来讲解下SELECT子句的使用方法,如何完成一些针对单表的简单的统计分析。


第3部分,数据库函数、谓词和CASE表达式。我们会来介绍下常用的一些函数、用于判断真假的谓词和用于多条件判断的CASE表达式。


第4部分,关联查询和子查询。我们将会带大家学习下,如何把多张表连接起来,通过表交叉来获取更多的信息,以及使用子查询实现在查询的结果上继续分析。


由于不同数据库厂商,引擎实现各有不同,SQL的语法、关键字、函数等都略有差异,因此本文只拿在互联网公司使用最广泛的MySQL为例进行讲解,文中涉及的SQL和例子都是在MySQL中运行的。下面我们就进入正式的知识讲解。


正文


1  数据库体系的一些基本概念


本部分的核心目标是让大家理解一些核心的基本概念,这些概念在日常工作中经常会提到和用到,因此理解了这些概念才能和团队其他小伙伴顺畅地沟通,愉快地协作。由于本文的重点是讲SQL,因此我们只讲解关系型数据库相关的概念。


1.1  数据库与数据库管理系统


我们通常口中所说的数据库,有两种含义,一是指实际存储数据的仓库,二是指抽象层面上容纳一组表的那个database。其中,表达后一种含义更常见。数据库管理系统,通常是指管理数据库的一套系统,通过它可以实现对数据的定义、插入、更新、删除、查询等操作,它提供了数据分析师与数据交互的窗口。


1.2  表


关系型数据库中的表,通常是指由行和列组成的用于存储数据的二维表。表是数据存储的直接载体,我们的数据通常都需要存储在表中。数据库基本上都是通过表来组织数据的。所以,表也是我们查询并获取数据最直接的对象。


对于表而言,有以下几个特性:


a. 表是由存在关联性的多列组成的,可以存储N多行数据,每行数据称为一条记录,行和列的交叉点唯一确定一个单元格


b. 表中的列名不重复,即列名需唯一


c. 表中的任意一列都只能存储一种数据类型的数据


1.3  数据类型


在不同的数据库管理系统中,支持的数据类型会略有差异,本文就以MySQL为例,介绍几种最常用的数据类型,分别如下所示:


数值类型


1.png


日期类型


2.png


字符串类型


3.png


上面只是罗列出了几种最常用的数据类型,如果大家接触到了其他不常用的类型,可以自己在网上搜索一下相关的信息。


1.4  主键


主键是一列或多列的组合,用于标识表中唯一的一条记录。所以,它天然的一个属性就是不重复性,也不允许为NULL值。通常我们会使用自增的整型值来作为主键,由数据库管理系统来维护,既能保证唯一性,又使用起来很方便。一个表的主键,通常也会作为其他表引用的对象,即后面要讲到的外键。


1.5  外键


外键通常用来建立两张表之间的关联关系,一个表的外键通常是与之关联的另一个表的主键。这样在进行关联查询时,就可以通过两个表外键和主键之间的关系,将两张表连接起来,形成一张中间表,将两张表的信息融合,产生更大的价值。


1.6  索引


如果你想快速找到一本书中,你感兴趣的部分,你就会去查找目录,目录可以帮你快速定位到你想看的内容在哪一页。对于数据库中的表来说,索引就相当于是表的目录。其存在的主要目的就是为了加快查询速度。当然,索引也还有一些其他用途,其设计原理也是非常巧妙,我们会在下一篇SQL进阶文章中,详细讲解这块内容。


1.7  表关系


在关系型数据库中,表和表之间的关系通常有三种,1对1、1对多、多对多。为方便描述,我们假定有两张表,分别为表A和表B。


1对1,是指表A和表B通过某字段关联后,表A中的一条记录最多对应表B中的一条记录,表B中的一条记录也最多对应表A中的一条记录。

1对多,是指表A和表B通过某字段关联后,表A中的一条记录可能对应表B中的多条记录,而表B中的一条记录最多对应表A中的一条记录。

多对多,是指表A和表B通过某字段关联后,表A中的一条记录可能对应表B中的多条记录,而表B中的一条记录可能对应表A中的多条记录。

1对1 和 1对多关系,通常使用外键引用对应表的主键就可以表达。而多对多关系,通常需要使用中间表来表达,中间表中记录了两张表的主键的对应关系。


1.8  视图


如果一条SQL的结果在日常查询中经常被用到,我们通常就会考虑使用视图将其存储起来,下次再使用时直接读取视图,就会执行视图对应的SQL语句,非常地简洁方便。所以,视图就是一张虚拟的表。不过,值得注意的是,视图存储的是SQL语句,而不是SQL执行后的结果,其结果是每次执行时动态生成的,可能每次读取都会有变化。


1.9  集合


集合在数学领域表示“(各种各样的)事物的总和”,在数据库领域表示记录的集合。具体来说,表、视图和查询的执行结果都是记录的集合。是集合,就可以进行集合运算,如求并集、交集、差集等。另外,查询的执行结果也是集合,那么就可以把查询的结果再当做一个表,继续基于这个表做分析。这个便是子查询的理论基础。在第4部分,我们会详细讲到子查询。


2  SQL查询的基本语法


SQL是结构化查询语言(Structural Query Language)的简称,是开发者与数据库管理系统对话的语言。SQL用关键字、表名、列名、操作符等组合而成的一条语句,用来描述操作的内容。SQL是有国际标准的,因此其通用性不言而喻。


2.1  关键字


SQL有很多关键字,每个关键字的含义和用法都不相同。本文只罗列出在数据分析工作中与查询分析相关的常用的基础关键字及其含义,其中有一些会在下面的段落中详细讲解,如下表格所示:


1.png

2.png


2.2  书写规则


SQL的书写规则非常简单灵活,但是如果不注意,也是很容易犯错的,工作中常用的规则如下:


a. 关键字、表名和列名等大小写不敏感;


b. 使用全英文半角(关键字、空格、符号)来书写;


c. SQL语句以分号结尾;


d. SQL语句的单词及运算符之间需使用半角空格或换行符来进行分隔;


e. 函数名和括号是一个整体,中间不能有空格,空参数函数括号不能省略;


f. 数字常量直接书写,如 20 ;


g. 日期和字符串常量需要使用英文单引号包裹起来,如 '2002-10-01 12:23:21','Lily';


h. 注释的三种写法:单行注释(#,--)和多行注释(/* */)。单行注释推荐使用"--"。


2.3  简单查询


最简单的查询语句莫过于"SELECT * FROM A",其中A表示数据表名A,这条


SQL的含义是从表A中查询出所有列的所有数据。"*"代表表A中的所有列,是一种简写形式。我们就从这条最简单的SQL开始,逐渐添加关键字,最后变成一条复杂的SQL。


接下来我们要讲解的简单查询,都是针对单个表的查询。针对单表的查询虽然比较简单,但是却是复杂查询的基础。为了方便演示,我们先定义一个数据表student,用于存储学生的信息,表里的数据如下所示:


555.jpg


从左到右列的含义依次为学号、姓名、年龄、英语成绩、数学成绩、总成绩。


2.4  过滤


如果要对表中的数据进行过滤,只保留满足我们需求的数据,那就要用到WHERE关键字了。WHERE关键字后跟的是由逻辑运算符连接的一个或多个表达式,每个表达式的最终结果为TRUE或FALSE,只保留表达式结果为TRUE的行。


例如,我们要获取英文成绩不合格的学生姓名和学号,则对应的SQL为


SELECT sno, name 
FROM student 
WHERE eng_score < 60


运行结果如下:


7.png


2.5  运算符


运算符,顾名思义就是用于做运算的符号。常见的运算符有三种,比较运算符、算术运算符和逻辑运算符。


1.png


不等于的判断,目前绝大部分的数据库管理系统厂商也都支持了"!="运算符,与"<>"表达的含义相同。


2.png


算术运算符在书写时可以紧挨着字段名写,如eng_score-math_score,所以字段名和表名的命名中不能使用中划线("-"),否则它会被误判为是在做减法运算的。


3.png


当存在多种逻辑运算符时,为了避免歧义,需要使用括号来界定执行的先后顺序,使用括号组织的表达式,可读性也会更强。建议大家不要去记忆逻辑运算符的优先级,容易记混,而且写出的SQL可读性比较差,最好是使用括号,来厘清多个逻辑条件的关系,清晰易懂,可读性强,不容易出错。


了解了上面这些运算符,我们便可以通过组合各种运算符,书写出WHERE后面复杂的表达式,来满足我们的过滤需求了。


2.6  分组聚合


分组聚合是指,我们可以将表中的数据,根据某一列或多列进行分组,然后将其他列的值进行聚合计算,如计数、求和和求平均值等。用到的关键字是GROUP BY,对于分组后的计算结果,我们还可以使用HAVING进行过滤。


例如,从student表中,求出不同年龄的人数、英语总成绩和数学成绩的平均值,且过滤掉。对应的SQL为


SELECT age, COUNT(sno) AS student_num,
    SUM(eng_score) AS sum_eng_score, 
    AVG(math_score) AS avg_math_score
FROM student
GROUP BY age
HAVING avg_math_score >= 60


运行后结果如下所示:


2.png


这里需要注意的是,出现在group by后面的字段或计算公式,必须出现在对应的select的后面,并且除了这些字段或计算公式外,select后面不能有其他字段,只能使用聚合函数。


2.7  去重


DISTINCT关键字用于对一列或多列去重,返回剔除了重复行的结果。DISTINCT对多列去重时,必须满足每一列都相同时,才认为是重复的行进行剔除。DISTINCT不会过滤掉NULL值,但去重后的结果只会保留一个NULL值。


例如,从student表中,找出有几种年龄的学生,即求出去重后的年龄。对应的SQL为


SELECT DISTINCT age FROM student


运行后结果如下所示:


4.png


2.8  排序


日常生活场景里,我们经常对各种各样的排名比较感兴趣,比较关注排在前面的内容。在数据库中,求出排名,就需要用到ORDER BY子句。ORDER BY通常配合ASC和DESC使用,可以根据一列或多列,进行升序或降序排列,之后使用LIMIT取出满足条件的前N行。


例如,从student表中,求出数学成绩最好的前3名学生的姓名、年龄和其数学成绩。对应的SQL如下:


SELECT name, age, math_score
FROM student
ORDER BY math_score DESC
LIMIT 3


运行后结果如下所示:


7.png


2.9  增加常量列

增加常量列,即把某一固定的常量值做为一列添加到我们的结果数据中。这种做法的应用场景,通常是结果集中所有的行在某个属性上值是相同的,这时便可以通过增加常量列的方式,来增加这一列。我们通过下面的例子来演示其语法形式。


例如,从student表中,查询英语成绩大于80分的学生的姓名和学号,并把他们都分入A班。对应的SQL如下:


SELECT sno, name, 'A' AS class FROM student WHERE eng_score > 80


运行后结果如下所示:


9.png


从示例中可以看出,直接通过"常量 AS 新列名"的方式就可以增加常量列,非常地方便。










相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
相关文章
|
4月前
|
SQL 存储 大数据
【大数据技术Hadoop+Spark】Hive基础SQL语法DDL、DML、DQL讲解及演示(附SQL语句)
【大数据技术Hadoop+Spark】Hive基础SQL语法DDL、DML、DQL讲解及演示(附SQL语句)
74 0
|
4月前
|
SQL 分布式计算 数据库
【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)
【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)
85 0
|
4月前
|
SQL 分布式计算 大数据
【大数据技术Hadoop+Spark】Spark SQL、DataFrame、Dataset的讲解及操作演示(图文解释)
【大数据技术Hadoop+Spark】Spark SQL、DataFrame、Dataset的讲解及操作演示(图文解释)
53 0
|
3月前
|
SQL Oracle 关系型数据库
Oracle PL/SQL基础知识及应用案例
Oracle PL/SQL基础知识及应用案例
33 0
|
4月前
|
SQL 分布式计算 大数据
大数据=SQL Boy,SQL Debug打破SQL Boy 的僵局
大数据=SQL Boy,SQL Debug打破SQL Boy 的僵局
50 0
|
4月前
|
SQL 分布式计算 大数据
大数据计算MaxCompute的sql代码中支持插入jinja语法语句吗?
大数据计算MaxCompute的sql代码中支持插入jinja语法语句吗?
34 0
|
4月前
|
SQL 分布式计算 MaxCompute
这些警告信息是MaxCompute在执行SQL查询时生成的
这些警告信息是MaxCompute在执行SQL查询时生成的
34 3
|
3月前
|
SQL 分布式计算 DataWorks
如果你在DataWorks中使用ODPS SQL时遇到"该文件对应引擎实例已失效,请重新选择可用的引擎实例"的错误提示
如果你在DataWorks中使用ODPS SQL时遇到"该文件对应引擎实例已失效,请重新选择可用的引擎实例"的错误提示
48 1
|
5月前
|
SQL 分布式计算 调度
在MaxCompute中,你可以通过SQL语句来查询和导出实例的运行状态和时间等信息
在MaxCompute中,你可以通过SQL语句来查询和导出实例的运行状态和时间等信息
50 5