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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 重学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 = '华为';


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
16天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端框架
【10月更文挑战第34天】在数字化时代,后端开发如同一座桥梁,连接着用户界面与数据处理的两端。本文将通过Node.js这一轻量级、高效的平台,带领读者领略后端框架的魅力。我们将从基础概念出发,逐步深入到实战应用,最后探讨如何通过代码示例来巩固学习成果,使读者能够在理论与实践之间架起自己的桥梁。
|
1月前
|
JavaScript 前端开发 中间件
探索后端技术:Node.js与Express框架的完美融合
【10月更文挑战第7天】 在当今数字化时代,Web应用已成为日常生活不可或缺的一部分。本文将深入探讨后端技术的两大重要角色——Node.js和Express框架,分析它们如何通过其独特的特性和优势,为现代Web开发提供强大支持。我们将从Node.js的非阻塞I/O和事件驱动机制,到Express框架的简洁路由和中间件特性,全面解析它们的工作原理及应用场景。此外,本文还将分享一些实际开发中的小技巧,帮助你更有效地利用这些技术构建高效、可扩展的Web应用。无论你是刚入门的新手,还是经验丰富的开发者,相信这篇文章都能为你带来新的启发和思考。
|
5天前
|
缓存 负载均衡 JavaScript
构建高效后端服务:Node.js与Express框架实践
在数字化时代的浪潮中,后端服务的重要性不言而喻。本文将通过深入浅出的方式介绍如何利用Node.js及其强大的Express框架来搭建一个高效的后端服务。我们将从零开始,逐步深入,不仅涉及基础的代码编写,更会探讨如何优化性能和处理高并发场景。无论你是后端新手还是希望提高现有技能的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
22天前
|
JavaScript 中间件 API
Node.js进阶:Koa框架下的RESTful API设计与实现
【10月更文挑战第28天】本文介绍了如何在Koa框架下设计与实现RESTful API。首先概述了Koa框架的特点,接着讲解了RESTful API的设计原则,包括无状态和统一接口。最后,通过一个简单的博客系统示例,详细展示了如何使用Koa和koa-router实现常见的CRUD操作,包括获取、创建、更新和删除文章。
38 4
|
29天前
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的完美结合
【10月更文挑战第21天】本文将引导你走进Node.js和Express框架的世界,探索它们如何共同打造一个高效、可扩展的后端服务。通过深入浅出的解释和实际代码示例,我们将一起理解这一组合的魅力所在,并学习如何利用它们来构建现代Web应用。
48 1
|
1月前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
17天前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实践
【10月更文挑战第33天】在数字化时代的浪潮中,后端服务的效率和可靠性成为企业竞争的关键。本文将深入探讨如何利用Node.js和Express框架构建高效且易于维护的后端服务。通过实践案例和代码示例,我们将揭示这一组合如何简化开发流程、优化性能,并提升用户体验。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
|
19天前
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的融合之道
【10月更文挑战第31天】在追求快速、灵活和高效的后端开发领域,Node.js与Express框架的结合如同咖啡遇见了奶油——完美融合。本文将带你探索这一组合如何让后端服务搭建变得既轻松又充满乐趣,同时确保你的应用能够以光速运行。
24 0
|
1月前
|
JSON JavaScript 前端开发
Node.js Express 框架
10月更文挑战第7天
30 2
|
1月前
|
SQL JavaScript 关系型数据库
Node.js 连接 MySQL
10月更文挑战第9天
20 0
下一篇
无影云桌面