重学Node.js及其框架(Express, Koa, egg.js) 之 MySQL及Nodejs中使用MySQL(上)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 重学Node.js及其框架(Express, Koa, egg.js) 之 MySQL及Nodejs中使用MySQL

数据库的下载和安装自行google。


总结自 Coderwhy的nodejs课程。


终端连接数据库


我们如果想要操作数据,需要先和数据建立一个连接,最直接的方式就是通过终端来连接;


两种方式的区别在于输入密码是直接输入,还是另起一行以密文的形式输入;


  • mysql -uroot -p密码


  • mysql -uroot -p。敲回车,然后输入密码。


MySQL默认的数据库


  • infomation_schema:信息数据库,其中包括MySQL在维护的其他数据库、表、列、访问权限等信息;


  • performance_schema:性能数据库,记录着MySQL Server数据库引擎在运行过程中的一些资源消耗相关的信息;


  • mysql:用于存储数据库管理者的用户信息、权限信息以及一些日志信息等;


  • sys:相当于是一个简易版的performance_schema,将性能数据库中的数据汇总成更容易理解的形式;


GUI工具选择


我建议选择navicat premium。因为。。。他收费,如果想免费,自己找资源吧。 下载地址www.navicat.com/en/products…


认识SQL语句


我们希望操作数据库(特别是在程序中),就需要有和数据库沟通的语言,这个语言就是SQL:


  • SQL是Structured Query Language,称之为结构化查询语言,简称SQL;


  • 使用SQL编写出来的语句,就称之为SQL语句;


  • SQL语句可以用于对数据库进行操作; 事实上,常见的关系型数据库SQL语句都是比较相似的,所以你学会了MySQL中的SQL语句,之后去操作比如Oracle或者其他关系型数据库,也是非常方便的。


SQL语句的常用规范:


  • 通常关键字是大写的,比如CREATE、TABLE、SHOW等等;


  • 一条语句结束后,需要以;结尾


  • 如果遇到关键字作为表名或者字段名称,可以使用``包裹;


SQL语句的分类


  • DDL(Data Definition Language):数据定义语言。可以通过DDL语句对数据库或者表进行:创建、删除、修改等操作;


  • DML(Data Manipulation Language):数据操作语言。可以通过DML语句对进行:添加、删除、修改等操作;


  • DQL(Data Query Language):数据查询语言。可以通过DQL从数据库中查询记录;(重点)


  • DCL(Data Control Language):数据控制语言。对数据库、表格的权限进行相关访问控制操作;


SQL的数据类型


我们知道不同的数据会划分为不同的数据类型,在数据库中也是一样。


MySQL支持的数据类型有:数字类型,日期和时间类型,字符串(字符和字节)类型,空间类型和 JSON数据类型


  • 数字类型


  • 整数数字类型:INTEGER,INT,SMALLINT,TINYINT,MEDIUMINT,BIGINT。


  • 浮点数字类型:FLOAT,DOUBLE(FLOAT是4个字节,DOUBLE是8个字节)。


  • 精确数字类型:DECIMAL,NUMERIC(DECIMAL是NUMERIC的实现形式)。DECIMAL()方法可传入两个参数,参数一表示多少个数字,参数二表示多少个小数。


  • 日期类型


  • YEAR类型 以YYYY格式显示值。支持的范围 1901到2155,和 0000。


  • DATE类型 用于具有日期部分但没有时间部分的值, 格式为式YYYY-MM-DD。支持的范围是 '1000-01-01' 到 '9999-12-31';


  • DATETIME类型 用于包含日期和时间部分的值, 格式为YYYY-MM-DD hh:mm:ss。支持的范围是'1000-01-01 00:00:00' 到 '9999-12-31 23:59:59';


  • TIMESTAMP数据类型被用于同时包含日期和时间部分的值, 格式为YYYY-MM-DD hh:mm:ss。的范围是UTC的时间范围:'1970-01-01 00:00:01' 到 '2038-01-19 03:14:07';另外:DATETIME或TIMESTAMP 值可以包括在高达微秒(6位)精度的后小数秒一部分。DATETIME表示的范围可以是'1000-01-01 00:00:00.000000'到'9999-12-31 23:59:59.999999'


  • 字符串类型


  • CHAR类型在创建表时为固定长度,长度可以是0到255之间的任何值。在被查询时,会删除后面的空格。


  • VARCHAR类型的值是可变长度的字符串,长度可以指定为0到65535之间的值。在被查询时,不会删除后面的空格。


  • BINARY和VARBINARY 类型用于存储二进制字符串,存储的是字节字符串。


  • BLOB用于存储大的二进制类型。


  • TEXT用于存储大的字符串类型。如果varchar依旧不能存储,那么将会使用TEXT类型。


