mysql 学习
版本: mysql Ver 8.0.44
centos7 安装
# 1. 如果之前安装过,可以先卸载 mariadb(可选)
sudo yum remove mariadb-libs -y
# 2. 添加官方 repo
sudo rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm
# 3. 安装
sudo yum install mysql-server -y
# 4. 启动
sudo systemctl start mysqld && sudo systemctl enable mysqld
# 5. 获取临时密码
sudo grep 'temporary password' /var/log/mysqld.log
# 6. 使用MySQL自带的初始化密码命令进行初始化
sudo mysql_secure_installation
安全初始化按提示操作:
1、输入 #临时密码要求修改 root 密码 → 输入强密码(MySQL 8 默认要求大小写+数字+特殊字符)
2、Remove anonymous users? → Y
3、Disallow root login remotely? → Y(除非你需要远程 root)
4、Remove test database? → Y
5、Reload privilege tables? → Y
mysql 密码管理
一、修改root密码并且创建admin日常管理账号
##修改mysql root密码的的方法
1、mysql_secure_installation 使用MySQL自带的初始化密码命令进行初始化
2、mysqladmin -u root -p "Po{>9G^7" 使用mysqladmin命令修改密码
3、先登录mysql 再执行sql语句更改
grant all on *.* to root@localhost identified by 'Po{>9G^7';
##sql语句说明:
1、grant 是sql语句通过指定权限类型、操作对象和授权对象构建授权关系,支持列级别权限控制,允许向用户、用户组或角色赋予针对数据库实体(如表、视图、序列)的特定操作权限
2、all 表示所有权限,包括SELECT、INSERT、UPDATE、DELETE等基本权限
3、identified 是 SQL 中用于指定用户密码的关键字,常见于用户创建或修改语句中,核心用法:CREATE USER username IDENTIFIED BY password
4、'localhost' 指定该用户从本地机器连接(如果你想让这个用户能从任何主机连接,可以使用'%')
4、 先登录mysql 再执行sql 语句更改:
alter user root@localhost identified by 'Po{>9G^7';
##sql语句说明:
1、alter 是结构化查询语言(SQL)中用于修改数据库表结构的命令,属于数据定义语言(DDL)的组成部分,此处ALTER USER语句来修改用户密码
#登录mysql
mysql -u root -p
mysql 命令常用的参数:
————————————————
-u 后面接用户名称
-p 后面接用户密码
-h 后面接mysql的IP
-P 后面接mysql的端口,默认3306
-S socket文件
-e 免交互执行命令
< 导入SQL脚本
————————————————
创建一个用于日常管理的用户: admin
-- 登录 MySQL 后执行
CREATE USER 'admin'@'%' IDENTIFIED BY 'StrongPass!123';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
## *.* 表示数据库名称和表名称,*表示所有的库和表都可以访问
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'admin'@'%'; ##查看admin当前的授权
二、mysql 密码破解方法:
如果忘记mysql root登录密码或者别其他人员修改掉数据库权限后、要紧急修改密码,就需要破解mysql 密码,如下是具体方法:
1、停止mysql 服务,并以跳过权限方式启动:
systemctl stop mysqld
###修改mysql 配置文件 /etc/my.cnf,并添加skip-grant-tables
[mysqld]
skip-grant-tables
###重启mysql服务
systemctl start mysqld
##再次登录mysql 这次不需要再输入root密码
mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.44 MySQL Community Server - GPL
Copyright (c) 2000, 2025, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
2、修改root密码:
mysql的用户及密码认证在mysql库的user表里,所以先进入mysql库再修改密码即可:
mysql> use mysql;
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 user FROM user;
+------------------+
| user |
+------------------+
| admin |
| mysql.infoschema |
| mysql.session |
| mysql.sys |
| root |
+------------------+
5 rows in set (0.00 sec)
mysql> SELECT DATABASE(); ##查看当前所在数据库是哪个
+------------+
| DATABASE() |
+------------+
| mysql |
+------------+
1 row in set (0.00 sec)
mysql> FLUSH PRIVILEGES; ##刷新用户权限
Query OK, 0 rows affected (0.00 sec)
mysql> ALTER USER "root"@"localhost" IDENTIFIED BY "xxxxx"; ###重置root密码
Query OK, 0 rows affected (0.00 sec)
mysql> EXIT;
3、修改配置文件改成正常方式启动
[root@test ~] vim /etc/my.cnf
[mysqld]
###skip-grant-tables
##重启启动mysql
[root@test ~] systemctl restart mysqld
[root@test ~] mysql -u root ##再次登录必须输入密码
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
创建数据库 :现在的数据库是mysql自带的,我们需要创建一个字用于测试的数据库,方便后面学习:
- 创建数据库的基础语法:
CREATE {
DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[CHARACTER SET charset_name]
[COLLATE collation_name]
[ENCRYPTION [=] {
'Y' | 'N'}];
说明:DATABASE 和 SCHEMA 是同义词,效果完全一样;创建数据库的所有选项都是可选的,但强烈建议显式指定字符集和排序规则
各选项详解:
1、 IF NOT EXISTS : 如果数据库已存在,不报错,静默跳过,推荐在脚本中始终使用,避免重复执行失败
2、CHARACTER:指定数据库的默认字符集,推荐使用:utf8mb4
3、COLLATE: 指定数据库的默认排序规则,会影响字符串比较、排序行为。必须与字符集兼容,utf8mb4 对应 utf8mb4_0900_ai_ci
常用组合
4、ENCRYPTION:启用或禁用InnoDB 表空间加密(需企业版或社区版 8.0+ 支持);选项: ‘Y’:启用加密(默认继承实例设置)
;‘N’:禁用加密; 前提:必须配置好 keyring 插件(如 keyring_file 或 keyring_okv)否则会报错
示例:
mysql> CREATE DATABASE IF NOT EXISTS test_mysql CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test_mysql |
+--------------------+
5 rows in set (0.01 sec)
mysql> SELECT DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='test_mysql'; #验证创建结果
+----------------------------+------------------------+
| DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+----------------------------+------------------------+
| utf8mb4 | utf8mb4_0900_ai_ci |
+----------------------------+------------------------+
1 row in set (0.01 sec)
SQL 语法说明
一、sql语法结构:
- 子句: 是语句和查询的组成部分,
- 表达式:可以产生任何标量值,或由列和行的数据库表
- 判断条件:给需要评估的 SQL 三值逻辑(3VL)(true/false/unknown)或布尔真值指定条件,并限制语句和查询的效果,或改变程序流程。
- 查询:基于特定条件检索数据。这是 SQL 的一个重要组成部分
- 语句:可以持久地影响纲要和数据,也可以控制数据库事务、程序流程、连接、会话或诊断
二、sql语法要点
- SQL 语句不区分大小写,例如:SELECT 与 select 、Select 是相同的。但是数据库表名、列名和值是否区分,依赖于具体的 DBMS 以及配置,建议大写数据库表名、列名和值方便区分和增加sql语句可读性
- SQL 语句结束必须以分号(;)分隔
- SQL 语句可以写成一行,也可以分写为多行
-- 一行 SQL 语句
UPDATE user SET username='robot', password='robot' WHERE username = 'root';
-- 多行 SQL 语句
UPDATE user
SET username='robot', password='robot'
WHERE username = 'root';
- 支持三种注释
## 注释1
-- 注释2
/* 注释3 */
三、sql语句分类
- 数据定义语言(DDL):集中负责数据结构定义与数据库对象定义的语言,DDL 的主要功能是定义数据库对象。
DDL 的核心指令是
CREATE:用于创建新的数据库对象,比如表、视图、索引等
表:(table) 是数据库中实际存储数据的结构,由行和列组成,数据以物理形式存储在磁盘上,支持增删改查操作
视图:(view)基于一个或多个表的虚拟表,由查询语句动态生成,不存储实际数据,用于简化复杂查询,提高安全性
索引:(index) 是表中一列或多列的排序结构,用于加速数据检索,自动维护
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100),
position VARCHAR(50),
salary DECIMAL(10, 2)
);
CREATE VIEW employee_view AS
SELECT name, position FROM employees;
ALTER:用于修改已存在的数据库对象。这可以包括添加、删除或修改列,添加或删除索引,或更改表的其他属性,以及修改密码
---添加hire_date 列到employees表
ALTER TABLE employees ADD hire_date DATE;
---删除hire_date 列到employees表
ALTER TABLE employees DROP COLUMN hire_date;
---修改列的类型
ALTER TABLE employees MODIFY COLUMN salary DECIMAL(12, 2);
---添加主键约束
ALTER TABLE employees ADD PRIMARY KEY (id);
mysql> use test_mysql;
Database changed
mysql> CREATE TABLE employees(id INT PRIMARY KEY,name VARCHAR(100),position VARCHAR(50),salary DECIMAL(10, 2));
Query OK, 0 rows affected (0.03 sec)
mysql> CREATE VIEW employee_view AS SELECT name,position FROM employees;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+----------------------+
| Tables_in_test_mysql |
+----------------------+
| employee_view |
| employees |
+----------------------+
2 rows in set (0.00 sec)
mysql> ALTER TABLE employees ADD hire_date DATE;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW COLUMNS FROM employees;
+-----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(100) | YES | | NULL | |
| position | varchar(50) | YES | | NULL | |
| salary | decimal(10,2) | YES | | NULL | |
| hire_date | date | YES | | NULL | |
+-----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> DESC employees;
+-----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(100) | YES | | NULL | |
| position | varchar(50) | YES | | NULL | |
| salary | decimal(10,2) | YES | | NULL | |
| hire_date | date | YES | | NULL | |
+-----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> ALTER TABLE employees DROP COLUMN hire_date;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC employees;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(100) | YES | | NULL | |
| position | varchar(50) | YES | | NULL | |
| salary | decimal(10,2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> ALTER TABLE employees MODIFY COLUMN salary decimal(12,2);
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC employees;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name

最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



