以下学习笔记参考自Datawhale12月组队学习的推荐系统课程,内容包括MySQL、MongoDB以及Redis的一些基本命令的使用。
项目原链接: https://github.com/datawhalechina/fun-rec
学习参考: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 = '衣服';
学习参考: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 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
MongoDB中基本的概念是文档、集合、数据库。
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
"show dbs" 命令可以显示所有数据库的列表。
show dbs
执行 “db” 命令可以显示当前数据库对象或集合。
运行"use"命令,可以连接到一个指定的数据库。
MongoDB 创建数据库的语法格式如下(如果数据库不存在,则创建数据库,否则切换到指定数据库):
use DATABASE_NAME
在此创建数据库tobytest
注意: 使用 show dbs 命令,我们刚创建的数据库 tobytest并不在数据库的列表中, 要显示它,我们需要向 tobytest数据库插入一些数据。并且,在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
db.createCollection(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 中使用 drop() 方法来删除集合。
db.collection.drop()
文档的数据结构和 JSON 基本一样,所有存储在集合中的数据都是 BSON 格式(一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称)。
MongoDB 使用 insert()
或save()
方法向集合中插入文档,语法如下:
db.COLLECTION_NAME.insert(document)
或
db.COLLECTION_NAME.save(document)
先在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 使用 update() 和 save() 方法来更新集合中的文档。接下来让我们详细来看下两个函数的应用及其区别。
update() 方法用于更新已存在的文档。语法格式如下:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
通过 updateOne() 方法来更新标题(title):
db.col.updateOne({'title':'Toby MongoDB'},{$set:{'title':'mongoDB'}})
MongoDB remove() 函数是用来移除集合中的数据。
remove() 方法的基本语法格式如下:
db.collection.remove(
<query>,
<justOne>
)
以下集合有四个文档,其中有两个title 为 ‘Toby MongoDB’ 的文档
接下来我们移除 title 为 ‘Toby MongoDB’ 的文档:
db.col.deleteMany({'title':'Toby MongoDB'})
注:mongoDB的remove在新版本已经弃用了,建议使用deleteMany()函数,若要删除一个文档,可用deleteOne()函数,对应remove里的justOne设为1.
MongoDB 查询文档使用 find() 方法。
db.collection.find(query, projection)
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,以格式化的方式来显示所有文档,语法格式如下:
db.col.find().pretty()
除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。
db.col.findOne()
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
语法格式如下:
db.col.find({key1:value1, key2:value2}).pretty()
MongoDB OR 条件语句使用了关键字 $or,语法格式如下:
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。
sort()方法基本语法如下所示:
db.COLLECTION_NAME.find().sort({KEY:1})
学习参考: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(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。由于是内存数据库,读写非常高速,可达10w/s的评率,所以一般应用于数据变化快、实时通讯、缓存等。但内存数据库通常要考虑机器的内存大小。Redis 是完全开源免费的,遵守 BSD 协议,是一个灵活的高性能 key-value 数据结构存储,可以用来作为数据库、缓存和消息队列。
可用Redis Desktop Manager软件更方便的查看Redis一些数据。
上图为将爬取到的sina新闻存取到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的使用补上。