以下学习笔记参考自Datawhale12月组队学习的推荐系统课程,内容包括MySQL、MongoDB以及Redis的一些基本命令的使用。
项目原链接: https://github.com/datawhalechina/fun-rec
MySQL
学习参考:https://github.com/datawhalechina/fun-rec/blob/master/docs/%E7%AC%AC%E4%BA%8C%E7%AB%A0%20%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%E5%AE%9E%E6%88%98/2.2%E6%96%B0%E9%97%BB%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%E5%AE%9E%E6%88%98/docs/2.2.1.1%20Mysql%E5%9F%BA%E7%A1%80.md
数据库的基本操作
数据库的创建
通过CREATE
命令,可以创建指定名称的数据库
-- IF EXISTS为可选性,用于防止数据库不存在时报错。
CREATE DATABASE [IF NOT EXISTS] <数据库名称>;
-- 创建名为shop的数据库。
CREATE DATABASE shop;
数据库的查看
- 查看所有存在的数据库
SHOW DATABASES [LIKE '数据库名'];
LIKE
从句是可选项,用于匹配指定的数据库名称。LIKE
从句可以部分匹配,也可以完全匹配。
2.查看创建的数据库
SHOW CREATE DATABASE <数据库名>;
数据库的选择
在操作数据库前,必须指定所要操作的数据库。通过USE
命令,可以切换到对应的数据库下。
USE <数据库名>
数据库的删除
通过DROP
命令,可以将相应数据库进行删除。
-- IF EXISTS为可选性,用于防止数据库不存在时报错。
DROP DATABASE [IF EXISTS] <数据库名>
表的基本操作
表的创建
CREATE TABLE <表名> (<字段1> <数据类型> <该列所需约束>,
<字段2> <数据类型> <该列所需约束>,
<字段3> <数据类型> <该列所需约束>,
<字段4> <数据类型> <该列所需约束>,
.
.
.
<该表的约束1>, <该表的约束2>,……);
示例
-- 创建一个名为Product的表
CREATE TABLE Product(
product_id CHAR(4) NOT NULL,
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32) NOT NULL,
sale_price INT,
purchase_price INT,
regist_date DATE,
PRIMARY KEY (product_id)
);
-
CHAR
为定长字符,这里CHAR
旁边括号里的数字表示该字段最长为多少字符,少于该数字将会使用空格进行填充。 -
VARCHAR
表示变长字符,括号里的数字表示该字段最长为多少字符,存储时只会按照字符的实际长度来存储,但会使用额外的1-2字节来存储值长度。 -
PRIMARY KEY
:主键,表示该字段对应的内容唯一且不能为空。 -
NOT NULL
:在NULL
之前加上了表示否定的NOT
,表示该字段不能输入空白。
通过SHOW TABLES
命令来查看当前数据库下的所有的表名:
SHOW TABLES;
通过DESC <表名>
来查看表的结构:
DESC Product;
表的删除
DROP TABLE <表名>;
-- 例如:DROP TABLE Product;
表的更新
通过ALTER TABLE
语句,我们可以对表字段进行不同的操作
示例:
1.创建一张名为Student的表
CREATE TABLE Student(
id INT PRIMARY KEY,
name CHAR(15)
);
DESC student;
2.更改表名
通过RENAME
命令,将表名从Student => Students。
ALTER TABLE Student RENAME Students;
3.插入新的字段
通过ADD
命令,新增字段sex和age。
ALTER TABLE Students ADD sex CHAR(1), ADD age INT;
4.字段的删除
通过DROP
命令,可以对不在需要的字段进行删除。
-- 删除字段stu_num,在此之前先add 一个 stu_num 字段
ALTER TABLE Students DROP stu_num;
5.字段的修改
通过MODIFY
修改字段的数据类型。
-- 修改字段age的数据类型
ALTER TABLE Students MODIFY age CHAR(3);
通过CHANGE
命令,修改字段名或类型
-- 修改字段name为stu_name,不修改数据类型
ALTER TABLE Students CHANGE name stu_name CHAR(15);
-- 修改字段sex为stu_sex,数据类型修改为int
ALTER TABLE Students CHANGE sex stu_sex INT;
表的查询
通过SELECT
语句,可以从表中取出所要查看的字段的内容:
SELECT <字段名>, …… FROM <表名>;
直接查询表的全部字段使用 * ,星号代表全部字段的意思。
示例:
1.建表并插入数据
在MySQL中,通过INSERT
语句往表中插入数据
-- 向Product表中插入数据
INSERT INTO Product VALUES
('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20'),
('0002', '打孔器', '办公用品', 500, 320, '2009-09-11'),
('0003', '运动T恤', '衣服', 4000, 2800, NULL),
('0004', '菜刀', '厨房用具', 3000, 2800, '2009-09-20'),
('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15'),
('0006', '叉子', '厨房用具', 500, NULL, '2009-09-20'),
('0007', '擦菜板', '厨房用具', 880, 790, '2008-04-28'),
('0008', '圆珠笔', '办公用品', 100, NULL,'2009-11-11')
;
2.查看表的内容
-- 查看表的全部内容
SELECT * FROM Product;
-- 查看部分字段包含的内容
SELECT product_id,product_name,sale_price FROM Product;
3.对查看的字段从新命名
通过AS
语句对展示的字段另起别名,这不会修改表内字段的名字。 设定汉语别名时需要使用双引号(")括起来,英文字符则不需要。
SELECT
product_id AS ID,
product_type AS TYPE
FROM Product;
4.常数的查询
SELECT
子句中,除了可以写字段外,还可以写常数。
SELECT
'商品' AS string,
'2009-05-24' AS date,
product_id,
product_name
FROM Product;
5.删除重复行
使用DISTINCT
可以去除重复行。
SELECT DISTINCT regist_date FROM Product;
可以通过组合使用,来去除列组合重复的数据。DISTINCT
关键字只能用在第一个列名之前。
SELECT DISTINCT product_type, regist_date FROM Product;
6.指定查询条件
首先通过WHERE
子句查询出符合指定条件的记录,然后再选取出SELECT
语句指定的列,WHERE
子句要紧跟在FROM
子句之后。语法结构如下:
SELECT <字段名>, ……
FROM <表名>
WHERE <条件表达式>;
例:
SELECT product_name
FROM Product
WHERE product_type = '衣服';
MongoDB
学习参考:https://github.com/datawhalechina/fun-rec/blob/master/docs/%E7%AC%AC%E4%BA%8C%E7%AB%A0%20%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%E5%AE%9E%E6%88%98/2.2%E6%96%B0%E9%97%BB%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%E5%AE%9E%E6%88%98/docs/2.2.1.2%20MongoDB%E5%9F%BA%E7%A1%80.md
MongoDB简介
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
MongoDB特点
- MongoDB 是一个面向文档存储的数据库,操作简单。
- 可以在MongoDB记录中设置任何属性的索引 (如:FirstName=“Sameer”,Address=“8 Gandhi Road”)来实现更快的排序。
- 可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
- 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上,这就是所谓的分片。
- Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
- MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
- Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
- Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
- Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
- GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
- MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
- MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
- MongoDB安装简单
MongoDB 概念解析
MongoDB中基本的概念是文档、集合、数据库。
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
MongoDB 创建数据库
"show dbs" 命令可以显示所有数据库的列表。
show dbs
执行 “db” 命令可以显示当前数据库对象或集合。
运行"use"命令,可以连接到一个指定的数据库。
MongoDB 创建数据库的语法格式如下(如果数据库不存在,则创建数据库,否则切换到指定数据库):
use DATABASE_NAME
示例
在此创建数据库tobytest
注意: 使用 show dbs 命令,我们刚创建的数据库 tobytest并不在数据库的列表中, 要显示它,我们需要向 tobytest数据库插入一些数据。并且,在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
MongoDB 创建集合
db.createCollection(name, options)
- name: 要创建的集合名称
- options: 可选参数, 指定有关内存大小及索引的选项
options 可以是如下参数:
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。 |
autoIndexId | 布尔 | 3.2 之后不再支持该参数。(可选)如为 true,自动在 _id 字段创建索引。默认为 false。 |
size | 数值 | (可选)为固定集合指定一个最大值,即字节数。 如果 capped 为 true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
示例
db.createCollection("tobycollection")
如果要查看已有集合,可以使用 show collections 或 show tables 命令:
MongoDB 删除集合
MongoDB 中使用 drop() 方法来删除集合。
db.collection.drop()
MongoDB 插入文档
文档的数据结构和 JSON 基本一样,所有存储在集合中的数据都是 BSON 格式(一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称)。
插入文档
MongoDB 使用 insert()
或save()
方法向集合中插入文档,语法如下:
db.COLLECTION_NAME.insert(document)
或
db.COLLECTION_NAME.save(document)
- save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 来代替。
- insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。
实例
先在tobytest 数据库 中创建一个col集合,之后将文档存储在该集合中
db.col.insertOne({
title:'Toby MongoDB',
description:'this is MongoDB',
tags:['mongodb','database','NoSQL'],
likes:1
})
查看已插入文档:
db.col.find()
可以将数据定义为一个变量,对该变量执行插入操作,
document=({title:'Toby another MongoDB',
description:'this is another MongoDB',
tags:['mongodb','database','NoSQL'],
likes:2
})
db.col.insertOne(document)
MongoDB 更新文档
MongoDB 使用 update() 和 save() 方法来更新集合中的文档。接下来让我们详细来看下两个函数的应用及其区别。
update() 方法
update() 方法用于更新已存在的文档。语法格式如下:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如 , , ,inc…)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
通过 updateOne() 方法来更新标题(title):
db.col.updateOne({'title':'Toby MongoDB'},{$set:{'title':'mongoDB'}})
MongoDB 删除文档
MongoDB remove() 函数是用来移除集合中的数据。
remove() 方法的基本语法格式如下:
db.collection.remove(
<query>,
<justOne>
)
- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
以下集合有四个文档,其中有两个title 为 ‘Toby MongoDB’ 的文档
接下来我们移除 title 为 ‘Toby MongoDB’ 的文档:
db.col.deleteMany({'title':'Toby MongoDB'})
注:mongoDB的remove在新版本已经弃用了,建议使用deleteMany()函数,若要删除一个文档,可用deleteOne()函数,对应remove里的justOne设为1.
MongoDB 查询文档
MongoDB 查询文档使用 find() 方法。
db.collection.find(query, projection)
- query :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,以格式化的方式来显示所有文档,语法格式如下:
db.col.find().pretty()
除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。
db.col.findOne()
MongoDB AND 条件
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
语法格式如下:
db.col.find({key1:value1, key2:value2}).pretty()
MongoDB OR 条件
MongoDB OR 条件语句使用了关键字 $or,语法格式如下:
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
MongoDB 排序
MongoDB sort() 方法
在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。
语法
sort()方法基本语法如下所示:
db.COLLECTION_NAME.find().sort({KEY:1})
Redis
学习参考:https://github.com/datawhalechina/fun-rec/blob/master/docs/%E7%AC%AC%E4%BA%8C%E7%AB%A0%20%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%E5%AE%9E%E6%88%98/2.2%E6%96%B0%E9%97%BB%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%E5%AE%9E%E6%88%98/docs/2.2.1.3%20Redis%E5%9F%BA%E7%A1%80.md
Redis简介
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。由于是内存数据库,读写非常高速,可达10w/s的评率,所以一般应用于数据变化快、实时通讯、缓存等。但内存数据库通常要考虑机器的内存大小。Redis 是完全开源免费的,遵守 BSD 协议,是一个灵活的高性能 key-value 数据结构存储,可以用来作为数据库、缓存和消息队列。
Redis特点
- Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载到内存使用。
- Redis 不仅支持简单的 key-value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。
- Redis 支持主从复制,即 master-slave 模式的数据备份。
可用Redis Desktop Manager软件更方便的查看Redis一些数据。
上图为将爬取到的sina新闻存取到Redis数据库。
Redis基本操作
1、基本操作命令:
-
切换库指令
redis.conf配置中默认16个库,下标从0~15。进入客服端默认选中第0个库,可以通过select命令进行切换,index表示库的小标。
SELECT index
-
删除当前库的数据
删除当前选择的数据库中的所有数据,这个命令永远不会出现失败。
FLUSHDB
-
删除所有库的数据
删除所有数据库里面的数据,注意是所有数据库,这个命令永远不会出现失败。
FLUSHALL
-
查看key的数量
查看当前选择的库中key的数量
DBSIZE
2、Key的操作命令:
-
查找符合模板的Key
KEYS pattern
该指令查找数据库所有符合pattern的key,其中pattern可以为?、* 、[abc…]、[a-d]等方式。其中?代表一个任意一个字符,*代表任意0个或多个字符,[abc…]代表只能是[]中的值,[a-d]代表a到d范围内总的值。
127.0.0.1:6378> keys * 1) "age" 2) "school" 3) "home" 4) "name" 127.0.0.1:6378> keys *e 1) "age" 2) "home" 3) "name" 127.0.0.1:6378> keys a?e 1) "age" 127.0.0.1:6378> keys [a-n][ao]me 1) "home" 2) "name" 127.0.0.1:6378> keys [a-n][a]me 1) "name"
-
查找存在key的数量
EXISTS key or [key…]
该指令为了查找一个或多个key,返回存在key值的数量。
127.0.0.1:6378> exists name (integer) 1 127.0.0.1:6378> exists name home id (integer) 2
-
设置过期时间
EXPIRE key seconds
expire 设置 key 的过期时间,时间过期后,key 会被自动删除,设置成功返回1,key不存在返回0。
TTL key
ttl 命令以秒为单位返回key的剩余过期时间,如果key不存在返回 -2 key 存在但没有关联超时时间则返回 -1 。
127.0.0.1:6378> expire name 30 (integer) 1 127.0.0.1:6378> ttl name (integer) 26 127.0.0.1:6378> ttl name (integer) -2 127.0.0.1:6378> ttl age (integer) -1 127.0.0.1:6378> ttl id (integer) -2
-
Key所属类型
TYPE key
type命令以字符串的形式返回存储在
key
中的值的类型,可返回的类型有:string
,list
,set
,zset
,hash
和stream
,如果key值不存在返回none
。127.0.0.1:6378> set key1 "value" OK 127.0.0.1:6378> lpush key2 "value" (integer) 1 127.0.0.1:6378> SADD key3 "value" (integer) 1 127.0.0.1:6378> type key1 string 127.0.0.1:6378> type key2 list 127.0.0.1:6378> type key3 set 127.0.0.1:6378> type key none
-
删除Key
DEL key or [key…]
del命令删除指定的key,不存在的key忽略,返回0,如果key存在,返回删除的key的个数。
127.0.0.1:6378> del key (integer) 0 127.0.0.1:6378> del key1 key2 (integer) 2
其他像是string命令、列表—list命令、哈希类型—hash命令、集合类型—set命令 等可看原文学习。
正好赶上考六级qwq,时间有限下次把 python中 Pymysql的使用 、PyMongo的使用,以及redis的使用补上。