MySQL核心SQL语句详解--下,SQL语句超详细讲解,php、python读写MySQL,数据表的增删改查
一、grant语句实践
1、授权的核心特性与安全原则
授权是网络和服务器安全的基础,其核心在于精准控制权限范围,避免过度开放导致风险。主要特性及安全实践如下:
1.1权限最小化
核心原则:仅授予完成任务必需的权限,而非 “全权限”。
实践:
数据库授权时,避免使用 all privileges(所有权限),而是指定具体操作。
对数据库和表的授权,避免用 *(所有库 / 表),而是明确指定具体库和表。
1.2主机范围严格限制
核心原则:缩小允许访问的主机范围,减少暴露面。
实践:
避免使用 %(表示所有 IP 均可访问),优先限制为局域网网段或单个 IP。
若必须允许公网访问(需用 %),需配合防火墙规则、修改默认端口等额外措施。
2、服务器安全的核心理念与实践
服务器安全的核心是减少攻击入口、提升认证门槛,重点针对远程登录和服务暴露风险。
2.1. 远程登录安全(以 SSH 为例)
- 禁止直接 root 登录:root 为最高权限账号,一旦泄露危害极大,应仅允许普通用户登录,必要时通过
su或sudo提升权限。 - 禁用账号密码登录:密码易被暴力破解,改用公私钥认证:
- 生成公钥(客户端)和私钥(服务器),仅通过密钥匹配允许登录,杜绝密码传输风险。
- 修改默认端口:SSH 默认端口 22 是黑客扫描的重点,建议改为 10000-65535 之间的非知名端口,减少扫描攻击。
2.2 通用服务安全
- 修改默认端口:数据库、中间件等默认端口易被针对性攻击,需改为自定义端口。
- 强密码策略:对于必须保留的密码,需设置复杂密码,避免简单密码。
grant语句可以直接创建,且赋值权限,给—个用户
#语法
grant select,insert,update,delete on 数据库 .数据表 to 用户名 @'%' identified by '密码 ';
# 创建用户且授权,查看用户
mysql> grant select,insert,update,delete on kings.tanks to 'zhangm'@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host,password from mysql.user;
+--------+-----------+-------------------------------------------+
| user | host | password |
+--------+-----------+-------------------------------------------+
| root | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root | 127.0.0.1 | |
| root | ::1 | |
| zhangm | % | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+--------+-----------+-------------------------------------------+
4 rows in set (0.00 sec)
mysql>
刷新权限,修改了user表,创建,修改用户后,立即刷新权限
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql>
二、远程连接MySQL
1、PHP读写MySQL
环境安装
yum install php-mysqlnd php -y
创建一个php文件
cd /opt
vim mysql_read.php
编写读取mysql数据的php脚本
<?php
/**
* 数据库连接配置
* 包含服务器地址、用户名、密码和数据库名
*/
$servername = "192.168.0.18";
$username = "zhangm";
$password = "123456";
$dbname = "kings";
/**
* 创建数据库连接
* 使用mysqli扩展连接MySQL数据库
*/
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 设置数据库连接字符集为UTF-8,确保中文正常显示
mysqli_query($conn, "SET NAMES UTF8");
// 检查数据库连接是否成功
if (!$conn) {
die("MySQL连接失败: " . mysqli_connect_error());
}
/**
* 执行SQL查询
* 查询kings数据库中的tanks表所有记录
*/
$sql = "SELECT * FROM kings.tanks";
$result = mysqli_query($conn, $sql);
/**
* 处理查询结果
* 检查是否有数据返回并循环输出
*/
if (mysqli_num_rows($result) > 0) {
// 循环输出每一行数据
while ($row = mysqli_fetch_assoc($result)) {
echo "ID: " . $row["id"] . " - 名称: " . $row["name"] . " - 技能: " . $row["skills"] . "\n";
}
} else {
echo "------ 未查询到数据 ------";
}
// 关闭数据库连接,释放资源
mysqli_close($conn);
?>
调用php解释器,执行这个文件
[root@mysql-01 opt]# php mysql_read.php
ID: 1 - 名称: 程咬金 - 技能: 大招回血,血量越低,伤害越高
ID: 2 - 名称: 大鱼庄周 - 技能: 免疫所有队友的负面控制
[root@mysql-01 opt]#
2、php插入数据
创建文件
vim mysql_write.php
文件写入以下内容
<?php
/**
* 数据库连接配置
*/
$servername = "192.168.0.18";
$username = "zhangm";
$password = "123456";
$dbname = "kings";
/**
* 创建数据库连接
*/
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 设置数据库连接字符集为UTF-8,确保中文正常写入
mysqli_query($conn, "SET NAMES UTF8");
// 检查数据库连接是否成功
if (!$conn) {
die("数据库连接失败: " . mysqli_connect_error());
}
/**
* 定义插入数据
* 使用预处理语句提高安全性,防止SQL注入
*/
$sql = "INSERT INTO kings.tanks (id, name, skills, price) VALUES (?, ?, ?, ?)";
$stmt = mysqli_prepare($conn, $sql);
// 绑定参数并执行多次插入
$values = [
[3, "吕布", "真实伤害爆棚", 18888],
[4, "关羽", "跑起来贼快", 188888]
];
// 循环处理多条插入数据
foreach ($values as $value) {
mysqli_stmt_bind_param($stmt, "isss", $value[0], $value[1], $value[2], $value[3]);
if (mysqli_stmt_execute($stmt)) {
echo "记录 {$value[1]} 插入成功<br>";
} else {
echo "记录 {$value[1]} 插入失败: " . mysqli_stmt_error($stmt) . "<br>";
}
}
// 关闭预处理语句和数据库连接
mysqli_stmt_close($stmt);
mysqli_close($conn);
?>
执行
[root@mysql-01 opt]# php mysql_write.php
记录 吕布 插入成功<br>记录 关羽 插入成功
三、python读写MySQL
1.安装python3
python3脚本即可,python3读写mysql就得有—个桥梁,有—个驱动,让python3可以正确的连接上mysql,通过如下命令安装这个驱动 pymysql
yum install python3 python3-devel -y
[root@mysql-01 opt]# python3 --version
Python 3.6.8
[root@mysql-01 opt]#
2.开发python3读写mysql的脚本
创建python文件
vim python3_mysql_read_write.py
#安装一个依赖
pip3 install pymysql
输入以下内容
import pymysql
from pymysql.cursors import DictCursor
# 数据库配置
db_config = {
'host': '192.168.0.18',
'port': 3306,
'user': 'zhangm',
'password': '123456',
'database': 'kings',
'charset': 'utf8mb4', # 支持中文
'cursorclass': DictCursor # 返回字典格式结果
}
try:
# 使用上下文管理器自动管理连接和游标
with pymysql.connect(**db_config) as conn:
with conn.cursor() as cursor:
# 插入数据(使用参数化查询防止SQL注入)
insert_sql = "INSERT INTO tanks (id, name, skills, price) VALUES (%s, %s, %s, %s)"
insert_data = (5, "项羽", "皮糙肉厚,贼抗打,超级坦克", 6888)
rows = cursor.execute(insert_sql, insert_data)
print(f"成功插入 {rows} 行数据")
# 查询数据
select_sql = "SELECT * FROM tanks"
cursor.execute(select_sql)
results = cursor.fetchall()
# 格式化输出查询结果
print("\n查询结果:")
for row in results:
print(f"ID: {row['id']}, 名称: {row['name']}, 技能: {row['skills']}, 价格: {row['price']}")
except pymysql.Error as e:
print(f"数据库操作失败: {e}")
finally:
print("数据库连接已关闭")
执行py脚本
[root@mysql-01 opt]# python3 python3_mysql_read_write.py
成功插入 1 行数据
查询结果:
ID: 1, 名称: 程咬金, 技能: 大招回血,血量越低,伤害越高, 价格: 8888
ID: 2, 名称: 大鱼庄周, 技能: 免疫所有队友的负面控制, 价格: 2888
ID: 3, 名称: 吕布, 技能: 真实伤害爆棚, 价格: 18888
ID: 4, 名称: 关羽, 技能: 跑起来贼快, 价格: 188888
ID: 5, 名称: 项羽, 技能: 皮糙肉厚,贼抗打,超级坦克, 价格: 6888
数据库连接已关闭
[root@mysql-01 opt]#
执行成功
进入MySQL数据库进行查看
mysql> select * from kings.tanks;
+----+--------------+----------------------------------------+--------+
| id | name | skills | price |
+----+--------------+----------------------------------------+--------+
| 1 | 程咬金 | 大招回血,血量越低,伤害越高 | 8888 |
| 2 | 大鱼庄周 | 免疫所有队友的负面控制 | 2888 |
| 3 | 吕布 | 真实伤害爆棚 | 18888 |
| 4 | 关羽 | 跑起来贼快 | 188888 |
+----+--------------+----------------------------------------+--------+
4 rows in set (0.00 sec)
mysql>
四、修改数据表
1.修改表名
#语法
rename table 旧的表名字 to 新的表名字;
mysql> show tables;
+-----------------+
| Tables_in_kings |
+-----------------+
| tanks |
+-----------------+
1 row in set (0.00 sec)
mysql> rename table tanks to Tanks;
Query OK, 0 rows affected (0.00 sec)
mysql> show tables;
+-----------------+
| Tables_in_kings |
+-----------------+
| Tanks |
+-----------------+
1 row in set (0.00 sec)
mysql>
2.alter命令修改数据表的名字
#语法
alter table 当前表名 rename to 新表名;
mysql> alter table Tanks rename to TANKS;
Query OK, 0 rows affected (0.00 sec)
mysql> show tables;
+-----------------+
| Tables_in_kings |
+-----------------+
| TANKS |
+-----------------+
1 row in set (0.00 sec)
mysql>
3.修改数据表的字段
#查看数据表具体信息
mysql> desc tanks;
+--------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | 0 | |
| name | varchar(100) | NO | | NULL | |
| skills | varchar(255) | NO | | NULL | |
| price | int(11) | NO | | NULL | |
+--------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql>
# 创建table的语句
mysql> show create table tanks;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tanks | CREATE TABLE `tanks` (
`id` int(11) NOT NULL DEFAULT '0',
`name` varchar(100) NOT NULL,
`skills` varchar(255) NOT NULL,
`price` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
3.1 添加字段
#语法
alter table 表名 add 字段名 字段的数据类型(长度) 额外的字段属性;
mysql> alter table tanks add introduction varchar(255) not null;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc tanks;
+--------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | 0 | |
| name | varchar(100) | NO | | NULL | |
| skills | varchar(255) | NO | | NULL | |
| price | int(11) | NO | | NULL | |
| introduction | varchar(255) | NO | | NULL | |
+--------------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> show create table tanks;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tanks | CREATE TABLE `tanks` (
`id` int(11) NOT NULL DEFAULT '0',
`name` varchar(100) NOT NULL,
`skills` varchar(255) NOT NULL,
`price` int(11) NOT NULL,
`introduction` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
3.2 添加指定字段的位置
mysql> alter table tanks add summoner_skills ENUM('flush','fire') not null default 'flush' after skills;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc tanks;
+-----------------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+----------------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | 0 | |
| name | varchar(100) | NO | | NULL | |
| skills | varchar(255) | NO | | NULL | |
| summoner_skills | enum('flush','fire') | NO | | flush | |
| price | int(11) | NO | | NULL | |
| introduction | varchar(255) | NO | | NULL | |
+-----------------+----------------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
mysql>
3.3 一次性添加多个字段
alter table tanks add camp varchar(50) after price , add pic varchar(255) after camp ;
3.4 删除table的字段
alter 结合drop删除字段
#语法
alter table 表名 drop 字段;
mysql> alter table tanks drop summoner_skills;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
3.5 修改表字段的类型
修改table字段的数据类型
#语法
alter table 表名 change 旧字段名 新字段名 新数据类型;
mysql> alter table tanks change pic pic_url char(200);
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> desc tanks;
+--------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | 0 | |
| name | varchar(100) | NO | | NULL | |
| skills | varchar(255) | NO | | NULL | |
| price | int(11) | NO | | NULL | |
| camp | varchar(50) | YES | | NULL | |
| pic_url | char(200) | YES | | NULL | |
| introduction | varchar(255) | NO | | NULL | |
+--------------+--------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
mysql>
五、MySQL数据表的索引创建
1.创建
mysql的索引功能,是提高mysql查询速度的一大重点,后面我们重点学习原理,这里先了解用法 索引功能,就像一本书的目录,知道目录,可以非常快速找到我们想要的内容在哪 通过给字段添加索引,能够加快该列字段的查询速度。
# 查看数据表的索引信息
mysql> show index from tanks\G
*************************** 1. row ***************************
Table: tanks
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 4
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
1 row in set (0.00 sec)
mysql>
2.添加索引
给name字段,添加索引
# 语法
alter table tanks add index 索引的名(哪—个字段);
mysql> alter table tanks add index name_index(name);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show index from tanks\G
*************************** 1. row ***************************
Table: tanks
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 4
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 2. row ***************************
Table: tanks
Non_unique: 1
Key_name: name_index
Seq_in_index: 1
Column_name: name
Collation: A
Cardinality: 4
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
2 rows in set (0.00 sec)
mysql>
3.删除索引
mysql> alter table tanks drop index name_index;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show index from tanks\G
*************************** 1. row ***************************
Table: tanks
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 4
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
1 row in set (0.00 sec)
mysql>
六、数据表的删除
# 删除数据库语法
drop database 数据库名;
# 删除数据表语法
drop table 表名;
delete from 删除数据表的内容
delete from 可以结合where条件语句,进行数据的指定删除,判断删除
delete是—行—行的删除数据,对于大容量的数据表,删除效率很低
delete对于有自增id的列,数据删除后,会保留其id的位置
delete对于有自增id的列,数据删除后,会保留其id的序号
七、tuncate删除语法
truncate语句直接清空表数据,重新建立—个表 不会出现自增id的问题,重新计算id位置
mysql> select * from tanks;
+----+--------------+----------------------------------------+--------+------+---------+--------------+
| id | name | skills | price | camp | pic_url | introduction |
+----+--------------+----------------------------------------+--------+------+---------+--------------+
| 1 | 程咬金 | 大招回血,血量越低,伤害越高 | 8888 | NULL | NULL | |
| 2 | 大鱼庄周 | 免疫所有队友的负面控制 | 2888 | NULL | NULL | |
| 3 | 吕布 | 真实伤害爆棚 | 18888 | NULL | NULL | |
| 4 | 关羽 | 跑起来贼快 | 188888 | NULL | NULL | |
+----+--------------+----------------------------------------+--------+------+---------+--------------+
4 rows in set (0.00 sec)
mysql> truncate table tanks;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from tanks;
Empty set (0.00 sec)
mysql>
八、表数据查询
通过*查询
mysql> select * from tanks;
+----+--------+--------------------------------+---------------
--+-------+------+---------+--------------+
| id | name | skills |
summoner_skills | price | camp | pic_url | introduction |
+----+--------+--------------------------------+---------------
--+-------+------+---------+--------------+
| 1 | 鲁班 | 二技能全图,被动扫射 | flush
| 5888 | NULL | NULL | |
| 2 | 甄姬 | 技能会冰冻敌人 | flush
| 2888 | NULL | NULL | |
+----+--------+--------------------------------+---------------
--+-------+------+---------+--------------+
2 rows in set (0.00 sec)
指定字段查询
只想查看鲁班的技能和价格
mysql> select skills,price from tanks where name='鲁班 ';
+--------------------------------+-------+
| skills | price |
+--------------------------------+-------+
| 二技能全图,被动扫射 | 5888 |
+--------------------------------+-------+
1 row in set (0.00 sec)
更多推荐
所有评论(0)