表约束


PRIMARY KEY(主键)一张表中,我们为了区分每一条记录的唯一性,必须有一个字段是永远不会重复,并且不会为空的,这个字段我们通常会将它设置为主键。


  • 主键是表中唯一的索引。


  • 并且必须是NOT NULL的,如果没有设置 NOT NULL,那么MySQL也会隐式的设置为NOT NULL。


  • 主键也可以是多列索引,PRIMARY KEY(key_part, ...),我们一般称之为联合主键。


  • 建议:开发中主键字段应该是和业务无关的,尽量不要使用业务字段来作为主键。UNIQUE(唯一) 某些字段在开发中我们希望是唯一的,不会重复的,比如手机号码、身份证号码等,这个字段我们可以使用UNIQUE来约束。


  • 使用UNIQUE约束的字段在表中必须是不同的;


  • 对于所有引擎,UNIQUE 索引允许NULL包含的列具有多个值NULL。就是同一个字段的记录可以同为null。NOT NULL(不能为空) 某些字段我们要求用户必须插入值,不可以为空,这个时候我们可以使用 NOT NULL 来约束。


DEFAULT(默认值) 某些字段我们希望在没有设置值时给予一个默认值,这个时候我们可以使用 DEFAULT来完成。


AUTO_INCREMENT(自动递增) 某些字段我们希望不设置值时可以进行递增,比如用户的id,这个时候可以使用AUTO_INCREMENT来完成。


FOREIGN KEY (表内字段) REFERENCES 外表(外表的主键) (外键), 某些字段希望引用到其他表的字段来作为值。即将两个表联系起来。


数据库的操作


通过DDL语句对数据库进行操作


  • 查看所有的数据


SHOW DATABASES;


  • 使用某一个数据


USE 数据库名;


  • 查看当前正在使用的数据库


SELECT DATABASE();


  • 创建数据库


CREATE DATABASE IF NOT EXISTS `数据库名称`
    DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; // 这些都是数据库的默认编码。utf8mb4_0900_ai_ci这个表示数据库中数据的排序规则。表示不区分轻重音和大小写。


  • 删除数据库


DROP DATABASE IF EXIT `数据库名`;


  • 修改数据库


# 修改数据库的字符集和排序规则
    ALTER DATABASE `数据库名` CHARACTER SET = utf8 COLLATE = utf8_unicode_ci;


数据表的操作


通过DDL语句对表进行操作


  • 查看所有的数据表


SHOW TABLES;


  • 查看某一个表结构


DESC `表名`;


  • 创建表 一般设置表的时候有时间字段,我们都会给时间字段设置DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP默认值。在我们插入数据的时候,自动添加当前时间给这个字段。


CREATE TABLE IF NOT EXISTS `表名`(
        # 字段 类型 约束条件
        id INT PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR(20) NOT NULL,
        age INT DEFAULT 0,
        telPhone VARCHAR(20) DEFAULT '' UNIQUE NOT NULL
    );


  • 删除表


