第一章 数据库理论
1.什么是数据库
1.1数据
描述事物的符号记录,可以是数字,文字,图像,声音等数据有多种形式,它们可以经过数字化后存入计算机
1.2数据库
存储数据的仓库
数据结构化
数据的共享性高,易扩充
数据独立性高
2.数据库管理系统(DBMS)
数据库管理系统是管理数据库的一个软件,它充当所有数据的知识库,并对它的存储,安全,一致性,并发操作,恢复和访问负责
3.常见数据库
3.1关系型数据库
关系数据库是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据
常见的关系型数据库有:Oracle,DB2,Microsoft SQLServer,MicrosoftAccess,MySQL,武汉达梦,南大通用,人大金仓,华为高斯,mariadb
3.2非关系型数据库
非关系型数据库是一种轻量,开源,不兼容SQL功能的数据库
常见的非关系数据库有:redis,mongodb
4.MySQ架构
Mysql架构分为网络连接池层,数据库服务层,存储引擎层,系统文件层
第二章 MySQL安装
1.Windows安装MySQL8.0 msi格式
下载地址
https://dev.mysql.com/downloads/installer/
安装过程:
安装过程为英文
注意:安装mysql8.0需要先安装依赖,若无依赖会自动下载安装,本步骤可选
默认设置即可,即开发平台,端口3306,加密端口33060
认证方式,默认
设置root密码(Mysql@123)
登录账户:默认root
安装的服务名设置,默认即可
安装路径,默认
安装时执行的内容
下一步
完成
注意:若这里报错则Alt+Ctrl+Delete打开任务管理器---服务---MySQL80---右击打开服务--找到MySQL80右击---属性--登录--允许本地系统账户
安装后的配置:环境变量(若配置的mysql的环境变量则可以在CMD中允许MySQL)
新建一个词条:输入mysql安装路径
打开MySQL自带的命令行测试,输入密码Mysql@123进行测试
命令提示符测试
powershell测试
mysql服务启动与停止
启动:net start mysql80
停止:net stop mysql80
可视化管理
清屏:\!cls
2.Liunx安装MySQL
使用迅雷下载集合包
下载网站
https://downloads.mysql.com/archives/community/
使用xftp将集合包上传到/目录
安装
[root@server ~]# cd /
[root@server /]# tar -xvf mysql-8.0.32-1.el9.x86_64.rpm-bundle.tar # 解压
[root@server /]# yum localinstall mysql-community-server-8.0.32-1.el9.x86_64.rpm \
mysql-community-client-8.0.32-1.el9.x86_64.rpm \ # 必须,客户端
mysql-community-common-8.0.32-1.el9.x86_64.rpm \ # 必须,公共库
mysql-community-icu-data-files-8.0.32-1.el9.x86_64.rpm \ # 必须,支持正则表达式的icu数据文件
mysql-community-client-plugins-8.0.32-1.el9.x86_64.rpm \ # 必须,客户端共享插件
mysql-community-libs-8.0.32-1.el9.x86_64.rpm # 不必须,开发库,开发跟MySql有关的C/C++ 项目时则需要
[root@server /]# cd ~
[root@server ~]# systemctl start mysqld
[root@server ~]# systemctl status mysqld # 查看状态
[root@server ~]# mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) # 密码错误,需要重置密码
[root@server ~]# grep password /var/log/mysqld.log # 查询初始密码
2023-02-09T03:55:47.305118Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: q&2PO.yJZ+Hp
# q&2PO.yJZ+Hp为密码,需要复制
[root@server ~]# mysql -u root -p
Enter password: # 粘贴之前的密码
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. # 提示需要修改默认密码
mysql> alter user 'root'@'localhost' identified by 'MyNewPass1!'; # 修改密码
Query OK, 0 rows affected (0.01 sec)
mysql> exit
Bye
第三章 MySQL库表操作
1.SQL语句基础
1.1SQL简介
SQL:结构化查询语言,在关系型数据库上执行数据操作,数据检索以及数据维护的标准语言。使用SQL语句,程序员和数据库管理员可以完成如下的任务
改变数据库的结构
更改系统的安全设置
增加用户对数据库或表的许可权限
在数据库中检索需要的信息
对数据库的信息继续更新
1.2SQL语句分类 四大类
DDL(数据定义语言):定义对数据库对象(库,表,列,索引)的操作,如:create(创建),drop(删除),alter(修改),rename(重命名),show(查看)
DML(数据操作语言):定义对数据库记录的操作,如:insert(插入),delete/truncate(删除),update(更新)
DQL select(查询)
DCL(数据控制语言):定义对数据库,表,字段,用户的访问权限和安全级别,如:grant(授权),revoke(回收特权)
1.3SQL语句的书写规范
在数据库系统中,SQL语句不区分大小写,但字符串常量区分大小写
SQL语句可单行或多行书写,以“;”结尾。
关键词不能跨多行或简写
用空格和缩进来提高语句的可读性
子句通常位于独立行,便于编辑,提高可读性。
注释:/* */ 为多行注释 , ---(远程终端执行有问题),--和#为单行注释
2.数据库操作
2.1数据库的登录及退出
登录格式:
mysql -u用户名 -h服务器的主机地址 -p密码 -A -P 端口 -D 数据库名 -e sql语句
解释:
-u后面更登录数据库的用户名,这里使用root
-h后面的参数是服务器的主机地址,在这里客户端和服务器在同一台机器上,所以输入localhost或者IP地址
-p后面是用户登录密码,注意:-p和密码之间没有空格。如果出现空格,系统将不会把后面的字符串当成密码来对待,没有密码时不写
-A参数:不预读数据库信息,加上该参数则不预读数据库中的表等信息
2.2查看数据库
格式:
like 模糊查询 % 任意长度的任意字符 _ 任意单个字符
mysql> show databases [like 条件]; # 注意有s
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
MySQL自带数据库
information_schema:提供MySQL服务器中所有数据库对象的元数据信息,相当于数据库的“数据字典”,存放内容有数据库,表,列,索引,视图,存储过程,触发器等的定义信息;表的存储引擎,数据类型,权限信息,字符集等
performance_schema:主要存储数据库服务器的性能参数
mysql:存储了系统的用户权限信息及帮助信息
sys:这个库是通过视图的形式把information_schema和performance_schema结合起来,查询出更加令人容易理解的数据
使用条件查看
mysql> show databases like 'sys';
+----------------+
| Database (sys) |
+----------------+
| sys |
+----------------+
1 row in set (0.00 sec)
带有通配符的条件查看
%:匹配任意零个或多个字符
_:匹配任意单个字符
mysql> show databases like 's%';
+---------------+
| Database (s%) |
+---------------+
| sys |
+---------------+
1 row in set (0.00 sec)
显示时间:
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2025-08-09 09:39:14 |
+---------------------+
1 row in set (0.00 sec)
显示数据库版本
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.37 |
+-----------+
1 row in set (0.00 sec)
2.3创建数据库
格式:
create database 数据库名;
示例:
mysql> create database db1;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| db1 |
+--------------------+
注意:如果数据库已经存在,则会报错
查看创建数据库的语句
格式:
show create database 数据库名
mysql> show create database db1;
+----------+-------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+-------------------------------------------------------------------------------------------------------------------------------+
| db1 | CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+-------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
# 分析:
# 上述显示创建数据库语句的内容可看做3段内容
# CREATE DATABASE `testdb` :表示创建数据库testdb
# /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ :表示注释内容,显示字符集采用utf8mb4方案,一个字符需要 1 ~ 4 个字节。可以存储一些 emoji 表情; utf8mb4_0900_ai_ci表示字符比较规则即ai为不区分重音,ci为不区分大小写
# /*!80016 DEFAULT ENCRYPTION='N' */ 表示数据库未加密
注意:在创建数据库或查看创建数据库语句时,dayabase没有s
2.4mysql中的反引号
作用可以避免一些与SQL语法冲突的问题,同时使代码更加规范化和易读性更强
注意:只有保留关键字和特殊字符需要使用反引号,普通的表名和列名不需要
数据类型之间可以加或者不加反引号,但为了代码规范化,建议加上
2.5切换数据库
查看当前使用的数据库,格式:
select database();
mysql> select database();
+------------+
| database() |
+------------+
| NULL |
+------------+
注意:当前没有使用数据库,则显示空
选择数据库,格式:
use 数据库名
mysql> use db1;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select database();
+------------+
| database() |
+------------+
| db1 |
+------------+
1 row in set (0.00 sec)
2.6查看当前用户
mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
2.7删除数据库
格式:
drop database 数据库名
示例:
mysql> drop database db1;
Query OK, 0 rows affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
2.8小结
新建数据库
create database 数据库名
设为当前数据库
use 数据库名
查看当前使用的数据库
select database();
显示所有数据库
show databases;
删除数据库
drop database 数据库名
查看当前登录的用户及主机名
select user();
3.MySQL字符集
3.1字符集
字符集是字符的编码规则,规定了字符在数据库中的存储格式,比如占多少空间,支持哪些字符等
mysql8.0的默认字符集是utf8mb4;
mysql8的库表创建以及程序中尽可能使用uf8mb4;
mysql8的库表创建以及程序中尽可能使用utf8mb4字符集(支持emoji)
mysql中的utf8字符集是utf8mb3字符集的别名,避免使用
latin1支持西欧字符、希腊字符等
gbk支持中文简体字符,但是不是国际通用字符集
big5支持中文繁体字符
utf8几乎支持世界所有国家的字符。
utf8mb4完全兼容UTF-8,用四个字节存储更多的字符
3.2字符序 CI CS
字符序就是字符排序的规则集合
字符序主要对字符的排序有影响
3.3查看MySQL字符集
查看所有支持的字符集
格式1:
mysql> show character set;
+----------+---------------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+---------------------------------+---------------------+--------+
| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |
| ascii | US ASCII | ascii_general_ci | 1 |
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
| binary | Binary pseudo charset | binary | 1 |
| cp1250 | Windows Central European | cp1250_general_ci | 1 |
| cp1251 | Windows Cyrillic | cp1251_general_ci | 1 |
| cp1256 | Windows Arabic | cp1256_general_ci | 1 |
| cp1257 | Windows Baltic | cp1257_general_ci | 1 |
| cp850 | DOS West European | cp850_general_ci | 1 |
| cp852 | DOS Central European | cp852_general_ci | 1 |
| cp866 | DOS Russian | cp866_general_ci | 1 |
| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 |
| dec8 | DEC West European | dec8_swedish_ci | 1 |
| eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 |
| euckr | EUC-KR Korean | euckr_korean_ci | 2 |
| gb18030 | China National Standard GB18030 | gb18030_chinese_ci | 4 |
| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |
| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |
| geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 |
| greek | ISO 8859-7 Greek | greek_general_ci | 1 |
| hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 |
| hp8 | HP West European | hp8_english_ci | 1 |
| keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 |
| koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 |
| koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 |
| latin1 | cp1252 West European | latin1_swedish_ci | 1 |
| latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |
| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 |
| latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 |
| macce | Mac Central European | macce_general_ci | 1 |
| macroman | Mac West European | macroman_general_ci | 1 |
| sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 |
| swe7 | 7bit Swedish | swe7_swedish_ci | 1 |
| tis620 | TIS620 Thai | tis620_thai_ci | 1 |
| ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |
| ujis | EUC-JP Japanese | ujis_japanese_ci | 3 |
| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |
| utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 |
| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |
| utf8mb3 | UTF-8 Unicode | utf8mb3_general_ci | 3 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_0900_ai_ci | 4 |
+----------+---------------------------------+---------------------+--------+
41 rows in set (0.00 sec)
# 字段含义
# Charset: 字符集的名称;
# Description:字符集的简单描述;
# Default collation:该字符集的默认字符序;
# Maxlen:该字符集中字符最大存储长度。
# 或者使用\g替代定界符分号
mysql> show character set\g
格式2:
#\G表示将查询结果进行按列打印,即将查到的结构旋转90度变成纵向显示,不需要分号
mysql> show character set\G
*************************** 1. row ***************************
Charset: armscii8
Description: ARMSCII-8 Armenian
Default collation: armscii8_general_ci
Maxlen: 1
*************************** 2. row ***************************
Charset: ascii
Description: US ASCII
Default collation: ascii_general_ci
Maxlen: 1
*************************** 3. row ***************************
Charset: big5
Description: Big5 Traditional Chinese
Default collation: big5_chinese_ci
Maxlen: 2
*************************** 4. row ***************************
Charset: binary
Description: Binary pseudo charset
Default collation: binary
Maxlen: 1
*************************** 5. row ***************************
Charset: cp1250
Description: Windows Central European
Default collation: cp1250_general_ci
Maxlen: 1
*************************** 6. row ***************************
Charset: cp1251
Description: Windows Cyrillic
Default collation: cp1251_general_ci
Maxlen: 1
*************************** 7. row ***************************
Charset: cp1256
Description: Windows Arabic
Default collation: cp1256_general_ci
Maxlen: 1
*************************** 8. row ***************************
Charset: cp1257
Description: Windows Baltic
Default collation: cp1257_general_ci
Maxlen: 1
*************************** 9. row ***************************
Charset: cp850
Description: DOS West European
Default collation: cp850_general_ci
Maxlen: 1
*************************** 10. row ***************************
Charset: cp852
Description: DOS Central European
Default collation: cp852_general_ci
Maxlen: 1
*************************** 11. row ***************************
Charset: cp866
Description: DOS Russian
Default collation: cp866_general_ci
Maxlen: 1
*************************** 12. row ***************************
Charset: cp932
Description: SJIS for Windows Japanese
Default collation: cp932_japanese_ci
Maxlen: 2
*************************** 13. row ***************************
Charset: dec8
Description: DEC West European
Default collation: dec8_swedish_ci
Maxlen: 1
*************************** 14. row ***************************
Charset: eucjpms
Description: UJIS for Windows Japanese
Default collation: eucjpms_japanese_ci
Maxlen: 3
*************************** 15. row ***************************
Charset: euckr
Description: EUC-KR Korean
Default collation: euckr_korean_ci
Maxlen: 2
*************************** 16. row ***************************
Charset: gb18030
Description: China National Standard GB18030
Default collation: gb18030_chinese_ci
Maxlen: 4
*************************** 17. row ***************************
Charset: gb2312
Description: GB2312 Simplified Chinese
Default collation: gb2312_chinese_ci
Maxlen: 2
*************************** 18. row ***************************
Charset: gbk
Description: GBK Simplified Chinese
Default collation: gbk_chinese_ci
Maxlen: 2
*************************** 19. row ***************************
Charset: geostd8
Description: GEOSTD8 Georgian
Default collation: geostd8_general_ci
Maxlen: 1
*************************** 20. row ***************************
Charset: greek
Description: ISO 8859-7 Greek
Default collation: greek_general_ci
Maxlen: 1
*************************** 21. row ***************************
Charset: hebrew
Description: ISO 8859-8 Hebrew
Default collation: hebrew_general_ci
Maxlen: 1
*************************** 22. row ***************************
Charset: hp8
Description: HP West European
Default collation: hp8_english_ci
Maxlen: 1
*************************** 23. row ***************************
Charset: keybcs2
Description: DOS Kamenicky Czech-Slovak
Default collation: keybcs2_general_ci
Maxlen: 1
*************************** 24. row ***************************
Charset: koi8r
Description: KOI8-R Relcom Russian
Default collation: koi8r_general_ci
Maxlen: 1
*************************** 25. row ***************************
Charset: koi8u
Description: KOI8-U Ukrainian
Default collation: koi8u_general_ci
Maxlen: 1
*************************** 26. row ***************************
Charset: latin1
Description: cp1252 West European
Default collation: latin1_swedish_ci
Maxlen: 1
*************************** 27. row ***************************
Charset: latin2
Description: ISO 8859-2 Central European
Default collation: latin2_general_ci
Maxlen: 1
*************************** 28. row ***************************
Charset: latin5
Description: ISO 8859-9 Turkish
Default collation: latin5_turkish_ci
Maxlen: 1
*************************** 29. row ***************************
Charset: latin7
Description: ISO 8859-13 Baltic
Default collation: latin7_general_ci
Maxlen: 1
*************************** 30. row ***************************
Charset: macce
Description: Mac Central European
Default collation: macce_general_ci
Maxlen: 1
*************************** 31. row ***************************
Charset: macroman
Description: Mac West European
Default collation: macroman_general_ci
Maxlen: 1
*************************** 32. row ***************************
Charset: sjis
Description: Shift-JIS Japanese
Default collation: sjis_japanese_ci
Maxlen: 2
*************************** 33. row ***************************
Charset: swe7
Description: 7bit Swedish
Default collation: swe7_swedish_ci
Maxlen: 1
*************************** 34. row ***************************
Charset: tis620
Description: TIS620 Thai
Default collation: tis620_thai_ci
Maxlen: 1
*************************** 35. row ***************************
Charset: ucs2
Description: UCS-2 Unicode
Default collation: ucs2_general_ci
Maxlen: 2
*************************** 36. row ***************************
Charset: ujis
Description: EUC-JP Japanese
Default collation: ujis_japanese_ci
Maxlen: 3
*************************** 37. row ***************************
Charset: utf16
Description: UTF-16 Unicode
Default collation: utf16_general_ci
Maxlen: 4
*************************** 38. row ***************************
Charset: utf16le
Description: UTF-16LE Unicode
Default collation: utf16le_general_ci
Maxlen: 4
*************************** 39. row ***************************
Charset: utf32
Description: UTF-32 Unicode
Default collation: utf32_general_ci
Maxlen: 4
*************************** 40. row ***************************
Charset: utf8mb3
Description: UTF-8 Unicode
Default collation: utf8mb3_general_ci
Maxlen: 3
*************************** 41. row ***************************
Charset: utf8mb4
Description: UTF-8 Unicode
Default collation: utf8mb4_0900_ai_ci
Maxlen: 4
41 rows in set (0.00 sec)
查看指定字符集
mysql> show character set like 'utf%';
+---------+------------------+--------------------+--------+
| Charset | Description | Default collation | Maxlen |
+---------+------------------+--------------------+--------+
| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |
| utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 |
| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |
| utf8mb3 | UTF-8 Unicode | utf8mb3_general_ci | 3 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_0900_ai_ci | 4 |
+---------+------------------+--------------------+--------+
3.4查看MySQL字符序
MySQL字符序命名规则:
以字符序对应的字符集名称开头
以国家名居中(或以general居中)
后缀:bin(二进制),ci(大小写不敏感),cs(大小写敏感),ai(口音不敏感),as(口音敏感),ks(假名敏感)
查看支持的字序
mysql> show collation;
# 字段含义
# Collation:字符序名称;
# Charset:该字符序关联的字符集;
# Id:字符序ID;
# Default:该字符序是否是所关联的字符集的默认字符序。armscii8_general_ci就是armscii8的默认字符序,而armscii8_bin就不是;
# Compiled:字符集是否已编译到服务器中;
# Sortlen:这与对以字符集表示的字符串进行排序所需的内存量有关;
# Pad_attribute:这表明了字符序在比较字符串时对末尾padding的处理。NO PAD表明在比较字符串时,末尾的padding也会考虑进去,否则不考虑。
指定条件查询
mysql> show collation where charset = "utf8mb4";
3.5查看当前字符集的设置
通过变量查看
mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 # 重要 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 # 重要 |
| character_set_system | utf8mb3 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
变量定义
character_set_client:MySQL客户端的字符集。
character_set_connection:数据通信链路字符集,当MySQL客户机向服务器发送请求时,请求数据以该字符集进行编码。
character_set_database:数据库默认使用的字符集。
character_set_filesystem:MySQL服务器文件系统字符集,该值是固定的binary。
character_set_results:服务器返回给客户端的结果使用的字符集。
character_set_server:服务器默认的字符集。
character_set_system:服务器存储元数据使用的字符集。
修改字符集
格式
ALTER DATABASE 数据库名 CHARACTER SET 字符集名 COLLATE 排序规则;
4.表的基本操作
4.1数据类型
类型组成:数据,文本,日期/时间类型
数字类型 整数int 小数浮点类型
数据类型 | 字节数 | 带符号值范围 | 不带符号值范围 |
tinyint unsigned | 1 | [-128,127] | [0,255] |
smallint | 2 | [-32768,32767] | [0,65535] |
mediumint | 3 | [-8388608,8388607] | [0,4294967295] |
int | 4 | [-2147483648,2147483647] | [0,4294967295] |
bigint | 8 | [-9223372036854775808,9223372036854775807] | [0,18446744073709551616] |
注意:
整型(N)表现形式:有时代码写法为int(10),表示数字宽度限制,并且int永远占4个字节,N表示的是显示宽度,不足则补0,超过长度则会无视长度直接显示整个数字
浮点型
数据类型 | 字节数 | 备注 |
float | 4 | 单精度浮点型 7 |
double | 8 | 双精度浮点型 15 |
注意:
可以使用float(M,D),double(M,D)格式限制宽度按(M)和精度(D),如float(3,2),不指定M,D的时,会按照实际的精度来处理
由于float,double类型存在精度丢失问题,所以在考虑精度的时候可以选择decimal
文本型
数据类型 | 描述 |
char(size) | 保存固定长度的字符串(可包含字母,数字以及特殊字符),最多255个字符 |
varchar(size) | 保存可变长度的字符串(可包含字母,数字以及特殊字符),最多255个字符,如果值的长度大于255,则被转换为TEXT类型 |
tinytext | 存放最大长度为255个字符的字符串 |
text | 存放最大长度为65535个字符的字符串 |
blob | 用于BLOBS,存放最多65535字节的数据 |
data类型
数据类型 | 字节数 | 格式 | 备注 |
date | 3 | yyyy-MM-dd | 存储日期值 |
time | 3 | HH:mm:ss | 存储时分秒 |
datetime | 8 | yyyy-MM-dd HH:mm:ss | 存储日期+时间 |
总结:常用数据类型:boolean
4.2创建表
格式
create table 表名 (表选项)
表定义选项格式
列名1 列类型1 约束 comment 注释名, 列名2 列类型2 约束,……
注意:
使用create table 创建表时,表的名称不区分大小写,不能使用SQL语言中的关键字,如drop,alter,inster等
必须指定数据表中每个列(字段)的名称和数据类型,如果创建多个列,要用逗号隔开
示例
mysql> select database(); # 查看当前数据库
mysql> create database mydb2_stuinfo; # 创建数据库
Query OK, 1 row affected (0.02 sec)
mysql> use mydb2_stuinfo; # 使用数据库
Database changed
mysql> create table student1(id int, name varchar(30), sex char(2), age int unsigned, score float, addr varchar(50));
Query OK, 0 rows affected (0.02 sec)
mysql> show tables;
+-------------------------+
| Tables_in_mydb2_stuinfo |
+-------------------------+
| student1 |
+-------------------------+
4.3查看表
show语句:显示当前数据库中已有的数据表
格式
show tables [from 数据库名][like wild];
示例
mysql> show tables;
+-------------------------+
| Tables_in_mydb2_stuinfo |
+-------------------------+
| class1 |
| student1 |
+-------------------------+
2 rows in set (0.00 sec)
mysql> show tables from mydb3_employee; # 查看另一个库的表示信息
+--------------------------+
| Tables_in_mydb3_employee |
+--------------------------+
| tb1 |
+--------------------------+
1 row in set (0.00 sec)
describe语句:查看数据表中各列的信息
格式
{describe|desc}表名[列名];
# or
show columns from 表名称;
示例
mysql> use mydb2_stuinfo;
mysql> desc student1;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(30) | YES | | NULL | |
| sex | char(2) | YES | | NULL | |
| age | int unsigned | YES | | NULL | |
| score | float | YES | | NULL | |
| addr | varchar(50) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
#columns 用法
mysql> show columns from student1;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(30) | YES | | NULL | |
| sex | char(2) | YES | | NULL | |
| age | int unsigned | YES | | NULL | |
| score | float | YES | | NULL | |
| addr | varchar(50) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
4.4删除表
格式
drop table [if exists] 表名;
示例
mysql> use mydb3_employee;
Database changed
mysql> show columns from tb1;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(25) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> drop table tb1;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
Empty set (0.00 sec)
注意:
用户必须拥有执行drop table 命令的权限,否则数据表不会被删除
推荐使用if exists 字句,即先判断是否存在,存在则删除,如
mysql> drop table if exists tb1;
Query OK, 0 rows affected (0.01 sec)
4.5修改表
更改表名(重命名)
# 法1:
alter table 表名 rename 新表名;
# 法2:
rename table 表名 to 新表名;
示例
mysql> use mydb2_stuinfo;
Database changed
mysql> show tables;
+-------------------------+
| Tables_in_mydb2_stuinfo |
+-------------------------+
| class1 |
| student1 |
+-------------------------+
1 row in set (0.00 sec)
mysql> create table student2(id int(11), name varchar(30), salary float);
Query OK, 0 rows affected, 1 warning (0.05 sec)
mysql> desc student2;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(30) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> alter table student2 rename student3; # 修改
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+-------------------------+
| Tables_in_mydb2_stuinfo |
+-------------------------+
| class1 |
| student1 |
| student3 |
+-------------------------+
2 rows in set (0.01 sec)
mysql> rename table student3 to teacher1; # 修改
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+-------------------------+
| Tables_in_mydb2_stuinfo |
+-------------------------+
| class1 |
| student1 |
| teacher1 |
+-------------------------+
2 rows in set (0.00 sec)
添加新列
alter table 表名 add 新列名 列类型 [after|first] 列名;
# after:在指定列之后插入新列
# first:在第一列插入新列
# 注意:无before关键字
示例
# 例:增加一列password
mysql> alter table student1 add password char(8);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
# 注意:数据库操作后得到的反馈,表明操作的结果。这个信息表示:
Records: 2: 表示成功导入或处理的记录总数是2条。
Duplicates: 0: 表示在操作过程中没有发现重复的记录。
Warnings: 0: 表示在操作过程中没有产生任何警告。
mysql> desc student1;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(30) | YES | | NULL | |
| sex | char(2) | YES | | NULL | |
| age | int unsigned | YES | | NULL | |
| score | float | YES | | NULL | |
| addr | varchar(50) | YES | | NULL | |
| password | char(8) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
# 例:再添加一个新列notes varchar(30),位置在score之前
mysql> alter table student1 add notes varchar(30) after age;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc student1;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(30) | YES | | NULL | |
| sex | char(2) | YES | | NULL | |
| age | int unsigned | YES | | NULL | |
| notes | varchar(30) | YES | | NULL | |
| score | float | YES | | NULL | |
| addr | varchar(50) | YES | | NULL | |
| password | char(8) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
# 例:再第一列添加一个新列
mysql> alter table student1 add aa int first;
mysql> desc student1;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| aa | int | YES | | NULL | |
| id | int | YES | | NULL | |
| name | varchar(30) | YES | | NULL | |
| sex | char(2) | YES | | NULL | |
| age | int unsigned | YES | | NULL | |
| notes | varchar(30) | YES | | NULL | |
| score | float | YES | | NULL | |
| addr | varchar(50) | YES | | NULL | |
| password | char(8) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
9 rows in set (0.00 sec)
删除列
格式
alter table 表名 DROP 列名;
示例
# 例:删除上例的notes、aa列
mysql> alter table student1 drop notes;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table student1 drop aa;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc student1;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(30) | YES | | NULL | |
| sex | char(2) | YES | | NULL | |
| age | int unsigned | YES | | NULL | |
| score | float | YES | | NULL | |
| addr | varchar(50) | YES | | NULL | |
| password | char(8) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
修改列名
格式
alter table 表名 change 旧列名 新列名 列类型;
示例
mysql> alter table student1 change password passwd char(8); # 改名
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc student1;
+--------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(30) | YES | | NULL | |
| sex | char(2) | YES | | NULL | |
| age | int unsigned | YES | | NULL | |
| score | float | YES | | NULL | |
| addr | varchar(50) | YES | | NULL | |
| passwd | char(8) | YES | | NULL | |
+--------+--------------+------+-----+---------+-------+
7 rows in set (0.01 sec)
修改列类型
格式
alter table 表名 modify 列名 列类型;
示例
# 插入新列,修改类型
mysql> alter table student1 add birthday char(10); # 增加
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc student1;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(30) | YES | | NULL | |
| sex | char(2) | YES | | NULL | |
| age | int unsigned | YES | | NULL | |
| score | float | YES | | NULL | |
| addr | varchar(50) | YES | | NULL | |
| passwd | char(8) | YES | | NULL | |
| birthday | char(10) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
mysql> alter table student1 modify birthday date; # 修改
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc student1;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(30) | YES | | NULL | |
| sex | char(2) | YES | | NULL | |
| age | int unsigned | YES | | NULL | |
| score | float | YES | | NULL | |
| addr | varchar(50) | YES | | NULL | |
| passwd | char(8) | YES | | NULL | |
| birthday | date | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
4.6修改列位置
格式
alter table 表名 modify 列名 列类型 after 某列;
示例
# 例:添加新列
mysql> alter table student1 add notes varchar(30) after name;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
# 将notes移动到最后
mysql> alter table student1 modify notes varchar(30) after birthday;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
# 删除该列
mysql> alter table student1 drop notes;
4.7复制表的结构
方法1:在create table 语句的末尾添加like子句,可以将源表的表结构复制到新表中,语法格式如下
create table 新表名 like 源表
示例
mysql> use mydb2_stuinfo;
mysql> insert into student1 value(1000,"zhangsan","M",18,98.5,"xi'an","12345678","2005-10-01");
Query OK, 1 row affected (0.00 sec)
mysql> insert into student1 value(1001, "lisi", "W", 20,66.79, "baoji","87654321","2003-5-01");
mysql> select * from student1;
mysql> create table student2 like student1;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+-------------------------+
| Tables_in_mydb2_stuinfo |
+-------------------------+
| class1 |
| student1 |
| teacher1 |
+-------------------------+
3 rows in set (0.00 sec)
mysql> select * from student2; # 注意:只是复制结构框架
Empty set (0.00 sec)
方法2:在create table 语句的末尾添加一个select语句,可以实现表结构的复制,甚至可以将源表的表记录拷贝到新表中,下面的语法格式将源表的结构和记录都拷贝到新表中
create table 新表名 select * from 源表
示例
mysql> create table student3 select * from student1;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show tables;
+-------------------------+
| Tables_in_mydb2_stuinfo |
+-------------------------+
| class1 |
| student1 |
| student2 |
| student3 |
| teacher1 |
+-------------------------+
4 rows in set (0.00 sec)
mysql> select * from student3;
方法3:如果已经存在一张结构一致的表,复制数据
mysql> select * from student2;
Empty set (0.00 sec)
mysql> insert into student2 select * from student1;
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from student2;
mysql> drop table if exists student2;
mysql> drop table if exists student3;
mysql> drop table if exists teacher1;
4.8数据库字典
数据字典:类似于系统编目或花名册,它保存数据库服务器上的元数据信息
元数据:描述数据的数据,内容包括数据库的属性信息,数据库的属性信息,字段的属性信息,视图的属性信息,用户信息,统计类信息等
information_schema数据库是MySQL系统自带的数据库,它提供了数据库元数据的访问方式
4.9 小结
新建表
create table 表名 (字段名1 数据类型,字段名2 数据类型,...);
create table 表名 (字段名1 数据类型,字段名2 数据类型,...) character set 字符集 collate 字符集_ci;
删除表
drop table 表名;
查看表
show tables;
show tables from db1;
查看完成的建表语句
show create table 表名;
修改表
alter table 表名 rename 新表名;
== rename table 表名 to 新表名;
查看表字段(表结构)
desc|explain|describe 表名;
show columns from 表名;
添加列(字段)
alter table 表名 add 字段名 数据类型 [after|first] 字段名;
删除列
alter table 表名 drop 字段名;
修改该列(字段名/字段的数据类型)
alter table 表名 change 旧的字段名 新的字段名 数据类型;
alter table 表名 modify 字段名 新的数据类型;
表复制(备份)
create table 新表名 like 旧表名 ; #备份表结构
insert into 新表名 select * from 旧表名; #复制表数据
create table 新表名 select * from 旧表; #备份表结构和表数据
4.10删除的注意事项
删除数据库表之前,一定要备份数据,以免数据丢失
在删除数据库表之前,要确保该表没有被其他的表所引用,否则可能会破坏外界约束
在删除数据库之前,要确保该表的数据已经备份,并且不再需要使用
在删除数据库表之前,要确保该表的数据已经被清空,否则会破坏外界约束
在删除数据库表之前,要去确保该表的所有索引都已经被删除。如果还存在索引,可能会导致删除失败
在删除数据库表之前,要确保该表的所有相关程序已经停止运行,以免影响其他程序的正常运行
5.表的约束
5.1概念
约束是什么:约束是在表上强制执行的数据校验规则,本质上是Mysql通过限制用户操作的方式,来达到维护数据本身安全及数据完整性的一套方案
常见约束:
非空约束 not null 限制字段中的值不能为空null
默认值约束 default "女"
主键约束(primary key)
外键约束(foreign key)
唯一约束 (unique)
检查约束(check)
创建约束的时机:
在建表的同时创建
建表后创建(修改表)
约束可定义列级或表级约束
5.2语法
列级约束(非空 默认)
create table 表名 (列名 类型 约束类型);
create table 表名 (列名 类型,...,constraint 自定义约束名 约束类型(字段名));
alter table 表名 change 列名 列名 列类型 约束类型;
alter table 表名 modify 列名 列类型 约束类型;
表级约束(约束名建议采用 表名_列名_约束类型简介)
create table 表名 (列名 类型, constraint 约束名 约束类型(列名));
创建表之后添加约束
alter table 表名 add constraint 约束名 约束类型(要约束的列名);
表级别删除
alter table 表名 drop constraint 约束名/字段;
alter table 表名 drop key key名; # 注:主键primary key key名 , 外建 foreign key key名
alter table 表名 drop primary key;
alter table 表名 drop foreign key fk_class_id ;
alter table 表名 modify 字段名 数据类型 null;
ALTER TABLE 表名 ALTER COLUMN enrollment_date DROP DEFAULT;
ALTER TABLE 表名 ALTER COLUMN sname SET DEFAULT NULL;
ALTER TABLE table_name MODIFY column_name INT; -- 删除自增长
ALTER TABLE table_name drop primary key; -- 删除主键约束
5.3非空约束
作用:限定某个字段/某列的值不允许为空
两个值:null(默认的)和not null (不为空)
示例
mysql> create table myclass1(class_name varchar(20) not null, class_room varchar(20) not null, class_id int); # 无约束
Query OK, 0 rows affected (0.02 sec)
mysql> desc myclass1;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| class_name | varchar(20) | NO | | NULL | |
| class_room | varchar(20) | NO | | NULL | |
| class_id | int | YES | | NULL | |
+------------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
# 插入数据时:
mysql> insert into myclass1 (class_room) values('计科1');
ERROR 1364 (HY000): Field 'class_name' doesn't have a default value # 失败,因为name有约束不能为空
mysql> insert into myclass1 (class_name,class_room) values('A104','计科1'); # 同时插入成功
Query OK, 1 row affected (0.00 sec)
mysql> select * from myclass1;
+------------+------------+----------+
| class_name | class_room | class_id |
+------------+------------+----------+
| A104 | 计科1 | NULL |
+------------+------------+----------+
1 row in set (0.00 sec)
# id字段无约束,可以为空
也可以选择在创建之后修改,语法如下:
# 语法:
alter table <数据表名> change column <字段名> <字段名> <数据类型> not null;
mysql> alter table student1 change column id id int not null;
也可以使用modify修改
mysql> alter table student1 modify name varchar(30) not null;
# modify字句中省略not null 相当于设置为可以为空
删除not null
mysql> alter table student1 modify id int null;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
# 或者
mysql> alter table student1 modify name varchar(30);
mysql> desc student1;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | int | YES | | NULL | | 主键 自增长
| name | varchar(30) | YES | | NULL | | 非空
| sex | char(2) | YES | | NULL | | 非空(枚举)
| age | int unsigned | YES | | NULL | | 检查约束
| score | float | YES | | NULL | |
| addr | varchar(50) | YES | | NULL | | 唯一
| passwd | char(8) | YES | | NULL | |
| birthday | date | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
5.4默认值约束
作用:给某个字段/某列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显示赋值,则赋值为默认值
mysql> create table teacher1(id int not null, name varchar(30) not null, sex char(2) default '女');
Query OK, 0 rows affected (0.03 sec)
mysql> desc teacher1;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | | NULL | |
| name | varchar(30) | NO | | NULL | |
| sex | char(2) | YES | | 女 | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> insert into teacher1(id,name) values(1001,'林雪');
Query OK, 1 row affected (0.00 sec)
mysql> select * from teacher1;
+------+--------+------+
| id | name | sex |
+------+--------+------+
| 1001 | 林雪 | 女 |
+------+--------+------+
1 row in set (0.00 sec)
mysql> insert into teacher1(id,name,sex) values(1002,'石磊','男'); # 也可以全字段插入
Query OK, 1 row affected (0.01 sec)
mysql> select * from teacher1;
+------+--------+------+
| id | name | sex |
+------+--------+------+
| 1001 | 林雪 | 女 |
| 1002 | 石磊 | 男 |
+------+--------+------+
2 rows in set (0.00 sec)
创建表之后增加默认值
mysql> alter table student1 modify sex char(2) default '女';
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc student1;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(30) | YES | | NULL | |
| sex | char(2) | YES | | 女 | |
| age | int unsigned | YES | | NULL | |
| score | float | YES | | NULL | |
| addr | varchar(50) | YES | | NULL | |
| passwd | char(8) | YES | | NULL | |
| birthday | date | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
mysql> insert into student1 (id,name) values(1004,'王五');
Query OK, 1 row affected (0.01 sec)
mysql> select * from student1;
默认值的生效:数据在插入的时候不给该字段赋值,就使用默认值
注意:若某字段都设置了not null 和default约束,则按照不插入时会选择默认值,插入时选择插入值,所以此时not null毫无意义
mysql> alter table teacher1 add age int not null default 18;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc teacher1;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | | NULL | |
| name | varchar(30) | NO | | NULL | |
| sex | char(2) | YES | | 女 | |
| age | int | NO | | 18 | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
# not null和defalut一般不需要同时出现,因为default本身有默认值,不会为空
ALTER TABLE t7 ALTER COLUMN num DROP DEFAULT;
5.5列描述--comment
列描述没有实际含义,就是个操作者来查看该列的含义
mysql> create table myclass2( class_name varchar(20) not null comment '教室',class_room varchar(20) default '计科2');
Query OK, 0 rows affected (0.02 sec)
mysql> desc myclass2;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| class_name | varchar(20) | NO | | NULL | |
| class_room | varchar(20) | YES | | 计科2 | |
+------------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> show create table myclass2\G
*************************** 1. row ***************************
Table: myclass2
Create Table: CREATE TABLE `myclass2` (
`class_name` varchar(20) NOT NULL COMMENT '教室',
`class_room` varchar(20) DEFAULT '计科2' COMMENT '班级'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
5.6主键约束(not null unique=primary key)
作用:相当于序号学号这样的唯一标识,可以根据主键来唯一地筛选出一条记录
主键:primary key ,用来唯一地约束该字段里面的数据
特点:
主键字段不能为空,不能重复
一张表最多只有一个主键
主键所在的列通常是整数类型
主键约束是最频繁的约束
注意:当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引。如果删除主键约束了,主键约束对应的索引就自动删除了,需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性。
示例:创建时增加主键
mysql> create table t1 ( id int unsigned primary key comment '学号不能为空', name varchar(20) not null ,sex char(2) default '男');
Query OK, 0 rows affected (0.02 sec)
mysql> desc t1;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int unsigned | NO | PRI | NULL | |
| name | varchar(20) | NO | | NULL | |
| sex | char(2) | YES | | 男 | |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> insert into t1 values(1,'孙文','女');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1;
+----+--------+------+
| id | name | sex |
+----+--------+------+
| 1 | 孙文 | 女 |
+----+--------+------+
1 row in set (0.00 sec)
mysql> insert into t1(id,name) values(2,'李文华');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1;
+----+-----------+------+
| id | name | sex |
+----+-----------+------+
| 1 | 孙文 | 女 |
| 2 | 李文华 | 男 |
+----+-----------+------+
2 rows in set (0.00 sec)
mysql> insert into t1(id,name) values(1,'黎明');
ERROR 1062 (23000): Duplicate entry '1' for key 't1.PRIMARY'
# 再次插入出错,因为需要保持唯一性
示例:修改表并且追加主键
mysql> alter table teacher1 add primary key(id);
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc teacher1;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(30) | NO | | NULL | |
| sex | char(2) | YES | | 女 | |
| age | int | NO | | 18 | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
注意:如果该字段内有重复值,则不能以该字段新增为主键,必须先把重复的数据去掉然后才能添加该列为主键
删除主键
alter table 表名 drop primary key;
复合主键:在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以使用复合主键,这些字段合在一起就是一个主键,也就是让多个字段联合在一起作为唯一标识,单个字段主键重复是没有问题的,只要不是成为复合主键的字段一起冲突就行
mysql> create table t2 (id int, hostname varchar(10), ip varchar(20), port int unsigned, primary key (ip,port));
Query OK, 0 rows affected (0.02 sec)
mysql> desc t2;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| hostname | varchar(10) | YES | | NULL | |
| ip | varchar(20) | NO | PRI | NULL | |
| port | int unsigned | NO | PRI | NULL | |
+----------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> insert into t2 values(1,'node1','192,168,48,2',120);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t2;
+------+----------+--------------+------+
| id | hostname | ip | port |
+------+----------+--------------+------+
| 1 | node1 | 192,168,48,2 | 120 |
+------+----------+--------------+------+
1 row in set (0.00 sec)
mysql> insert into t2 values(2,'node2','192,168,48,3',120);
Query OK, 1 row affected (0.00 sec) # 可以单个记录重复
mysql> insert into t2 values(3,'node2','192,168,48,2',120);
ERROR 1062 (23000): Duplicate entry '192,168,48,2-120' for key 't2.PRIMARY' # 复合主键一起冲突,报错
5.7主键自增长
作用:给主键添加自增长的数值
auto_increment:当对应的字段,不给值,会自动地被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值,通常和主键搭配使用,作为逻辑主键
注意:
自增长字段必须是整数,自增长字段可以不设置初始值,默认从1开始递增
被自增长的字段必须作为主键或者其他具有唯一性的键使用(必须保证这一列字段具有唯一性的字段)
自增长字段也可以插入数据,只要不与已有数据重复即可,之后新增数据会从最大值开始递增
任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
一张表当中最多只能有一个自增长的列
约束的字段必须具备NOT NULL 属性
示例:
# 先增加主键
mysql> use mydb2_stuinfo;
Database changed
mysql> alter table student1 modify id int primary key;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
# 设置自增长
mysql> alter table student1 modify id int auto_increment;
Query OK, 3 rows affected (0.05 sec)
Records: 3 Duplicates: 0 Warnings: 0
# 查看
mysql> desc student1;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(30) | YES | | NULL | |
| sex | char(2) | YES | | 女 | |
| age | int unsigned | YES | | NULL | |
| score | float | YES | | NULL | |
| addr | varchar(50) | YES | | NULL | |
| passwd | char(8) | YES | | NULL | |
| birthday | date | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)
mysql> insert into student1(name) values('关六');
Query OK, 1 row affected (0.00 sec)
mysql> select * from student1;
# 发现自动增长
指定自增长的起始站:如果第一条记录设置了该字段的初始值,那么新增加的记录就从这个初始值开始自增
# 指定自增长的起始值为100
mysql> create table t3 ( id int primary key auto_increment, systemname varchar(10) not null )auto_increment=100;
Query OK, 0 rows affected (0.02 sec)
# 插入一条记录
mysql> insert into t3(systemname) values('Linux');
Query OK, 1 row affected (0.00 sec)
# 插入一条记录
mysql> insert into t3(systemname) values('windows');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t3;
+-----+------------+
| id | systemname |
+-----+------------+
| 100 | Linux |
| 101 | windows |
+-----+------------+
2 rows in set (0.01 sec)
删除主键自增长
# alter table t3 modify id int; -- 删除自增长约束
# alter table t3 drop primary key; -- 删除主键约束
5.8唯一性约束
作用:限制某个字段/某列的值不能重复
唯一键和主键的关系:
主键更多的是标识唯一性
唯一键不要和别的信息出现重复
主键只能有一个,唯一键可以设置多个
主键用来查找,唯一键用来保证数据的完整性
示例:创建表时实现
mysql> create table t4( id int primary key, name varchar(20) unique comment '名子不能重名,可以为空' );
Query OK, 0 rows affected (0.02 sec)
mysql> desc t4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(20) | YES | UNI | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
# 插入数据
mysql> insert into t4 values(1,'刘文');
Query OK, 1 row affected (0.00 sec)
# 唯一键数据重复,插入失败
mysql> insert into t4 values(1,'刘文');
ERROR 1062 (23000): Duplicate entry '1' for key 't4.PRIMARY'
mysql> insert into t4 values(2,'张磊');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t4;
+----+--------+
| id | name |
+----+--------+
| 1 | 刘文 |
| 2 | 张磊 |
+----+--------+
2 rows in set (0.00 sec)
唯一键冲突,自增长字段不连续
# 设置id列为自增长
mysql> alter table t4 modify id int auto_increment;
Query OK, 3 rows affected (0.03 sec)
Records: 3 Duplicates: 0 Warnings: 0
# 插入一条记录
mysql> insert into t4(name) values('张磊磊');
ysql> select * from t4;
+----+-----------+
| id | name |
+----+-----------+
| 1 | 刘文 |
| 2 | 张磊 |
| 3 | 张磊磊 |
+----+-----------+
3 rows in set (0.00 sec)
# 插入一条相同姓名记录
mysql> insert into t4(name) values('张磊磊');
ERROR 1062 (23000): Duplicate entry '张磊磊' for key 't4.name'
# 在插入一条记录,由于上述唯一键冲突,自增长会出现不连续
mysql> insert into t4(name) values('钱明');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t4;
+----+-----------+
| id | name |
+----+-----------+
| 1 | 刘文 |
| 2 | 张磊 |
| 3 | 张磊磊 |
| 5 | 钱明 |
+----+-----------+
4 rows in set (0.00 sec)
5.9外键约束
作用:限定某个表的某个字段的引用完整性
概念:
主表(父):被引用的表,被参考的表
从表(子):引用别人的表,参考别人的表
外键:从表中的某个字段引用自主表的某个字段或多个字段
引用键:主表被引用的字段
外键约束主要定义在从表上,主表则必须是有主键约束或唯一键约束,当定义外键后,要求外键列数据必须在主表的主键列存在或为null
on update cascade on delete cascade;更新数据在主表中更新级联更新从表;删除数据在主表删除会级联删除从表
格式
foreign key (从表的字段名称) references 主表名字(主表的字段名称); # 建立外键关联
foreign key (从表的字段名称) references 主表名字(主表的字段名称) on update cascade;
示例
# 定义主表
mysql> create table myclass3(id int primary key, name varchar(20) not null comment '班级名');
Query OK, 0 rows affected (0.02 sec)
mysql> desc myclass3;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(20) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
# 定义从表:
mysql> create table myclass3_stu( id int primary key, name varchar(30) not null comment '学生名', class_id int, foreign key (class_id) references myclass3(id) );
Query OK, 0 rows affected (0.02 sec)
mysql> desc myclass3_stu;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(30) | NO | | NULL | |
| class_id | int | YES | MUL | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
# 主表中插入数据
mysql> insert into myclass3 values(10,'C++'),(20,'Java');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from myclass3;
+----+------+
| id | name |
+----+------+
| 10 | C++ |
| 20 | Java |
+----+------+
2 rows in set (0.00 sec)
# 从表中正常插入数据:
mysql> insert into myclass3_stu values(1,'Li',10),(2,'Sun',20);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from myclass3_stu;
+----+------+----------+
| id | name | class_id |
+----+------+----------+
| 1 | Li | 10 |
| 2 | Sun | 20 |
+----+------+----------+
2 rows in set (0.00 sec)
# 从表中插入没有班级的记录,受外键控制,报错
mysql> insert into myclass3_stu values(3,'wang',30);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`stu_info`.`myclass3_stu`, CONSTRAINT `myclass3_stu_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `myclass3` (`id`))
# 从表中,收到外键控制,可以使用null替代,表示没有分配班级
mysql> insert into myclass3_stu values(3,'wang',null);
Query OK, 1 row affected (0.00 sec)
mysql> select * from myclass3_stu;
+----+------+----------+
| id | name | class_id |
+----+------+----------+
| 1 | Li | 10 |
| 2 | Sun | 20 |
| 3 | wang | NULL |
+----+------+----------+
3 rows in set (0.00 sec)
5.10检查约束
作用:检查约束(check)是用来检查数据表中字段值有效性的一种手段,一般用于设置值的范围
注意
设置检查约束时要根据实际情况进行设置,这样能够减少无效数据的输入
在默认值和非空约束可看作是特殊的检查约束
示例1:创建表时设置检查约束
mysql> create table t5(id int primary key, name varchar(20), salary float, check(salary>0 and salary<10000) );
Query OK, 0 rows affected (0.02 sec)
mysql> desc t5;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> insert into t5 values(1,'Li',5984);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t5 values(2,'wang',12000);
ERROR 3819 (HY000): Check constraint 't5_chk_1' is violated.
示例2:修改表时添加检查约束
格式
alter table 表名 add constraint <检查约束名> check(检查约束)
mysql> alter table t5 add constraint check_id check(id>0);
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
5.11删除表的约束方式
删除not null约束
alter table 表名 modify 列名 类型;
删除unique约束
alter table 表名 drop index 惟一约束名;
ALTER TABLE teacher DROP CONSTRAINT 唯一约束名;
删除检查约束:
alter table 表名 drop constraint 检查约束名;
删除primary key约束
alter table 表名 drop primary key;
删除foreign key约束
alter table 表名 drop foreign key 外键名;
6.三范式小结
6.1范式小结
1NF:确保原子性,表中每一个列数据都必须是不可再分的字段。
2NF:确保唯一性,每张表都会只描述一种业务属性,一张表只描述一件事。
3NF:确保独立性,表中除主键外,每个字段主键不存在任何依赖,都是独立的。
7.MySQL数据库账户及授权
7.1密码策略
默认身份验证插件从mysql_native_password更改为caching_sha2_password
查看数据库当前密码策略:123456 64 hash 3306
mysql> show variables like "%password%";
+----------------------------------------------+-----------------+
| Variable_name | Value |
+----------------------------------------------+-----------------+
| # 是否自动生成RSA密钥对文件
caching_sha2_password_auto_generate_rsa_keys | ON |
| # 哈希轮数,数值越大安全性越强
caching_sha2_password_digest_rounds | 5000 |
| # RSA 私钥文件
caching_sha2_password_private_key_path | private_key.pem |
| # RSA 公钥文件
caching_sha2_password_public_key_path | public_key.pem |
| # MySQL密码过期时间,单位为天
default_password_lifetime | 0 |
| # 超时断开
disconnect_on_expired_password | ON |
| # 随机密码长度
generated_random_password_length | 20 |
| # 是否支持代理用户控制认证插件
mysql_native_password_proxy_users | OFF |
| # 不允许用户使用最近n次使用过的密码
password_history | 0 |
| # 修改密码时是否需要提供当前用户使用的密码,OFF不需要,ON需要
password_require_current | OFF |
| # 不允许用户使用最近n天内使用过的密码
password_reuse_interval | 0 |
| #该变量通常为空,它可能用于特定的报告或审计目的
report_password | |
|
sha256_password_auto_generate_rsa_keys | ON |
|
sha256_password_private_key_path | private_key.pem |
|
sha256_password_proxy_users | OFF |
|
sha256_password_public_key_path | public_key.pem |
+----------------------------------------------+-----------------+
查看密码设置策略
mysql> SHOW VARIABLES LIKE 'validate_password%';
Empty set (0.01 sec)
# 注意:若显示为空,则表示未安装插件
mysql> INSTALL COMPONENT 'file://component_validate_password';
Query OK, 0 rows affected (0.01 sec)
mysql> show variables like 'validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| # 是否能将密码设置成当前用户名
validate_password.check_user_name | ON |
| # 插件用于验证密码强度的字典文件路径,默认为空
validate_password.dictionary_file | |
| # 密码最小长度,默认为8,有最小值为4的限制
validate_password.length | 8 |
| # 密码至少要包含的小写字母和大写字母的个数
validate_password.mixed_case_count | 1 |
| # 密码至少要包含的数字个数
validate_password.number_count | 1 |
| # 密码强度检查等级
validate_password.policy | MEDIUM |
| # 密码必须包含的特殊字符个数
validate_password.special_char_count | 1 |
+--------------------------------------+--------+
7 rows in set (0.00 sec)
密码强度检查等级解释
等级 | 检查对象 |
0 or LOW | 检查长度6 |
1 or MEDIUM | 检查长度,数字,大小写,特殊字符8 |
2 or STRONG | 检查长度,数字,大小写,特殊字符,字典文件 |
设置密码强度检查参数
mysql> show variables like 'validate_password.%'; # 查看密码策略
# 设置密码验证强度检查策略
mysql> set global validate_password.policy=low; # 或0
# 设置至少要包含大/小写字母的个数
mysql> set global validate_password.mixed_case_count=0;
# 设置至少要包含数字的个数
mysql> set global validate_password.number_count=6;
# 设置至少包含特殊字符个数
mysql> set global validate_password.special_char_count=0;
# 设置密码长度
mysql> set global validate_password.length=6;
mysql> show variables like 'validate_password.%'; # 再次查看
+-------------------------------------------------+-------+
| Variable_name | Value |
+-------------------------------------------------+-------+
| validate_password.changed_characters_percentage | 0 |
| validate_password.check_user_name | ON |
| validate_password.dictionary_file | |
| validate_password.length | 6 |
| validate_password.mixed_case_count | 0 |
| validate_password.number_count | 6 |
| validate_password.policy | LOW |
| validate_password.special_char_count | 0 |
+-------------------------------------------------+-------+
8 rows in set, 1 warning (0.00 sec)
mysql> flush privileges; # 刷新权限,生效
Query OK, 0 rows affected (0.01 sec)
修改密码
mysql> select user, host, plugin from mysql.user; # 查看root用户信息
mysql> alter user 'root'@'localhost' identified by '123456';
# 注意:主机名为localhost,远程主机为%
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
7.2登录账户管理
mysql的账户权限管理原则:先创建账户,在赋予权限
用户信息存放在mysql数据库下的user表
mysql> select user(); # 查看当前的用户信息
mysql> use mysql;
mysql> show tables;
mysql> desc user;
mysql> select user,host,authentication_string from user;
7.3新建登录账户
格式
create user 'username'@'localhost' identified by 'password';
username:创建的用户名
localhost:指定该用户在哪个主机上可以登录,如果本地用户可以用localhost,如果想让该用户可以从任意远程主机登录,可以使用通配符%
password:该用户的登陆密码
示例
mysql> create user 'test1'@'localhost' identified by '123456';
# 注意:密码要符合密码设置规则
mysql> select user, host, plugin from mysql.user; # 查看信息
mysql> exit
Bye
PS C:\Users\Administrator> mysql -u test1 -p
Enter password: ****** # test账户登录
mysql> show databases; # 只能看到有限的库
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
+--------------------+
2 rows in set (0.01 sec)
7.4账户授权
作用:通过账户权限限制普通账户的工作范围及内容
root账户绝对禁止允许任何IP都可以访问,即登录方式不能用%
赋权最小化,即一般只给select权限,最好不要给update,insert等编辑权限
应用账号和管理账号要分离
常见的用户权限
查看权限
mysql> exit
Bye
PS C:\Users\Administrator> mysql -u root -p
mysql> show grants; # 查看当前账户
mysql> show grants for 'test1'@'localhost'; # 查看其它账户权限
+----------------------------------+
| Grants for test1@% |
+----------------------------------+
| GRANT USAGE ON *.* TO `test1`@`localhost` |
+----------------------------------+
1 row in set (0.00 sec)
# 上例显示test账户只有usage默认权限即连接登录的权限
赋权语法
grant 权限列表 on 数据库名.表名 to '用户名'@'来源地址' ;
权限列表:用户的操作权限,如select,insert,update,creare,如果赋予全部权限就是all
数据库名:数据库名,*代表所有数据库
表名:*代表所有数据库
localhost:指定该用户在哪个主机上登录,本地用户用localhost,任意用户用%
示例1:创建test1账户,赋权
# 使用root账户登录
mysql> grant select on *.* to 'test1'@'localhost'; # 赋予mysql库的查询权限
Query OK, 0 rows affected (0.01 sec)
mysql> show grants for 'test1'@'localhost';
mysql> select * from mysql.user where user='test1'\G # 查看user表的权限信息
mysql> \q
Bye
PS C:\Users\Administrator> mysql -u test1 -p # 重新登录
Enter password: ******
mysql> show databases;
mysql> exit
Bye
示例2:创建test2账户,设置密码,赋权select和create权限,仅通过某个网段登录
PS C:\Users\Administrator> mysql -u root -p
Enter password: ******
# 需要查本机的IP网段
mysql> create user 'test2'@'10.100.170.%' identified by '123456';
mysql> select user, host, plugin from mysql.user;
mysql_native_password
功能:使用 MySQL 4.1 及以后版本的加密方式,生成 41 位哈希值。
应用场景:是 MySQL 5.7 的默认插件,适用于需要与旧版本客户端兼容的情况。
缺点:安全性不如更现代的插件。
caching_sha2_password
功能:采用 SHA-256 算法,并且具备缓存机制,能够减少重复认证时的性能损耗。
应用场景:从 MySQL 8.0 开始成为默认插件,适合用于安全要求较高的场景。
优势:支持更安全的加密方式和快路径认证。
mysql> show grants for 'test2'@'10.100.170.%';
mysql> grant select,create on *.* to 'test2'@'10.100.170.%';
mysql> show grants for 'test2'@'10.100.170.%';
mysql> exit
Bye
PS C:\Users\Administrator> mysql -u test2 -p123456 -h 10.100.170.198
mysql> exit
Bye
10.100.170.198
示例3:创建teste3账户,设置密码,赋予所有权限,仅通过%登录,登录后创建test4账户并赋权
PS C:\Users\Administrator> mysql -u root -p
mysql> create user 'test3'@'%' identified by '123456';
mysql> select user, host, plugin from mysql.user;
mysql> show grants for 'test3'@'%';
mysql> grant all [privileges] on *.* to 'test3'@'%';
mysql> show grants for 'test3'@'%';
mysql> exit
Bye
PS C:\Users\Administrator> mysql -u test3 -p123456
mysql> create database mydbx_temp1;
mysql> create user 'test4'@'%' identified by '123456';
mysql> select user, host, plugin from mysql.user;
mysql> show grants for 'test4'@'%'; # 查看test4账户权限
mysql> select user(); # 查看当前登录的账户
mysql> grant select on *.* to 'test4'@'%'; # 被拒绝,无权给test4账户赋权
ERROR 1045 (28000): Access denied for user 'test3'@'%' (using password: YES)
# 注意:all所有权限中不包含给账户赋权的权限grant
mysql> exit
Bye
PS C:\Users\Administrator> mysql -u root -p # 登录root账户给test3账户赋与给别的账户赋权的权限
mysql> grant all on *.* to 'test3'@'%' with grant option; # 给test3添加赋权的权限
mysql> exit
Bye
PS C:\Users\Administrator> mysql -u test3 -p123456 # 登录test3账户
mysql> grant select on *.* to 'test4'@'%'; # 给test4赋权
Query OK, 0 rows affected (0.01 sec)
注意:若赋权不成功则先给root账户增加system_user权限
mysql> grant system_user on *.* to 'root'@'localhost'; # 给root赋权system_user权限
# 注意:登录主机是%还是localhost
7.5回收权限
格式
revoke 权限列表/all on 库名.表名 from '用户名'@'来源地址';
# revoke跟grant 的语法差不多,只需要把关键字 “to” 换成 “from” 即可
示例4:回收所有权限
mysql> select user();
+-----------------+
| user() |
+-----------------+
| test3@localhost |
+-----------------+
mysql> exit
Bye
PS C:\Users\Administrator> mysql -u root -p
mysql> select user, host, plugin , select_priv from mysql.user;
# select_priv查询权限
mysql> show grants for 'test4'@'%'; # 查看test4账户的权限
mysql> revoke select on *.* from 'test4'@'%'; # 回收select权限
mysql> show grants for 'test4'@'%';
mysql> revoke all on *.* from 'test3'@'%'; # 回收所有权限
mysql> show grants for 'test3'@'%';
mysql> revoke all on *.* from 'test2'@'10.100.170.%'; # 同上
mysql> show grants for 'test2'@'10.100.170.%';
mysql> revoke all on *.* from 'test1'@'localhost';
mysql> show grants for 'test1'@'localhost';
7.6删除账户
格式
drop user '用户名'@'访问主机名';
示例5:删除所有账户
mysql> select user, host from mysql.user;
mysql> drop user 'test1'@'localhost';
Query OK, 0 rows affected (0.01 sec)
mysql> drop user 'test2'@'10.100.170.%';
Query OK, 0 rows affected (0.01 sec)
mysql> drop user test3; # 注意:主机为%可以不写
Query OK, 0 rows affected (0.01 sec)
mysql> drop user test4;
Query OK, 0 rows affected (0.00 sec)
mysql> select user, host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)