Datawhale组队学习——推荐系统Task02 数据库的基本使用

以下学习笔记参考自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;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BvPUe2am-1639840636101)(file:///C:\Users\19635\AppData\Roaming\Tencent\Users\1963582058\QQ\WinTemp\RichOle\CNWG32L4S2D`]L%RKHN72UF.png)]

数据库的查看

  1. 查看所有存在的数据库
SHOW DATABASES [LIKE '数据库名'];

LIKE从句是可选项,用于匹配指定的数据库名称。LIKE 从句可以部分匹配,也可以完全匹配。

在这里插入图片描述

2.查看创建的数据库

SHOW CREATE DATABASE <数据库名>;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7GAdvTa3-1639840636102)(C:\Users\19635\Desktop\2W7NG_)]VFV@JJF1FG{AO3RO.png)

数据库的选择

在操作数据库前,必须指定所要操作的数据库。通过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,表示该字段不能输入空白。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hyOVoUoc-1639840636103)(file:///C:\Users\19635\AppData\Roaming\Tencent\Users\1963582058\QQ\WinTemp\RichOle)]Y]JE22M`UEN)BXH~M4S%JM.png)

通过SHOW TABLES命令来查看当前数据库下的所有的表名:

SHOW TABLES;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y9YaoaJc-1639840636104)(file:///C:\Users\19635\AppData\Roaming\Tencent\Users\1963582058\QQ\WinTemp\RichOle)]99VLMNIRB5Y(%N5AZ%AOCR.png)

通过DESC <表名>来查看表的结构:

DESC Product;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PiEcgyFB-1639840636104)(file:///C:\Users\19635\AppData\Roaming\Tencent\Users\1963582058\QQ\WinTemp\RichOle(XM)]42L1%MH(O9~4EW71T[2.png)

表的删除

DROP TABLE <表名>;

-- 例如:DROP TABLE Product;

表的更新

通过ALTER TABLE语句,我们可以对表字段进行不同的操作

示例:

1.创建一张名为Student的表

CREATE TABLE Student(
  id INT PRIMARY KEY,
  name CHAR(15)
);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wKKNYDA9-1639840636105)(file:///C:\Users\19635\AppData\Roaming\Tencent\Users\1963582058\QQ\WinTemp\RichOle%JX@QN7%KFFFH%_6@}B$F3A.png)]

DESC student;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y1RTl2sL-1639840636106)(file:///C:\Users\19635\AppData\Roaming\Tencent\Users\1963582058\QQ\WinTemp\RichOle\4E23_2DPODSW}D8)])1}$$KC.png)

2.更改表名

通过RENAME命令,将表名从Student => Students。

ALTER TABLE Student RENAME Students;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ui9p9jGj-1639840636107)(file:///C:\Users\19635\AppData\Roaming\Tencent\Users\1963582058\QQ\WinTemp\RichOle\6{DB)]JB(C{AG`~@AF6N@H]4.png)

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术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins表连接,MongoDB不支持
primary keyprimary 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 collectionsshow 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,hashstream,如果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的使用补上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值