DROP TABLE IF EXISTS `表名`;


  • 修改表 对表结构,字段等做修改。不修改数据内容。


# 1.修改表名
    ALTER TABLE `原表名` RENAME TO `修改表名`;
    # 2.添加一个新的列
    ALTER TABLE `表名` ADD `字段` 字段类型;
    ALTER TABLE `moment` ADD `updateTime` DATETIME;
    # 3.删除一列数据
    ALTER TABLE `表名` DROP `字段`;
    # 4.修改列的名称
    ALTER TABLE `表名` CHANGE `原字段` `修改字段` 修改后的字段类型;
    # 5.修改列的数据类型
    ALTER TABLE `表名` MODIFY `字段` 字段类型;
    # 6.根据表结构创建另外一张表(不会复制数据)
    CREATE TABLE IF NOT EXISTS `表名` LIKE `参照表名`
    # 7.根据表结构创建另外一张表(并且复制数据)
    CREATE TABLE IF NOT EXISTS `表名` AS (SELECT * FROM `参照表名`);


通过DML语句对表进行操作, 比如插入数据,删除数据,修改数据


  • 向表中插入数据


#按表中字段的顺序插入数据
    INSERT INTO `表名` VALUES (对应的字段插入的值);
    #指定字段插入数据
    INSERT INTO `表名` (若干字段) VALUES (对应的字段插入的值);
    INSERT INTO `products` (`title`, `description`, `price`, `publishTime`) 
    VALUES ('iPhone', 'iPhone12只要998', 998.88, '2020-10-10');


  • 删除表中的数据


# 会删除表中所有的数据
    DELETE FROM `表名`;
    # 会删除符合条件的数据
    DELETE FROM `表名` WHERE 条件;
    DELETE FROM `products` WHERE `title` = 'iPhone';


  • 修改表中的数据 修改数据内容。


# 会修改表中所有的数据
    UPDATE `表名` SET 修改内容;
    UPDATE `products` SET `title` = 'iPhone12', `price` = 1299.88;
    # 会修改符合条件的数据
    UPDATE `表名` SET 修改内容 WHERE 条件;
    UPDATE `products` SET `title` = 'iPhone12', `price` = 1299.88 
    WHERE `title` = 'iPhone';


对数据库的查询操作


通过DMQL语句对表进行操作, 查询符合条件的数据。


主要就是通过SELECT用于从一个或者多个表中检索选中的行。


查询格式


SELECT select_expr [, select_expr]...
    [FROM table_references]
    [WHERE where_condition]
    [ORDER BY expr [ASC | DESC]]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [GROUP BY expr]
    [HAVING where_condition]


WHERE基本条件查询


逻辑查询


and, &&。 或or, ||。 之间between and 这个也会包括两头的结果。In关键字是取代多个或查询的。


# 查询品牌是华为,并且小于2000元的手机
    SELECT * FROM `products` WHERE `brand` = '华为' and `price` < 2000;
    SELECT * FROM `products` WHERE `brand` = '华为' && `price` < 2000;
    # 查询1000到2000的手机(不包含1000和2000)
    SELECT * FROM `products` WHERE price > 1000 and price < 2000;
    # OR: 符合一个条件即可
    # 查询所有的华为手机或者价格小于1000的手机
    SELECT * FROM `products` WHERE brand = '华为' or price < 1000;
    # 查询1000到2000的手机(包含1000和2000)
    SELECT * FROM `products` WHERE price BETWEEN 1000 and 2000;
    # 查看多个结果中的一个
    SELECT * FROM `products` WHERE brand IN ('华为', '小米');
    -- 等价于
    SELECT * FROM `products` WHERE brand = '华为' || brand = '小米';


空值查询


  • IS NULL


  • IS NOT NULL


SELECT * FROM `products` WHERE name IS NULL;
    SELECT * FROM `products` WHERE name IS NOT NULL;


模糊查询


