【MySQL】基础命令操作

本文首发于 慕雪的寒舍

mysql的基础命令

本文所用mariadb版本

mysql  Ver 15.1 Distrib 10.3.28-MariaDB, for Linux (x86_64) using readline 5.1

sql语句的分类

  • DDL【data definition language】 数据定义语言,用来维护存储数据的结构。代表指令: create, drop, alter
  • DML【data manipulation language】 数据操纵语言,用来对数据进行操作。代表指令: insert,delete,update
    • DML中又单独分了一个DQL,数据查询语言,代表指令: select
  • DCL【Data Control Language】 数据控制语言,主要负责权限管理和事务。 代表指令: grant,revoke,commit

0.连接mysql

默认情况下,我们的mysql没有密码,直接使用如下命令,就能链接上mysql

mysql -uroot;

mysql数据库文件路径

/var/lib/mysql

mysql的语句是大小写不敏感的,大小写都可以。

0.1 查看有谁连接了

show processlist;

该命令可以查看当前有谁连接了,所在数据库是什么,正在执行的cmd是什么

image-20230415154733573

0.2 查看引擎

mysql支持多种存储引擎

存储引擎是:数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。

每个引擎各有其优势。可以用下面的语句查询当前支持的引擎

show engines;

image-20230415110657396

1.数据库

1.1 创建

create database 数据库名字;
create database if not exists 数据库名字; # 如果不存在才创建
create database hello;

上面的命令创建了一个名为hello的数据库。对于mysql服务端而言,其实际上是在数据文件路径中,帮我们创建了一个对应的文件夹

image-20230415105802521

如果是mysql5.7,在创建语句之前新增一个show,可以看到当前执行语句的详细信息。我当前使用的是高版本的mariadb,不支持这个操作

show create database hello;

创建数据库或者表的时候,我们还可以给名称带上如下符号作为分割符

create database `数据库名称`;
MariaDB [(none)]> create database `test2`;
Query OK, 1 row affected (0.001 sec)

带上该符号后,可以用于区分你的表名和数据库的内置语句。建议创建、删除操作的时候,都给名字带上这个符号。

当然,创建的数据库、表名最好不要mysql内置语句冲突,这和写代码的时候不要用编程语言的关键字/库函数名来命名变量一样。

1.2 查看已有

show databases;

查看当前已有数据库

+--------------------+
| Database           |
+--------------------+
| hello              |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.001 sec)

1.3 进入

进入这个数据库

 use hello;

1.4 删除

drop database [if exists] 名字;

如下,我先是创建了一个test1数据库

MariaDB [(none)]> create database test1;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| hello              |
| information_schema |
| mysql              |
| performance_schema |
| test1              |
+--------------------+
5 rows in set (0.000 sec)

用下面这个命令删除该数据库

drop database test1;

成功删除

MariaDB [(none)]> drop database test1;
Query OK, 0 rows affected (0.035 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| hello              |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.001 sec)

数据文件路径中,test1文件夹也被对应删除

image-20230415105910841

1.5 字符集和校验规则

字符集会有自己对应的校验规则

  • 字符集用于将数据以特定编码存入数据库
  • 校验规则用于数据时对数据进行校验

修改字符集的时候,mysql会为我们自动指定对应的校验规则

1.5.1 字符集

一个数据被存放的时候,是会有其所用的编码的。编码不相同,会导致数据在不同软件中显示出不同的结果。

比如 我们使用VS写的C语言代码,文件内的中文注释放入devc++之中,有可能会乱码,这就是字符编码不匹配的原因

show variables like 语句可以查看mysql的内置变量,其中如下变量就是数据库字符集的编码格式

show variables like 'character_set_database';

可以看到,为utf-8

+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| character_set_database | utf8  |
+------------------------+-------+
1 row in set (0.002 sec)

在配置mariadb的时候,就已经修改过了数据库的编码规则,所以所有相关字符集编码都是utf-8

