半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字 “超硬核” 文章!(二)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字 “超硬核” 文章!

数据库表相关操作

60b7fe5091904a14aecdc32b79929aa2.gif

一. 创建表

语法:create table 表名 {列名,数据类型,约束条件};

CREATE TABLE `Student`(
  `s_id` VARCHAR(20),
  `s_name` VARCHAR(20) NOT NULL DEFAULT '',
  `s_birth` VARCHAR(20) NOT NULL DEFAULT '',
  `s_sex` VARCHAR(10) NOT NULL DEFAULT '',
  PRIMARY KEY(`s_id`)
);

结果

58f111836ea84134ac9d67f65c728bda.png

注意:表名还请遵守数据库的命名规则,这条数据后面要进行删除,所以首字母为大写。

二. 查看表定义

  • 语法:desc 表名
mysql> desc Student;

结果:

0ff854714afb4e6b9a859e98cef55d66.png

虽然 desc 命令可以查看表定义,但是其输出的信息还是不够全面,为了查看更全面的表定义信息,有时就需要通过查看创建表的 SQL 语句来得到,可以使用如下命令实现

语法:show create table 表名 \G;

mysql> show create table Student \G;

结果:

e2ab9e77231a44baad0a51c20d6e550b.png


从上面表的创建 SQL 语句中,除了可以看到表定义以外,还可以看到表的engine(存储引擎)和charset(字符集)等信息。\G选项的含义是使得记录能够按照字段竖着排列,对于内容比较长的记录更易于显示。


三. 删除表

  • 语法:drop table 表名
mysql> drop table Student;
  • 结果:

2409c00136ea481294b62aa6c478389b.png


四. 修改表 (重要)


对于已经创建好的表,尤其是已经有大量数据的表,如果需要对表做一些结构上的改变,我们可以先将表删除(drop),然后再按照新的表定义重建表。这样做没有问题,但是必然要做一些额外的工作,比如数据的重新加载。而且,如果有服务在访问表,也会对服务产生影响。因此,在大多数情况下,表结构的更改一般都使用 alter table语句,以下是一些常用的命令。


1. 修改表类型


语法:ALTER TABLE 表名 MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]

例如,修改表 student 的 s_name 字段定义,将 varchar(20)改为 varchar(30)

mysql> alter table Student modify s_name varchar(30);

结果:

94968663b88c44eeb62cc1d35e0b2aa7.png


2. 增加表字段
  • 语法:ALTER TABLE 表名 ADD [COLUMN] [FIRST | AFTER col_name];
  • 例如,表 student 上新增加字段 s_test,类型为 int(3)
mysql> alter table student add column s_test int(3);

结果:

df997c4a64ea49c5a57348fb51313a19.png


3. 删除表字段
  • 语法:ALTER TABLE 表名 DROP [COLUMN] col_name
  • 例如,将字段 s_test 删除掉
mysql> alter table Student drop column s_test;

结果:

74afa84ea422434b9cc4844f504f9b37.png

4. 字段改名
  • 语法:ALTER TABLE 表名 CHANGE [COLUMN] old_col_name column_definition [FIRST|AFTER col_name]
  • 例如,将 s_sex 改名为 s_sex1,同时修改字段类型为 int(4)
mysql> alter table Student change s_sex s_sex1 int(4);

结果:

76a28a1dc8a845919a49dee8f2eb8e99.png


注意:change 和 modify 都可以修改表的定义,不同的是 change 后面需要写两次列名,不方便。但是 change 的优点是可以修改列名称,modify 则不能。


5. 修改字段排列顺序


  • 前面介绍的的字段增加和修改语法(ADD/CNAHGE/MODIFY)中,都有一个可选项first|after column_name,这个选项可以用来修改字段在表中的位置,默认 ADD 增加的新字段是加在表的最后位置,而 CHANGE/MODIFY 默认都不会改变字段的位置。
  • 例如,将新增的字段 s_test 加在 s_id 之后
  • 语法:alter table 表名 add 列名 数据类型 after 列名;
mysql> alter table Student add s_test date after s_id;

结果:

fcc52c86f50c4e0988cab7be12d52d4a.png


  • 修改已有字段 s_name,将它放在最前面
mysql> alter table Student modify s_name varchar(30) default '' first;


结果:


66f566832b95427f9d02c1bd9ccf6a84.png


注意:CHANGE/FIRST|AFTER COLUMN 这些关键字都属于 MySQL 在标准 SQL 上的扩展,在其他数据库上不一定适用。

6.表名修改


  • 语法:ALTER TABLE 表名 RENAME [TO] new_tablename
  • 例如,将表 Student 改名为 student
mysql> alter table Student rename student;


结果:

2773e6372c3f4d969a4192b4a2c2a563.png


DML(Data Manipulation Language)语句:即数据操纵语句

  • 用于操作数据库对象中所包含的数据

