1.清空并创建school数据库,并查看有哪些集合
use school; db.dropDatabase(); use school; show tables;2.创建三年级二班(class_3_2), 三年级五班(class_3_5), 三年级八班(class_3_8)共3个班,
并给每个班随机添加 10 名学生, 包含学生的姓名(s_name), 学生的性别(s_sex), 学生的年龄(s_sex),学生的爱好(s_habit)
for(class_index in (classes ='class_3_2', 'class_3_5', 'class_3_8'])) { for (var i = 1; i <= 10; i++) { db[classes[class_index]].insert({ "s_name": "zhoujielun" + i, "s_sex": Math.round(Math.random() * 10) % 2, "s_age": Math.round(Math.random() * 4) + 10, "s_habit": ["dance", "eat"] }); } } mongorestore -d school --dir D:\mongodb\output\school -u okk --authenticationDatabase admin -d 指恢复后的数据库 --dir 指数据来源 -u 用户名 --authenticationDatabase admin 授予权限3.查看三年级二班中的所有学生
db.getCollection('class_3_2').find() ---下面只用这个方式写 或 db.class_3_2.find()4.查看三年级二班中所有年龄是 11岁的学生
db.getCollection('class_3_2').find({"s_age": 11})5查看三年级二班中所有年龄大于 12 岁的学生
db.getCollection('class_3_2').find({"s_age": {$gt: 12}})6查看三年级二班中所有年龄大于 12岁并且小于 14岁的学生
db.getCollection('class_3_2').find({"s_age": {$gt: 12, $lt: 14}})7查看三年级二班中所有年龄大于 12 岁并且性别值为0的学生
db.getCollection('class_3_2').find({"s_age": {$gt: 12}, "s_sex": 0})8查看三年级二班中所有年龄小于 12 岁并且大于13岁的学生
db.getCollection('class_3_2').find({$or: [{"s_age": {$lt: 12}}, {"s_age": {$gt: 13}}]})9查看三年级二班中所有年龄是11 岁或 13 岁的学生
db.getCollection('class_3_2').find({"s_age": {$in: [11, 13]}})10.查看三年级二班中所有姓名带zhoujielun1字符的学生
db.getCollection('class_3_2').find({"s_name": {$regex: "zhoujielun1"}})11.查看三年级二班中所有姓名带zhoujielun1和zhoujielun2字符的学生
db.getCollection('class_3_2').find({"s_name": { $in: [new RegExp("zhoujielun1"), new RegExp("zhoujielun2")] }})12.三年二班,修改名为zhoujielun7的学生,年龄为9 岁,兴趣爱好为 跳舞和画画;
db.getCollection('class_3_2').update({"s_name": "zhoujielun7"}, {$set: {"s_age": 8, "s_habit": ["dance", "drawing"]}}) 三年二班中,追加zhoujielun7学生兴趣爱好唱歌; db.getCollection('class_3_2').update({"s_name": "zhoujielun7"}, {$push: {"s_habit": "sing"}})14.三年二班中,追加zhoujielun7学生兴趣爱好吹牛brag和打篮球play_basketball;
db.getCollection('class_3_2').update({"s_name": "zhoujielun7"}, {$push: {"s_habit": {$each: ["brag", "play_basketball"]}}})15…三年二班中,追加zhoujielun7学生兴趣爱好看电视(TV)和打篮球,要保证hobby数组不重复;
db.getCollection('class_3_2').update({"s_name": "zhoujielun7"}, {$addToSet: {"s_habit": {$each: ["TV", "play_basketball"]}}})16.查看三年二班中所有兴趣爱好有2项的学生
db.getCollection('class_3_2').find({"s_habit": {$size: 2}})17.查看三年二班中所有兴趣爱好包括画画的学生
db.getCollection('class_3_2').find({"s_habit": "drawing"})18查看三年二班中所有兴趣爱好既包括画画又包括跳舞的学生
db.getCollection('class_3_2').find({"s_habit": {$all: ["drawing", "dance"]}})19.查看三年二班中所有兴趣爱好有2项的学生的学生数目
db.getCollection('class_3_2').find({"s_habit": {$size: 2}}).count()20查看三年二班的第二位学生
db.getCollection('class_3_2').find({}).limit(1).skip(1)21查看三年二班的学生,按年纪升序
db.getCollection('class_3_2').find({}).sort({"s_age": 1})22.查看三年二班的学生,按s_sex降序
db.getCollection('class_3_2').find({}).sort({"s_sex": -1})23查看三年二班的学生,年龄值有哪些
db.getCollection('class_3_2').distinct('s_age')24.查看三年二班的学生,男生(sex为 0)年龄值有哪些
db.getCollection('class_3_2').distinct('s_age', {"s_sex": 0})25.给三年级二班所有学生的年龄都增加一岁
db.getCollection('class_3_2').update({}, {$inc: {"s_age": 1}}, {multi: true})26.三年二班删除所有 11 岁的学生
db.getCollection('class_3_2').remove({"s_age": 11})27.三年二班, 删除第一位 12岁的学生
db.getCollection('class_3_2').remove({"s_age": 12}, {justOne: 1})28.三年二班中,删除zhoujielun7学生的sex属性
db.getCollection('class_3_2').update({"s_name": "zhoujielun7"}, {$unset: {"s_sex": 1}})29.删除三年二班zhoujielun7学生的hobby数组中的头元素
db.getCollection('class_3_2').update({"s_name": "zhoujielun7"}, {$pop: {"s_habit": -1}})30.删除三年二班zhoujielun7学生的hobby数组中的尾元素
db.getCollection('class_3_2').update({"s_name": "zhoujielun7"}, {$pop: {"s_habit": 1}})31.删除三年二班zhoujielun7学生的hobby数组中的sing元素
db.getCollection('class_3_2').update({"s_name": "zhoujielun7"}, {$pull: {"s_habit": "sing"}})新建一个集合class_5_2,记录五年级二班的python成绩;
for (var i = 1; i <= 10; i++) { db.class_5_2.insert({ "s_name": "fujie" + i, "s_sex": Math.round(Math.random() * 10) % 2, "s_age": Math.round(Math.random() * 6) + 3, "s_score": { "mysqls": 60 + Math.round(Math.random() * 40), "djangos": 60 + Math.round(Math.random() * 40), "sockets": 60 + Math.round(Math.random() * 40) } }); }1_1.统计每名学生在考试中的总分
db.class_5_2.group({ key: {"s_name": 1}, cond: {}, reduce: function(curr, result) { result.total += curr.s_score.mysqls + curr.s_score.djangos + curr.s_score.sockets; }, initial: { total : 0 } })1_2.统计每名学生在考试中的总分
db.getCollection('class_5_2').aggregate([ {$group: {_id: "$s_name", s_score: {$sum: {$sum: ["$s_score.mysqls", "$s_score.djangos", "$s_score.sockets"]}}}} ])2_1.统计每名男生(s_sex为0代表男生,下同)在考试中的总分
db.class_5_2.group({ key: {"s_name": 1}, cond: {"s_sex": 0}, reduce: function(curr, result) { result.total += curr.s_score.mysqls + curr.s_score.djangos + curr.s_score.sockets; }, initial: { total : 0 } })2_2.统计每名男生 ,在考试中的总分
db.getCollection('class_5_2').aggregate([ {$match: {s_sex: 0}}, {$group: {_id: "$s_name", s_score: {$sum: {$sum: ["$s_score.mysqls", "$s_score.djangos", "$s_score.sockets"]}}}} ])2_3.统计每名男生在考试中的总分, 总分降序
db.getCollection('class_5_2').aggregate([ {$match: {s_sex: 0}}, {$group: {_id: "$s_name", s_score: {$sum: {$sum: ["$s_score.mysqls", "$s_score.djangos", "$s_score.sockets"]}}}}, {$sort: {s_score: 1}} ])3.统计每名男生在考试中的总分及平均分
db.class_5_2.group({ key: {"s_name": 1}, cond: {"s_sex": 1}, reduce: function(curr, result) { result.total += curr.s_score.mysqls + curr.s_score.djangos + curr.s_score.sockets; }, initial: { total : 0 }, finalize: function(item) { item.avg = (item.total / 3).toFixed(2); return item; } })4.根据姓名分组, 并统计人数
db.getCollection('class_5_2').aggregate([ {$group: {_id: "$s_name", num: {$sum: 1}}} ])5.根据姓名分组, 并统计,过滤人数大于 1 的学生
db.getCollection('class_5_2').aggregate([ {$group: {_id: "$s_name", num: {$sum: 1}}}, {$match: {num: {$gt: 1}}} ])6.创建用户school_admin,只能对school数据库进行读写操作;
use school; db.createUser({ user: "school_admin", pwd: "school_admin", roles: [{role: "readWrite", db: "school"}] })7.进入school数据库, 验证创建的用户是否存在
use school; db.auth('用户名', '密码')8.查看所有用户
db.getUsers()9.删除用户
db.dropUser('school_admin')1.分别列出几个非关系数据库和关系型数据库,并写出两者各自的优势(举例说明都分别适用于什么场景)。
非关系数据库:mongoDB,Hbase,Redis 关系型数据库:mysql,oracle,sqlserver,db2 非关系数据库优势: 1、容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等其他模型来说更容易理解; 2、使用方便:通用的SQL语言使得操作关系型数据库非常方便; 3、易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率; 4、支持SQL,可用于复杂的查询。 关系型数据库优势: 1、无需经过sql层的解析,读写性能很高; 2、基于键值对,数据没有耦合性,容易扩展; 3、存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,而关系型数据库则只支持基础类型。 非关系数据量使用场景: 1)海量数据存储; 2)多格式的数据存储; 3)对查询速度要求快的数据存储; 关系型数据库使用场景: 1)需要做复杂处理的数据; 2)数据量不是特别大的数据; 3)对安全性要求高的数据; 4)数据格式单一的数据;2.你用的 Mysql 是哪个引擎,各引擎之间有什么区别?
默认InnoDB 主要 MyISAM 与 InnoDB 两个引擎,其主要区别如下:InnoDB 支持事务,MyISAM 不支持, 这一点是非常之重要。事务是一种高级的处理方式,如在一列增删改中只要哪个出错还可以回滚还原 ,而 MyISAM 就不可以了;MyISAM 适合查询以及插入为主的应用, InnoDB 适合频繁修改以及涉及到安全性较高的应用;InnoDB 支持外键,MyISAM 不支持; MyISAM 是默认引擎,InnoDB 需要指定;InnoDB 不支持 FULLTEXT 类型的索引; InnoDB 中不保存表的行数,如 select count() from table 时,InnoDB; 需要扫描一遍整个表来算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。 注意的是,当 count()语句包含here 条件时 MyISAM 也需要扫描整个表;3.分别画出mysql和mongoDB的结构图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5P1wY1Jn-1572674835171)(C:\Users\97541\AppData\Roaming\Typora\typora-user-images\1558026206768.png)]
4.事务的特性?
1、原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执 行。 2、一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相 一致。 3、隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透 明的。 4、持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即 使数据库出现故障5.数据库索引的优势与弊端?
优势: 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 第二,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。 第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 弊端: 第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。 第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。6.mysql的两大运算模式分别是什么,你又是如何理解这两个模型的。
逐行查询运算模型:逐行遍历每条记录,对每条记录返回一个值。 分组查询运算模型:groupby分组进行的查询,select后只能是分组id,常量,聚合函数。是对每个组返回一个值,需通过having进行过滤分组后的条件。7.7.对于主从服务器你是怎么理解的?
1.做主从,可以说是做数据的备份,有利于故障的恢复 2.做主从,可以做到读写分离,主节点负责写操作,从节点负责读操作,这样就把读写压力分开,保证系统的稳定性. 二.主从服务器的实现原理 首先,主节点会把本服务的与写有关的操作记录下来,读操来不记录,这些操作就记录在local数据库中的oplog.$admin这个集合中,这是一个固定集合,大小是可以配置的,主要是通过配置oplogSize这个参数来实现,单位是M,大小一般为磁盘剩余空间的5%左右.因为是固定集合所以当固定集合放满日志的时候,新进来的日志就会把最旧的日志覆盖掉,如果这个值设置的不合理,导致数据很快的被覆盖,而从节点没有来得及更新,这样就会产生数据不同步的情况.设置为主节点的local数据库有会有oplog.$admin与slave这两个集合.slave记录的是从节点的信息. 从节点与主节点的数据同步主要是从节点定时的会去连接主节点,请求主节点的操作日志,从而对自己的数据副表进行同样的操作来达到数据的同步.从节点的local数据库中会多了source与me这两个集合,source是记录主节点的信息,me是记录从节点的标识8.什么是事务,事务有哪些并发问题,都分别如何解决的?
指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 简单的说,事务就是并发控制的单位,是用户定义的一个操作序列。 而一个逻辑工作单元要成为事务,就必须满足ACID属性。 脏读:Read committed!读提交,能解决脏读问题 不可重复读:一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读 Repeatable read 幻读:Serializable 但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。9.MongoDB有哪些特点:
高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。 模式自由。 支持动态查询。 支持完全索引,包含内部对象。 支持查询。 支持复制和故障恢复。 使用高效的二进制数据存储,包括大型对象(如视频等)。 自动处理碎片,以支持云计算层次的扩展性 支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。 文件存储格式为BSON(一种JSON的扩展)。 可通过网络访问10.画出以下sql语句的join示例图,标明哪个是a表哪个是b表,并注解。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q4kIdchm-1572674835172)(C:\Users\97541\AppData\Roaming\Typora\typora-user-images\1558026342643.png)]
个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读 Repeatable read 幻读:Serializable 但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
9.MongoDB有哪些特点:高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。 模式自由。 支持动态查询。 支持完全索引,包含内部对象。 支持查询。 支持复制和故障恢复。 使用高效的二进制数据存储,包括大型对象(如视频等)。 自动处理碎片,以支持云计算层次的扩展性 支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。 文件存储格式为BSON(一种JSON的扩展)。 可通过网络访问
10.画出以下sql语句的join示例图,标明哪个是a表哪个是b表,并注解。 [外链图片转存中...(img-Q4kIdchm-1572674835172)]