Nodejs 第三十三章 SQL语句
Nodejs 第三十三章 SQL语句
-
在上一章节中,我们使用了可视化来简单创建了数据库,创建了表和填充删除了数据。
- 但通过可视化的操作方式,其实操作自由度是不太够的,比开车的自动挡手动挡的区别还大一点
- 所以掌握命令的写法是势在必得的(就像Git一样,应该没人去用那个可视化),命令写法多快呐
-
而编写在数据库中的命令就叫
SQL
- SQL(Structured Query Language)是一种用于管理关系型数据库系统的语言。它是一种标准化语言,用于执行各种数据库操作,包括数据
查询、插入、更新和删除
等 - 其中正常使用掌握增删改查也就够用了,如果需求不满足还可以继续深造,SQL能探索的深度是非常夸张的
- SQL(Structured Query Language)是一种用于管理关系型数据库系统的语言。它是一种标准化语言,用于执行各种数据库操作,包括数据
数据库的操作
连接数据库
-
通过命令:
mysql -u root -p
连接数据库- 该命令首先开头mysql是专属于mysql系列的命令标识,在我们前面自己实现脚手架的时候,也实现过的
- -u是-user(用户名)的缩写,而后面的root就是我们的默认用户名了
- -p则是password(密码)的缩写,而此时密码是不能跟在-p后面写的,因为我们此时输入的状态还是明文,-p回车之后,我们会进入输入密码的密文状态,此时就没人能看见我们输入的密码是什么了(除非他盯着你的键盘)
-
查看所有的数据库:
show databases;
- 上一章节讲解过,这里就略过
创建数据库
-
非常形象化
- create(创建) database(数据库) 库名
- 这里
命令是不区分大小写
的,根据自己的爱好可以来选择,只是说大多数情况下他们会采用大写的写法
create database 库名
-
如果进行重复的创建就会失败,数据库不允许重复创建
- 会报错:Can't create database 'xiaoyu'; database exists
- 意思就是:无法创建数据库"xiaoyu",数据库已经存在
避免重复创建数据库
-
为了避免这个问题,我们采用
if not exists
命令- 此时就不会报错了
- 该命令的意思是:如果这个数据库不存在,我就创建。如果存在,就什么都不做。
CREATE DATABASE IF NOT EXISTS `xiaoyu`
添加字符集utf-8
- 在我们创建数据库的同时,设置默认的字符集(第二行翻译过来就是这句话)
CREATE DATABASE IF NOT EXISTS `xiaoyu`
DEFAULT CHARACTER SET = 'utf8mb4'
- 大家能够看到,我们此时没有在终端继续写命令,而是换到了vscode编辑器中,因为
编辑器有代码提示,而且可以换行
,是要比在终端输入更加方便的,我们要善于利用工具
SQL书写顺序
此时我需要向你介绍SQL命令书写的最根本原则之一,他的书写顺序是非常核心且基础的内容。只有掌握住这个规律,我们在阅读和书写SQL语句的时候,才不会是生搬硬套,而是真正理解。此时的学习才会轻松
-
操作类型关键字:命令始终以操作类型的关键字开始,例如
CREATE
,SELECT
,INSERT
,UPDATE
,DELETE
等。 -
目标对象:操作类型关键字后通常是目标对象,例如
DATABASE
,TABLE
, 或具体的表名。 -
条件或修饰符:某些命令可能包括条件或修饰符,如
IF NOT EXISTS
(用于创建操作),IF EXISTS
(用于删除操作),这些修饰符通常紧随目标对象之后。 -
详细规范:
- 在创建或修改结构的命令(如
CREATE TABLE
)中,详细规范如字段定义、数据类型等紧随条件或修饰符之后。 - 在
INSERT
,UPDATE
,SELECT
命令中,字段和值或条件表达式跟在目标对象之后。
- 在创建或修改结构的命令(如
-
操作细节:
- 对于
INSERT
命令,先定义表名和列名,随后是要插入的值。 - 对于
UPDATE
命令,先指定表名,接着是SET
关键字和字段赋值,然后是WHERE
子句(如果有条件限制)。 - 对于
SELECT
命令,首先列出要查询的字段,然后是FROM
关键字和表名,最后是WHERE
子句(如果有条件限制)。
- 对于
-
结束符:每条命令的末尾都应该有一个分号(
;
)作为结束符,特别是在同时执行多条命令的情况下。
数据表操作
创建数据表
- 我们先来看下一个基础的用户表长什么样子,不要被这个密密麻麻的内容所吓倒,其实内容并没我们想象中那么多
CREATE TABLE `user` (
id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
name varchar(100) COMMENT '名字',
age int COMMENT '年龄',
address varchar(255) COMMENT '地址',
create_time timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) COMMENT '用户表'
-
作为一个表最基础的结构其实是很简单的,让我们去掉所有不是必需的内容来看看吧
- 首先,我们要记住前面SQL的书写顺序,我们就能够知道命令始终以操作类型的关键字开始。而这里,我们要创建一个表,就以CREATE开始,然后是目标对象,我们目标是一个表,而表就是TABLE,在TABLE之后连贯上我们的表名user。
- 之后加上中括号就好了,中括号内就是我们要定义的表的内容框架了
CREATE TABLE `user`{
}
-
那此时,我们就要思考,表的内部到底要怎么填写?
- 内容是不重要的,因为不同的表,需要定义的内容都是不同的。我们所需要掌握的,是填写的方式和顺序,只要有所掌握,我们就能根据自己的需求将其如同搭积木一样搭建起来,自由组合成自己所需的内容
必须的元素
- 字段名:每个字段都必须有一个唯一的名称,用于标识该字段
- 数据类型:每个字段都必须指定数据类型,它定义了该字段可以存储的数据种类(如
INT
,VARCHAR
,DATE
等)
元素的顺序
-
抛开哪些复杂的表面,其实他们的内在规则就由以下这三点按顺序组成,非常好理解
- 我们所看到的繁复内容,很大程度上是可选属性的堆叠造成的
字段名 数据类型 可选属性
可选的元素(属性)
- NULL/NOT NULL:指定字段是否可以存储
NULL
值。 - DEFAULT:为字段指定一个默认值。
- AUTO_INCREMENT:对于整数类型的字段,可以设置为自动递增,常用于主键。
- PRIMARY KEY:将字段指定为表的主键。
- UNIQUE:确保字段值在表中唯一。
- COMMENT:为字段添加注释说明。
插入位置详解
- 数据类型后:大部分可选属性都是跟在数据类型之后,例如
AUTO_INCREMENT
,NOT NULL
,DEFAULT
,COMMENT
等 - 字段定义结束后:一些特殊的约束如
PRIMARY KEY
和UNIQUE
可以在单独的行中定义,也可以直接在字段定义行中指定
定义表内的内容
通过前面的了解后,我们就来看看一开始所看到的基础用户表的内容,我们解析这张用户表其中两行典型案例,而后面的内容都可以用同样的规律所看透
-
id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-
字段名:
id
-
数据类型:
int
(整数) -
可选属性:
NOT NULL
:该字段不能存储 NULL 值。AUTO_INCREMENT
:该字段的值将自动递增,每插入一条新记录,值自动加一。PRIMARY KEY
:该字段是表的主键,用于唯一标识表中的每条记录。
-
-
create_time timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
-
字段名:
create_time
-
数据类型:
timestamp
(时间戳) -
可选属性:
DEFAULT CURRENT_TIMESTAMP
:为字段指定默认值,如果在插入记录时未指定该字段的值,MySQL将自动使用当前的时间戳。就是自动填充默认值功能COMMENT '创建时间'
:为字段添加注释,说明这是记录创建时间的字段。为了后来者也能够以最快速度知道这行代码的作用,我们可以添加适当的注释
-
create table 表名字 (
id字段名称 int数据类型代表数字类型 NOT NULL(不能为空) AUTO_INCREMENT(id自增)
PRIMARY KEY(id为主键)
name(字段名称) varchar(100)字符串类型100字符 COMMENT(注释)
age(字段名称) int数据类型代表数字类型 COMMENT(注释)
create_time(字段名称) timestamp(时间戳) DEFAULT CURRENT_TIMESTAMP(自动填充创建时间)
)
CREATE TABLE `user` (
id int NOT NULL AUTO_INCREMENT PRIMARY KEY, -- 定义一个名为 `id` 的整数字段,设为主键,自增,不能为空
name varchar(100) COMMENT '名字', -- 名为 `name` 的字符串字段,最大长度100字符,附加注释 '名字'
age int COMMENT '年龄', -- 名为 `age` 的整数字段,附加注释 '年龄'
address varchar(255) COMMENT '地址', -- 名为 `address` 的字符串字段,最大长度255字符,附加注释 '地址'
create_time timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' -- 名为 `create_time` 的时间戳字段,设置默认值为当前时间戳,附加注释 '创建时间'
) COMMENT '用户表' -- 对整个表添加注释 '用户表'
-
我们来随便添加点内容测试一下,插入的命令会附带显示在下面
- 其中id和时间不填,因为id是自增的,而时间是根据当前时间戳自动填入
INSERT INTO `user`(`name`,`age`,`address`) VALUES('小余',21,'福建');
- 可以看到
id
自己从1开始,而时间
就是我写这份笔记的时间
-
我此时如果把
id
删掉,就会报错。因为我们前面在创建表的时候对id
设置NOT NULL
,也就是不能为空- 其他部分就没这个报错问题
修改表
修改表名
-
遇到新的命令,还是遵循我们SQL语句的书写顺序
- ALTER是
操作类型关键字
,**TABLEuser
RENAMEuser666
**是目标对象 - ALTER是改变的意思,后面的目标对象则是
表名user重命名为user666
- ALTER是
ALTER TABLE `user` RENAME `user666`
添加列
-
对表进行
增删改查
是最基础的操作命令,此时掌握SQL语句的书写顺序
。我们就会很轻松的理解下面这些命令了- ALTER 是
操作关键字
- ALTER TABLE
user
Add COLUMNsex
VARCHAR(20) ;是目标对象
- ALTER 是
-
我们只需要额外理解的只有Add COLUMN
sex
VARCHAR(20) 这段内容。- 翻译过来就是:添加一列内容,主体是
sex
字段,限制是VARCHAR(20)
。就是让用户填性别 - 而这段需要额外理解的为什么要写在后面,在我们SQL书写顺序中也有提到
- 翻译过来就是:添加一列内容,主体是
ALTER TABLE `user` Add COLUMN `sex` VARCHAR(20) ;
删除列
-
DROP:删除一个列
- 整体:删除user表中的
sex
列
- 整体:删除user表中的
ALTER TABLE `user` DROP `sex`
编辑表
-
MODIFY:变更
-
表名:
user
— 指定了要修改的表名。 -
字段名:
age
— 指出要修改的列的名称。 -
数据类型:
VARCHAR(255)
— 将age
列的数据类型从之前的类型(可能是int
或其他)更改为VARCHAR(255)
,即可存储最长为255个字符的字符串。 -
可选属性:
NULL
— 允许age
列存储NULL
值,表示该列数据可以不提供(可以为空)。COMMENT '年龄2'
— 为该列添加或修改注释为 "年龄2",用于说明或标记该列的内容或用途。
-
ALTER TABLE `user` MODIFY COLUMN `age` VARCHAR(255) NULL COMMENT '年龄2';
- 同时这里要说明,不管是删除还是添加、编辑,都是可以同时增删多个的,只需要在要删除或者添加的后面加上逗号,即可继续连贯的写下去
增删改逻辑规律(表)
- 对于上面的
增删改
操作表中,我想大家已经可以发现了一些规律,我们来将其总结一下
ALTER TABLE `user` RENAME `user666`
ALTER TABLE `user` Add COLUMN `sex` VARCHAR(20) ;
ALTER TABLE `user` MODIFY COLUMN `age` VARCHAR(255) NULL COMMENT '年龄2';
-
所有这些操作都以
ALTER TABLE
开始,随后指定操作类型(如 ADD, MODIFY, RENAME),然后是具体的操作细节(如新的表名、列名、数据类型、约束等) -
不过这些是对表是本身进行操作的,在开头的
ALTER TABLE
也印证了这点- 我们在往表里添加内容开头则不一样,这好像规律被打破了,但其实不然。我们添加表内容是通过
INSERT INTO
,而这其实是和ALTER
都同属于SQL书写顺序中的操作类型关键字
- 我们并没有脱离整体的书写规则框架,包括接下来要讲解的查询表内容的
SELECT
也是操作类型关键字
。但查询的方式会更多,我们放到下一章节来讲
- 我们在往表里添加内容开头则不一样,这好像规律被打破了,但其实不然。我们添加表内容是通过
转载自:https://juejin.cn/post/7364971987050168371