数据库的下载和安装自行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 = '华为';