系统学习数据库day20

MongoDB和MySQL的区别

MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库(NoSQL),也叫文档型数据库,是一种NoSQL的数据库。它们各有各的优点,关键是看用在什么地方。所以我们所熟知的那些SQL语句就不适用于MongoDB了,因为SQL语句是关系型数据库的标准语言。

一、关系型数据库-MySQL

1、在不同的引擎上有不同的存储方式。
2、查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高。
3、开源数据库的份额在不断增加,mysql的份额页在持续增长。
4、缺点就是在海量数据处理的时候效率会显著变慢。

二、非关系型数据库-MongoDB

非关系型数据库(nosql ),属于文档型数据库。先解释一下文档的数据库,即可以存放xml、json、bson类型系那个的数据。这些数据具备自述性,呈现分层的树状数据结构。数据结构由键值(key=>value)对组成。

1、存储方式:虚拟内存+持久化。
2、查询语句:是独特的MongoDB的查询方式。
3、适合场景:事件的记录,内容管理或者博客平台等等。
4、架构特点:可以通过副本集,以及分片来实现高可用。
5、数据处理:数据是存储在硬盘上的,只不过需要经常读取的数据会被加载到内存中,将数据存储在物理内存中,从而达到高速读写。
6、成熟度与广泛度:新兴数据库,成熟度较低,Nosql数据库中最为接近关系型数据库,比较完善的DB之一,适用人群不断在增长。
在这里插入图片描述

基本操作

// 查一条数据
db.getCollection("students").findOne();
// 指定要返回的域(字段)
db.students.findOne({}, {"stu_no": 1, "stu_name": 1, "address":1, "_id":0});

在这里插入图片描述

/**
查所有数据
*/

db.students.find();
db.students.find({});
//指定要返回的域(字段)
db.students.find({}, {"stu_no": 1, "stu_name": 1});
//查询年龄大于12岁的所有学生
db.students.find({age : {$gt:12}})


//查询年龄在9~12之间(含)的学生信息
db.students.find({age: {$gte: 9,$lte: 12}});


//查询未设置/已设置年龄的学生信息
//db.students.find({age: null});
db.students.find({age: {$ne: null}});

//查询学生年龄在9岁和12岁的学生信息
db.students.find({age: {$in: [9, 12]}});



//查询所有12岁以上的男生和9岁以下的女生
db.students.find({
	$or: [
		{sex: "男", age: {$gt: 12}},
		{sex: "女", age: {$lt: 9}}
	]
});


db.students.find({stu_name: /^/});


//查找所有姓“李”,名只有一个字的学生信息
db.students.find({stu_name: /^.$/});

