MySQL库、表的操作
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
库的连接:
mysql -h [主机名] -P [端口号] -u [用户名] -p -A [数据库名]-h:指定要连接的 MySQL 服务器主机名,若连接本地数据库,可省略或写为 localhost。
-P:指定连接的端口号,MySQL 默认端口是 3306,如果使用默认端口,该参数也可省略。
-u:指定登录用户名。
-p:表示后续会提示输入密码,输入密码时不会回显。
-A:关闭自动补全表和列名等信息的功能。
[数据库名]:可选项,指定登录后默认进入的数据库。
1.库的操作
1.1.创建数据库
(1)语法
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,
create_specification] ...]create_specification:
数据库的创建规范,用于指定数据库的字符集和排序规则,可包含一个或多个规范(用逗号分隔)。
[DEFAULT] CHARACTER SET charset_name
指定数据库的默认字符集(用于存储数据时的编码格式)。
[DEFAULT] COLLATE collation_name
指定数据库的默认排序规则(决定字符串比较和排序的规则),需与字符集匹配。
(2)案例
创建名为 db1 的数据库
create database db1;
当我们创建数据库没有指定字符集和校验规则时,系统使用默认字符集:utf8,校验规则是:utf8_ general_ c。
创建一个使用utf字符集,并带校对规则的 db2 数据库
create database db2 charset=utd8 collate utf8_general_ci创建数据库时指定字符集(charset)和排序规则(collate)时,带不带 = 都是允许的
charset 是 character set 的缩写形式
1.2.字符集和校验规则
(1)查看系统默认字符集以及校验规则
show variables like 'character_set_database';
show variables like 'collation_database';

show charset;
字符集主要是控制用什么语言。比如utf8就可以使用中文。
show collation;
(4)校验规则对数据库的影响
- 是否区分大小写
创建一个数据库,校验规则使用utf8_ general_ ci[不区分大小写]
create database test1 collate utf8_general_ci;
use test1;
create table person(name varchar(20));
insert into person values('a');
insert into person values('A');
insert into person values('b');
insert into person values('B');
create database test2 collate utf8_bin;
use test2
create table person(name varchar(20));
insert into person values('a');
insert into person values('A');
insert into person values('b');
insert into person values('B');
- 进行查询
不区分大小写的查询以及结果
区分大小写的查询以及结果
如果是使用 apt(Debian、Ubuntu 等系统)或 yum(RHEL、CentOS 等系统)等包管理器安装,数据库文件通常在 /var/lib/mysql 目录下。

1.3.操纵数据库
1.3.1.查看数据库
(1)查看已经创建的数据库
show databases;
show create database 数据库名;
Database 列:显示数据库名(此处为 test2)
Create Database 列:显示创建该数据库的完整语句,包含:
- 数据库名
- 字符集配置(DEFAULT CHARACTER SET utf8mb4)
- /*!40100 default.... */ 这个不是注释,表示当前mysql版本大于4.01版本,就执行这句话
MySQL 建议我们关键字使用大写,但是不是必须的。
数据库名字的反引号``,是为了防止使用的数据库名刚好是关键字。
(3)查看数据库
在linux下,当使用 apt 或 yum等包管理器安装时,数据库文件通常在 /var/lib/mysql 目录下,每个数据库对应一个同名文件夹,其中保存着表结构文件、数据文件等。
在db.opt文件中保存着数据库使用的字符集和校验规则
1.3.2.修改数据库
ALTER DATABASE 数据库名
[DEFAULT] CHARACTER SET 字符集名称
[DEFAULT] COLLATE 排序规则名称;[DEFAULT] 可省略,不影响功能
主要能修改的是数据库的默认字符集和默认排序规则