show variables like 'character_set_%';
MariaDB [(none)]> show variables like 'character_set_%';
+--------------------------+------------------------------+
| Variable_name            | Value                        |
+--------------------------+------------------------------+
| character_set_client     | utf8                         |
| character_set_connection | utf8                         |
| character_set_database   | utf8                         |
| character_set_filesystem | binary                       |
| character_set_results    | utf8                         |
| character_set_server     | utf8                         |
| character_set_system     | utf8                         |
| character_sets_dir       | /usr/share/mariadb/charsets/ |
+--------------------------+------------------------------+
8 rows in set (0.002 sec)

使用如下命令可以查看数据库支持的所有编码

show charset;
MariaDB [(none)]> show charset;
+----------+-----------------------------+---------------------+--------+
| Charset  | Description                 | Default collation   | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese    | big5_chinese_ci     |      2 |
| dec8     | DEC West European           | dec8_swedish_ci     |      1 |
| cp850    | DOS West European           | cp850_general_ci    |      1 |
| hp8      | HP West European            | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian       | koi8r_general_ci    |      1 |
| latin1   | cp1252 West European        | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European | latin2_general_ci   |      1 |
| swe7     | 7bit Swedish                | swe7_swedish_ci     |      1 |
| ascii    | US ASCII                    | ascii_general_ci    |      1 |
| ujis     | EUC-JP Japanese             | ujis_japanese_ci    |      3 |
| sjis     | Shift-JIS Japanese          | sjis_japanese_ci    |      2 |
| hebrew   | ISO 8859-8 Hebrew           | hebrew_general_ci   |      1 |
| tis620   | TIS620 Thai                 | tis620_thai_ci      |      1 |
| euckr    | EUC-KR Korean               | euckr_korean_ci     |      2 |
| koi8u    | KOI8-U Ukrainian            | koi8u_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese   | gb2312_chinese_ci   |      2 |
| greek    | ISO 8859-7 Greek            | greek_general_ci    |      1 |
| cp1250   | Windows Central European    | cp1250_general_ci   |      1 |
| gbk      | GBK Simplified Chinese      | gbk_chinese_ci      |      2 |
| latin5   | ISO 8859-9 Turkish          | latin5_turkish_ci   |      1 |
| armscii8 | ARMSCII-8 Armenian          | armscii8_general_ci |      1 |
| utf8     | UTF-8 Unicode               | utf8_general_ci     |      3 |
| ucs2     | UCS-2 Unicode               | ucs2_general_ci     |      2 |
| cp866    | DOS Russian                 | cp866_general_ci    |      1 |
| keybcs2  | DOS Kamenicky Czech-Slovak  | keybcs2_general_ci  |      1 |
| macce    | Mac Central European        | macce_general_ci    |      1 |
| macroman | Mac West European           | macroman_general_ci |      1 |
| cp852    | DOS Central European        | cp852_general_ci    |      1 |
| latin7   | ISO 8859-13 Baltic          | latin7_general_ci   |      1 |
| utf8mb4  | UTF-8 Unicode               | utf8mb4_general_ci  |      4 |
| cp1251   | Windows Cyrillic            | cp1251_general_ci   |      1 |
| utf16    | UTF-16 Unicode              | utf16_general_ci    |      4 |
| utf16le  | UTF-16LE Unicode            | utf16le_general_ci  |      4 |
| cp1256   | Windows Arabic              | cp1256_general_ci   |      1 |
| cp1257   | Windows Baltic              | cp1257_general_ci   |      1 |
| utf32    | UTF-32 Unicode              | utf32_general_ci    |      4 |
| binary   | Binary pseudo charset       | binary              |      1 |
| geostd8  | GEOSTD8 Georgian            | geostd8_general_ci  |      1 |
| cp932    | SJIS for Windows Japanese   | cp932_japanese_ci   |      2 |
| eucjpms  | UJIS for Windows Japanese   | eucjpms_japanese_ci |      3 |
+----------+-----------------------------+---------------------+--------+
40 rows in set (0.001 sec)

