初识MySQL

一.为什么需要数据库?


任何的软件系统都需要存放的大量的数据,这些数据通常是非常复杂和庞大的。

  • 比如用户信息包括姓名、年龄、性别、地址、身份证号、出生日期等等;
  • 比如商品信息包括商品的名称、描述、价格(原价)、分类标签、商品图片等等
  • 比如歌曲信息包括歌曲的名称、歌手、专辑、歌曲时长、歌词信息、封面图片等等

难道这些数据不能存储在文件系统中? 答案是可以,但是文件系统有很多的特点。

  • 很难以合适的方式组织数据(多张表之前的关系合理组织)
  • 并且对数据进行增删改查中的复杂操作(虽然一些简单确实可以),并且保证单操作的原子性
  • 很难进行数据共享,比如一个数据库需要为多个程序服务,如何进行很好的数据共享
  • 需要考虑如何进行数据的高效备份、迁移、恢复

数据库通俗来讲就是一个存储数据的仓库,数据库本质上就是一个软件,一个程序。

二.常见的数据库有哪些?


通常我们将数据库划分为两类:关系型数据库和非关系型数据库。

关系型数据库:MySQL,Oracle,DB2,SQL Server,Postgre SQL等。

  • 关系型数据库通常我们会创建很多二维数据表。
  • 数据表之间相互关联起来,形成一对一,一对多,多对多等关系。
  • 之后可以利用SQL语句在多张表中查询我们所需的数据。

非关系型数据库:MangoDB,Redis,Memcached,HBse等。

  • 非关系型数据库的英文其实是Not only SQL,也简称为NoSQL
  • 相当而言非关系型数据库比较简单一点,存储数据也会更加自由,设置我们可以直接将一个复杂的json对象直接塞到数据库中。
  • NoSQL是基于Key-Value的对应关系,并且查询的过程中不需要经过SQL解析。

三.认识MySQL


MySQL的介绍:

  • MySQL原本是一个开源的数据库,原开发者为瑞典的MySQL AB公司。
  • 在2008年被Sun公司收购,在2009年,Sun被Oracle收购。
  • 所以目前MySQL归属于Oracle。

MySQL是一个关系型数据库,其实本质上就是一款软件,一个程序。

  • 这个程序中管理了很多个数据库。
  • 每个数据库中有很多张表。
  • 每个表中可以有很多条数据。

四.下载MySQL


我们可以去MySQL官网进行下载:www.mysql.com/cn/

然后选择下载的页面,拉到最后选择免费的社区版。

然后进去之后我们可以选择MySQL的版本进行安装,如果要安装其他版本就去这里,包含很多的历史版本。

然后我们可以安装对应的安装版本进行下载安装,我这里安装的是8.4.0安装的过程种可能会出现如下这种情况

这个错误是因为 此程序需要最新版 Visual Studio 2019 x64 VC++ 运行库,请先安装该组件,再重新运行 MySQL 安装程序。 我们需要去下载和安装:aka.ms/vs/16/relea...

然后我们就可以安装MySQL了,会弹出让我们选择,默认安装第一个就可以了。

然后基本就是一步Next即可,之后会出现这个界面。

然后我们点击execute进行安装即可,之后安装就完成了。

五.启动MySQL


当安装完毕会自动帮我们启动MySQL,然后我们通过Window电脑的搜索,可以看到如下的内容就说明我们的MySQL已经启动了。

但是这个时候我们还不能在终端上直接进行输入命令查看,因为我们还没有配置环境变量。

这个时候我们需要配置一下环境变量,搜索打开查看高级系统设置,之后在系统path中添加。

然后我们就可以直接访问了。

六.终端连接数据库


如果我们想要对数据进行操作,我们首先要建立一个链接最直接的方式就是通过终端来连接。

sql 复制代码
# 方式一
mysql -uroot -proot
# 方式二
mysql -uroot -p
Enter password: your password

我们还可以通过命令来看下有哪些默认的数据库;

sql 复制代码
show databases;

MySQL默认的数据库

  • infomation_schema:信息数据库,其中包括MySQL在维护的其他数据库、表、列、访问权限等信息;
  • performance_schema:性能数据库,记录着MySQL Server数据库引擎在运行过程中的一些资源消耗相关的信息;
  • mysql:用于存储数据库管理者的用户信息、权限信息以及一些日志信息等。
  • sys:相当于是一个简易版的performance_schema,将性能数据库中的数据汇总成更容易理解的形式;

七.终端操作数据库


我们可以直接cmd终端直接操作数据库。

sql 复制代码
create database coderhub;

然后我们可以使用新建的数据库。

sql 复制代码
use database;

在数据库中新建一张表

sql 复制代码
create table user(name varchar(20), age int,height double);

我们可以向表中插入一些数据

sql 复制代码
insert into user(name,age,height) values('why',18,1.88);
insert into user(name,age,height) values('aaa',18,1.88);