模糊查询使用LIKE关键字,结合两个特殊的符号:


  • % 表示匹配任意个的任意字符。


  • _ 表示匹配一个的任意字符。


# 查询所有以v开头的title
    SELECT * FROM `products` WHERE title LIKE 'v%';
    # 查询带M的title
    SELECT * FROM `products` WHERE title LIKE '%M%';
    # 查询带M的title必须是第三个字符
    SELECT * FROM `products` WHERE title LIKE '__M%';


对查询结果排序


ORDER BY有两个常用的值:


  • ASC:升序排列。默认


  • DESC:降序排列。


SELECT * FROM `products` WHERE brand = '华为' or price < 1000 
    ORDER BY price ASC;


可以添加多个排序。作为辅排序。当主排序相同的时候,我们就可以通过辅排序来进行排序。


SELECT * FROM `products` WHERE brand = '华为' or price < 1000 
    ORDER BY price ASC, score DESC;


分页查询


当数据库中的数据非常多时,一次性查询到所有的结果进行显示是不太现实的,在真实开发中,我们都会要求用户传入offset、limit或者page等字段。它们的目的是让我们可以在数据库中进行分页查询;


它的用法有[LIMIT {[offset,] row_count | row_count OFFSET offset}]


SELECT * FROM `products` LIMIT 30 OFFSET 0;
    SELECT * FROM `products` LIMIT 30 OFFSET 30;
    SELECT * FROM `products` LIMIT 30 OFFSET 60;
    # 另外一种写法:offset, row_count
    SELECT * FROM `products` LIMIT 90, 30;


分组查询


我们通过GROUP BY来创建分组。通常结合聚合函数使用。


在我们没有分组之前,使用聚合函数,它将整个表看成一个组。即聚合函数相当于默认将所有的数据分成了一组。


我们先对数据进行分组,再对每一组数据,进行聚合函数的计算。并且我们可以通过HAVING来对分组进行约束。注意:WHERE不能在GROUP BY后面使用,我们只能通过HAVING来对分组进行约束。他表示在分完组后进行条件筛选。


SELECT brand,
    COUNT(*) as count,
    ROUND(AVG(price),2) as avgPrice,
    MAX(price) as maxPrice,
    MIN(price) as minPrice,
    AVG(score) as avgScore
    FROM `products` GROUP BY brand
    HAVING avgPrice < 4000 and avgScore > 7;


常用的聚合函数


注意:COUNT(*)COUNT(字段)的区别。前面是统计该表中有多少记录。或者统计的是非空记录的个数。而且后者还可以通过DISTICT来约束相同记录只记做一次。即COUNT(DISTINCT 字段)