一. 添加数据:INSERT

Insert 语句用于向数据库中插入数据

1. 插入单条数据(常用)

语法:insert into 表名(列名1,列名2,...) values(值1,值2,...)

特点:

  • 插入值的类型要与列的类型一致或兼容。插入NULL可实现为列插入NULL值。列的顺序可以调换。列数和值的个数必须一致。可省略列名,默认所有列,并且列的顺序和表中列的顺序一致。

案例:

-- 插入学生表测试数据
insert into Student(s_id,s_name,s_birth,s_sex) values('01' , '赵信' , '1990-01-01' , '男');


cc0737e6d4e142f4bfb5dad1e973ac95.png

2. 插入单条数据

语法:INSERT INTO 表名 SET 列名 = 值,列名 = 值

这种方式每次只能插入一行数据,每列的值通过赋值列表制定。

案例:

INSERT INTO student SET s_id='02',s_name='德莱厄斯',s_birth='1990-01-01',s_sex='男'

26c40bdc8d0a480db047204ba07a761c.png

3. 插入多条数据

语法:insert into 表名 values(值1,值2,值3),(值4,值5,值6),(值7,值8,值9);

案例:

INSERT INTO student VALUES('03','艾希','1990-01-01','女'),('04','德莱文','1990-08-06','男'),('05','俄洛依','1991-12-01','女');

b2114cc9e64b4c25ac61135bddde5742.png

上面的例子中,值1,值2,值3),(值4,值5,值6),(值7,值8,值9) 即为 Value List,其中每个括号内部的数据表示一行数据,这个例子中插入了三行数据。Insert 语句也可以只给部分列插入数据,这种情况下,需要在 Value List 之前加上 ColumnName List,

例如:

INSERT INTO student(s_name,s_sex) VALUES('艾希','女'),('德莱文','男');


  • 每行数据只指定了 s_name 和 s_sex 这两列的值,其他列的值会设为 Null。

4. 表数据复制

语法:INSERT INTO 表名 SELECT * from 表名;


案例:

INSERT INTO student SELECT * from student1;

6ed545aab17e4277a643edc89245b188.png

注意:

  • 两个表的字段需要一直,并尽量保证要新增的表中没有数据

二. 更新数据:UPDATE

Update 语句一共有两种语法,分别用于更新单表数据和多表数据。


28b77e7ce41f4b23832613ed70f5ecbe.png

  • 注意:没有 WHERE 条件的 UPDATE 会更新所有值!

1. 修改一条数据的某个字段

语法:UPDATE 表名 SET 字段名 =值 where 字段名=值

案例:

UPDATE student SET s_name ='张三' WHERE s_id ='01'

f3ecb27e165b4b0a8e037657fd0c8973.png

2. 修改多个字段为同一的值

语法:UPDATE 表名 SET 字段名= 值 WHERE 字段名 in ('值1','值2','值3');

案例:

UPDATE student SET s_name = '李四' WHERE s_id in ('01','02','03');

81fc907de8bb4c17a001a13cfa4b1e17.png

3. 使用case when实现批量更新

语法:update 表名 set 字段名 = case 字段名 when 值1 then '值' when 值2 then '值' when 值3 then '值' end where s_id in (值1,值2,值3)

案例:

update student set s_name = case s_id when 01 then '小王' when 02 then '小周' when 03 then '老周' end where s_id in (01,02,03)

0aa2f860468d449bb1fb240550bcb83a.png

这句sql的意思是,更新 s_name 字段,如果 s_id 的值为 01 则 s_name 的值为 小王,s_id = 02 则 s_name = 小周,如果s_id =03 则 s_name 的值为 老周。

这里的where部分不影响代码的执行,但是会提高sql执行的效率。确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。

案例 2:

UPDATE student SET s_birth = CASE s_name
  WHEN '小王' THEN
    '2019-01-20'
  WHEN '小周' THEN
    '2019-01-22'
END WHERE s_name IN ('小王','小周');

a6e7eb3292144e74bbf2f92d7e0d8310.png

三. 删除数据:DELETE

  • 数据库一旦删除数据,它就会永远消失。 因此,在执行DELETE语句之前,应该先备份数据库,以防万一要找回删除过的数据。

1. 删除指定数据

语法:DELETE FROM 表名 WHERE 列名=值

  • 注意:删除的时候如果不指定where条件,则保留数据表结构,删除全部数据行,有主外键关系的都删不了

案例:


DELETE FROM student WHERE s_id='09'

f53d6a06ef8a41c781b71e8f4e4452ea.png