上述的终端操作了解即可,实际中我们更多的使用图形化界面GUI进行操作。

八.GUI工具的介绍


我们会发现使用GUI工具有很多不方便的地方,在开发中我们大多数情况下会使用GUI工具进行操作,推荐使用开源的DBeaver。

然后我们可以连接上我们的MySQL服务进行便捷的查看数据了。

九.认识SQL语句


我们需要操作数据库就需要和数据库能够沟通,和数据库沟通的语言就是SQL

  • SQL是Structured Query Language,称之为结构化查询语言,简称SQL
  • 使用SQL编写出来的语句,就称之为SQL语句
  • SQL语句可以用于对数据库进行操作

常用的数据库语句分为四类:

  • DDL数据定义语言:可以通过DDL语句对数据库或表进行创建,删除,修改等操作。
  • DML数据操作语言:可以通过DML语言对表进行添加,删除,修改等操作。
  • DQL数据查询语言:可以通过DQL从数据库中查询记录。
  • DCL数据控制语言:对数据库,表格进行权限相关的访问控制操作。

SQL语句常用规范:

  • 通常关键字使用大写,比如CREATE,TABLE,SHOW等等。
  • 一条语句结束后,需要以;结尾。
  • 如果遇到关键字作为表明或者字段名称可以使用``进行包裹。

十.数据库的操作


查看当前数据库

sql 复制代码
# 查看所有的数据库
show databases;
# 使用某一个数据库
use coderhub;
# 查看当前正在使用的数据库
select database();

创建新的数据库

sql 复制代码
# 创建数据库
CREATE DATABASE bilibili;
CREATE DATABASE IF NOT EXISTS bilibili;
CREATE DATABASE IF NOT EXISTS bilibili
DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

删除某个数据库

sql 复制代码
# 删除某个数据库
DROP DATABASE bilibili;
drop database if exists test_demo;

修改数据库

sql 复制代码
# 修改数据库的字符集和排序规则
ALTER DATABASE bilibili CHARACTER SET = utf8 COLLATE = utf8_unicode_ci;

十一.数据表的操作


sql 复制代码
# 查看所有的数据表
SHOW TABLES;
# 查看某一个表结构
DESC user;
# 创建数据表
CREATE TABLE IF NOT EXISTS `users`(
name VARCHAR(20),
age INT,
height DOUBLE
);

十二.SQL数据类型


我们直到不同数据会划分为不同的数据类型,在数据库中也一样,MySQL支持的数据类型有:数字类型,日期和时间类型,字符串类型,空间类型和JSON数据类型。

MySQL支持的数字类型是比较多的

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

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

精确数字类型:DECIMAL,NUMBERIC(DECIMAL是NUMBERIC的实现形式)

日期类型:

MySQL的日期类型也很多:

YEAR: 以YYYY格式显示值,范围为1901到2155和0000

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

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

TIMESTAMP:数据类型被用于同时包含日期和时间部分的值,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之间的值在被查询时不会删除后面的空格;

BINARYVARBINARY类型用于存储二进制字符串,存储的是字节字符串。

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

TEXT用于存储大的字符串类型。

十三.表约束


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

  • 主键是表中唯一的索引。
  • 并且必须是NOT NULL的,如果没有设置NOT NULL,那么MySQL也会隐式的设置为NOT NULL
  • 主键也可以是多列索引,PRIMARY KEY(key_part, ...),我们一般称之为联合主键
  • 建议:开发中主键字段应该是和业务无关的,尽量不要使用业务字段来作为主键

唯一:UNIQUE

  • 某些字段在开发中我们希望是唯一的,不会重复的,比如手机号码、身份证号码等,这个字段我们可以使用UNIQUE来约束
  • 使用UNIQUE约束的字段在表中必须是不同的
  • UNIQUE 索引允许NULL包含的列具有多个值NULL

不能为空:NOT NULL

  • 某些字段我们要求用户必须插入值,不可以为空,这个时候我们可以使用NOT NULL 来约束

默认值:DEFAULT

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

自动递增: AUTO_INCREMENT

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

十四.创建一个完整的表


创建数据表:

sql 复制代码
create table if not exists `users`(
	id INT primary key auto_increment,
	name VARCHAR(20) not null,
	age INT default 0,
	telPhone VARCHAR(20) default '' unique not null
);

删除数据表:

sql 复制代码
drop table users;
drop table if exists users;

修改表:

sql 复制代码
# 1.修改表名
ALTER TABLE `moments` RENAME TO `moment`;
# 2.添加一个新的列
ALTER TABLE `moment` ADD `publishTime` DATETIME;
ALTER TABLE `moment` ADD `updateTime` DATETIME;
# 3.删除一列数据
ALTER TABLE `moment` DROP `updateTime`;
# 4.修改列的名称
ALTER TABLE `moment` CHANGE `publishTime` `publishDate` DATE;
# 5.修改列的数据类型
ALTER TABLE `moment` MODIFY `id` INT;

