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的公司)之后自己开源的数据库,目前发展也很好。
基本语法如下:
注意: 在结尾一定要加分号。 query ok 表示请求成功,即执行命令成功。 1 row affected 表示本次操作只影响了数据库中的其中一行的记录。因为只是创建了一个数据库,所以database没有分号。
即查看所有的数据库。
可以看到我的数据库服务器中存放了8个数据库。
nodejs使用的是show dbs,比mysql更加简洁。
即选中其中的某一个数据库,然后就可以对其操作了,当然这个数据库一定是属于show databases;中的某一个。
在输入基本命令之后,可以发现database changed , 这表示数据库切换成功。
注意:我们不难发现,在切换了数据库之后,mariadb后面的方括号中就是表示当前所在的数据库。 而最考试我们没有进入数据库时, mariadb后面显示的none。
我们可以看到,mysql的创建数据库和使用数据库是两种操作,而mongodb只用了use db,即如果有这个数据库,就切换,没有就创建。所以mongodb比mysql更崇尚简洁。
表示显示当前数据库下的所有的数据表。
基本用法如下:
注意: 一旦删除了某个数据库,这个数据库下所有的数据表也会被删除了。
mongodb使用的是db.dropdatabase(),可见,mongodb在数据库操作上,更多的还是独立的sql语句,而mongodb的函数用的较多。
其中的自动名就是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引擎。基本语法如下:
还可以制定默认字符集。基本语法如下:
最后组合起来即可:
其中desc是描述的意思,即description。 当然这个操作必须在某个数据库的情况下进行操作。
其中field表示字段, type表示这些字段的类型, null表示是否支持输入为null,即无内容时,我们可以使用null来输入,并且默认也是null。
mongodb使用的是db.<集合名>.find(),由此同样可以看出mongodb更多使用的是函数调用,而mysql使用的简单的语句。
即这就是我之前创建的ceshi数据表的创建语句。
mognodb中删除集合使用的时mongodb.<集合名>.drop(),即调用函数的方式。
注意:这里的关键字是 修改、类型。 基本语法如下:
即将表中的一个字段修改其类型为varchar(20)。
可以看到我们通过这种方式可以将其中的id字段的类型由int(10)修改为了int(20)。
即在zhiding表中添加了类型为varchar(5)的字段sex。
刚刚我们再添加字段时,默认是添加在尾部的,如果我们希望添加到中间部分呢? 基本语法如下:
不同之处仅在于添加了after 字段名,表示在某个字段之后添加。如果希望添加在第一行,将after 字段名 直接替换成 first 即可。
可以看到有没有column都是可以的。 并且在命令行中,是不区分大小写的。 所以使用大小写都是一样的。
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 即可。
举例如下所示:
字符集就是将各种文字编码为二进制数字(十六进制也是可以的,本质一样)的方式, 即这是让一般文字存储在计算机的一种通用的规则, 字符集有很多, 我们常用的有下面几种:
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中使用下面的命令可以查看所支持的所有表引擎。
下面介绍几个常用的引擎和几个不常用的引擎。
myisam --- 常用引擎,特点: 读取效率很高。
innodb --- 常用引擎, 特点:写入、事务等支持。
ndb --- 不常用,特点:主要在mysql 集群服务器中使用,不做介绍
archive --- 不常用,特点:归档引擎,压缩比高达1:10,用于数据归档
myisam:
不支持事务,表锁(表级锁,加锁会锁住整个表),支持全文索引,操作速度快。常用于读取多的业务。
innodb:
支持事务,主要面向在线事务处理(oltp)方面的应用。
行锁设计,支持外键,即默认情况下读取操作不加锁
innodb是为处理巨大数据量时的最大性能设计。
说明:
行锁。 写入、更新操作的时候,将这一行锁起来, 不让其他人再操作了。
表锁。 写入、更新操作时,将这个表给锁起来,不让其他人再操作了。
事务。 可同时操作多个数据,若其中的一个数据操作失败,就会回滚到操作之前。 常用于银行、电商、金融等系统中。
索引其实就类似于书中的目录,有了索引就更加方便我们查找。不使用索引,mysql必须从第1条记录开始然后读完整个表直到找出相关的行。表越大,花费的时间越多。如果表中查询的列有一个索引,mysql能快速到达一个位置去搜寻到数据文件的中间,没有必要看所有数据。mysql中的索引类型有以下几种方式:
普通索引:
即为某个表的某个字段增加索引。
唯一索引:
即为某个表的某个字段增加唯一索引。
全文索引:
即为某个表的某个字段增加全文索引
主键索引:
即为某个表的某个字段增加主键索引。
在创建表时也可以声明索引,如下所示:
对于数据库的操作实际上就是增删改查。 这些基本功做好了,对数据库的操作也就游刃有余了。
插入记录有两种基本语法。
语法一:
语法二:
显然,两种语法是有区别的:
语法一要求:在表中有多少个字段,就要上传多少个值,如果其中某些字段是有默认值,不想上传覆盖,就传入null。 并且值的顺序和字段的顺序也要保持一致。
语法二要求:对于表中的默认字段,可以不上传, mysql会自动补齐默认值。
另外,对于第一种语法,我们也可以一次性增加多各记录, 只要在values后添加多个()即可,用逗号隔开,如下所示:
为了查数据,首先我们创建一个数据表。
即创建了包含id、username、age三个字段的表。
下面我们向其中添加字段:
查询全部:
然后我们就可以查询,查询表中的所有记录的基本语法如下:
指定字段查询:
基本语法如下:
查询字段不重复的记录:
为了演示,我新增一条记录,使得age有相等的两条记录。如下:
条件查询where
可以看到*表示的是如果有,就返回一条记录,而不是其中的字段, age=50即返回age等于50字段所在的记录。
下面的符号也是可以的:
基本语法如下:
其中排序关键词有两个:
asc --- 升序排列,由小到大
desc --- 降序排列,由大到小
上面的例子是根据其中某一个字段来排序,现在我们可以进行多字段排序。 即第一个已经排好,则第二个不再生效,否则第二个生效。。。
通过上面的两个例子,很容易看出他们的区别。
对于查询或者排序后的结果集,如果我们不希望显示全部,比如就想知道一次比赛中的前三名是谁,这就是结果集限制。
上例中我们就把年龄最大的三者筛选了出来。
上面我们是默认从第一条记录开始的,但是如果我们希望留下中间的几条呢,语法如下:
基本使用语法如下:
比如我们再查询用户购买情况时,至少需要两张表,第一张保存了用户的基本信息,包括name,password,id等。 第二章表上保存了用户的购买记录。 即一旦有一个用户购买,就将这个记录插入表中。
于是这样的查询就是联合查询,而要做到联合查询就要进行表连接。
表连接分为内连接和外连接。 具体定义后面会讲到。
既然需要进行表连接,那么就得有两个表!
http://www.shouce.ren/api/view/a/13995
这一部分只是等到需要的时候再学吧。
修改一个字段,语法如下:
这里是修改其中一个字段,我们还可以修改多个字段。
基本语法如下所示:
关键: 对于其中的username下的值,他们都是字符串,所以一定要写成 username="zuzhidao", 而不是username=buzhidao, 因为系统会将buzhidao当做一个变量,而这个变量又没有声明和定义,所以会报错。
删除记录的基本语法如下:
注意:这里一删除就是删掉一条记录,而不难只删除其中的一个字段。
清空表记录基本语法如下:
这条命令会直接将一个表删除。