1.3.3.数据库删除
DROP DATABASE [IF EXISTS] db_ name;[IF EXISTS] 是一个可选参数,它的核心作用是避免因删除不存在的数据库而产生错误
执行删除之后的结果:
- 数据库内部看不到对应的数据库
- 对应的数据库文件夹被删除,级联删除,里面的数据表全部被删
注意:不要随意删除数据库
1.4.备份和恢复
备份
mysqldump -P3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径
还原
mysql> source D:/mysql-5.7.22/mytest.sql;
在系统命令行(终端)中执行备份,在MySQL 客户端还原” 的操作
show processlist;
可以告诉我们当前有哪些用户连接到我们的MySQL,如果查出某个用户不是你正常登陆的,很有可能你的数据库被人入侵了。以后大家发现自己数据库比较慢时,可以用这个指令来查看数据库连接情况。
2.表的操作
2.1.创建表
语法:
CREATE TABLE table_name (
field1 datatype,
field2 datatype,
field3 datatype
) character set 字符集 collate 校验规则 engine 存储引擎;
- field 表示列名
- datatype 表示列的类型
- character set 字符集,如果没有指定字符集,则以所在数据库的字符集为准
- collate 校验规则,如果没有指定校验规则,则以所在数据库的校验规则为准
create table users (
id int,
name varchar(20) comment '用户名',
password char(32) comment '密码是32位的md5值',
birthday date comment '生日'
) character set utf8 engine MyISAM;
不同的存储引擎,创建表的文件不一样。
users 表存储引擎是 MyISAM ,在数据目中有三个不同的文件,分别是:
users.frm:表结构
users.MYD:表数据
users.MYI:表索引
2.2.查看表
desc 表名;
2.3.修改表
在数据库的术语中,“列” 和 “字段” 是对表中同一类元素的不同称呼,本质上是同一个概念。
(1)添加列
ALTER TABLE 表名
ADD 列名 数据类型 [约束条件];
(2)修改列
ALTER TABLE 表名
MODIFY 列名 新数据类型 [新约束];
MODIFY:修改列的数据类型或约束(不修改列名)。
CHANGE:既可以修改列名,也可以修改数据类型和约束。
将name长度修改为60
alter table users modify name varchar(60);
alter table employee change name xingming varchar(60);
(3)删除列
ALTER TABLE tablename DROP (column);
alter table users drop assets;
(4)重命名表
ALTER TABLE 旧表名 rename TO 新表名;
to可省略
2.4.删除表
ALTER TABLE 表名
DROP COLUMN 列名; -- COLUMN 可省略
drop table t1;
3.数据类型
3.1.数值类型
3.2.1.int类型
- 在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。
- 可以通过UNSIGNED来说明某个字段是无符号的。
下面以tinyint类型为例,无符号tinyint类型的范围是: 0 - 255
mysql> create table datatype(num tinyint);
Query OK, 0 rows affected (0.02 sec)mysql> insert into datatype values(1);
Query OK, 1 row affected (0.01 sec)mysql> insert into datatype values(128);
ERROR 1264 (22003): Out of range value for column 'num' at row 1mysql> insert into datatype values(-128);
Query OK, 1 row affected (0.01 sec)mysql> select * from datatype;
+------+
| num |
+------+
| 1 |
| -128 |
+------+
2 rows in set (0.00 sec)mysql> create table tt1(num tinyint unsigned);
Query OK, 0 rows affected (0.02 sec)mysql> insert into tt1 values(-1);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into tt1 values(255);
Query OK, 1 row affected (0.00 sec)mysql> select * from tt1;
+------+
| num |
+------+
| 255 |
+------+
1 row in set (0.00 sec)
3.2.2.bit类型
bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1
mysql> create table tt2 (id int, a bit(8));
ERROR 1046 (3D000): No database selected
mysql> use test1;
Database changed
mysql> create table tt2 (id int, a bit(8));
Query OK, 0 rows affected (0.02 sec)mysql> insert into tt2 values(10, 10);
Query OK, 1 row affected (0.00 sec)mysql> insert into tt2 values(10, 65);
Query OK, 1 row affected (0.00 sec)mysql> insert into tt2 values(10, 50);
Query OK, 1 row affected (0.01 sec)mysql> select * from tt2;
+------+------+
| id | a |
+------+------+
| 10 | |
| 10 | A |
| 10 | 2 |
+------+------+
3 rows in set (0.00 sec)
3.2.3.小数类型
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。
如果定义的是float(4,2) unsigned 这时,因为把它指定为无符号的数,范围是 0 ~ 99.99
mysql> create table tt3(id int, salary float(4,2));
Query OK, 0 rows affected (0.02 sec)mysql> insert into tt3 values(100, -99.99);
Query OK, 1 row affected (0.00 sec)mysql> insert into tt3 values(100, -99.991);
Query OK, 1 row affected (0.00 sec)mysql> insert into tt3 values(100, -99.995);
ERROR 1264 (22003): Out of range value for column 'salary' at row 1
mysql> select * from tt3;
+------+--------+
| id | salary |
+------+--------+
| 100 | -99.99 |
| 100 | -99.99 |
+------+--------+
2 rows in set (0.00 sec)
3.2.4.decimal
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
decimal(5,2) 表示的范围是 -999.99 ~ 999.99
decimal(5,2) unsigned 表示的范围 0 ~ 999.99
decimal和float很像,但是有区别,两者表示的精度不一样。
mysql> create table tt4(id int, salary1 float(10,2), salary2 decimal(10,2));
Query OK, 0 rows affected (0.02 sec)mysql> insert into tt8 values(100,23.12345612, 23.12345612);
ERROR 1146 (42S02): Table 'test1.tt8' doesn't exist
mysql> insert into tt4 values(100,23.12345612, 23.12345612);
Query OK, 1 row affected, 1 warning (0.00 sec)mysql> select * from tt4;
+------+---------+---------+
| id | salary1 | salary2 |
+------+---------+---------+
| 100 | 23.12 | 23.12 |
+------+---------+---------+
1 row in set (0.00 sec)
float表示的精度大约是7位,decimal整数最大位数m为65,支持小数最大位数d是30。如果d被省略,默认为0。如果m被省略,默认是10。
3.2.字符类型char、varchar
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
mysql> create table tt5(id int, name char(2));
Query OK, 0 rows affected (0.02 sec)mysql> insert into tt5 values(100, '中国');
Query OK, 1 row affected (0.00 sec)mysql> insert into tt5 values(100, 'china');
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql> select * from tt5;
+------+--------+
| id | name |
+------+--------+
| 100 | 中国 |
+------+--------+
1 row in set (0.00 sec)
mysql> create table tt6(id int, name varchar(6));
Query OK, 0 rows affected (0.02 sec)mysql> insert into tt6 values(100, 'china');
Query OK, 1 row affected (0.00 sec)mysql> insert into tt6 values(100, '我爱你,中国');
Query OK, 1 row affected (0.00 sec)mysql> select * from tt6;
+------+--------------------+
| id | name |
+------+--------------------+
| 100 | china |
| 100 | 我爱你,中国 |
+------+--------------------+
2 rows in set (0.00 sec)
关于varchar(len),len到底是多大,这个 len 值,和表的编码密切相关:
- varchar 长度可以指定为 0 到 65535 之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532。
- 当我们的表的编码是 utf8 时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。
char与varchar的比较
如何选择定长或变长字符串?
如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
定长的磁盘空间比较浪费,但是效率高。
变长的磁盘空间比较节省,但是效率低。
定长的意义是,直接开辟好对应的空间
变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少
3.3.日期类型
常用的日期有如下三个:
date:日期 'yyyy-mm-dd' ,占用三字节
datetime:时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
timestamp:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节
mysql> create table birthday(t1 date, t2 datetime, t3 timestamp);
Query OK, 0 rows affected (0.02 sec)mysql> insert into birthday(t1, t2) values('2005-02-24', '2009-03-25 10:11:29');
Query OK, 1 row affected (0.01 sec)mysql> select * from birthday;
+------------+---------------------+---------------------+
| t1 | t2 | t3 |
+------------+---------------------+---------------------+
| 2005-02-24 | 2009-03-25 10:11:29 | 2025-09-21 14:44:51 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)mysql> update birthday set t1 = '2015-1-18';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from birthday;
+------------+---------------------+---------------------+
| t1 | t2 | t3 |
+------------+---------------------+---------------------+
| 2015-01-18 | 2009-03-25 10:11:29 | 2025-09-21 14:46:09 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)
添加数据时,时间戳自动补上当前时间;更新数据,时间戳会更新 成当前时间
3.4.enum和set
enum:枚举,“单选”类型
enum('选项1','选项2','选项3',...)
enum(枚举) 是一种用于实现 “单选” 功能的字段数据类型,其核心作用是为字段限定一组固定的可选值,确保数据录入时只能从预设选项中选择其一。
set('选项值1','选项值2','选项值3', ...);
set(集合) 是一种支持 “多选” 功能的字段数据类型,核心作用是为字段预设一组可选值,允许单个单元格存储其中任意多个值(包括 1 个或多个);而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字1,2,4,8,16,32,.... 最多64个。
说明:不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。
mysql> create table votes( username varchar(30),
hobby set('足球', '篮球', '游泳'), gender enum('男', '女'));mysql> insert into votes values('张三', '足球,游泳', '男');mysql> insert into votes values('李四','篮球',2);mysql> insert into votes values('王五','足球,.篮球'1);mysql> insert into votes values('王五','篮球,游泳',1);mysql> select * from votes;
+----------+---------------+--------+
| username | hobby | gender |
+----------+---------------+--------+
| 张三 | 足球,游泳 | 男 |
| 李四 | 篮球 | 女 |
| 王五 | 足球,篮球 | 男 |
| 王五 | 篮球,游泳 | 男 |
+----------+---------------+--------+
不能查询出所有,爱好为篮球的人
mysql> select * from votes where gender=1;
//使用数字标识的时候,就是正常的数组下标
+----------+---------------+--------+
| username | hobby | gender |
+----------+---------------+--------+
| 张三 | 足球,游泳 | 男 |
| 王五 | 足球,篮球 | 男 |
| 王五 | 篮球,游泳 | 男 |
+----------+---------------+--------+
3 rows in set (0.00 sec)mysql> select * from votes where hobby='篮球';
+----------+--------+--------+
| username | hobby | gender |
+----------+--------+--------+
| 李四 | 篮球 | 女 |
+----------+--------+--------+
1 row in set (0.00 sec)
set 类型支持通过数字匹配查询,但需严格遵循其底层 “选项 - 数字” 的映射规则(即选项按定义顺序对应 2⁰=1、2¹=2、2²=4、2³=8
...)。
mysql> select * from votes where hobby & '2';
+----------+---------------+--------+
| username | hobby | gender |
+----------+---------------+--------+
| 李四 | 篮球 | 女 |
| 王五 | 足球,篮球 | 男 |
| 王五 | 篮球,游泳 | 男 |
+----------+---------------+--------+
3 rows in set (0.00 sec)
集合查询使用find_ in_ set函数:
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0; str_list 用逗号分隔的字符串。
mysql> select * from votes where find_in_set('篮球', hobby);
+----------+---------------+--------+
| username | hobby | gender |
+----------+---------------+--------+
| 李四 | 篮球 | 女 |
| 王五 | 足球,篮球 | 男 |
| 王五 | 篮球,游泳 | 男 |
+----------+---------------+--------+
3 rows in set (0.00 sec)