十五.对数据操作


DML数据操作语言:

sql 复制代码
CREATE TABLE IF NOT EXISTS `products`(
  `id` INT PRIMARY KEY AUTO_INCREMENT,
  `title` VARCHAR(20),
  `description` VARCHAR(200),
  `price` DOUBLE,
  `publishTime` DATETIME
);

插入数据:

sql 复制代码
INSERT INTO `products` (`title`, `description`, `price`, `publishTime`) 
VALUES ('iPhone', 'iPhone12只要998', 998.88, '2020-10-10'); 

INSERT INTO `products` (`title`, `description`, `price`, `publishTime`) 
VALUES ('huawei', 'iPhoneP40只要888', 888.88, '2020-11-11');

删除数据:

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

修改数据:

sql 复制代码
# 修改数据
# 会修改表中所有的数据
UPDATE `products`  SET `title` = 'iPhone12', `price` = 1299.88;
# 会修改符合条件的数据
UPDATE `products`  SET `title` = 'iPhone12', `price` = 1299.88 WHERE `title` = 'iPhone';

如果我们希望修改完数据后,直接可以显示最新的更新时间:

sql 复制代码
ALTER TABLE `products` ADD `updateTime` TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; 

十六.数据查询


我们可以使用DQL语言对数据进行查询,基本查询格式如下:

sql 复制代码
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]

我们准备一张表

sql 复制代码
CREATE  TABLE  IF  NOT  EXISTS `products`  (
  id  INT  PRIMARY  KEY AUTO_INCREMENT, 
  brand VARCHAR(20),
  title VARCHAR(100)  NOT  NULL, 
  price  DOUBLE  NOT  NULL,
  score  DECIMAL(2,1),
  voteCnt  INT,
  url VARCHAR(100),
  pid  INT
);

然后我们可以使用mysql2来进行数据的插入

sql 复制代码
const  mysql  =  require('mysql2');
const  connection  =  mysql.createConnection({
host:  'localhost',
port:  3306, 
user:  'root',
password:  'root',
database:  'coderhub'
});
const  statement  = `INSERT  INTO  products  SET  ?;`
 const  phoneJson  =  require('./phone.json');
for  (let  phone  of  phoneJson)  {
 connection.query(statement,  phone);
}

基本查询:

sql 复制代码
# 查询谁有数据并显示所有字段
SELECT  *  FROM `products`;
# 查询title、brand、price:
SELECT  title,  brand,  price  FROM `products`;
# 我们也可以给字段起别名:别名一般在多张表或者给客户端返回对应的key时会使用到
SELECT  title  as  t,  brand  as  b,  price  as  p  FROM `products`;

where条件查询: 在开发中,我们希望根据条件来筛选我们的数据,这个时候我们要使用条件查询:条件查询会使用 WEHRE查询子句;

sql 复制代码
#  查询价格小于1000的手机
SELECT  *  FROM `products`  WHERE price  <  1000;
#  查询价格大于等于2000的手机
SELECT  *  FROM `products`  WHERE price  >=  2000;
#  价格等于3399的手机
SELECT  *  FROM `products`  WHERE price  =  3399;
#  价格不等于3399的手机
SELECT  *  FROM `products`  WHERE price  !=  3399;
#  查询华为品牌的手机
SELECT  *  FROM `products`  WHERE `brand`  =  '华为';

where查询逻辑运算符

sql 复制代码
#  查询品牌是华为,并且小于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  ('华为',  '小米');

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

  • %表示匹配任意个的任意字符;
  • _表示匹配一个的任意字符;
sql 复制代码
#  查询所有以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,ORDER BY有两个常用的值:

  • ASC:升序排序
  • DESC:降序排序
sql 复制代码
SELECT * FROM `products` WHERE brand = '华为' or price < 1000 ORDER BY price ASC;

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

sql 复制代码
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;

相关推荐
陳陈陳1 小时前
从Token到Embedding:一篇文章搞懂大模型的「文字数学变形记」
前端·javascript·ai编程
十有八七1 小时前
AI时代的置身X内
前端·人工智能
橘子星1 小时前
LLM 无状态架构实践:从原理到代码落地
前端·javascript·人工智能
LiuMingXin1 小时前
意图与代码之间:AI编程范式全景解读
前端·后端·面试
壹方秘境2 小时前
ApiCatcher支持抓包HTTP传输大文件的实现原理分享
前端·后端·客户端
一份执念2 小时前
uni-app项目 (vue+vite + uni-UI)中引入umd格式JS文件,微信小程序中导入报错处理方案
前端·uni-app·echarts
ClouGence2 小时前
2026 年自动化测试工具选型指南:8 款主流工具对比
前端·测试
lichenyang4533 小时前
为什么需要双线程通信、JavaScriptProxy 和 runJavaScript 分别干什么
前端
以和为贵3 小时前
前端也能搞懂 RAG:用 JS 手写一条最小检索增强链路
前端·人工智能·面试