# 华为手机价格的平均值
    SELECT AVG(price) FROM `products` WHERE brand = '华为';
    # 计算所有手机的平均分
    SELECT AVG(score) FROM `products`;
    # 手机中最低和最高分数
    SELECT MAX(score) FROM `products`;
    SELECT MIN(score) FROM `products`;
    # 计算总投票人数
    SELECT SUM(voteCnt) FROM `products`;
    # 计算所有条目的数量
    SELECT COUNT(*) FROM `products`;
    # 华为手机的个数
    SELECT COUNT(*) FROM `products` WHERE brand = '华为';


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
13天前
|
开发框架 JavaScript 安全
js开发:请解释什么是Express框架,以及它在项目中的作用。
【4月更文挑战第24天】Express是Node.js的Web开发框架,简化路由管理,支持HTTP请求处理。它包含中间件系统用于日志、错误处理和静态文件服务,集成多种模板引擎如EJS、Jade、Pug。框架还提供安全中间件提升应用安全,并具有良好的可扩展性,便于项目功能扩展和开发效率提升。
24 3
|
9天前
|
JavaScript 前端开发 持续交付
【专栏】构建现代Web应用:Vue.js与Node.js的完美结合
【4月更文挑战第27天】本文探讨了Vue.js和Node.js如何结合构建现代Web应用。Vue.js作为轻量级前端框架,以其简洁易懂、组件化开发、双向数据绑定和虚拟DOM等特点受到青睐;而Node.js是高性能后端平台,具备事件驱动、非阻塞I/O、丰富生态系统和跨平台优势。两者结合实现前后端分离,高效通信,并支持热更新、持续集成、跨平台和多端适配,为开发高性能、易维护的Web应用提供强有力的支持。
|
6天前
|
JavaScript 前端开发 开发工具
【JavaScript 技术专栏】Node.js 基础与实战
【4月更文挑战第30天】本文介绍了Node.js的基础及应用,包括事件驱动的非阻塞I/O、单线程模型和模块系统。内容涵盖Node.js的安装配置、核心模块(如http、fs、path)及实战应用,如Web服务器、文件操作和实时通信。文章还讨论了Node.js的优劣势、与其他技术的结合,并通过案例分析展示项目实施流程。总结来说,Node.js是高效后端开发工具,适合构建高并发应用,其广阔的应用前景值得开发者探索。
|
7天前
|
JavaScript API 开发者
深入了解Node.js的文件系统:Node.js文件系统API的使用与探索
【4月更文挑战第30天】本文深入探讨了Node.js的文件系统API,介绍了如何引入`fs`模块进行文件操作。内容包括异步读取和写入文件、删除文件、创建目录以及使用文件流进行高效操作。此外,还提到了文件系统的监视功能,帮助开发者全面掌握在Node.js中处理文件和目录的方法。
|
7天前
|
开发框架 JavaScript 中间件
深入探索Node.js的Express框架:使用与中间件详解
【4月更文挑战第30天】本文深入探讨了Node.js的Express框架,介绍了其作为Web开发的强大工具,主要聚焦于基本使用和中间件。Express是基于Node.js的Web应用框架,用于构建高效的应用和API。文章详细讲解了如何安装Express,创建简单应用,以及中间件的工作原理和应用,包括中间件的顺序、错误处理和挂载位置。此外,还提到了使用第三方中间件扩展功能。理解Express基础和中间件对于开发高质量Web应用至关重要。
|
8天前
初识express框架
初识express框架
|
13天前
|
Web App开发 JavaScript 前端开发
js开发:请解释什么是Node.js,以及它的应用场景。
Node.js是基于V8引擎的JavaScript运行时,用于服务器端编程。以其事件驱动、非阻塞I/O模型著称,适用于高并发和实时应用。常见用途包括:构建Web服务器、实时应用(如聊天)、API服务、微服务、工具和命令行应用,以及搭配Electron开发桌面软件。
19 1
|
24天前
|
开发框架 JavaScript 前端开发
【Node系列】Express 框架
Express.js 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,提供一系列强大的特性来帮助你创建各种 web 和移动设备应用。
35 2
|
19小时前
|
关系型数据库 MySQL Linux
Linux CentOs7 安装Mysql(5.7和8.0版本)密码修改 超详细教程
Linux CentOs7 安装Mysql(5.7和8.0版本)密码修改 超详细教程
|
1天前
|
SQL 缓存 关系型数据库
MySQL常见问题解决和自动化安装脚本
这篇内容包含了两个主要部分:解决MySQL登录问题和处理GPG密钥问题。当MySQL密码正确但无法登录时,可以通过执行SQL命令`ALTER USER`和`flush privileges`来修改和重置密码。对于MySQL安装时的GPG密钥错误,首先需要强制删除旧的MySQL仓库包,导入新的GPG公钥,然后安装MySQL服务器。如果遇到GPG检查错误,可以使用`--nogpgcheck`参数忽略检查来安装。最后,提供了一个自动化安装MySQL的脚本,用于检查旧版本、卸载残留、安装MySQL8并启动服务。
11 1
MySQL常见问题解决和自动化安装脚本