后台提供的数据存放在数据库
1、关系型数据库----常用的数据库:MySQL Oracle SQLServer Access db2 fox pro
MySQL:
优点:免费、适合中小网站、性能非常不错
缺点:集群、容灾稍微弱一些
Oracle:
挺贵的、适合大型应用、金融级和银行常用
优点:性能不错、集群、容灾性非常强
缺点:不免费(挺贵的)
2、文件型数据库:sqlite、mongodb
3、空间型数据库
数据库分为客户端数据库和服务端数据库,node.js中的中间件mysql是一个客户端的数据库
MySQL的介绍
1)到www.mysql.com下载安装
2)安装数据库管理工具:sqlyog----用于管理mysql的数据库(因为MySQL只是一个命令行);或者navicat
数据库的基本概念
数据库有两种概念:
1)库:类似文件夹--用来管理,本身没法存数据
2)表:类似文件--存数据
行row---一条数据
列(字段,域,column):一个数据项
使用数据库管理工具:SQLyog
1)创建数据库
2)创建表----右击数据库下面的“表”,选择“创建表”,然后在出现的页面下面书写表中的字段
注意:字段中的主键primary key(具有唯一性、性能高)
创建表的另外一种方式,就是右击数据库 =》 导入 =》执行SQL脚本,引进用SQL书写的表单
注意:导入的sql文件的文件名要和在sqlyog中的数据库的名称一致(如下图所示),否则导入完之后并没有表格。
SQL的简单介绍---不区分大小写
1、数据库----创建、查看、选择、删除数据库
数据库的定义:数据库是存储数据库对象的容器,数据库分为系统数据库(安装完MySQL之后附带的数据库,用户不能直接修改这些系统数据库,information_schema performance_schema mysql test)和用户数据库(用户自己创建的数据库)
数据库对象:是指存储,管理,和使用数据的不同结构形式,包含表、视图、存储过程、触发器、事件
//1、创建数据库
CREATE DATABASE 数据库名
CREATE DATABASE `user`
// 2、查看数据库
SHOW DATABASES;
// 选择数据库
USE 数据库名字
USE `user`;
// 删除数据库
DROP DATABASE 数据库名
DROP DATABASE `user`;
2、存储引擎和数据类型
1)存储引擎:它指定了表的类型---如何存储和索引数据、是否支持事务、表在计算机中的存储方式。每种引擎各有优点,安装版是InnoDB,免安装版是MyISAM,还有MEMORY CSV BLACKHOLE等
// 查看引擎
SHOW ENGINES;
2)数据类型:整数类型 浮点数类型 定点数类型 字符串类型 位类型 日期和时间类型
SQL:结构查询语言,在数据库中只识别一种语言就是SQL
SQL标准写法:1)关键字大写;2)库,表,字段加上``
3、表的操作----创建、删除、查看、更新
// 1、创建表
CREATE TABLE 表名(
属性名 类型,
属性名 类型
);
// 需要声明使用哪个数据库
CREATE DATABASE student1;
USE student1;
CREATE TABLE table1(
NAME VARCHAR(33),
sex CHAR
);
// 2、删除表
DROP TABLE 表名
DROP TABLE table1;
// 3、查看表DESCRIBE SHOW CREATE TABLE
// 先声明使用哪个数据库
USE student;
// 查看表定义
DESCRIBE table1;
// 查看表详细定义
SHOW CREATE TABLE table1;
// 4、修改表
// 修改表名、增加字段、删除字段,修改字段,修改字段的顺序
// 1)修改表名ALTER TABLE---RENAME
ALTER TABLE table1 RENAME table2;
// 2)在表的最后面增加字段----ADD
ALTER TABLE 表名 ADD 属性名 属性类型;
ALTER TABLE table2 add age int;
// 在表的第一个位置增加字段
ALTER TABLE 表名 ADD 属性名 属性类型 FIRST;
ALTER TABLE table2 ADD height int FIRST;
// 在表的指定字段后面增加字段
ALTER TABLE 表名 ADD 属性名 属性类型 AFTER 属性名;
ALTER TABLE table2 ADD width int AFTER name;
// 3)删除字段---DROP
ALTER TABLE 表名 DROP 属性名
ALTER TABLE table2 DROP width;
// 4)修改字段--字段的数据类型、名字----MODIFY CHANGE
// 修改字段的类型---MODIFY
ALTER TABLE 表名 MODIFY 属性名 数据类型
ALTER TABLE table2 MODIFY height varchar(320);
// 修改字段的名字---CHANGE
ALTER TABLE 表名 CHANGE 旧属性名 新属性名 旧数据类型;
ALTER TABLE table2 CHANGE height height1 varchar(320);
// 同时修改字段的名字和数据类型----CHANGE
ALTER TABLE 表名 CHANGE 旧属性名 新属性名 新数据类型;
// 修改字段顺序---MODIFY FIRST/AFTER
ALTER TABLE 表名 MODIFY 属性名1 数据类型 FIRST|AFTER 属性名2;
// 表示将其移到表的第一行
ALTER TABLE table2 MODIFY height varchar(320) FIRST;
4、表的约束---检查表中所存储的数据是否合法
完整性是指数据的准确性和一致性
完整性检查是指检查数据的准确性和一致性
完整性约束关键字
// 字段的值不能为空
NOT NULL
// 字段的默认值
DEFAULT
// 值自动增加
AUTO_INCREMENT
// 主键,表记录的唯一标志----唯一,非空,主键可以由单一字段或者多字段组成
PRIMARY KEY
[CONSTRAINT 约束名] PRIMARY KEY (属性名1,属性名2,...)
// 外键,可以为NULL,设置两个表中的字段的父子关系
FOREIGN KEY
CONSTRAINT 外键约束名 FOREIGN KEY (属性名) REFERENCES 表名 (属性名)
// name是table2的主键
CONSTRAINT no FOREIGN KEY (name) REFERENCES table2 (name)
// 唯一键,字段的值是唯一的
UNIQUE
4、索引的操作---提高搜素的速度,创建、查看、删除
索引的类型:普通索引、唯一索引、全文索引、单列索引、多列索引、空间索引
//1、创建普通索引
INDEX|KEY 索引名(属性名)
//创建标的时候声明
INDEX index_name(name)
//在已经存在的表上创建
CREATE INDEX 索引名 ON 表名 (属性名)
CREATE index_name ON student (name)
//通过ALTER TABLE创建普通索引
ALTER TABLE 表名 ADD INDEX|KEY 索引名(属性名)
ALTER TABLE student ADD INDEX index_name(name);
//2、创建唯一索引 ,在普通索引前面加上UNIQUE INDEX,其他一样
//3、全文索引,主要关联CHAR VARCHAR TEXT字段上 ,比普通索引多了FULLTEXT INDEX
//4、多列索引
INDEX|KEY 索引名(属性名1,属性名2,....)
INDEX index1(name,age)
//删除索引---索引会降低表的更新速度,影响数据库的性能
DROP INDEX 索引名 ON 表名
DROP INDEX index_name ON table2;
5、数据的操作--CRUD,创建(INSERT),查询(SELECT),更新(UPDATE),删除(DELETE)
1)增----INSERT INTO
INSERT INTO 表名 (字段列表) VALUES(值列表)
//id是自增 的,0---是不被识别的,所以系统会给id字段的值自增
INSERT INTO nodeDB (id,userName,password) VALUES(0,li,878);
//1、插入数据
//插入1条完整数据记录
INSERT INTO 表名(字段1,字段2,...,字段n) VALUES(值1,值2,...,值n);
INSERT INTO 表名 VALUES(值1,值2,...,值n);//两种写法一样
//插入1条数据记录的一部分(插入指定字段)
INSERT INTO 表名(field1,field3,..) VALUES(VAL1,VAL3,...);
//插入多条完整数据记录,可以将前面的字段名省略
INSERT INTO 表名(field1,field2,...,fieldn) VALUES(val11,val12,...,val1n),(val21,val22,...,val2n),...;
//插入多条数据记录的一部分(插入指定字段)
INSERT INTO 表名(field1,field3,..) VALUES(VAL11,VAL13,...),(VAL21,VAL23,...);
//插入查询结果
INSERT INTO 表名1(field1,field2,...)
SELECT (field1,field2,...)
FROM 表名2
WHERE...
2)删----DELETE
DELETE FROM 表 WHERE 条件
//删除特定数据记录
DELETE FROM 表名 WHERE CONDITION
//删除所有数据记录--无关键字WHERE,或者满足表中所有数据记录
3)改-----UPDATE
UPDATE 表 SET 字段=值,字段=值 WHERE 条件
UPDATE article SET n_like=n_like+1 WHERE id=xxx;
//更新特定记录
UPDATE 表名
SET field1=val1,
field1=val2,
field1=valn
WHERE CONDITION
//更新所有数据记录,不使用条件语句
4)查------SELECT
SELECT 什么 FROM 表名 WHERE 条件
//*通配符,将表中所有字段都选出来
SELECT * FROM user1
A、简单数据记录查询
//1、简单数据记录查询
//A、简单数据查询---查询素有字段数据,特定字段数据
SELECT * FROM 表名;
//或者
SELECT field1,dield2,...,fieldn FROM 表名;
SELECT field1 FROM 表名;
//B、避免重复数据查询---DISTINCT
SELECT DISTINCT field1,...,fieldn FROM 表名;
select DISTINCT job FROM employee;
//C、数学四则运算数据查询,AS修改字段名
SELECT field1 AS other1,...,fieldn AS othern FROM 表名;
SELECT ename,sal*12 yearsalary FROM employee;
//or
SELECT ename,sal*12 AS yearsalary FROM employee;
//设置显示格式数据查询---CONCAT()合并字符串和字段值
SELECT CONCAT(ename,'年薪: ',sal*12) AS yearsalary;
B、条件数据记录查询---WHERE
//2、条件数据记录查询----WHERE
//A、带关系运算符、逻辑运算符的条件数据查询
//> < = !=(<>) >= <= AND(&&) OR(||) NOT(!) XOR()
//单条件数据查询
SELECT ename
FROM employee
WHERE job='CLERK';
//多条件数据查询
SELECT ename
FROM employee
WHERE job='CLERK' && sal>300;
//B、带BETWEEN AND关键字的范围查询
//符合范围的数据记录查询
SELECT field1,...fieldn
FROM 表名
WHERE field BETWEEN VAL1 AND VAL2;
SELECT ename
FROM employee
WHERE sal BETWEEN 1000 AND 2000;
//不符合范围的数据记录查询 NOT BETWEEN AND
WHERE sal NOT BETWEEN 1000 AND 2000;
//C、带IS NULL 关键字的空值查询---为空则被查出来
SELECT field1,...fieldn
FROM 表名
WHERE field IS NULL;
//IS NOT NULL----字段不为空则被选出来
//D、带IN关键字的集合查询---判断字段的值是否在集合中,NOT IN(集合中有NULL,不回有任何查询结果)
SELECT ename
FROM employee
WHERE sal IN (2000,3000,4000);
//不在集合中
WHERE sal NOT IN (2000,3000,4000);
//E、LIKE--关键字的模糊查询,通配符_:匹配单个字符 %:匹配任意长度的字符串
//以字母A开头的雇员
SELECT ename
FROM employee
WHERE ename LIKE 'A%';
//不以字母A开头的雇员
SELECT ename
FROM employee
WHERE ename NOT LIKE 'A%';
C、排序数据记录查询--ORDER BY ASC|DESC
//ASC DESC,默认升序排序
//A、按照单字段排序---字段值为NULL,ASC则为第一行,DESC则为最后一行
SELECT *
FROM employee
ORDER BY sal desc;
//B、按照多字段排序---按照第一个字段排序,如果有相同的按照第二个字段排序
SELECT *
FROM employee
ORDER BY sal ASC,hiredate DESC;
//4、限制数据记录查询数量---LIMIT
LIMIT offset_start,row_count;
//不指定初始位置默认为0
LIMIT row_count;
D、统计函数
//统计函数中,表中无数据,COUNT()返回0,其他NULL
//COUNT() SUM() AVG() MAX() MIN()
//COUNT(*)---统计表中值为NULL和非NULL的记录数,会忽略NULL但0不会
//COUNT(field)---统计表中值非NULL的记录数
SELECT COUNT(*) number FROM employee;
SELECT COUNT(name) number FROM employee;
//AVG(field),会忽略NULL但0不会
//计算雇员奖金平均值
SELECT AVG(comm) average
FROM employee
WHERE comm!=0;
//SUM(field),会忽略NULL但0不会
//计算工资总和
SELECT SUM(sal) sumval
FROM employee
WHERE sal!=0;
//MAX(field) MIN(field)会忽略NULL但0不会
SELECT MAX(sal) maxval,MIN(sal) minval
FROM employee
WHEREsal!=0;
E、分组数据记录查询---GROUP BY(分组的数据一定要有重复值才有意义),配合统计函数使用
//1、简单分组查询
SELECT fun()
FROM 表名
WHERE CONDITION
GROUP BY field;
//2、统计功能分组查询
//GROUP-CONCAT(field)--显示每个分组中的字段
//按照部门号分组,显示每组成员和成员数
SELECT deptno,GROUP_CONCAT(ename) enames,COUNT(ename) number
FROM employee
GROUP BY deptno;
//3、多个字段分组查询
//按照部门号,雇佣日期分组,显示每组雇员和人数
SELECT deptno,hiredate,GROUP_CONCAT(ename) enames,COUNT(ename) number
FROM employee
GROUP BY deptno,hiredate;
//4、HAVING子句对分组查询进行条件限定
GROUP BY CONDITION
HAVING CONDITION;
//显示部门平均工资>2000的部门及其成员和人数
SELECT deptno,AVG(sal),GROUP_CONCAT(ename) enames,COUNT(ename) number
FROM employee
GROUP BY deptno
HAVING AVG(sal)>200
6、多表数据记录查询----连接查询(内,外),效率低,使用子查询替代
关系数据操作--UNION(并) CARTESIAN PRODUCT(笛卡尔积) JOIN 连接
1)UNION---具有相同字段数目和字段类型的表合并在一起,将相同的记录合并为一条,结果具有相同的字段
2)笛卡尔积---没有连接条件表关系返回的结果(结果为表1记录(记录 数num1)组合表2记录(记录数num2))-----记录数目为num1*num2
连接:在表关系的笛卡尔积数据记录中,按照相应字段值的比较条件进行选择,生成一个新的关系
3)内连接---INNER JOIN,在表关系的笛卡尔积数据记录中,保留匹配数据记录,按照匹配条件分为自然连接,等值连接,不等连接
7、MySQL运算符
1)算数运算符:+ - * /(DIV) %(MOD)---除和求余分母为0,结果为NULL
2)比较运算符:> 、 < 、 = ( <=> )相等返回1否则返回0、!=( <> )不相等返回1否则0、>=、<=、BETWEEN AND ----存在于指定范围(x1 BETWEEN m AND n)、IS NULL---为空( x1 IS NULL )、IN---存在于指定集合( x1 IN (val1,val2,...,valn) )、LIKE----模糊匹配( x1 LIKE expression )、REGEXP----正则( x1 REGEXP regularexpression )
= ( <=> )相等返回1否则返回0,NULL=NULL返回NULL,NULL<=>NULL返回1
!=( <> )不相等返回1否则0,不能操作NULL
> 、 < 、>=、<=:不能操作NULL
3)逻辑运算符:AND(&&)、OR(||)、NOT(!)、XOR
AND(&&):操作数都不为0 NULL返回1否则0,;任意操作数为NULL切没有操作数为0,返回NULL
OR(||):操作数只要一个不为0或NULL返回1否则0;所有操作数不为0但包含NULL返回NULL
NOT(!):操作数为NULL,返回NULL
XOR :包含NULL返回NULL,同为0或同为非0数字返回0;一个为0一个为非0返回1
4)位运算符:&、 |、~、^、<<、>>
8、常用函数
字符串函数
1)合并字符串函数,CONCAT(S1,S2,...,SN),参数有NULL返回NULL;CONCAT_WS(SEP,S1,S2,...,SN),SEP为NULL返回NULL;参数有NULL则忽略该参数
2)比较字符串大小函数STRCMP(S1,S2),S1>S2返回1,S1<S2返回-1.相等0
3)获取字符串长度函数LENGTH(),字符数函数CHAR_LENGTH()
4)字母大小写函数UPPER() LOWER()
子句
1)WHERE 条件
WHERE age=18
WHERE age<18
WHERE age>=18
WHERE age<18 AND score<80
WHERE age<18 OR score<80
2)ORDER BY 排序(多条件排序)
ORDER BY age ASC/DESC
// 价格升序排序,如果价格相同,再按照销量降序排序
ORDER BY price ASC,sales DESC
3)GROUP BY 聚类--合并相同的:GROUP BY 字段(就是按照 字段来分组,只保留第一次出现的数据,后面有相同的直接忽略),GROPU BY要配合函数使用(COUNT MAX MIN AVG)
//输出表中所有的信息
SELECT * FROM student
// 计算班上所有的人数,也就是表中row数
SELECT COUNT(*) FROM student;
// 按照班级分组,统计每班的人数,以及一起有多少个班
SELECT class,COUNT(class) FROM student GROUP BY class;
// 算出各班的平均成绩
SELECT class,AVG(score) FROM student GROUP BY class;
// 每个班的最高分和最低分
SELECT class,MAX(score),MIN(score) FROM student GROUP BY class;
// 计算每一个人的总花费
SELECT name,SUM(price) FROM class GROUP BY name;
// 计算每一个人的总花费并且按照降序排列
SELECT name,SUM(price) FROM class GROUP BY name ORDER BY SUM(price) DESC;
4)LIMIT---限制输出,常用于分页
分页:
a)所有数据给前端
b)后台只给一丁点数据
LIMIT 10; 前10条
LIMIT 5,8; 从5开始,取8条数据
----------------
分页:每页20条
第一页 0,20 0-19
第二页 20,20 20-39
第n页 (n-1)*20,20
注意:子句之间所有顺序的----WHERE(选出符合条件的,剩下的是有用的) GROUP BY(合并,去掉相同的) ORDER BY (排序) LIMIT(限制所获得的数目)
在NODEJS中操作MySQL
通过下面的方式引进来的mysql是一个客户端的数据库;数据库操作是异步操作
1)首先在项目的根目录下安装中间件mysql
cnpm install mysql
2)将mysql引进来
requireMySQL= require('mysql);
3)数据库和服务端建立连接
4)向服务器发送请求(专业名词:查询)
// node中的mysql是一个客户端数据库
const mysql = require('mysql');
// 1.和服务器建立连接
// createConnection({server address,db port,username,password,detailDatabase})
let db = mysql.createConnection({host:'localhost',port:3306,user:'root',password:'root',database:'nodeDB'});
// 2.查询
//query(功能,回调)
db.query("SELECT * FROM `USER1`;",(err,data)=>{
if(err){
console.log(err);
}else{
console.log('success: ',data);
console.log(JSON.stringify(data));
}
});
存放在数据库中的密码不能明文存放
MD5----签名算法,看不到原文,想加强密度就进行多次加密
1、数据库管理系统( DBMS )是:系统软件
2、死锁的定义:死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象。死锁不仅在操作系统中存在,在数据库中也同样存在。同一个用户,也有可能多个操作同时使用同一个数据资源
3、关系中行、列次序的交换性质是:行列均可交互,元祖是不会改变的