1.5.2 校验规则

show variables like 'collation_%';

如下可以看到,当前的校验规则都是utf-8相关的

MariaDB [(none)]> show variables like 'collation_%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.001 sec)

查看系统中所有校验集

show collation;

结果很长,就不全贴出来了。能看到每一个编码集都对应了一个字符集

image-20230415114232320

1.5.3 创建库时指定

CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,
create_specification] ...]

create_specification:
    [DEFAULT] CHARACTER SET charset_name
    [DEFAULT] COLLATE collation_name

其中[]代表是可选项

  • CHARACTER SET 指定数据库采用的字符集
  • COLLATE 指定数据库字符集的校验规则

如果在创建数据库时没有指定字符集和校验规则,则会采用数据库默认的。

在数据库的文件夹中,有一个db.opt文件,其中就包含了当前数据库使用的字符集和校验规则

[root@1c2261732150:/var/lib/mysql]# ls hello
db.opt  stu_test.frm  stu_test.ibd
[root@1c2261732150:/var/lib/mysql]# cat hello/db.opt
default-character-set=utf8
default-collation=utf8_general_ci

如果在创建的时候指明字符集编码

create database `test1` character set gbk; 
create database `test1` charset=gbk; # 两种写法相同 

查看db.opt,可以看到系统自动指定了gbk字符集对应的校验和

[root@1c2261732150:/var/lib/mysql]# ls test1
db.opt
[root@1c2261732150:/var/lib/mysql]# cat test1/db.opt
default-character-set=gbk
default-collation=gbk_chinese_ci

同时指定字符集和编码

create database `test2` charset=utf8 collate utf8_bin;

执行成功后,查看本地文件

[root@1c2261732150:/var/lib/mysql]# cat test2/db.opt
default-character-set=utf8
default-collation=utf8_bin

成功设置了字符集和编码规则


虽然在创建的时候可以这么做,但我们保持默认配置的utf8即可

1.5.4 校验的影响

通过指定不同的编码,我创建了两个校验规则不同的数据库

MariaDB [(none)]> create database test_ci charset=utf8;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> create database test_bin charset=utf8 collate utf8_bin;
Query OK, 1 row affected (0.000 sec)

其中一个的校验规则是utf8_general_ci,另外一个是utf8_bin

[root@1c2261732150:/var/lib/mysql]# cat test_bin/db.opt
default-character-set=utf8
default-collation=utf8_bin
[root@1c2261732150:/var/lib/mysql]# cat test_ci/db.opt
default-character-set=utf8
default-collation=utf8_general_ci
utf8_bin

先进入test_bin数据库

use test_bin;

创建一个student表,只有一个字符串类型的name字段

create table student(name varchar(30));

插入如下数据

MariaDB [test_bin]> insert into student value ('a');
Query OK, 1 row affected (0.042 sec)

MariaDB [test_bin]> insert into student value ('A');
Query OK, 1 row affected (0.008 sec)

MariaDB [test_bin]> insert into student value ('b');
Query OK, 1 row affected (0.003 sec)

MariaDB [test_bin]> insert into student value ('B');
Query OK, 1 row affected (0.004 sec)

MariaDB [test_bin]> insert into student value ('c');
Query OK, 1 row affected (0.009 sec)

MariaDB [test_bin]> insert into student value ('C');
Query OK, 1 row affected (0.007 sec)

查看已有数据,分别是大小写的abc

MariaDB [test_bin]> select * from  student;
+------+
| name |
+------+
| a    |
| A    |
| b    |
| B    |
| c    |
| C    |
+------+
6 rows in set (0.001 sec)

查询数据,可以看到,返回的结果是只有小写a的

MariaDB [test_bin]> select * from student where name='a';
+------+
| name |
+------+
| a    |
+------+
1 row in set (0.001 sec)

