单表查询
准备工作
单表查询是SQL教程中最基础、最复杂的内容,在这一部分,会讲解两个方面的内容:单表查询的基本范式和常用的SQL函数。在开始介绍前,给定一个例子,这样方便大家直观的理解SQL是如何查询的。以学生各科成绩为例,其表格内容如下:
student_id | name | grade | subject | score |
---|---|---|---|---|
101 | 张三 | 一年级 | 数学 | 70 |
101 | 张三 | 一年级 | 语文 | 80 |
202 | 李四 | 二年级 | 英语 | 95 |
创建上面表格及写入数据的SQL语句如下:
CREATE TABLE student (`student_id` int, `name` varchar(4), `grade` varchar(6), `subject` varchar(7), `score` int) ; INSERT INTO student (`student_id`, `name`, `grade`, `subject`, `score`) VALUES ('101', '张三', '一年级', '数学', '70'), ('101', '张三', '一年级', '语文', '80'), ('202', '李四', '二年级', '英语', '95') ;
当然也可以上传数据,但是网页对于上传数据的字段的数据类型识别可能不准确,仍然需要修改下字段的数据类型。
student_id是学号;name是学生姓名;grade是学生所在年级;subject是相应的科学名称;score是学生在这次考试中的分数。同时,我们把这张表定义为student表。
针对单表查询,其基本的查询范式如下,接下来的讲解也是围绕这个基本范式展开
select col1, col2, col3 from table1 where …… group by …… having …… order by …… limit n
select语句
select是数据分析最为常用的,从一张表中选择数据就是使用select。让我们从最简单的查询开始入手,查询一张表的数据。上面我们提到了表是包含两个维度:字段和记录。所以在查询的时候就需要写明白,查询哪些字段以及查询多少条记录。
指定字段名称需要在select后面写相应的字段名称(列名),毕竟有些非常大的表有着非常多的字段,并不需要全部查询出来。那如果需要查询呢,就使用*代替,select *就代表了要查询这张表的全部字段,这样就省去了写出全部字段名称的繁杂。
查询多少条记录,这个功能对于数据分析师而言主要是熟悉数据表的数据结构,如果只是想取一些数据出来认识下数据就会用到这一功能。这个函数最常用的就是limit n(n为正整数),也就是限定选择出n条数据记录。
整理一下最简单的数据查询就是使用select + 字段名称 + from + 表名称 + limit + n。整理成一句话就是:从某张表中取出某几个字段的几条记录。整理成代码就是下面这段。记得字段名称之间需要使用,隔开
select col1, col2 from table1 limit 5
在select中还需要说明的一个语句是distinct,从英文名就能知道这是一个去重的函数,即筛选出不重复的数据。distinct既可以对单列数据去重,也可以对多列数据去重。多列去重就要求多列数据均相同的情况下才会被去重。
例子
以前面定义的学生表为例,现在想查询这张表的全部字段的其中2条记录,SQL就是如下格式:
--方法一:指定字段名,限定查询条数 select student_id, name, grade, subject, score from student limit 2 --方法二:使用*指代全部字段 select * from student limit 2
select后面是相应的字段名称,代表了想要查询的字段。from后面是表的名称
现在想查看有几个不同的年级,也就是需要distinct grade,查询代码如下:
select distinct grade from student
使用distinct对变量进行去重
where语句
在select中学习了限定字段名称和记录数量的方法,下一步呢就是考虑查询符合条件的数据。限定记录数量只是为了识别表格的数据内容,并不是查询我们想要的数据,以学生成绩表为例,如果我们想查询某一名学生的成绩,使用字段名称和limit就不可能实现,这时候就需要使用where来进行判断。where,可以理解为一种判断条件,根据where后面的条件进行筛选。需要明确的是,数据表中的筛选是依据字段名称对记录进行筛选。举学生表的例子,想查询张三的成绩,是不是通过姓名这一字段就可以对下面的数据记录进行筛选?明确了这一点where用起来就很方便了。
问题的关键来了,知道是对字段进行判断,那应该如何设定判断条件?在讲具体的判断条件以前,先来说一下变量的数据类型,SQL中变量类型细说起来有很多种,但是从数据分析角度看,可以把变量分成三种类型就可以,那就是数字型、字符型和日期型。这么划分的依据是所使用函数的不同,数字可以进行加减乘除,字符可以进行拼接、拆分、匹配等,日期则可以判断大小、计算时间间隔等。目前的SQL已经像Excel一样智能,表格中变量类型并不严格限制进行相应的运算。比方说以字符型存储的数据,依然可以进行加减乘除运算等,所以只要明确这个变量呈现出什么样式就可以使用相应的函数。
回到where函数,where的主要作用是判断,涉及到的函数分为以下几类:
对于单一条件筛选,where可选的函数包含"="、"!="(或者使用"<>")、">"、"<"、"<="、">="、"in"、"not in"、"like"、between…and…等。
需要解释的就是"!="(或者使用"<>"),表示不等于;
in和not in是针对变量与集合的操作,表示在某个限定的范围内在或者不在,如"男" in ("男","女"),肯定是TRUE,not in则为相反含义;
"like"是匹配函数,是部分字符串的匹配,like通常和通配符%一块使用,其中%表示一个或多个字符。例如"数据科学家进阶之路" like "%数据%",结果就是TRUE。有like自
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
数据分析入门技术篇