前端数据库表格的基本使用
以前数据存储在文本文件中的data.json
- 缺点1:数据存取不方便,不利于维护和扩展,当数据量大了之后,无法直接通过打开文件的形式对数据进行操作;
- 缺点2:数据存储比较分散,无法进行集中式管理;
- 缺点3:安全性较低,由于数据是直接存储在文本文件中的,所有无法进行数据的加密,存在安全隐患
Sql(Structured Query Language)数据库
提供了安全机制、便于通过Sql语句对数据直接进行操作
- 支持 结构化查询语言(Sql)的数据库,叫做
Sql数据库
Sql
是一种查询语言,能够很方便的对数据进行CRUD(增删改查)
数据库就是数据的仓库用来按照特定的结构去组织和管理我们的数据,有了数据库我们就可以更加方便、便捷的操作(C / R / U / D)我们需要保存的数据。
数据库都是将数据存到文件(硬盘)中 只是存储的形式不同 Excel 就可以看作一个数据库
常见的数据库分类
-
传统的关系型数据库(Sql数据库):Oracle(甲骨文 Java)、DB2、MySql、MS SQL Server、Sqlite【关系型数据库,对于大量数据的存取效率很高】
-
现在比较流行的非关系型数据库(No-Sql数据库):Redis(内部以键值对形式存储数据,是内存数据库)、CouchDB、MongoDb(可以把数据对应到实际的物理磁盘,MongoDB使用JS来操作数据)【一般当作中间层来使用,对于少量数据存取速度非常快,但是当数据多了之后,效率就变慢】
安装配置mysql
、`navicat
安装单独得出mysql服务
navicat一键激活然后一直选择下一步就可以安装路径默认尽量不要改
数据库可视化工具navicat
的基本使用(重点学会表格的创建和增删查改)
1打开和关闭数据库连接
2创建用户,设置用户权限
3建立数据库,新建表,设计表(设置字段类型),设置id新增 ,日期自动插入
4新建users用户表,表字段为:id、name、age、gender、address、isdel.
id自增:设为主键,勾选自动递增
主键:是用来标识数据表中的每一行数据的唯一性,确保独一无二。
新建一张users表
-- 新建一张 Users 表
表中有 6 个 字段【注意:在JS中每个对象身上有很多属性,当这个对象的数据,存储到数据中之后,这些属性,就被叫做 字段】
id 用户 id
number -> Int(整数类型)
Id必须要有,同时不能重复
主键:是用来唯一标识一条数据的,标识数据具有唯一性,不能重复
注意:在一个表中,一般只有一个主键来标识唯一性
如果勾选了Int 类型的 Id为 自动增长,则每次写入数据的时候,可以不提供id,数据库会自动写入一个Id
name 用户名
string -> varchar(可变长度的字符)
不能为空
age 年龄
number -> Int
gender 性别
string -> varchar
address 地址
string -> varchar
isdel 是否被删除
bool -> boolean tinyint
使用Sql语句对数据库执行基本操作
查询
1查询的sql语句 查询出来的数据都是结果集
2语法:select*from表名where条件 *表示全部
select * from stuInfo; -- 表示查询所有的数据信息
select id,name,gender from stuinfo; -- 根据指定的字段来查询
select * from stuinfo where id = 2; -- 查询id为2的那一条数据
select name,age from stuinfo where id = 3; -- 查询id为3的那条数据中的name age id
select * from stuinfo where id =3 or id= 5; -- 查询id为3 和5 的那两条数据 or表示与的意思
select * from stuinfo where id in (2,3,4,5,7); -- 查询id为 2 3 4 5 7 的那些数据 in表示包含里面的数如果(1,3)就只能找到1和3这俩个数
增加
语法:insert into 表名(字段1,字段2,...)values(值1,值2...)
insert into stuinfo(id,name,gender,age,phone)values(null,"张三","男","20","12114341411") ID值一般不用写 如果写了值就写个null
insert into stuinfo (name,age,gender) values ('李四',21,'男');
insert into stuinfo values (null,"王五","男",21); -- 如果直接写值的话,必须和字段匹配起来,这样写会报错的
insert into stuinfo values (null,"王五","男",21,"1234666"); -- 没有字段的时候,如果要是直接添加值的话,必须和字段对应,不能缺少
删除
3.删除语句
语法;delete from 表名 where 条件
DELETE FROM stuinfo where id = 7; 设置delete时要设置条件不然会把所有的删除的
DELETE FROM stuinfo where id = 2 or id = 8;
DELETE FROM stuinfo where id in (4,5,10);
DELETE FROM stuinfo WHERE gender ='男' AND age = 20; -- 通过多条件来删除数据 and 在这里表示并且的关系
DELETE FROM stuinfo WHERE id > 10; -- 还可以根据id的特性
修改
修改语句
语法:UPDATA 表名 set 字段1=值1,字段2=值2....where条件
UPDATE stuinfo set gender = '男'; -- 如果后面没有跟条件的话,则表示将表中所有的数据中的gender都改成了男
UPDATE stuinfo set gender = '女' WHERE id = 3; -- 将id为3的那条数据中的gender修改为“女”
UPDATE stuinfo set gender = '女' WHERE age = 21 and name = '李四'; -- 将数据表中名字叫"李四"
几个常用函数
count,MAX,MIN,avg
count 比较常用
SELECT count(*) FROM stuinfo; -- count用来统计所有的数据条数 会根据里面的参数来进行统计
SELECT count(id) FROM stuinfo; -- 根据id来统计具体的数据条数
SELECT count(phone) FROM stuinfo; -- 根据phone字段来统计具体的条数,如果数据为空则会忽略
SELECT MAX(age) FROM stuinfo; -- 查询年龄中的最大值
SELECT MIN(age) FROM stuinfo; -- 查询年龄中的最小值
SELECT avg(age) FROM stuinfo; -- 查询年龄中的平均值 average 平均值
order by
SELECT * FROM stuinfo order by id; -- order by是用来排序的,默认是以升序进行排序 asc就是升序排序
SELECT * FROM stuinfo ORDER BY id desc;
SELECT * FROM stuinfo ORDER BY age desc; -- desc是降序排列
limit
主要用于分页场合
语法
SELETE * FROM stuinfo ORDER BY id
select * from stuinfo limit 3; -- 取结果集中的前3条
SELECT * FROM stuinfo ORDER BY id limit 3;
-- limit n (索引) m (数量) 数据表中数据的索引默认也是从0开始的,索引只会对剩下的数据进行排序
SELECT * FROM stuinfo ORDER BY id LIMIT 3, 3;
-- 还可以这样来实现一个分页 limit count(数量) offset index(索引);
SELECT * FROM stuinfo ORDER BY id limit 3 offset 0;--从索引为0的位置向下查询3条
SELECT * FROM stuinfo ORDER BY id limit 3 offset 3; -- 从索引为3的位置向下查询3条
SELECT * FROM stuinfo ORDER BY id limit 3 offset 6; -- 从索引为6的位置向下查询3条
-- 经过上面的规律可以总结如下:
int pageCount = 3 ; -- 每页显示的条数
int pageSize = 1 ; -- 当前的页码 1 第1页 2 第2页 3 第3页
SELECT * FROM stuinfo ORDER BY id LIMIT pageCount offset (pageSize - 1)* pageCount;
数据库在node.js 上运用
建立服务器连接
const express = require('express')
连接数据库
const mysql = require('mysql')
建力服务器
const app = express()
端口连接
app.listen('3009', () => {
console.log('http://127.0.0.1:3009')
})
/ 创建一个连接对象
const conn = mysql.createPool({
host: 'localhost', // 主机
user: 'root', // 用户名
password: '', // 密码
database: 'mybase58' // 你想操作的数据库的名称
})
// 不用手动打开连接
app.get('/', (req, res) => {
// 查询
// let sql = 'select * from user where id = 100'
// 调用query方法可以实现指定的Sql语句,执行完之后,会调用指定的回调函数,同时给回调函数传入三个参数
// err:操作失败的错误信息
// results:操作成功的msyql服务器的返回结果,查询返回结果集,在这里,返回的数据格式是数组
// fields:查询特有的返回数据,主要用于描述数据表及字段的相关信息,对于前台业务的影响不大---别理它,只有查询会有
// conn.query(sql语句,(err,results,fields)=>{})
// let obj = {
// //模拟从客户端接收的参数
// name: "海",
// gender: '男',
// age: 16,
// address: "105教室"
// }
// let sql = `insert into user(name,age,gender,address) values("${obj.name}","${obj.age}","${obj.gender}","${obj.address}")`
// 新增
// let obj = { // 模拟从客户端接收到的参数
// name: '你好呀',
// age: 16,
// gender: '男',
// address: '508教室'
// }
// let sql = `insert into users(name,age,gender,address) values('${obj.name}','${obj.age}','${obj.gender}','${obj.address}')`
// // 修改
// let obj = { // 模拟从客户端接收到的参数
// id: 10,
// name: '你好呀',
// age: 16,
// gender: '男',
// address: '508教室'
// }
// let sql = `update user set name = '${obj.name}',age= '${obj.age}',gender = '${obj.gender}',address = '${obj.address}' where id = '${obj.id}'`
// 删除
// let id = 10
// let sql = `delete from user where id = '${id}'`
conn.query(sql, (err, results, fields) => {
if (err) {
console.log(err)
}
else {
console.log(results)
console.log(typeof results)
console.log('-------------------------------------')
console.log(fields)
res.json(results)
}
})
})