执行排序(升序)后输出,得到如下结果。我们知道,小写字母的ASCII是在大写字母的之后的,所以这个排序结果是正确的。

MariaDB [test_bin]> select * from student order by name;
+------+
| name |
+------+
| A    |
| B    |
| C    |
| a    |
| b    |
| c    |
+------+
6 rows in set (0.001 sec)
utf8_general_ci
use test_ci;

在这个数据库中进行相同的插入工作,创建表,插入大小写abc(命令同上不再重复)

MariaDB [test_ci]> select * from  student;
+------+
| name |
+------+
| a    |
| A    |
| b    |
| B    |
| c    |
| C    |
+------+
6 rows in set (0.000 sec)

执行查询语句,发现当我们查询小a的时候,同时返回了A和a的结果

MariaDB [test_ci]> select * from student where name='a';
+------+
| name |
+------+
| a    |
| A    |
+------+
2 rows in set (0.001 sec)

排序的时候,大小a没有按ASCII码顺序排,而是放到了一起

MariaDB [test_ci]> select * from student order by name;
+------+
| name |
+------+
| a    |
| A    |
| b    |
| B    |
| c    |
| C    |
+------+
6 rows in set (0.001 sec)
结论
  • utf8_bin:查询的时候区分大小写
  • utf8_general_ci:查询时忽略大小写

在实际场景中,我们就可以根据需求,选择这两个校验规则中的其一作为我们数据库的校验规则。

这两个只是众多校验规则之一,更多编码的区别,还得等后续慢慢探寻。在一般场景中,使用utf8是完全足够的。

1.6 修改

alter database 数据库名 [create_specification [,
create_specification] ...];

一般情况下,我们修改的是数据库的字符集和校验规则。

示例如下,修改数据库test_ci的字符集为gbk

MariaDB [test_ci]> alter database test_ci charset=gbk;
Query OK, 1 row affected (0.006 sec)

修改后查看配置文件,字符集和校验规则确实变化了(系统自动查找对应的校验规则)

[root@1c2261732150:/var/lib/mysql]# cat test_ci/db.opt
default-character-set=utf8
default-collation=utf8_general_ci
[root@1c2261732150:/var/lib/mysql]# cat test_ci/db.opt
default-character-set=gbk
default-collation=gbk_chinese_ci

也可以同时修改校验规则,这里和新建数据库时的操作是一样的

alter database test_ci charset=utf8 collate utf8_bin;
[root@1c2261732150:/var/lib/mysql]# cat test_ci/db.opt
default-character-set=gbk
default-collation=gbk_chinese_ci
[root@1c2261732150:/var/lib/mysql]# cat test_ci/db.opt
default-character-set=utf8
default-collation=utf8_bin

1.7 备份数据库

1.7.1 备份一个数据库

如下操作是在linux命令行中执行的

mysqldump -P3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径

示例

mysqldump -P3306 -u root -B hello > hello.bak.sql

这会在当前路径中出现了一个sql文件,其内容如下。

-- MySQL dump 10.19  Distrib 10.3.28-MariaDB, for Linux (x86_64)
--
-- Host: localhost    Database: hello
-- ------------------------------------------------------
-- Server version       10.3.28-MariaDB

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Current Database: `hello`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `hello` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `hello`;

--
-- Table structure for table `stu_test`
--