//查找姓名中包含“雪”字的学生信息
db.students.find({stu_name: //});

//查找所有学生的语文成绩
db.grades.find({"grade.course_name": "语文"});


//查找所有学生中语文成绩已经及格的学生信息
db.grades.find({"grade.course_name": "语文", "grade.score": {$gte: 60}});

db.grades.find({
$and: [
	{"grade.course_name": "语文"},
	{"grade.score": {$gte: 60}}
	]
});


//查找只有两门成绩的学生信息
db.students.find({grades: {$size: 2}});


//统计学生总人数
db.students.count();
db.students.find({grades: {$size: 2}}).count();


//查找所有学生的居住区域
db.students.distinct("address");
db.students.distinct("address", {class_name: "三年级一班"});


//统计语文成绩的最高分/最低分
db.grades.aggregate([
//where
{
	$match: {"grade.course_name": "语文"}
},
//group by
{
	$group: {
		_id: null,
		maxScore: {$max: "$grade.score"},
		minScore: {$min: "$grade.score"},
		avgScore: {$avg: "$grade.score"},
	}
}
]);

在这里插入图片描述

//统计学生张三的各科总分
db.grades.aggregate([
//where
{
	$match: {"stu_name": "张三"}
},
//group by
{
	$group: {
		_id: null,
		totalScore: {$sum: "$grade.score"}
	}
}
]);


//统计每个班的学生人数
db.students.aggregate([
{
	$group: {
		_id: "$class_name",
		total: {$sum: 1}
	}
}
]);


//查找三门成绩都及格(>=60)的学生

db.grades.aggregate([
//where
{
	$match: {"grade.score":{$gte: 60}}
},
//group by
{
	$group: {
		_id: "$stu_no",
		total: {$sum: 1}
	}
},
// having
{
	$match: {
		total: {$eq: 3}
	}
}
]);



// 将学生的语文成绩从高到低排序
db.grades.find({"grade.course_name": "语文"}).sort({"grade.score": -1});




//将学生的语文成绩按照年龄和成绩排序
db.grades.find({"grade.course_name": "语文"}).sort({"age": -1, "grade.score": -1});
db.grades.find({"grade.course_name": "语文"}).sort({"grade.score": -1, "age": -1});

//获取第3页学生成绩信息,每页8条
db.grades.find().skip(16).limit(8);
db.grades.find({"grade.course_name": "语文"}).sort({"grade.score": -1}).skip(8).limit(8);

修改

// 设置学生的年龄为20岁
db.students.updateMany({}, {$set: {age: 20}});

// 删除students的phone_no和sex
db.students.updateMany({}, {$unset: {phone_no: null, sex:null}});



// 添加用户created_at为系统当前时间
db.users.updateMany({}, {$currentDate: {created_at: true}});

// 将用户的年龄+1
db.users.updateMany({}, {$inc: {age: -2}});

// updateOne
db.users.updateOne({}, {$inc: {age: -2}});
// replaceOne 替换文档
db.users.replaceOne({}, {'a': 1});


// 批量删除数据
db.users.find({username: /^lili/});
db.users.deleteMany({username: /^lili/});

// 删除一条数据
db.users.deleteOne({username: /^user/});

// 危险操作:删除集合中所有的内容
db.users.deleteMany({})

python 操作mongodb

查询


import pymongo

myclient = pymongo.MongoClient('mongodb://localhost:27017/')
mydb = myclient["test"]  # 链接的数据名
print(mydb)

mycol = mydb['students'] # 选表

print(mycol.find_one())
# print(type(mycol.find_one()))  # <class 'dict'>
#  # 查询所有
# for x in mycol.find():
#     print(x)

# 我们可以使用 find() 方法来查询指定字段的数据,将要返回的字段对应值设置为 1。
# for x in mycol.find({}, {"stu_no": 1, "stu_name": 1, "address":1, "_id":0}):
#   print(x)

#条件查询
# myquery = {"stu_name": "李四"}
#
# mydoc = mycol.find(myquery)
#
# for x in mydoc:
#     print(x)


# 字段中age值大于 "12.的数据,大于的修饰符条件为 {"$gt":12.} :
# myquery = {"age": {"$lt":  12.0}}
# mydoc = mycol.find(myquery)
#
# for x in mydoc:
#    print(x)


# 如果我们要对查询结果设置指定条数的记录可以使用 limit() 方法,该方法只接受一个数字参数。

# myresult = mycol.find().limit(3)
#
# for x in myresult:
#     print(x)

插入

import pymongo

myclient = pymongo.MongoClient('mongodb://localhost:27017/')
mydb = myclient["test"]  # 链接的数据名
print(mydb)

mycol = mydb['students'] # 选表

# mydict = { 'stu_no': 1001.0, 'stu_name': '李明', 'class_name': '三年级一班', 'address': '希望小区', 'age': 20.0, 'grades': [{'course_name': '语文', 'teacher': '王老师', 'score': 98.0}, {'course_name': '数学', 'teacher': '李老师', 'score': 76.0}, {'course_name': '英语', 'teacher': '吴老师', 'score': 51.0}]}
#
#
# x = mycol.insert_one(mydict)
# print(x.inserted_id)
# print(x)
mylist = [
 {"stu_no": 1002, "stu_name": "王浩", "sex": "男", "class_name": "三年级一班", "address": "希望小区", "age": 12,
  "grades": [{"course_name": "语文", "teacher": "王老师", "score": 87},
             {"course_name": "数学", "teacher": "李老师", "score": 50},
             {"course_name": "英语", "teacher": "吴老师", "score": 63}]},
     {"stu_no": 1004, "stu_name": "李思", "sex": "女", "class_name": "三年级一班", "address": "希望小区", "age": 12,
      "grades": [{"course_name": "语文", "teacher": "王老师", "score": 79},
                 {"course_name": "数学", "teacher": "李老师", "score": 68},
                 {"course_name": "英语", "teacher": "吴老师", "score": 41}]}]

x = mycol.insert_many(mylist)

# 输出插入的所有文档对应的 _id 值
print(x.inserted_ids)

修改


import pymongo

myclient = pymongo.MongoClient('mongodb://localhost:27017/')
mydb = myclient["test"]  # 链接的数据名
print(mydb)

mycol = mydb['students'] # 选表

myquery = {"stu_name":"王浩"}
new_values = {"$set": {"stu_name":"王大浩"}}

mycol.update_one(myquery, new_values)

```
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210715222755533.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5Mjc2MzM3,size_16,color_FFFFFF,t_70)
### 删除

```python

import pymongo

myclient = pymongo.MongoClient('mongodb://localhost:27017/')
mydb = myclient["test"]  # 链接的数据名
print(mydb)

mycol = mydb['students'] # 选表

myquery = {"stu_name":"王大浩"}

mycol.delete_one(myquery)

```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值