与 SELECT 语句不同的是,DELETE 语句中不能使用 GROUP BY、 HAVING 和 ORDER BY 三类子句,而只能使用WHERE 子句。原因很简单, GROUP BY 和 HAVING 是从表中选取数据时用来改变抽取数据形式的, 而 ORDER BY 是用来指定取得结果显示顺序的。因此,在删除表中数据 时它们都起不到什么作用。`


2. 删除表中全部数据

语法:TRUNCATE 表名;


注意:全部删除,内存无痕迹,如果有自增会重新开始编号。


与 DELETE 不同的是,TRUNCATE 只能删除表中的全部数据,而不能通过 WHERE 子句指定条件来删除部分数据。也正是因为它不能具体地控制删除对象, 所以其处理速度比 DELETE 要快得多。实际上,DELETE 语句在 DML 语句中也 属于处理时间比较长的,因此需要删除全部数据行时,使用 TRUNCATE 可以缩短 执行时间。


案例:

TRUNCATE student1;

c027235fd6bc404b80744a085b7ecddd.png

DQL(Data Query Language)语句:即数据查询语句

  • 查询数据库中的记录,关键字 SELECT,这块内容非常重要!

一. wherer 条件语句

语法:select 列名 from 表名 where 列名 =值

where的作用:

  1. 用于检索数据表中符合条件的记录
  2. 搜索条件可由一个或多个逻辑表达式组成,结果一般为真或假

搜索条件的组成:

  • 算数运算符

f2f094c59f4a442eb114b662fbb77008.png

逻辑操作符(操作符有两种写法)

66df9e8856414ddeb28f6b1f198ad3de.png

  • 比较运算符

d494a96213ce4a7eaa3ceb75575fda00.png

注意:数值数据类型的记录之间才能进行算术运算,相同数据类型的数据之间才能进行比较。


表数据


6d314527cf7b49dea82afa129de25908.png

案例 1(AND):

SELECT  * FROM student WHERE s_name ='小王' AND s_sex='男'

0eafa04ce0b046838413f2b118501334.png

案例 2(OR):

SELECT  * FROM student WHERE s_name ='崔丝塔娜' OR s_sex='男'

11a73b5670a24309911643dc1aaca875.png

案例 3(NOT):

SELECT  * FROM student WHERE NOT s_name ='崔丝塔娜'


cd621969ff214d75b4ac45902f5c70c3.png

案例 4(IS NULL):

SELECT * FROM student WHERE s_name IS NULL;

23ac7490a01a4d5297333d2bdc21a11b.png

案例 5(IS NOT NULL):

SELECT * FROM student WHERE s_name IS NOT NULL;

90695dd631f94537a06142512be14be0.png

案例 6(BETWEEN):

SELECT * FROM student WHERE s_birth BETWEEN '2019-01-20' AND '2019-01-22'

c5f7d9ec460d4b13ba2374273a4beff5.png

案例 7(LINK):

SELECT * FROM student WHERE s_name LIKE '小%'


2ef87a755b5e4f708e53495cf1b16d77.png

案例 8(IN):

SELECT * FROM student WHERE s_name IN ('小王','小周')

2b9fc03c60444a5cb59f32acfd420370.png






相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8月前
|
存储 SQL 关系型数据库
MySQL阅读网上MySQL文章有感的杂记
MySQL阅读网上MySQL文章有感的杂记
43 0
|
9月前
|
关系型数据库 MySQL Linux
让安装变简单:Linux下安装Mysql一篇文章搞定
让安装变简单:Linux下安装Mysql一篇文章搞定
122 0
|
2月前
|
存储 SQL 关系型数据库
【MySQL 数据库】6、一篇文章学习【索引知识】,提高大数据量的查询效率【文末送书】
【MySQL 数据库】6、一篇文章学习【索引知识】,提高大数据量的查询效率【文末送书】
59 0
|
4月前
|
Cloud Native 关系型数据库 MySQL
AnalyticDB MySQL文章汇总
AnalyticDB MySQL文章汇总
39 0
|
7月前
|
SQL 存储 关系型数据库
MySQL的第一篇文章——了解数据库、简单的SQL语句
MySQL的第一篇文章——了解数据库、简单的SQL语句
|
7月前
|
SQL 关系型数据库 MySQL
mybatis-plus代码生成器(+24篇MySql/MyBatis-Plus文章)
mybatis-plus代码生成器(+24篇MySql/MyBatis-Plus文章)
56 0
|
11月前
|
SQL 存储 算法
【MySQL速通篇004】这可能最详细的关于MySQL基础知识点的文章了
【MySQL速通篇004】这可能最详细的关于MySQL基础知识点的文章了
118 0
|
关系型数据库 MySQL
半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字 “超硬核” 文章!(七)
半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字 “超硬核” 文章!
90 0
半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字 “超硬核” 文章!(七)
|
关系型数据库 MySQL
半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字 “超硬核” 文章!(六)
半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字 “超硬核” 文章!
87 0
半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字 “超硬核” 文章!(六)
|
SQL 移动开发 关系型数据库
半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字 “超硬核” 文章!(五)
半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字 “超硬核” 文章!
163 0
半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字 “超硬核” 文章!(五)