一、引入
1.1什么是NoSql
NoSQL(Not Only SQL)是一组非关系型数据库(或称为非SQL数据库)的统称,它们提供了与传统的关系型数据库不同的数据存储和检索方式。NoSQL数据库通常用于处理大量的、分布式的、非结构化或半结构化的数据,并且它们能够在大规模并行处理方面表现出色。
1.2NoSQL数据库的特点
1. **可扩展性**:NoSQL数据库通常更容易在多台机器上水平扩展,这允许它们处理巨大的数据量。
2. **高性能**:它们被设计为能够处理高并发读写操作,尤其是在大数据集上。
3. **灵活的数据模型**:NoSQL数据库不要求预定义数据模式,这意味着它们可以存储不同类型的数据而不需要像关系型数据库那样定义表结构。
4. **最终一致性**:许多NoSQL数据库在数据一致性方面采取了更宽松的策略,如Amazon DynamoDB使用的“eventual consistency”,这在某些高可用性场景下是有益的。
5. **键-值存储**:许多NoSQL数据库使用键-值对存储数据,这是最简单且最直接的数据存储方式之一。
6. **不同的数据类型支持**:不同类型的NoSQL数据库支持不同类型的数据模型,包括键值存储、文档存储、列族存储和图数据库。
1.3NoSQL数据库的主要类型
- **键值存储**(Key-Value Stores):如Redis、Riak、Amazon DynamoDB。
- **文档存储**(Document Databases):如MongoDB、CouchDB。
- **列族存储**(Wide-Column Stores):如Cassandra、HBase。
- **图数据库**(Graph Databases):如Neo4j、ArangoDB。
1.4总结
NoSQL数据库的兴起,在很大程度上是由于Web 2.0应用和社交媒体的需求,这些应用需要处理大量的用户生成数据,并且需要高可用性和可扩展性。然而,NoSQL并不是万能的,每种数据库都有其适用的场景和局限性。在实际应用中,需要根据具体的业务需求和数据特性来选择合适的数据库。
二、实战
2.1选择题
1. (单选题)关于NoSQL数据库和关系数据库,下列说法不正确的是( )。
- A. NoSQL数据库和关系数据库各有优缺点,但随着NoSQL的发展,终将取代关系数据库
- B. 关系数据库有关系代数理论作为基础,NoSQL数据库没有统一的理论基础
- C. NoSQL数据库可以支持超大规模数据存储,具有强大的横向扩展能力
- D. 大多数NoSQL数据库很难实现数据完整性
正确答案: A :NoSQL数据库和关系数据库各有优缺点,但随着NoSQL的发展,终将取代关系数据库;
2. (单选题)大数据时代,数据的存储与管理不需满足以下哪个要求()。
- A. 满足用户 的高并发读写
- B. 要适应多变的数据结构
- C. 满足完整性的约束条件
- D. 数据管理系统具有很高的扩展性,适应海量数据库的迅速增长
正确答案: C :满足完整性的约束条件;
3. (单选题)下列关于NoSQL数据库和关系型数据库的比较,不正确的是( )。
- A. NoSQL数据库缺乏统一的查询语言,而关系型数据库有标准化查询语言
- B. NoSQL数据库具有弱一致性,关系型数据库具有强一致性
- C. NoSQL数据库很容易实现数据完整性,关系型数据库很难实现数据完整性
- D. NoSQL数据库的可扩展性比传统的关系型数据库更好
正确答案: C :NoSQL数据库很容易实现数据完整性,关系型数据库很难实现数据完整性;
4. (单选题)以下不属于NoSQL数据库的是( )。
- A. Cassandra
- B. MySQL
- C. MongoDB
- D. CouchDB
正确答案: B :MySQL;
5. (单选题)NoSQL一词表示的含义是( )。
- A. 没有SQL
- B. 非关系型数据库
- C. 不是SQL
- D. 关系型数据库
正确答案: B :非关系型数据库;
2.2语句练习
1. 在s集合中插入以下数据。(insert、insertOne、insertMany都试试)
db.s.insert({sno:'1001',sname:' zhangsan', sage:'10'})
db.s.insertOne({sno:'1002',sname :'lisi',sage:'18'})
db.s.insertMany([{sno:'1003',sname:' wangwu',sage:'10"},{sno:'1004',sname:'zhaoliu', sage:'88'}])
db.s.insert({sno:'1005',sname:'lisi',addr:'hebei'})
db.s.insert({sno:'1006',sname:'zhangsan',addr:['beijing','hebei']})
2.查询学号为1001同学的姓名
db.s.find({sno:'1001'})
3.查询学生的人数
db.s.find().count()
4.查询18岁的lisi的学号和姓名
db.s.find({$and:[{ sname:'lisi'},{sage:'18'}]})
5.查询zhangsan及所有18岁同学的信息
db.s.find({$or:[{sname:'zhangsan'},{sage:'18'}]})
6.查询年龄为11或18岁的同学的姓名
db.s.find({sage:{$in:['11','18']}})
7.查询第一个文档
db.s.find()[0]
8.查询第五个文档
db.s.find()[4]