MySQL数据库详细笔记

发布于:2025-08-11 ⋅ 阅读:(11) ⋅ 点赞:(0)

第一章 数据库理论

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)


网站公告

今日签到

点亮在社区的每一天
去签到