数据库在磁盘上就是一个文件;数据库管理系统是管理数据库的一个软件; 数据库:存放数据的仓库;Databsae,简称DB
模型训练需要使用大量的数据 使用python读取数据库再用 pandas 进行操作 占用时间/内存资源 并且处理大量数据时效率较低
实际使用时直接在数据库里进行简单的字符串操作/数据简单的加减乘除等 最后把处理后的数据结果表拉近python用于模型训练等操作
数据库基础
数据表:
在数据库(database)中,可以创建很多张表(table) ;
通常情况下,一张表用于保存一类数据,例如网站中的所有用户信息会保存在一张表中,所有商品信息会保存在另一张表中表记录:
数据表中(table)中,可以插入很多条记录;数据表往往保存一类数据,对应java中的一个类;
而一条记录往往对应java中的一个具体的实例 (即表中的一行数据)数据库管理系统:对数据库进行统一地管理和控制,以保证数据库地安全性和完整性;
数据库系统:包括了数据库、数据库管理系统、应用系统、数据库管理员 即软件+人。
数据库服务器:
数据库服务器其实就是一个软件,比如我们安装的mysql软件(或者mariadb软件)
mysql服务器软件需要安装在服务器硬件上(就是一台计算机)才可以让外界来访问
在mysql服务器中,可以创建很多的数据库(database数据库查询:select * from isupport_customer order by id desc(查询数据表中的相应数据)
数据库的分类:数据库根据句存储采用的数据结构的不同可以分为许多种,其中包含
早期的数据库类型:
*层次式数据库
*网络式数据库目前占市场主流的是
*关系型数据库
*非关系型数据库
*键值对数据库,例如:MongDB,Redis
关系型数据库:
底层是以二维表的及其之间的关系所组成的数据库.常见关系型数据库:
SQL Server 微软提供(收费.java中使用不多)
Oracle 甲骨文公司(收费,功能强大,性能优异,java中使用者很多)
DB2 IBM(收费,中型/大型,银行/电信等企业)瑞典MySQL AB(免费,小型,性能较优异,适用于中小型项目,可集群)
SQLite 迷你数据库
SQL语言:Structured Query Language:结构化的查询语言; SQL是操作所有关系型数据库的通用的语言
SQL语言的分类:
- DDL - - 数据库定义语言,指Create,Allter,Drop等操作(即创建,删除,修改数据库和数据表)
- DML - - 数据库操作语言,指Insert.Update.Delete等操作(即数据表中数据的增删改操作)
- DQL - - 数据查询语言(指Selete操作,即数据表中数据的查询操作)
其中DQL,也就是数据查询操作是在开发中使用最多的操作,也是我们关注的重点.
SQL增删改查:
增:insert 表的名称 values 新增的内容
例子:
insert SQ_Academe(Academe,Specialty.Grade,Class)
values(‘信息技术学院’,’计算机’,’2019’,’1班’)改:update 表的名称 set 要改的内容 where 条件
例子:
update SQ_Academe
set Academe = ‘药数学院’
where AcademeID =1010查:# select 查询的内容 from 表的名称
例子:
select * from SQ_Academe
select * from pm_customer order by id desc;
select * from isupport_customer where id =621 order by id desc;
select * from isupport_customer_property where isupport_customer_id=621删:delete 表的名称 where 条件 —>相应行变成 NULL
例子:
delete SQ_Academe
where AcademeID = 1010
hive
创建表/新增数据/删除表
1
2
3
4
5
6
7
8
9DROP TABLE IF EXISTS 库名.表名;
CREATE TABLE 库名.表名(
字段1 bigint,
字段2 int,
字段3 string,
字段4 timestamp
...
);
insert into 库名.表名删除表中某一部分数据
1
2INSERT OVERWRITE TABLE table_name SELECT * FROM table_name WHERE year>2018;
#WHERE后的条件是需要保留的数据的查询结果,即删除2018年及以前的数据Quantile
1
2
3分析函数:用于等级、百分点、n分片等 Ntile 是Hive很强大的一个分析函数。
ntile (num) over ([partition_clause] order_by_clause) as your_bucket_num
然后可以根据桶号,选取前或后 n分之几的数据ROW_NUMBER
hive的分组和组内排序—语法1
2
3
4
5row_number() over (partition by 字段a order by 计算项b desc ) rank
rank是排序的别名
partition by:类似hive的建表,分区的意思;
order by :排序,默认是升序,加desc降序;
这里按字段a分区,对计算项b进行降序排序LAG
1
2LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值
第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)时间数据格式化操作
hive 常用日期格式转换- 固定日期转换成时间戳
select unix_timestamp(‘2016-08-16’,’yyyy-MM-dd’) –1471276800
select unix_timestamp(‘20160816’,’yyyyMMdd’) –1471276800
select unix_timestamp(‘2016-08-16T10:02:41Z’, “yyyy-MM-dd’T’HH:mm:ss’Z’”) –1471312961
16/Mar/2017:12:25:01 +0800 转成正常格式(yyyy-MM-dd hh:mm:ss)
select from_unixtime(to_unix_timestamp(‘16/Mar/2017:12:25:01 +0800’, ‘dd/MMM/yyy:HH:mm:ss Z’))时间戳转换程固定日期
select from_unixtime(1471276800,’yyyy-MM-dd’) –2016-08-16
select from_unixtime(1471276800,’yyyyMMdd’) –20160816
select from_unixtime(1471312961) – 2016-08-16 10:02:41
select from_unixtime( unix_timestamp(‘20160816’,’yyyyMMdd’),’yyyy-MM-dd’) –2016-08-16
select date_format(‘2016-08-16’,’yyyyMMdd’) –20160816取当前时间
select from_unixtime(unix_timestamp(),’yyyy-MM-dd HH:mm:ss’)
select from_unixtime(unix_timestamp(),’yyyy-MM-dd’)返回日期时间字段中的日期部分 select to_date(‘2016-08-16 10:03:01’) –2016-08-16
返回日期中的年 select year(‘2016-08-16 10:03:01’) –2016
返回日期中的月 select month(‘2016-08-16 10:03:01’) –8
返回日期中的日 select day(‘2016-08-16 10:03:01’) –16
返回日期中的时 select hour(‘2016-08-16 10:03:01’) –10
返回日期中的分 select minute(‘2016-08-16 10:03:01’) –3
返回日期中的秒 select second(‘2016-08-16 10:03:01’) –1返回日期在当前的周数 select weekofyear(‘2016-08-16 10:03:01’) –33
返回结束日期减去开始日期的天数 select datediff(‘2016-08-16’,’2016-08-11’)返回开始日期startdate增加days天后的日期 select date_add(‘2016-08-16’,10)
返回开始日期startdate减少days天后的日期 select date_sub(‘2016-08-16’,10)返回当天三种方式
SELECT CURRENT_DATE; –2017-06-15
SELECT CURRENT_TIMESTAMP;–返回时分秒 –2017-06-15 19:54:44
SELECT from_unixtime(unix_timestamp()); –2017-06-15 19:55:04返回当前时间戳 select current_timestamp–2018-06-18 10:37:53.278
返回当月的第一天 select trunc(‘2016-08-16’,’MM’) –2016-08-01
返回当年的第一天 select trunc(‘2016-08-16’,’YEAR’) –2016-01-01从时间数据中提取年/月/天等
1
2
3
4
5
6
7
8
9
10select to_date(’2011-12-08 10:03:01′) from dual; -----返回日期时间字段中的日期部分:2011-12-08
select year(‘2011-12-08 10:03:01’) ----返回日期中的年:2011
select month(‘2011-12-08 10:03:01’) from iteblog; ----返回日期中的月份:12
select day(‘2011-12-08 10:03:01’) from iteblog; -----返回日期中的天:8
select hour(‘2011-12-08 10:03:01’) from iteblog; -----返回日期中的小时:10
select second(‘2011-12-08 10:03:01’) from iteblog; -----返回日期中的秒:1
select weekofyear(‘2011-12-08 10:03:01’) from iteblog; ----返回日期在当前的周数:49
select datediff(‘2012-12-08’,‘2012-05-09’) from iteblog; -----返回结束日期减去开始日期的天数:213
select date_add(‘2012-12-08’,10) from iteblog; ----返回开始日期startdate增加days天后的日期:2012-12-18
select date_sub(‘2012-12-08’,10) from iteblog; -----返回开始日期startdate减少days天后的日期:2012-11-28
- 固定日期转换成时间戳
sql sever
字符串操作
字符串类型的数据切词提取有效信息:substring(字符串字段名,开始位置,结束位置)1
2
3select substring
(字符串字段名,charindex('abc',字符串字段名)+11,ABS(charindex('bjsa',字符串字段名)-charindex('abc',字符串字段名)-14))
FROM 库名.表名获取某个字符串在字段中的位置:charindex(字符串,字段名)
1
charindex('mainBody',content)+11
排序规则不同导致join失败
1
2
3无法改变数据库的情况下:
1.在 on 后的字段后加上 collate Chinese_PRC_CS_AI_WS 指定排序规则
2.在建表时给字符串类型的字段后面加上 collate Chinese_PRC_CS_AI_WS