DROP TABLE IF EXISTS `stu_test`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `stu_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `score` decimal(4,2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `stu_test`
--

LOCK TABLES `stu_test` WRITE;
/*!40000 ALTER TABLE `stu_test` DISABLE KEYS */;
INSERT INTO `stu_test` VALUES (2,'小图图',5,72.80),(3,'大司马',42,87.30),(4,'乐迪',32,99.00);
/*!40000 ALTER TABLE `stu_test` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2023-04-15 15:20:25

我们会发现这里面的内容其实都是sql语句,如果将这个备份导入到另外一个数据库中,实际上就是将历史的所有sql语句全部执行一遍!

除此之外,复制/var/lib/mysql下的数据库文件也是可行的一种备份方案。但并不推荐这么做!

1.7.2 备份数据库中的多张表

mysqldump -u root -p 数据库名 表名1 表名2 > 备份文件名

1.7.3 同时备份多个数据库

mysqldump -u root -p -B 数据库名1 数据库名2  > 备份文件名

1.7.4 还原

如下命令需要在mysql中执行

source 备份文件路径
# 示例
source /root/hello.bak.sql;

image-20230415152700967

数据库中的内容和原有数据库是完全相同的

MariaDB [hello]> show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| stu_test        |
+-----------------+
1 row in set (0.001 sec)

MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+
| id | name      | age  | score |
+----+-----------+------+-------+
|  2 | 小图图    |    5 | 72.80 |
|  3 | 大司马    |   42 | 87.30 |
|  4 | 乐迪      |   32 | 99.00 |
+----+-----------+------+-------+
3 rows in set (0.001 sec)

1.7.5 化简

如果你看过了上面对校验影响的验证,其中我往test_bin数据库中使用6条语句插入了大小写的abc。

但当我们执行备份的时候,可以看到备份出来的sql文件,六个语句被合并了!

INSERT INTO `student` VALUES ('a'),('A'),('b'),('B'),('c'),('C');

这也是mysql备份的智能之处之一!

2.表

如下命令需要先进入database才能执行

2.1 创建

基础的创建操作如下。其中末尾的字符集、校验规则、存储引擎的设置项可以留空不填

  • field 列名
  • datatype 列的类型
create table 表名 (
    field1 datatype,
    field2 datatype,
    field3 datatype
) character set 字符集 collate 校验规则 engine 存储引擎;

示例如下,创建了一个student表,并配置了两个键值name和age,类型分别为字符串和int

create table student(
    name varchar(30),
    age int
);

除了基础操作之外,我们还可以给这个表新增一个comment作为备注

create table student(
    name varchar(30) comment '学生名字',
    age int comment '学生年龄'
);

用下面的语句可以查看创建表时候的操作

show create table 表名;

image-20230415161430461

这部分和备份的时候的sql也是一样的,mysql会帮我们自动规整语句,使其语法规则更规整;

如下语句也能看到创建表时所用命令

show create table stu_test\G
MariaDB [hello]> show create table stu_test\G
*************************** 1. row ***************************
       Table: stu_test
Create Table: CREATE TABLE `stu_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `score` decimal(4,2) DEFAULT NULL,
  `avatar` varchar(100) NOT NULL DEFAULT 'default-avatar.png' COMMENT '头像图片路径',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
1 row in set (0.000 sec)

二者结果是类似的

image-20230506110031599

2.2 查看已有表

show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| student         |
+-----------------+
1 row in set (0.001 sec)

2.3 查看表的属性/结构

desc 表名;
MariaDB [hello]> desc stu_test;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(30)  | YES  |     | NULL    |                |
| age   | int(11)      | YES  |     | NULL    |                |
| score | decimal(4,2) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
4 rows in set (0.002 sec)

2.4 删除该表

drop table student;

2.5 修改表的结构

注意,这里是对表的属性的修改,并不是对数据的修改!

比如我想新增字段,或者修改已有字段的属性,或者删除字段

-- 新增字段
ALTER TABLE tablename ADD (column datatype [DEFAULT expr][,column
datatype]...);
-- 修改字段
ALTER TABLE tablename MODIfy (column datatype [DEFAULT expr][,column
datatype]...);
-- 删除字段
ALTER TABLE tablename DROP (column);

2.5.0 注意事项

请注意:修改表的字段是一个很麻烦的操作,其可能会涉及到已有数据的有效性问题

  • 请在生产环境上线前的测试阶段,完成表字段的定义!

说人话就是,前期设计要想的尽量到位,避免后期表中已有数据的时候修改表的属性!

