nodejs是需要连接Mysql的,然后才是真正的服务器端语言,这里对数据库做一个简单的介绍。
第一部分:基本知识
什么是数据库?
- 身份证信息放在公安部的数据库中。
- 银行卡的余额、交易信息、转账记录,放在银行的数据库服务器的数据库中。
- qq、微信等用户信息放在腾讯的数据库中。
- 。。。。
等等等等,所有的信息存储都需要数据库。
数据库的五个基本单位
- 数据库服务器 --- 用来运行数据库服务的一台电脑。如果数据很多,就需要很多台。 数据大多是需要备份的。
- 数据库 --- 数据库服务器中可以存放很多数据库。 如银行卡信息数据库、qq数据库等等。 就像一个网站的服务器可以托管很多个网站一样。
- 数据表 --- 数据库包含很多数据表。
- 数据字段 --- 就是数据表中的列,并不是说一定要是整列,而是列中的关键字。
- 数据行(记录) --- 就是数据表中的行。
上图就是一个数据表,它是存放在数据服务器中的某一个数据库中的, 其中每一行就是一个记录,即数据行, 而数据字段就是用户编号、用户名、性别等。 这里使用的是汉字,如果是真实的,一定是用英文来表示的。
对比Mysql与mongodb:Mysql是SQL数据库,它和nosql(mongodb为代表)是有概念的区别的,比如mysql用的是数据库、数据表、记录、字段为核心概念,而mongodb用的是数据库、集合、文档为核心概念,即使如此,我们可以将mysql的数据表和mongodb的集合类比,将mysql的记录和mongodb的文档类比。
值得注意的是,数据表和数据表之间一般是由关系的, 后面会将到。
数据库安装
数据库服务器可以单独安装,但是使用xampp会更加方便一些,如下所示,其中apache和mysql就可以了。这里的xampp软件自动包含了apache服务器(在本地安装,服务器和浏览器一样,都不过是一个软件,只是apache软件安装的位置称为服务器端,而浏览器安装的位置成为客户端)、mysql服务器(提供mysql数据库查询)、php(即支持PhP的运行,比如js需要解释器才能运行,而这里的php就是供php语言运行的地方)、perl(即提供perl语言运行的解释器)。并且服务器端和客户端并没有明显的区别,服务器端也是有操作系统的,只是这操作系统中运行的是服务器软件,所以我们称之为服务器,而你把服务器端软件运行在自己的PC电脑上,那么你的PC电脑也就可以成为服务器端了。
可能出现的问题:
- 数据库可以直接使用xampp下集成的mysql, 但是往往运行mysql时会出现一些不可预料的错误,这时将错误粘贴下来然后在stackoverflow上搜索, 上面的高票答案挨个试一遍即可。
- 但是怎么查看用户名和密码呢? 启动mysql服务器之后,可以进入xampp -> Explorer -> phpMyAdmin -> config.inc.php中可以查看user和password的相关配置,也可以修改。
数据语句操作类型
数据库安装完成,最重要的就是学习SQL语句了。 什么是SQL呢? 它是操作数据库的核心, Structured Query Language, 即结构化查询语言,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
SQL最重要的是关系数据库操作语言,学习好了MySQL总的SQL语句,其他的语法学起来也是万变不离其宗。
SQL语句按照其功能的不同可以分为三类:
- 数据定义语言(DDL ,Data Defintion Language)语句:数据定义语句,用于定义不同的数据段、数据库、表、列、索引等。常用的语句关键字包括create、drop、alter等。
- 数据操作语言(DML , Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据的完整性。常用的语句关键字主要包括insert、delete、update和select等。
- 数据控制语言(DCL, Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括grant、revoke等。
连接数据库
在xampp面板的右上方点击shell, 然后输入mysql,就可进入mysql的环境。
如果有时候不能直接进入,就需要我们使用下面的方法登录了;
可以认为-h表示链接地址在哪, -u表示user用户名输入,比如这里的用户名是root, -p表示password输入。
注意:如果我们直接在本地开了xampp,那么就可以输入 mysql -u root -p, 接着shell就会提示输入密码,输入完密码之后就可以看到效果了。
如上所示,就可以连接到Mysql了,但我们在最后一行看到的是: MariaDB,它和mysql有什么区别呢?实际上两者区别很小,mariaDB是MySQL之父离开SUN(java和mysql的公司)之后自己开源的数据库,目前发展也很好。
第二部分:数据库、数据表、数据字段操作
数据库操作之创建数据库
基本语法如下:
create database 数据库名;
注意: 在结尾一定要加分号。 query OK 表示请求成功,即执行命令成功。 1 row affected 表示本次操作只影响了数据库中的其中一行的记录。因为只是创建了一个数据库,所以database没有分号。
数据库操作之查看数据库
基本语法如下:
show databases;
即查看所有的数据库。
可以看到我的数据库服务器中存放了8个数据库。
nodejs使用的是show dbs,比mysql更加简洁。
数据库操作之选中数据库
基本语法如下:
use 数据库名;
即选中其中的某一个数据库,然后就可以对其操作了,当然这个数据库一定是属于show databases;中的某一个。
在输入基本命令之后,可以发现Database changed , 这表示数据库切换成功。
注意:我们不难发现,在切换了数据库之后,MariaDB后面的方括号中就是表示当前所在的数据库。 而最考试我们没有进入数据库时, MariaDB后面显示的none。
我们可以看到,mysql的创建数据库和使用数据库是两种操作,而mongodb只用了use db,即如果有这个数据库,就切换,没有就创建。所以mongodb比mysql更崇尚简洁。
数据库操作之查看数据库中的表
基本语法如下:
show tables;
表示显示当前数据库下的所有的数据表。
数据库操作之删除数据库
基本用法如下:
drop database 数据库名;
注意: 一旦删除了某个数据库,这个数据库下所有的数据表也会被删除了。
mongodb使用的是db.dropDatabase(),可见,mongodb在数据库操作上,更多的还是独立的SQL语句,而mongodb的函数用的较多。
数据表操作
数据表操作之创建数据表
基本语法如下:
create table 数据表名(字段名1 字段类型, 字段名2 字段类型,..... , 字段名n 字段类型 );
其中的自动名就是id、sex、name等这样的名称。 而字段类型表示这个字段下是什么类型, 一般int代表整型、 float代表浮点型、char和varchar代表字符串。一般我们还可以在类型后添加长度,用()括起来。
注意: 在创建数据表的时候,我遇到的问题是创建失败,提示数据库时只读的, 解决方法是先去看stackoverflow。 上面的教程是将mysql中config下的某一行删除,然后重新使用mysql -h....这种形式登录即可。
这样就创建了一个数据表,其中包含id字段和name字段,id字段限定输入的是整型, name字段限定输入的是字符型。
在创建表这方面来说,mongodb的方式是直接对一个集合插入文档,这样,同时也就创建了集合,并且Mongodb和JavaScript类似,对于类型都是没有要求的,创建文档时,没有规定必要的类型; 而mysql创建表实际上就是在创建表,而没有插入记录,并且在创建表的过程中,就是创建字段的过程,并且给每个字段具体的类型。所以,mysql比MongoDB更加限制类型,严谨。 就像java需要类型限制,而JavaScript比较宽松一样。另外,在mysql创建数据表时,才调用了函数,而其他情况下并没有。
数据表操作之创建数据表并制定表引擎和字符集
在创建表最后,我们常用MyISAM或者InnoDB引擎。基本语法如下:
ENGINE=InnoDB
还可以制定默认字符集。基本语法如下:
DEFAULT CHARSET=utf8
最后组合起来即可:
数据表操作之查看一个数据表的详细内容
基本语法如下:
desc 表名;
其中desc是描述的意思,即description。 当然这个操作必须在某个数据库的情况下进行操作。
其中Field表示字段, Type表示这些字段的类型, Null表示是否支持输入为Null,即无内容时,我们可以使用Null来输入,并且默认也是Null。
mongodb使用的是db.<集合名>.find(),由此同样可以看出mongodb更多使用的是函数调用,而mysql使用的简单的语句。
数据表操作之查看创建数据表时的创建语句
基本语法如下:
show create table 数据表名 \G;
即这就是我之前创建的ceshi数据表的创建语句。
数据表操作之删除数据表
基本语法如下:
drop table 数据表名;
mognodb中删除集合使用的时mongodb.<集合名>.drop(),即调用函数的方式。
数据表操作之修改数据表名
基本语法如下:
alter table 表名 rename 新表名;
数据表操作之查看所有数据表
基本语法如下:
show tables;
数据字段操作
数据字段操作之修改表字段类型
注意:这里的关键字是 修改、类型。 基本语法如下:
alter table 表名 modify 字段名 varchar(20);
即将表中的一个字段修改其类型为varchar(20)。
可以看到我们通过这种方式可以将其中的id字段的类型由int(10)修改为了int(20)。
数据字段操作之增加表字段
基本语法如下:
alter table 表名 add column 字段名 字段类型;
即在zhiding表中添加了类型为varchar(5)的字段sex。
数据字段操作之增加字段时控制字段顺序
刚刚我们再添加字段时,默认是添加在尾部的,如果我们希望添加到中间部分呢? 基本语法如下:
alter table 表名 add column 字段名 字段类型 after 字段名;
不同之处仅在于添加了after 字段名,表示在某个字段之后添加。如果希望添加在第一行,将after 字段名 直接替换成 first 即可。
可以看到有没有column都是可以的。 并且在命令行中,是不区分大小写的。 所以使用大小写都是一样的。
数据字段操作之删除表字段
基本语法如下:
alter table 表名 drop column 字段名;
数据字段操作之修改表字段名
基本语法如下:
alter table 表名 change 原字段名 新字段名 字段类型;
第三部分:数据类型、字符集、引擎和索引
MySQL中存放的是数据,所以说数据就要有数据类型,我们再存放数据时也要规定数据的类型,并且要满足数据长度的要求。
在MySQL中我们将数据分为以下的类型:
- 数值类型(整型、浮点),如int、float
- 字符串类型, 如 char、varchar
- 日期时间类型,如data
- 复合类型
- 空间类型(非科学性工作基本不用,这里不讲解)
整型
注意:
1.在创建表字段时,性别我们可以使用无符号的微小整型(tinyint)来表示。用0表示女、用1表示男。用2表示未知。
2.同样人类年龄也是,在创建表字段时可用用无符号的整型。因为人类的年龄还没有负数3.在实际使用过程中。我们业务中最大需要存储多大的数值。我们创建表时,就选择什么样的类型来存储这样的值。
浮点型
注意:
1.浮点是非精确值,会存在不太准确的情况
2.而decimal叫做定点数。在MySQL内部,本质上是用字符串存储的。实际使用过程中如果存在金额、钱精度要求比较高的浮点数存储,建议使用decimal(定点数)这个类型。
字符类型
其中char类型表示定长字符串,如果比之规定的长,就截取; 如果比他规定的短,就用空格来填补。
而varchar不是定长的。因为 VARCHAR 类型可以根据实际内容动态改变存储值的长度,所以在不能确定字段需要多少字符时使用 VARCHAR 类型可以大大地节约磁盘空间、提高存储效率。
text类型与blob类型 对于字段长度要求超过 255 个的情况下,MySQL 提供了 TEXT 和 BLOB 两种类型。根据存储数据的大小,它们都有不同的子类型。这些大型的数据用于存储文本块或图像、
声音文件等二进制数据类型。
时间类型
一般用的比较少,多用int来存储。
符合类型
字段其他属性设置
UNSIGNED(无符号)
主要用于整型和浮点类型,使用无符号。即,没有前面面的-(负号)。存储位数更长。tinyint整型的取值区间为,-128~127。而使用无符号后可存储0-255个长度。
创建时在类型后面接上 unsigned 即可。
ZEROFILL(0填充)
0(不是空格)可以用来真补输出的值。使用这个修饰符可以阻止 MySQL 数据库存储负值。
创建时在类型后面接上 zerofill 即可。
DEFAULT(默认)
default属性确保在没有任何值可用的情况下,赋予某个常量值,这个值必须是常量,因为MySQL不允许插入函数或表达式值。此外,此属性无法用于BLOB或TEXT列。如果已经为此列指定了NULL属性,没有指定默认值时默认值将为NULL,否则默认值将依赖于字段的数据类型。
NOT NULL (非NULL)
如果将一个列定义为not null,将不允许向该列插入null值。建议在重要情况下始终使用not null属性,因为它提供了一个基本验证,确保已经向查询传递了所有必要的值。
创建时在整型或浮点字段语句后接上 not null 即可。
举例如下所示:
CREATE TABLE IF NOT EXISTS demo (id int(11) NOT NULL,username varchar(50) NOT NULL,password char(32) NOT NULL,content longtext NOT NULL,createtime datetime NOT NULL,sex tinyint(4) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;
字符集
字符集就是将各种文字编码为二进制数字(十六进制也是可以的,本质一样)的方式, 即这是让一般文字存储在计算机的一种通用的规则, 字符集有很多, 我们常用的有下面几种:
ASCII:
ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符 。 但是ASCII能表示的字符很少,所以中文是不支持的。单字节。
GBK:
GBK 向下与 GB 2312 编码兼容。是中华人民共和国定义的汉字计算机编码规范。早期版本为GB2312。 即这个仅仅是支持中文的。 但是仅仅表示中文的时候, 节约内存,因为他是双字节的 。
Unicode:
Unicode(统一码、万国码、单一码)Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。以满足跨语言、跨平台进行文本转换、处理的要求。 但是不难看出, 4字节还是非常消耗内存的。
UTF-8:
是一种针对Unicode的可变长度字符编码,也是万国码。因为UNICODE比ASCII占用大一倍的空间,而对ASCII来说高字节的0对他毫无用处。为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF(Universal Transformation Format)
综上可知,在实际工作中,我们比较常用的编码方式就是unicode和UTF-8这两种编码方式。
表引擎:
MySQL的很大的一个特点就是他的插件式表引擎,根据不同的特点使用不同的存储引擎,使得存储性能最大化。在MySQL中使用下面的命令可以查看所支持的所有表引擎。
show engines;
下面介绍几个常用的引擎和几个不常用的引擎。
- MyISAM --- 常用引擎,特点: 读取效率很高。
- InnoDB --- 常用引擎, 特点:写入、事务等支持。
- NDB --- 不常用,特点:主要在MySQL 集群服务器中使用,不做介绍
- Archive --- 不常用,特点:归档引擎,压缩比高达1:10,用于数据归档
MyISAM:
不支持事务,表锁(表级锁,加锁会锁住整个表),支持全文索引,操作速度快。常用于读取多的业务。
InnoDB:
- 支持事务,主要面向在线事务处理(OLTP)方面的应用。
- 行锁设计,支持外键,即默认情况下读取操作不加锁
InnoDB是为处理巨大数据量时的最大性能设计。
说明:
- 行锁。 写入、更新操作的时候,将这一行锁起来, 不让其他人再操作了。
- 表锁。 写入、更新操作时,将这个表给锁起来,不让其他人再操作了。
- 事务。 可同时操作多个数据,若其中的一个数据操作失败,就会回滚到操作之前。 常用于银行、电商、金融等系统中。
索引
索引其实就类似于书中的目录,有了索引就更加方便我们查找。不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行。表越大,花费的时间越多。如果表中查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要看所有数据。MySQL中的索引类型有以下几种方式:
普通索引:
基本语法如下:
alter table 表名 add index(字段名)
即为某个表的某个字段增加索引。
唯一索引:
基本语法如下:
alter table 表名 add UNIQUE(字段名)
即为某个表的某个字段增加唯一索引。
全文索引:
基本语法如下:
alter table 表名 add FULLTEXT (字段名)
即为某个表的某个字段增加全文索引
主键索引:
基本语法如下:
alter table 表名 add PRIMARY KEY(字段)
即为某个表的某个字段增加主键索引。
在创建表时也可以声明索引,如下所示:
CREATE TABLE test (id INT NOT NULL , username VARCHAR(20) NOT NULL , password INT NOT NULL , content INT NOT NULL , PRIMARY KEY (id), INDEX pw (password), UNIQUE (username),FULLTEXT (content)) ENGINE = InnoDB;
第四部分:增删改查
对于数据库的操作实际上就是增删改查。 这些基本功做好了,对数据库的操作也就游刃有余了。
增(插入记录)
插入记录有两种基本语法。
语法一:
insert into 表名 values(值1, 值2 ... 值n);
语法二:
insert into 表名(字段1,字段2 ... 字段n) values(值1,值2 ... 值n);
显然,两种语法是有区别的:
- 语法一要求:在表中有多少个字段,就要上传多少个值,如果其中某些字段是有默认值,不想上传覆盖,就传入null。 并且值的顺序和字段的顺序也要保持一致。
- 语法二要求:对于表中的默认字段,可以不上传, mysql会自动补齐默认值。
另外,对于第一种语法,我们也可以一次性增加多各记录, 只要在values后添加多个()即可,用逗号隔开,如下所示:
insert into user(username,password,sex)values('黄晓明', 'abcdef', 1),( 'angelababy', 'bcdeef', 0),( '陈赫', '123456', 1),('王宝强', '987654', 1);
查(查询记录)
为了查数据,首先我们创建一个数据表。
即创建了包含id、username、age三个字段的表。
下面我们向其中添加字段:
查询全部:
然后我们就可以查询,查询表中的所有记录的基本语法如下:
select * from 表名;
指定字段查询:
基本语法如下:
select 字段名 from 表名;
查询字段不重复的记录:
基本语法如下:
select distinct 字段名 from 表名;
为了演示,我新增一条记录,使得age有相等的两条记录。如下:
insert into money values(7, "nnn", 21);
条件查询where
基本语法如下:
select 字段名 from 表名 where 条件;
可以看到*表示的是如果有,就返回一条记录,而不是其中的字段, age=50即返回age等于50字段所在的记录。
下面的符号也是可以的:
结果集排序
基本语法如下:
select 字段名 from 表名 order by 字段名 排序关键词
其中排序关键词有两个:
- asc --- 升序排列,由小到大
- desc --- 降序排列,由大到小
结果集多字段排序
上面的例子是根据其中某一个字段来排序,现在我们可以进行多字段排序。 即第一个已经排好,则第二个不再生效,否则第二个生效。。。
基本语法如下:
select 字段名 from 表名 order by 字段名1 排序关键字, 字段名2 排序关键字;
通过上面的两个例子,很容易看出他们的区别。
结果集限制
对于查询或者排序后的结果集,如果我们不希望显示全部,比如就想知道一次比赛中的前三名是谁,这就是结果集限制。
基本语法如下:
select 字段名 from 表名 limit 限制的数量;
上例中我们就把年龄最大的三者筛选了出来。
结果集区间选择
上面我们是默认从第一条记录开始的,但是如果我们希望留下中间的几条呢,语法如下:
select 字段名 from 表名 limit 开始位置,结束位置;
统计类函数使用
基本使用语法如下:
select 函数名(字段名) from 表名;
分组
基本语法如下:
select 字段名 from 表名 group by 字段名;
多表联合查询
比如我们再查询用户购买情况时,至少需要两张表,第一张保存了用户的基本信息,包括name,password,id等。 第二章表上保存了用户的购买记录。 即一旦有一个用户购买,就将这个记录插入表中。
于是这样的查询就是联合查询,而要做到联合查询就要进行表连接。
表连接
表连接分为内连接和外连接。 具体定义后面会讲到。
既然需要进行表连接,那么就得有两个表!
http://www.shouce.ren/api/view/a/13995
这一部分只是等到需要的时候再学吧。
改(更新记录)
修改一个字段,语法如下:
update 表名 set 字段名=字段值 where 条件;
这里是修改其中一个字段,我们还可以修改多个字段。
修改多个字段
基本语法如下所示:
update 表名 set 字段名1=值1, 字段名2=值2 where 条件;
关键: 对于其中的username下的值,他们都是字符串,所以一定要写成 username="zuzhidao", 而不是username=buzhidao, 因为系统会将buzhidao当做一个变量,而这个变量又没有声明和定义,所以会报错。
删(删除记录)
删除记录的基本语法如下:
delete from 表名 where 条件。
注意:这里一删除就是删掉一条记录,而不难只删除其中的一个字段。
清空表记录基本语法如下:
trunkate table 表名;
这条命令会直接将一个表删除。
http://study.163.com/course/courseLearn.htm?courseId=706085#/learn/video?lessonId=866408&courseId=706085