在数据分析师看来,MYSQL就是一个简单而又必不可少的工具。只要能精准按业务需求在数据库里存数据、提取数据,为业务数据分析提供源数据就足矣!
什么是数据库
在认识MYSQL之前,必须了解数据库是什么?答案是肯定的。我们平时说的数据库表达的意思是关系数据库管理系统(RDBMS),实际上数据库是RDBMS下的一个子集。从整体来说就是数据库系统由包含多个数据库,每个数据库包含多个数据表,每个数据表包含多个字段,每个字段包含多条记录。在IT背景下,企业数据存储面临的问题:
– 存储大量数据
– 大量数据的检索和访问
– 保证数据信息的一致和完整
– 数据共享和安全
– 通过分析整合,产生新的有用的信息(如提供决策支持)
这时,可以在数据库系统下建立一个企业专属的数据库来储存企业数据,为企业后期的业务决策、业务数据分析提供源数据。再来看一RDBMS是怎样的一个软件:
– 能让我们使用表、列和索引实现一个数据库
– 保证各种表的行间的引用完整性
– 自动更新索引
– 解释一个SQL查询和组合来自不同表的信息
– SQL:指的是结构化查询语言(Structured Query Language),在关系型数据库上执行数据操作、数据检索及数据维护的标准语言。
创建数据库
怎样储存一个企业的业务数据?首先得创建企业专属得数据库,在MYSQL的命令窗格可以用下面的代码实现对数据库得创建、使用、删除等操作:
create database test;#创建名为test的测试数据库
show create database test;#查看创建好的数据库
show databases;#查看数据库下的所有列表
use test;使用数据库
drop database test;删除创建好的test数据库
创建数据表
企业有了专属的数据库后,需要向数据库中储存不同维度的数据(信息)。这时可以在数据库下建立不同维度的数据表,所有的数据存储在数据库下不同维度的表中,使用主键或外键建立表间的关系。用下面涉及的代码可以在指定的数据库下创建数据表:
创建数据表: create table 表名(…),比如用SQL语句创建以下员工信息表:
用下面的代码可创建、查看、删除员工信息表:
use test;使用数据库
create table emp(depid char(3),depname varchar(20),peoplecount int);#创建
show tables;#查看
drop table emp;#删除
数据类型及约束条件
数据表下的不同字段可以定义不同的数据类型、约束条件来保证数据的准确性。先说数据类型,如下表所述,它包含数值类型、日期和时间类型、字符串类型。
数值类型 | 意义 |
---|---|
INT | 有符号的和无符号的。有符号大小-2147483648~2147483647,无符号大0—4294967295。宽度最多为11个数字- int(11) |
TINYINT | 有符号的和无符号的。有符号大小-128—127,无符号大小为0~255。宽度最多为4个数字- tinyint(4) |
INT | 有符号的和无符号的。有符号大小-2147483648~2147483647,无符号大0—4294967295。宽度最多为11个数字- int(11) |
SMALLINT | 有符号的和无符号的。有符号大小-3276832767,无符号大小为065535。宽度最多为6个数字- smallint(6) |
MEDIUMINT | 有符号大小-8388608—8388607,无符号大小为0~16777215。 |
BIGINT | 有符号的和无符号的。宽度最多为20个数字- bigint(20) |
DOUBLE(M,D) | 只能为有符号的。默认为(16,4) |
DECIMAL(M,D) | 只能为有符号的。 |
FLOAT(M,D) | 只能为有符号的。默认为(10,2) |
日期和时间类型 | 意义 |
---|---|
DATE | YYYY-MM-DD格式,在1000-01-01和9999-12-31之间。例如: 1973-12-30 |
DATETIME | YYYY-MM-DD HH:MM:SS格式,位于1000-01-01 00:00:00和9999-12-31 23:59:59之间。例如: 1973-12-30 15:30:00 |
TIMESTAMP | 称为时间戳,在1970-01-01 00:00:00和2037-12-31 23:59:59之间。例如, 1973年12月30日下午15:30,则在数据库中存储为:19731230153000 |
TIME | 以HH:MM:SS格式, -838:59:59~838:59:59 |
YEAR(2or4) | 以2位或4位格式存储年份值。如果是2位, 1970—2069;如果是4位, 1901—2155。默认长度为4 |
字符串类型 | 意义 |
---|---|
CHAR(M) | 固定长度字符串,长度为1-255。如果内容小于指定长度,右边填充空格。如果不指定长度,默认为1 |
VARCHAR(M) | 可变长度字符串,长度为1-255。定义该类型时必须指定长度 |
BLOB 或TEXT | 最大长度65535。存储二进制大数据,如图片。不能指定长度。两者区别:BLOB 大小写敏感 |
TINYBLOB 和TINYTEXT | 最大长度255。不能指定长度。 |
LONGBLOB 或LONGTEXT | 最大长度4294967295 字符 |
ENUM | 例如: ENUM(‘A’,’B’,’C’)。 NULL 值也可 |
MEDIUMBLOB 或MEDIUMTEXT | 最大长度16777215 字符 |
约束条件是在表上强制执行的数据检验规则,用来保证创建的表的数据完整和正确。MySQL数据库常用约束条件有:
约束条件 | 说明 | 语法 |
---|---|---|
PRIMARY KEY | 主键约束 | 字段名 数据类型 PRIMARY KEY |
UNIQUE | 唯一约束 | 字段名 数据类型 UNIQUE |
AUTO_INCREMENT | 自增字段 | 字段名 数据类型 AUTO_INCREMENT |
DEFAULT | 默认值 | 字段名 数据类型 DEFAULT 默认值 |
为数据表导入外部数据
创建好数据表后,可以为其导入规范的外部数据,比如为Monthly_Indicator表导入外部txt文件,用下面代码实现:load data local infile '文件路径.txt’ into table Monthly_Indicator fields terminated by '\t' ignore 1 lines;
。然后检查导入的数据库是否正确,用下面的代码实现:Select * from Monthly_Indicator;检查表的内容
,Select count(*) from Monthly_Indicator;#检查表的行数
,Desc Monthly_Indicator;#检查表的结构
。
修改数据表
当发现数据表的结构、信息有误或者为了操作方便,需要对数据数据表进行一定的修改,可以用下面的代码实现:alter table emp rename empdep;
#将数据表emp改名为empdep;alter table empdep modify depname varchar(30);
#将数据表empdep中depname字段的数据类型由varchar(20)修改成varchar(30);alter table empdep change depname dep varchar(30);
#将数据表empdep中depname字段的字段名改为dep;alter table empdep add maname varchar(10) not null;#
为数据表empdep添加新字段maname,新字段数据类型为varchar(10),约束条件为非空;alter table empdep modify maname varchar(10) first;
#将数据表empdep中maname字段的排列顺序改为第一位;alter table empdep modify maname varchar(10) after depid;
#将数据表emp中maname字段的排列顺序改到depid字段之后;alter table empdep drop maname;
#删除maname字段。
SQL的数据查询功能
作为数据分析师,不仅要能够正确的向数据库里储存数据,还要能正确的从该数据库提取数据。那么,SQL的数据查询功能是每个数据分析师必须掌握的。
SQL的数据查询语法如下:SELECT〈目标列组〉 FROM〈数据源〉 [WHERE〈元组选择条件〉 ] [GROUP BY〈分列组〉 [HAVING 〈组选择条件〉 ]] [ORDER BY〈排序列1〉〈排序要求1〉 [, …n]];
。union
用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行,比如select t1.* from t1 union all select t2.* from t2;
。Select语句的操作符如下所示:算术操作符+(加号)、-(减号)、 *(乘号)和 /(除号)
;比较操作符=(等于)、 >(大于)、 <(小于)、 <=(小于等于)、 >=(大于等于)、 !=或<> (不等于)、 !>(不大 于)和 !<(不小于),共9种操作符。
以及逻辑操作符。除此之外还有distinct操作符,用于消除重复记录select distinct s_id from fruits;
。
当条件查询条件较为复杂时,可引入子查询作为查询条件:select * from fruits where f_id in (select f_id from fruits where f_price between 10 and 20);
#用in操作符与子查询语句来查询所有f_id对应的f_price在10元到20元之间的水果记录;select * from fruits where f_id = any (select f_id from fruits where f_price between 10 and 20);
#用any操作符与子查询语句来查询所有f_id对应的f_price在10元到20元之间的水果记录;select * from fruits where f_price > all (select f_price from fruits where f_price < 20);
#用all操作符与子查询语句来查询所有f_price大于20元的水果记录;select * from fruits where exists (select * from fruits where f_price > 30);
#用exists操作符与子查询语句来查询是否存在f_price大于30元的水果记录。此外,可用as重命名与limit限制查询结果行数, select f.* from fruits as f;
#用as将fruits表名重命名为f后使用;select * from fruits order by f_price desc limit 3;
#显示f_price金额最大的前三名水果记录。
其他补充
对数据库、数据表的操作除了上面的介绍,还有其他的操作。比如,为字段赋值update 表名 set 字段名 = 值;
与 删除记录DELETE FROM 表名 [WHERE Clause]
。使用group_concat函数查询不同s_id下对应的所有f_name信息,SELECT s_id, GROUP_CONCAT(f_name) FROM fruits GROUP BY s_id;
此处GROUP_CONCAT()函数常与关键字 GROUP BY 一起使用,能够将分组后指定的字段值都显示出来。CAST() 将一个值转换为指定的数据类型。其他常用的各类函数有:
数学函数
字符串函数
常用的日期及时间函数