三、数据库应用
发布时间:2024-08
浏览量:116
本文字数:6019
读完约 21 分钟
一、数据库介绍
数据库是存储、调用、分析数据的仓库,主要分为关系数据库和非关系数据库。
关系数据库
关系数据库是用来存放结构化数据的数据库。关系数据库以行和列的形式存储数据,这一系列的行和列被称为表,一组表组成了数据库。
非关系数据库
非关系数据库是用来存放非结构化数据的数据库,它不像关系数据库局限于固定的结构,而是采取开放式结构来存储数据,其标准也不像关系数据库那样统一,常用的存储标准有键值对,即键(Key)对应值(Value),且对应的值可以采取不同的长度和类型。
1、认识数据库:
应用数据库进行数据的获取及处理的过程又可以分为业务理解、数据理解、数据清洗及信息输出(或数据输出)4个环节
数据库是存储、调用、分析相关数据的仓库。数据库管理系统是用于管理数据库(Oracle、MySQL、DB2、SQL Server等)的软件,一个数据库管理系统可以管理多个数据库,相关人员可以通过数据库管理系统对数据库进行统一的管理和控制,从而保证数据的安全性和完整性。SQL(Structure QueryLanguage,结构化查询语言)是国际标准化组织(ISO)采纳的标准的数据库语言,是用来对数据库进行存储、计算、查询、更新、管理等操作的语言。
2、SQL:
SQL可以独立完成数据库生命周期中的全部活动。
(1)数据定义语言(DDL):用于创建、修改、删除数据库中的各种对象(数据库、表、视图、索引等)。对于业务分析人员来说,可以使用DDL完成分析逻辑的自用数据库的建设和修改。常用的命令有create、alter、drop。
(2)数据操作语言(DML):用于操作数据库表中的记录。业务分析人员如果在分析时需要添加其他数据源的数据或者在删除不符合分析条件的数据时可以使用DML。常用的命令有insert、update、delete。
(3)数据查询语言(DQL):用于查询数据库表中的记录,是业务分析人员最常用的语言类型,贯穿信息获取、数据获取、数据理解、数据清洗等多个环节,其主体结构为select<字段名>from<表或视图名>where<查询条件>。
(4)数据控制语言(DCL):用于定义数据库访问权限和安全级别。业务分析人员通常不涉及该类型命令的使用,它常用于数据库管理员为业务分析人员开数据库相关权限。常用的命令有grant、revoke。
3、数据仓库:
数据仓库(Data Warehouse)是一个面向主题(SubjectOriented)的、集成(Integrate)的、稳定(Non-Volatile)的、反映历史变化(Time Variant)的数据集合。
通常来讲,数据仓库根据其作用的不同,最少分为3个层级,即ODS(Operational Data Store)层、DSA(Data StagingArea)层和EDW(Enterprise Data Warehouse)层。
ODS:用来存储业务数据库在一个时间范围内新增或更新的数据,相当于业务数据库的一个非实时的缓存,因此其结构和原表结构类似,会对来自不同业务系统所产生的数据进行初步的整理,如筛选分析所需的字段、统一不同来源数据的编码等。
DSA:用于存储ODS层数据经过了抽取、清洗、转换等流程后所产生的格式和类型统一的数据。
EDW:用于存储DSA层数据在根据维度和度量对数据进行重新抽象和冗余化简之后利于分析数据抽取和展示的库表。
操作型处理称为联机事务处理(On-Line TransactionProcessing,OLTP),也可以称为面向交易的处理系统,针对具体业务在数据库联机的日常操作,通常对少数记录进行查询、修改。用户较为关心操作的响应时间、数据的安全性、完整性和并发的支持用户数等问题。
分析型处理称为联机分析处理(On-Line AnalyticalProcessing,OLAP),这种分析处理是针对事后的,它需要关注时间段内产生的所有有效数据,通过对数据进行分析来判断操作任务的过程是否正常,流程是否有可优化的地方,甚至对企业未来的业务发展方向进行预测。 此时该系统需要考虑如何高效地整合海量数据并且提供直观易懂的查询结果而不用考虑实时的数据读/写速度,因此我们通常采用数据仓库作为数据管理的主要手段。
二、数据定义语言
1、数据库基础操作:
# 创建数据库 create database <数据库名称>; -- 创建一个名为test的数据库 create database test; # 查看数据库 show databases # 选择数据库 use <数据库名称>; use test; # 删除数据库 drop database <数据库名称>; drop database test;
2、数据表操作:
# 创建表 use<数据库名称>; create table ( ); # 查看表 show tables; # 查看表结构 describe<表名>;或 desc<表名>; # 修改表 -- 修改表名 alter table<原表名>rename<新表名>; -- 修改字段名 alter table<表名>change<原字段名><新字段名><新数据类型>; # 修改字段类型 -- 对字段的类型进行修改时,如果要修改的字段已经存储了数据,那么数据库会检查已存储的数据是否满足新的数据类型的要求,只有在该字段的所有数据都满足新的数据类型的要求的情况下才会成功执行修改命令,如果有任意一行数据不满足要求就会报错,无法进行字段类型的修改。 alter table<表名>modify<字段名><新数据类型>; # 添加新字段 -- 向已存在的表中添加新的字段,添加字段的位置可以指定,在不指定的情况下会默认将新字段添加到表中的最后一列。 alter table<表名>add<新字段名><数据类型>[约束条件][first|after 参照字段名]; # 修改字段的排列位置 alter table<表名>modify<字段名><数据类型>[first|after 参照字段名]; # 删除字段 -- 删除表中不需要的字段,该字段在标准存储的全部数据、约束条件、索引等也会一并删除。 alter table<表名>drop<字段名>; # 删除表 -- drop可同时删除多个表,if exists主要用来判断表名是否存在 drop table[if exists]<表名>[,<表名1>,<表名2>,...,<表名n>];
数据类型:
整数型、小数、字符串、日期时间型
约束条件:
定义约束:
在MySQL中有以下5种常用的约束条件:
(1)primary key 主键约束,用来唯一标识数据中的每行记录。主键约束要求字段中的数据记录是非空的和唯一的。
一个表中只能有一个主键,但是构成主键的字段可以是一个也可以是多个。
# 单字段主键约束: create table < 表名> ( <字段名1> < 字段类型1> primary key, ); # 多字段主键约束: create table < 表名> ( <字段名1> < 字段类型1>, <字段名2> < 字段类型2>, primary key(<字段名1>, <字段名2>) ); # 删除主键约束 alter table<表名>drop primary key;
(2)not null 非空约束,限制了字段中的数据记录不能有空值。
# 创建 create table < 表名> ( <字段名1> < 字段类型1> primary key auto_increment, <字段名2> < 字段类型2> not null, ); # 删除 alter table<表名>modify<字段名><字段类型>[null];
(3)unique 唯一约束,限制了字段中的数据记录不能有重复值,即不能有两个相同的数据记录存在。
-- 用法1 create table < 表名> ( <字段名1> < 字段类型1> unique, <字段名2> < 字段类型2> unique, ); -- 用法2 create table < 表名> ( <字段名1> < 字段类型1>, <字段名2> < 字段类型2>, unique(<字段名1>, <字段名2>) ); # 删除唯一约束 -- 若单个字段没有指定唯一约束名,则默认的唯一约束名为字段名;若多个字段组合为唯一约束,则默认的唯一约束名为第一个字段的名称;若指定了约束名,则删除的时候写约束名。 alter table<表名>drop index<唯一约束名>;
(4)auto_increment 自动增长约束,它需要和主键约束一起使用,并且只有整数型字段才可以添加自动增长约束。在默认情况下,它是从1开始,在前一条记录的基础上,步长为1自动生成的,如1,2,3,4,…
# 创建 create table < 表名> ( <字段名1> < 字段类型1> primary key auto_increment, <字段名2> < 字段类型2>, ); # 删除 alter table<表名>modify<字段名><字段类型>;
(5)default 默认约束,表示为字段设置默认值。如果某个字段在添加数据时,没有指定该字段的取值,那么数据库管理系统就会按照default设置的默认值进行存储。
# 创建 -- default value create table < 表名> ( <字段名1> < 字段类型1> primary key auto_increment, <字段名2> < 字段类型2> default 0, ); # 删除 alter table<表名>modify<字段名><字段类型>;
SQL还使用外键约束来指定表和表之间的依赖关系,该约束条件受实际业务的限制,在企业数据库中极少用到。
三、数据操作语言
数据操作语言(DML)是对表中记录进行添加、更新、删除等操作的语言。
1、添加数据:
手动添加:
# 手动添加 insert into<表名>[<字段1>[,<字段2>,...<字段n>]]values(<值1>[,<值2>,...,<值n>]); -- 全列插入 -- insert [into] 表名 values(...) -- 主键字段 可以用 0 null default 来占位 -- 向classes表中插入 一个班级 insert into classes values(0, "菜鸟班"); -- 向students表插入 一个学生信息 insert into students values(0, "小张", 22, "男", 1, "1996-09-03"); insert into students values(null, "小张", 22, "男", 1, "1996-09-03"); insert into students values(default, "小张", 22, "男", 1, "1996-09-03"); -- 枚举中的下标从1开始 insert into students values(default, "小张", 22, 2, 1, "1996-09-03"); -- 部分插入 -- insert into 表名(列1, ...) values(值1, ...) insert into students (name, gender) values("小李", 3); -- 多行插入 insert into students (name, gender) values("大李", 2),("小卢", 1); insert into students values(default, "蛮王", 22, 1, 1, "1999-09-03"),(default, "寒冰", 22, 2, 1, "1996-09-03"); insert into students values( default, "vn", 22, 2, 1, "1999-09-03" ),( default, "EZ", 22, 1, 1, "1993-09-03" ),( default, "女枪", 22, 2, 1, "1994-09-03" );
批量导入:
load data infile '文件路径' into table<表名>[fieldsterminated by '分隔符' ignore x lines];
2、将查询结果添加到表中:
# 利用insert在已有表中插入数据 insert into<新表名>[<字段1>[,<字段2>,...,<字段n>]]select<字段1>[,<字段2>,...,<字段n>]from<原表名>[where<查询条件>]; # 将查询结果添加到新表中 create table<新表名>asselect<字段1>[,<字段2>,...<字段n>]from<原表名>[where<查询条件>];
3、更新/修改数据:
update 表名 set 列1=值1, 列2=值2... where 条件;
4、删除数据:
delete与truncate的区别在于,delete可以添加删除条件来删除表中部分数据,truncate只能删除表中全部数据。delete在删除表中数据的同时保留表结构,truncate直接先把表删除(drop),然后创建(create)一个新表,执行速度比delete快。
# 删除数据 delete from 表名 where 条件; # 删除表 delete from 表名 truncate 表名;
四、数据查询语言
数据查询语言(DQL)用于查询数据库表中的记录,它提供了很多灵活的语句和函数来帮助分析人员,根据分析需求对数据进行查询、筛选、分析、统计、排序等后处理操作,并可以将数据以分析人员希望的格式进行展现。DQL返回的查询结果是存储在内存中的虚拟结果集,所以在DQL中执行的筛选、计算、排序等操作,都不会影响真实表中的记录。
1、单表查询:
where子句针对数据表进行筛选,在对查询结果进行分组前,就将不符合where查询条件的记录过滤掉;而having子句对分组聚合后的结果进行过滤,故having子句中的筛选字段必须是可以出现在分组结果中的字段。另外,按照SQL语句的执行顺序,where子句是在分组聚合前执行的,因此不能引用聚合函数作为筛选条件,而having子句是在分组聚合后执行的,因此可以引用聚合函数作为筛选条件。
2、函数:
数学函数
字符串函数
日期时间函数
分组合并函数
group_concat([distinct]str[order by str asc/desc][separator]) -- distinct用来对组内字符串进行去重,order by用来指定字符串的合并顺序,separator用来指定连接的分隔符,默认为逗号
逻辑函数
# 空值函数 ifnull(expression, alt_value) -- 若第一个表达式为null,则使用alt_value来替代空值;若第一个表达式不为null,则返回第一个表达式的值。 # if if(expr1,expr2,expr3) -- 若expr1的值为true,则返回expr2的值;若expr1的值为false,则返回expr3的值。 # case表达式
窗口函数
3、多表查询:
纵向合并
被合并的多个结果集的字段数量、顺序必须完全一致,而其数据类型必须可以兼容。字段名可以不一样,数据库管理系统会将第一个结果集的字段名作为合并后的结果集的字段名。
union -- 去重 union all -- 不去重
横向合并
4、子查询:
五、视图:
视图是存储在数据库中的虚拟表,视图本身并不保存表中的任何数据,而是在其内部封装了查询语句,通过调用该查询语句从数据库中对应的一个或多个底层基本表中获得相应的查询结果数据并进行展示。
# 创建 create view<视图名>as<select 查询语句>; # 更新/修改 create[or replace or alter]view<视图名>as<select 查询语句>; # 删除 drop view[ if exists]<视图名>;