我们把商标中的数据存储在demo数据库的chapter5表中。
具体如何把上表中的数据存储到demo数据库的chapter5表中呢?首先在demo数据库中新建一张名为chapter5的表,然后分别新建id、name、class、age、score列,表和列新建完成后,再将本地的CSV文件导入即可。
(数据导入其实很简单,使用数据库管理工具,比如navicat 都可以进行导入)
获取列
我们都知道一个数据库中有多张表,每张表又有多个字段,即多个列。
当我们并不是每次进行分析的时候都需要用到全部的表和全部的列,我们可以根据自己的需要选择想要的表或列。
获取全部列
如果想要获取SQL的chapter5表中全部列,则通过以下代码:
select * from chapter5;
*表示获取一张表中的全部列,运行上面的代码就会得到chapter5表中的全部列。
获取特定列
在SQL中,如果我们要获取特定的某几列,只需要把代表全部列的*换成对应的列名即可,比如要获得id列和class列。
select id,class from chapter;
运行上面代码,得到结果如下。
获取想要的行
获取全部行
如果只指定了要获取哪些列,对行没有指定,则默认获取的是这些列的全部行。
获取前几行
有时候,我们可能只想看一下某张表中各个字段的数据都是什么样子的,这个时候我们就不需要获取所有的行,因为每行的数据都差不多,所以我们只要获取前几行就可以了。
在SQL中,可用使用limit来对获取行数进行限制。
select * from chapter5 limit 5; # 获取前5行
运行上面代码,得到如下结果。
limit除了可以限制前几行,还可以写为 limit x,y 的形式,表示获取第x行(不包括x行)以后的y行数据。
select * from chapter5 limit 2,3;
运行上面代码,可以获取第2行(不包括第二行)以后的3行数据。
获取满足单一条件的行
有时候,我们不只是单纯地先获取前几行,而是想要获取满足特定条件的某些行,比如,获取age列中等于18的所有行。
在SQL中,可以利用where来指定据具体的条件,把具体的条件放在where后面即可。
select * from chapter5 where age=18;
运行上面代码,得到结果如下。
获取满足多个条件的行
有时候,一个条件可能不能满足我们的需求,需要同时用多个条件来进行限制。比如,我们要获取age列等于18且class列等于一班的所有列。
在SQL中,我们可以直接在where后面用逻辑符来连接多个条件。
# and 与
select * from chapter5 where age=18 and class="一班";
上面是以两个条件为例的,也可以使用多个条件,多个条件之间还是直接用逻辑符连接即可。
逻辑符除了用and,还可以用or,表示两个或者多个条件中只要有一个条件满足即可。比如,我们要获取chapter5表中age列等于18或class列等于一班的所有行,可以通过如下代码实现:
# or 或
select * from chapter5 where age=18 or class="一班"
在上面的代码中,关于where后面的比较运算符我们只用了等于,还有更多的比较运算符可以用,比如,大于、小于、介于等,后续章节会详细讲述。
行列同时获取
前面两节内容都只是单独对行或列进行获取,我们也可以同时对行和列进行获取,即获取某些列的某些行。
所谓的行列同时获取,就是把单独获取行和单独获取列的代码组合在一起,比如,我们要获取chapter5表中age列等于18且class列等于一班的id列和name列,具体实现代码如下:
select id,name from chapter5 where age=18 and class="一班";
运行上面代码,就会把chapter5表中满足age列等于18且class列等于一班的id列和name列获取出来。
插入一列固定值
有时候,我们会有这样的需求,除了要获取原始表中现有的数据,我们还想在select结果中根据选取的数据特征插入一列固定值。
比如,我们要从chapter5表中获取age列小于20的id列和name列,并希望用一列标签列来标识这些人的年龄情况。
在SQL中,我们想要给查询结果插入一列固定值,只需要把这列固定值当作表的一列即可,具体实现代码
select id,class 'age<20' as label from chapter5 where age<20;
label列中每个都是字符串"age<20",其中,as表示给这一列起一个别名。
JSON列解析
有时候,数据库中的数据是按照JSON格式存储的,什么是JSON格式呢?如果读者学过Python,应该都知道字典这种数据结构,就是最外层用的花括号括起来,花括号中是key:value的形式,key可以理解成普通表中的字段名,value就是这个字段的值,一班花括号中会包含多个key:value,也就是虽然只用了一列位置,但是存储了列数据,用户可以根据需要选择对应的key:value值。
在SQL中,可以使用json_edxtract()对JSON列中的数据进行获取。
chapter5表中的score列就是JSON格式,比如,我们要获取每个id对应的数学成绩,可以通过如下代码实现。
select id,json_extract(score,'$.数学') as '数学成绩' from chapter5;
json_extract()主要有两个参数,第一个参数需要说明JSON格式的列名,此处是score列;第二个参数需要说明你要获取JSON中具体哪个key对应的value值,注意,key前面的$.符号不可少。
json_extract()用于获取JSON中key对应的value值,如果我们还想要查看JSON中都有哪些key,则可以通过json_keys()来实现。
比如,我们要查看每个id对应的score列中都有哪些key
select id,json_keys(score) as "科目" from chapter5;
对结果进行排序
对结果进行排序也是我们经常会执行的操作。
在SQL中,我们要想将结果列按照某列进行排序,需要借助order by来实现,比如,我们要将chapter5表按照age列进行升序排列,具体实现代码如下:
select * from chapter5 order by age;
我们可以看到上面代码运行的结果是按照age列进行升序排列的,这是order by默认的排序方式,如果我们想按照age列进行降序排列,则可以在age后面加一个desc,表明降序排列,具体实现代码如下∶
select * from chapter5 order by age desc;
与desc对应的是asc,表示升序排序,order by默认是升序排序,所以当我们对数据进行升序排序时,一般省略不写。
如果我们在SQL中也想按照多列进行排序,那么只需要在order by后面指明要排序的多个列以及每个列对应的排序方式即可,比如,我们要对chapter5表中的class列进行升序排列,对age列进行降序排列,具体实现代码如下︰
select * from chapter5 order by class asc,age desc;
如果我们要对多个列进行统一的升序排序,则可以直接键多个列名用逗号分隔开,省略排序方式。
小结
获取列
获取全部列 select * from chapter5;
获取特定列 select id,class from chapter5;
获取行
获取全部行 默认就是获取全部行
获取前几行
select * from chapter5 limit 5; # 获取前5行
select * from chapter5 limit 2,3; # 获取第2行(从0开始)以后的三条数据
获取满足特定条件的行 where
select * from chapter5 where age=18 or class="一班"
行列同时获取
select id,name from chapter5 where age=18 and class="一班";
插入一列固定值
直接在选择的列中写一个常量,那么整列都是这个值
select id,class 'age<20' as label from chapter5 where age<20;
JSON列解析
json_extract() 获取json列中的值
select id,json_extract(score,'$.数学') as '数学成绩' from chapter5;
json_keys() 查看json列中的键
select id,json_keys(score) as "科目" from chapter5;
对结果进行排序
order by
参数 asc(默认) desc
select * from chapter5 order by age;
select * from chapter5 order by class asc,age desc;