数据库

后台提供的数据存放在数据库

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、关系中行、列次序的交换性质是:行列均可交互,元祖是不会改变的

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值