数据库
创建表
- 数据类型
+ 整数类型 int
+ 浮点类型 double
+ 日期类型 date/timestamp
+ 字符串类型 char varchar
* 可变varchar(n) 必须要给字符最大长度n 使用:用户名,密码,身份证号码。 n= 40 40 个字节,20个字符
* 不可变是char 不需要给字符长度,使用;商品描述、歌词...
* 空间换时间
* text 长度不限
- 首先足够用,其次尽量小
create table 表名(
id int,
name varchar(20)
);
- 查看创建表的语句
+ show create table 表名
- 查看表的明细
+ desc 表名
删除表
- drop table 表名
插入数据
- 第一种:全表字段插入
+ `insert into 表名 values (val1,val2...)`
+ 插入的字段类型和*顺序必须*与表的字段*类型*与顺序保持一致,个数是针对全表字段的插入
- 指定表字段的插入
+ `insert into 表名 (字段1,字段2...) values (val1,val2...)`
+ 插入的数据的顺序要与声明的字段名的顺序一致
+ 类型也要一致,个数也要一致
总结
sql 语句 结尾必须要有 分号
- 1: 登录:
- 2: 查看有哪些数据库
- 3: 切换数据库
- 4: show tables;
- 没有表: 必须创建表 create table ceshi(id int,name varchar(20));
- 5: 查看表字段明细
- 6: 插入数据
insert into 表名 (字段1,..) values (值1...) - 插入的是数据,表中字段;以及字段的类型;是在创建表示决定的
- 7:更新操作
UPDATE 表名 SET 字段1 = 表达式,[,字段2 = 表达式] [WHERE express布尔值] update student set tmp = 20+1,sex = sex where 1=1;
- 8:删除操作
DELETE FROM 表名 [,WHERE exr布尔值] delete from student where name = '马蓉';
- 9:truncate和delete的区别
- truncate table 表名
- delete会一条一条的删 自增id保留
- truncate先摧毁整张表,再创建一张和原来的表结构一模一样的表
- truncate在效率上比delete高
- truncate只能删除整表的数据,也就是格式化。
- truncate会把自增id截断恢复为1
查询语句
- DISTINCT 去重,尽量不要根据* 来去重
select distinct name,age from student;
- 查询语句可以指定多个字段查询,也可以使用* 查询
- 在企业中,使用SQL查询* 是会拉低查询效率的 ,建议少用* 查询
条件查询
select * from student where math > 66.6 or math < 66.6; - 语法:select * from 表 查询条件
> < <= >= = <> 大于、小于、大于(小于等于)、不等于
between...and 显示在某一区间的值
in(set) 显示在in列表中的值,例:in(100,200)
like ‘张pattern’ 模糊查询%
is null 判断是否为空
and 多个条件同时成立
or 多个条件任一成立
not 不成立,例:where not(salary>100)
模糊查询
- 包含关`select * from student where name like '%关%';`
- 以关开头`select * from student where name like '关%';`
- 以关结尾`select * from student where name like '%关';`
- 判断为空
select * from student where sex is not null;
聚合函数
- 统计数量
- 求和
- sum(math+english+chinese)
- 平均值
- avg(math+english+chinese)
- 找最值
- max(列)/min(列)/max(math+english+chinese)
排序(order by)
select * from student where 1= 1 order by chinese desc,math desc,english desc;
分组(group by)
- 如果聚合函数只有一行,需要对于不同的集合做聚合运算就加上分组
select zu,count(*) from student group by zu;
分页(limit)
- `select * from student limit 10,5;`
- limit offset(起始位置) count(显示多少个)
- limit 使用的时候,offset从0开始
- 豆瓣: offset (当前页-1)* 页显示数
+ count : 页显示数
默认端口(数据库汇总)
- oracle:1521
- sqlserver :1433
- mysql :3306
- mongodb :27017
- DB2 : 50000
mysql中间使用
使用步骤
- ?1:导入mysql 中间件 const mysql = require(‘mysql’);
- ?2:创建连接池 const pool =mysql.createPool()
- ?3:取出链接 pool.getConnection()
- ?4:操作数据 pool.query()
- ?5:释放链接 release()
- ?6:操作数据库完毕(err/success) 做什么(交给外部处理函数)
mysql中间件操作mysql 数据库方法封装
const pool = mysql.createPool({
connectionLimit : 10,// 一次性
host : 'localhost',
user : 'root',
port : '3306',
password : '******',
database : 'yanqi'
});
var db = {};
db.p = function (sql,parm,callback) {
// getConnection() 从连接池中获取链接
// 回参一:抛出错误
// 回参二:获取到的链接
pool.getConnection(function(error,connection){
if(error){
callback(error);// 错误异常处理
return // 获取链接池失败 以下不执行了
}
// query() 往数据库发送请求的
// 参一:sql语句
// 参二:回调函数:处理数据库的响应
// 回参一:抛出错误异常(错误优先原则)
// 回参二:数据库响应的正确结果
connection.query(sql,parm,function(error,results){
console.log(`${sql}===>${parm}`);
// --> 释放链接
connection.release();
// ----> 将操作数据库结果发送给外界让外处理
callback(error,results);// callback 是对查询结果的处理
})
})
}
作用:通过连接池去操作去操作数据库
参一: sql 语句 换句话,如果想对数据是增删改查操作,就写对应的sql 语句
参二: 回调函数:sql 语句执行的结果
——> 回参一: 返回的是错误信息
——> 回参二:sql 执行成功 输出的结果
MongoDB
- 关系是数据库对应多个集合
- 集合对应多个文档对象
- 在mongo中不论是db还是集合,你都无需去创建他
- 直接就当他已经存在,直接Use来使用
- use db名称;
- 接着会被切换到该db中
db.要创建的集合名称.save({}) ;这样集合就被创建了
- 1:启动服务器
mongod --dbpath "D:/mongodb/db" ?// 目录一定要存在自己创建随便名称‘
- 如果看到
waiting for connections on port 27017 说明服务已经启动
- 客户端连接服务器另开一个命令行
- 查询有哪些数据库
- 查询数据库:
show dbs; - 切换数据库:?
use 数据库名;
- 查询当前db下有哪些集合
- 查询数据:
db.集合名.find(); ?//查询出来的是文档对象 documentdb.users.find();
- 添加数据:
db.集合名.save(对象) ?//mongo默认会给我们加入_id作为该文档对象的唯一标识db.users.save({contry:'中国',name:'小明',score:77});
- 删除数据:
db.集合名.remove(条件对象); //条件匹配就会被删除db.users.remove({name:'小明'}); - 如果给定一个空对像,会匹配全部
- 更新数据:
db.集合名.update({匹配条件对象},{$set:{修改后的对象}}); db.users.update({name:'小明'},{$set:{contry:'印度'}});;
条件查询
练习:
? 查询姓名为小明的学生
db.users.find({name:'小明'});;
? 查询英语成绩大于90分的同学
db.users.find({score:{$gt:90}}); //查找成绩大于90分$gt
//$lt小于
? 查询数学成绩不等于88的同学
db.users.find({score:{$ne:88}});
? 查询总分大于200分的所有同学
db.users.find({score:{$gt:200}});
分页
db.users.find().skip(3).limit(3); - db.集合名称.find().跳到3.显示3条
? ? ? ? + limit 0,3
排序
db.users.find().sort({key:排序方式}); db.users.find().sort({'score':1}); ?//正数代表升序,负数代表降序
模糊匹配
db.users.find({name:{$regex:'小'}}); db.users.find({name:{$regex:'明'}});
聚合函数
-
需要求当前集合的记录数: -
db.users.find().count(); -
求最大值 -求整个集合的总成绩 ? + db.集合名.聚合({ 组的划分规则{_id:’1’,显示内容:{$sum:’$score’}} })
- 求所有人的平均分
db.users.aggregate({$group:{_id:'1',sumscore:{$avg:'$score' } }});
- 求按国家分组,求所有国家的总分
db.users.aggregate({$group:{_id:'$contry',sumScore:{$sum:'$score'}}});
-
添加基础数据: db.users.save({contry:’中国’,name:’小明’,score:77}); db.users.save({contry:’中国’,name:’小红’,score:88}); db.users.save({contry:’中国’,name:’小张’,score:99}); db.users.save({contry:’美国’,name:’jack’,score:45}); db.users.save({contry:’美国’,name:’rose’,score:67}); db.users.save({contry:’美国’,name:’mick’,score:89});
解决32位异常 mongod –dbpath=”路径” –journal –storageEngine=mmapv1
Mongoose
mongoose是mongoDB的一个对象模型工具,是基于node-mongodb-native开发的mongoDB的nodejs驱动,可以在异步的环境下执行。同时它也是针对mongoDB操作的一个对象模型库,封装了mongoDB对文档的一些增删改查等常用方法,让nodejs操作mongoDB数据库变得更加容易。
?
mySQL与 mongoDB 区别
1:mysql 是关系型数据库 mongoDB 是非关系型
2: mysql 需要自己创建连接池 操作数据库 ,mongoDB 内部自带连接池
3: 概念区分:
? myql 数据库/表/字段
? mongoDB 数据库/集合/文档最对象
4:操作数据:
- mysql 必须先创建数据库—>创建表—> 字段——>字段值的数据类型 这些必须在操作数据之前准备好 中间 字段有改变时候,必须要通过表来改变。不能通过操作数据的sql语句来修改
- mongoDB 创建数据库 ,集合以及文档对象,都可以通过操作数据的命令来创建或者修改。使用’命令行‘时,如果没有集合则会自动创建,有 则对集合中文档对象操作
|