2.5.1 新增字段

比如我给上方2.5中出现过的stu_test表新增一列,可以用如下的命令

alter table stu_test add avatar varchar(100) comment '头像图片路径' after
score;
MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+
| id | name      | age  | score |
+----+-----------+------+-------+
|  2 | 小图图    |    5 | 72.80 |
|  3 | 大司马    |   42 | 87.30 |
|  4 | 乐迪      |   32 | 99.00 |
|  5 | dc872458  |   25 |  NULL |
+----+-----------+------+-------+
4 rows in set (0.000 sec)

MariaDB [hello]> alter table stu_test add avatar varchar(100) comment '头像图片路径' after
    -> score;
Query OK, 0 rows affected (0.005 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+--------+
| id | name      | age  | score | avatar |
+----+-----------+------+-------+--------+
|  2 | 小图图    |    5 | 72.80 | NULL   |
|  3 | 大司马    |   42 | 87.30 | NULL   |
|  4 | 乐迪      |   32 | 99.00 | NULL   |
|  5 | dc872458  |   25 |  NULL | NULL   |
+----+-----------+------+-------+--------+
4 rows in set (0.000 sec)

此时可以看到,已有数据都多了一个avatar字段,且这些已有数据的新字段都为NULL

说明新增字段并不会影响旧数据的旧字段。我们可以在新增字段之后,给旧的数据修改默认值

2.5.2 删除字段

如果表中的数据只剩一列(只有一个字段)是不能删除这个字段的(只能删除这个表)

使用如下命令,删除刚刚新增的avatar字段

alter table stu_test drop avatar;

可以看到avatar列被删除了

MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+--------+
| id | name      | age  | score | avatar |
+----+-----------+------+-------+--------+
|  2 | 小图图    |    5 | 72.80 | NULL   |
|  3 | 大司马    |   42 | 87.30 | NULL   |
|  4 | 乐迪      |   32 | 99.00 | NULL   |
|  5 | dc872458  |   25 |  NULL | NULL   |
+----+-----------+------+-------+--------+
4 rows in set (0.000 sec)

MariaDB [hello]> alter table stu_test drop avatar;
Query OK, 0 rows affected (0.034 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+
| id | name      | age  | score |
+----+-----------+------+-------+
|  2 | 小图图    |    5 | 72.80 |
|  3 | 大司马    |   42 | 87.30 |
|  4 | 乐迪      |   32 | 99.00 |
|  5 | dc872458  |   25 |  NULL |
+----+-----------+------+-------+
4 rows in set (0.000 sec)

在具体场景中,如果需要给已有用户新增头像,一般存放的是头像的文件路径(而不是图片),此时我们就可以设计一个默认头像,并在新增字段的时候将默认值(默认的头像文件路径)修改为这个默认头像图片的路径。

比如我现在的头像存储的文件路径是

./images/

此时存放的用户头像文件就应该放到这个目录中,而mysql中只需要存放文件的路径。

比如用户上传了一个头像图片,我们将头像图片保存到这个路径,再往sql中的avatar字段插入路径

./images/test-img.png
sql中只需要保存test-img.png,取图片的时候拼接上前方的文件路径

设计一个默认头像,也是放在这个路径中

./images/test-img.png
./images/default-avatar.png

这时候新增avatar字段的时候,就可以指定默认值

alter table stu_test add avatar varchar(100) not null default 'default-avatar.png'  comment '头像图片路径' after
score;

这时候就能看到,旧数据的头像都是默认头像了!

MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+--------------------+
| id | name      | age  | score | avatar             |
+----+-----------+------+-------+--------------------+
|  2 | 小图图    |    5 | 72.80 | default-avatar.png |
|  3 | 大司马    |   42 | 87.30 | default-avatar.png |
|  4 | 乐迪      |   32 | 99.00 | default-avatar.png |
|  5 | dc872458  |   25 |  NULL | default-avatar.png |
+----+-----------+------+-------+--------------------+
4 rows in set (0.000 sec)

默认头像总好过没有图片嘛!

2.5.3 修改字段类型

在设计stu_test表的时候,只给name分配了30个字节的空间。此时如果来了个名字特别特别长的新同学(有些地方的人名确实很长)

我们发现30个字节存不下这个名字了,就可以考虑将名字字段的长度增加

alter table stu_test modify name varchar(60);

如下,成功修改!

MariaDB [hello]> desc stu_test;
+--------+--------------+------+-----+--------------------+----------------+
| Field  | Type         | Null | Key | Default            | Extra          |
+--------+--------------+------+-----+--------------------+----------------+
| id     | int(11)      | NO   | PRI | NULL               | auto_increment |
| name   | varchar(30)  | YES  |     | NULL               |                |
| age    | int(11)      | YES  |     | NULL               |                |
| score  | decimal(4,2) | YES  |     | NULL               |                |
| avatar | varchar(100) | NO   |     | default-avatar.png |                |
+--------+--------------+------+-----+--------------------+----------------+
5 rows in set (0.001 sec)

MariaDB [hello]> alter table stu_test modify name varchar(60);
Query OK, 0 rows affected (0.013 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [hello]> desc stu_test;
+--------+--------------+------+-----+--------------------+----------------+
| Field  | Type         | Null | Key | Default            | Extra          |
+--------+--------------+------+-----+--------------------+----------------+
| id     | int(11)      | NO   | PRI | NULL               | auto_increment |
| name   | varchar(60)  | YES  |     | NULL               |                |
| age    | int(11)      | YES  |     | NULL               |                |
| score  | decimal(4,2) | YES  |     | NULL               |                |
| avatar | varchar(100) | NO   |     | default-avatar.png |                |
+--------+--------------+------+-----+--------------------+----------------+
5 rows in set (0.001 sec)

因为是增加字段的长度,所以也不影响已有数据

MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+--------------------+
| id | name      | age  | score | avatar             |
+----+-----------+------+-------+--------------------+
|  2 | 小图图    |    5 | 72.80 | default-avatar.png |
|  3 | 大司马    |   42 | 87.30 | default-avatar.png |
|  4 | 乐迪      |   32 | 99.00 | default-avatar.png |
|  5 | dc872458  |   25 |  NULL | default-avatar.png |
+----+-----------+------+-------+--------------------+
4 rows in set (0.000 sec)

如果是减小字段长度,就需要确认已有数据是否有超过新长度的内容了!比如从60减小到30,那么长度为40的数据就会出现错误!

那如果是将varchar直接改成int,或者将int改成char,会发生什么呢?

表中的id字段是一个int,尝试将其修改成char

alter table stu_test modify id varchar(32);
MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+--------------------+
| id | name      | age  | score | avatar             |
+----+-----------+------+-------+--------------------+
| 2  | 小图图    |    5 | 72.80 | default-avatar.png |
| 3  | 大司马    |   42 | 87.30 | default-avatar.png |
| 4  | 乐迪      |   32 | 99.00 | default-avatar.png |
| 5  | dc872458  |   25 |  NULL | default-avatar.png |
+----+-----------+------+-------+--------------------+
4 rows in set (0.001 sec)

MariaDB [hello]> desc stu_test;
+--------+--------------+------+-----+--------------------+-------+
| Field  | Type         | Null | Key | Default            | Extra |
+--------+--------------+------+-----+--------------------+-------+
| id     | varchar(32)  | NO   | PRI | NULL               |       |
| name   | varchar(60)  | YES  |     | NULL               |       |
| age    | int(11)      | YES  |     | NULL               |       |
| score  | decimal(4,2) | YES  |     | NULL               |       |
| avatar | varchar(100) | NO   |     | default-avatar.png |       |
+--------+--------------+------+-----+--------------------+-------+
5 rows in set (0.002 sec)

可以看到,其不仅成功变成了字符串类型,已有的值也没有出错。毕竟int数字改成字符串是可行的。那反过来呢?

MariaDB [hello]> insert into stu_test (id,name,age,score,avatar) values ('kb','你好',30,60,'测试图片.png');
Query OK, 1 row affected (0.007 sec)

MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+--------------------+
| id | name      | age  | score | avatar             |
+----+-----------+------+-------+--------------------+
| 2  | 小图图    |    5 | 72.80 | default-avatar.png |
| 3  | 大司马    |   42 | 87.30 | default-avatar.png |
| 4  | 乐迪      |   32 | 99.00 | default-avatar.png |
| 5  | dc872458  |   25 |  NULL | default-avatar.png |
| kb | 你好      |   30 | 60.00 | 测试图片.png       |
+----+-----------+------+-------+--------------------+
5 rows in set (0.000 sec)

此时我往表中插入了一个id为kb的数据,再尝试将id从varchar改回int类型

MariaDB [hello]> alter table stu_test modify id int;
ERROR 1292 (22007): Truncated incorrect INTEGER value: 'kb'
MariaDB [hello]> desc stu_test;
+--------+--------------+------+-----+--------------------+-------+
| Field  | Type         | Null | Key | Default            | Extra |
+--------+--------------+------+-----+--------------------+-------+
| id     | varchar(32)  | NO   | PRI | NULL               |       |
| name   | varchar(60)  | YES  |     | NULL               |       |
| age    | int(11)      | YES  |     | NULL               |       |
| score  | decimal(4,2) | YES  |     | NULL               |       |
| avatar | varchar(100) | NO   |     | default-avatar.png |       |
+--------+--------------+------+-----+--------------------+-------+
5 rows in set (0.001 sec)

此时就会报错,kb不符合int类型;修改失败了!

所以,修改字段的类型,需要保证原有类型和目标类型之间是可以正常双向转换的!

2.5.4 修改字段名字

如下使用change修改字段id -> num,同时还需要注明属性(也可以修改属性)

alter table stu_test change id num varchar(32);

这里可以看到 0 rows affected,因为我们修改的是字段名字而已,所以不会影响到数据

MariaDB [hello]> alter table stu_test change id num varchar(32);
Query OK, 0 rows affected (0.008 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [hello]> desc stu_test;
+--------+--------------+------+-----+--------------------+-------+
| Field  | Type         | Null | Key | Default            | Extra |
+--------+--------------+------+-----+--------------------+-------+
| num    | varchar(32)  | NO   | PRI | NULL               |       |
| name   | varchar(60)  | YES  |     | NULL               |       |
| age    | int(11)      | YES  |     | NULL               |       |
| score  | decimal(4,2) | YES  |     | NULL               |       |
| avatar | varchar(100) | NO   |     | default-avatar.png |       |
+--------+--------------+------+-----+--------------------+-------+
5 rows in set (0.001 sec)

2.6 修改表名

alter table stu_test rename stu;

可以看到修改成功了

MariaDB [hello]> alter table stu_test rename stu;
Query OK, 0 rows affected (0.015 sec)

MariaDB [hello]> show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| stu             |
| tb_video        |
+-----------------+
2 rows in set (0.000 sec)

3.数据

3.1 插入

往刚刚创建的students表里面插入两个数据

 insert into student (name,age) value ('牛爷爷',50);
 insert into student (name,age) value ('图图',9);

查看表中数据

select * from student;
+-----------+------+
| name      | age  |
+-----------+------+
| 牛爷爷    |   50 |
| 图图      |    9 |
+-----------+------+
2 rows in set (0.001 sec)

3.2 查看表中已有值

select * from  student;

该语句作用为查看student表中的所有值

MariaDB [test_bin]> select * from  student;
+------+
| name |
+------+
| a    |
| A    |
| b    |
| B    |
| c    |
| C    |
+------+
6 rows in set (0.001 sec)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕雪华年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值