目录
一、win10 与ubuntu安装mysql
一、win10安装mysql
下载地址:mysql官网:https://dev.mysql.com/downloads/installer/
网盘链接:链接:https://caiyun.139.com/m/i?065Ctt7o1m6UX
提取码:iLGw
1.安装步骤
2.配置mysql环境变量
找到环境变量配置页面,例如:C:\Program Files\MySQL\MySQL Server 5.7\bin,将mysql的安装路径下的bin目录地址复制到环境变量中的path中
3.连接mysql
mysql -u root -p
二、ubuntu安装mysql
1、安装mysql
打开命令窗口 sudo apt Install mysql-server安装mysql
2.进行配置
sudo mysql_secure_installation
开启配置
密码 级别
删除匿名用户
禁用root远程登录
删除测试数据库
刷新权限
3.登录mysql
使用系统的root用户直接登录
mysql
创建用户
create user 'temp'@'%' identified by '123456';
二、Navicat客户端连接
三、DDL
在 MySQL 数据库管理中,DDL(Data Definition Language,数据定义语言)是一组用于定义和管理数据库结构的语句。它就像是数据库的建筑师,负责创建、修改和删除数据库、表、视图、索引等数据库对象。本文将带你深入了解 MySQL DDL 的常见操作,让你对数据库结构的构建有更清晰的认识。
一、创建数据库
创建数据库是使用 MySQL 的第一步,使用CREATE DATABASE语句可以轻松完成。
CREATE DATABASE your_database_name;
其中,your_database_name是你想要创建的数据库名称。例如:
CREATE DATABASE mytest;
二、创建表
表是数据库中存储数据的基本单元,使用CREATE TABLE语句来创建。
CREATE TABLE table_name (
column1 datatype constraint,
column2 datatype constraint,
...
);
column1、column2等是列名,datatype是数据类型(如INT、VARCHAR、DATE等),constraint是约束条件(如NOT NULL、UNIQUE、PRIMARY KEY等)。
示例:创建一个名为students的表,包含id、name、age字段。
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT
);
三、修改表结构
当需要对已存在的表进行结构调整时,使用ALTER TABLE语句。
- 添加列
ALTER TABLE table_name ADD column_name datatype constraint;
例如,在students表中添加email列。
ALTER TABLE students ADD email VARCHAR(100);
- 修改列
ALTER TABLE table_name MODIFY column_name new_datatype;
假设要将students表中的age字段数据类型改为BIGINT。
ALTER TABLE students MODIFY age BIGINT;
- 删除列
ALTER TABLE table_name DROP COLUMN column_name;
如删除students表中的email列。
ALTER TABLE students DROP COLUMN email;
四、删除数据库和表
- 删除数据库
DROP DATABASE database_name;
删除mytest数据库。
DROP DATABASE mytest;
- 删除表
DROP TABLE table_name;
删除students表。
DROP TABLE students;
五、索引管理
索引可以提高数据查询的效率,使用CREATE INDEX和DROP INDEX语句来管理索引。
- 创建索引
CREATE INDEX index_name ON table_name (column_name);
在students表的name列上创建索引。
CREATE INDEX idx_name ON students (name);
- 删除索引
DROP INDEX index_name ON table_name;
删除students表上的idx_name索引。
DROP INDEX idx_name ON students;
四、DML
在 MySQL 数据库管理体系中,除了 DDL 用于定义数据库结构外,DML(Data Manipulation Language,数据操作语言)则承担着对数据库中数据进行操作的重任。它就像是数据库的 “搬运工” 和 “修理工”,负责数据的插入、更新、查询和删除等关键操作,是开发者与数据库中数据交互的主要工具。接下来,让我们深入探索 MySQL DML 的奥秘。
一、插入数据(INSERT)
向表中插入新的数据记录是数据库操作中常见的任务,使用INSERT INTO语句来实现。
- 插入完整记录
INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...);
例如,向之前创建的students表中插入一条学生记录:
INSERT INTO students (id, name, age) VALUES (1, '张三', 20);
- 插入部分字段数据
如果只想插入部分字段的数据,可以省略不需要插入数据的字段。
INSERT INTO students (name, age) VALUES ('李四', 22);
此时,id字段因为设置了AUTO_INCREMENT,会自动生成唯一值。
二、查询数据(SELECT)
查询数据是数据库使用中最频繁的操作之一,SELECT语句是实现数据查询的关键。
SELECT column1, column2,... FROM table_name WHERE condition;
- column1, column2,...指定要查询的列,*表示查询所有列。
- table_name是要查询的表名。
- condition是查询条件,用于筛选符合条件的数据。
示例:查询students表中所有学生的信息。
SELECT * FROM students;
查询students表中年龄大于 20 岁的学生姓名和年龄。
SELECT name, age FROM students WHERE age > 20;
还可以使用ORDER BY对查询结果进行排序,LIMIT限制返回的记录数。
SELECT * FROM students ORDER BY age DESC LIMIT 5;
上述语句将按照年龄降序排列,返回前 5 条学生记录。
三、更新数据(UPDATE)
当需要修改表中已存在的数据时,使用UPDATE语句。
UPDATE table_name SET column1 = value1, column2 = value2,... WHERE condition;
例如,将students表中id为 1 的学生年龄更新为 21 岁。
UPDATE students SET age = 21 WHERE id = 1;
若不指定WHERE条件,将会更新表中的所有记录,所以使用时务必谨慎。
四、删除数据(DELETE)
删除表中数据记录使用DELETE FROM语句。
DELETE FROM table_name WHERE condition;
删除students表中id为 2 的学生记录。
DELETE FROM students WHERE id = 2;
同样,若不指定WHERE条件,会删除表中的所有数据,操作前要仔细确认。
五、DCL
一、权限管理
在多用户环境下,确保不同用户只能执行其被授权的操作至关重要,这便是 MySQL 权限管理的职责所在,主要通过GRANT和REVOKE语句来实现。
(一)授予权限(GRANT)
GRANT语句用于给用户授予特定的权限。语法如下:
GRANT privileges ON database_name.table_name TO 'username'@'host' [IDENTIFIED BY 'password'];
- privileges:指定授予的权限,如SELECT(查询)、INSERT(插入)、UPDATE(更新)、DELETE(删除)、ALL PRIVILEGES(所有权限)等。
- database_name.table_name:指定权限作用的数据库和表,*.*表示所有数据库和所有表。
- 'username'@'host':指定用户名和允许访问的主机,'localhost'表示本地主机,'%'表示任何主机。
- IDENTIFIED BY 'password':为用户设置密码(可选)。
例如,创建一个名为test_user的用户,允许其从本地主机访问mytest数据库的所有表,并授予查询和插入权限,同时设置密码为123456:
GRANT SELECT, INSERT ON mytest.* TO 'test_user'@'localhost' IDENTIFIED BY '123456';
(二)撤销权限(REVOKE)
当需要收回用户已有的权限时,使用REVOKE语句,语法如下:
REVOKE privileges ON database_name.table_name FROM 'username'@'host';
比如,撤销test_user对mytest数据库中所有表的插入权限:
REVOKE INSERT ON mytest.* FROM 'test_user'@'localhost';
六、外键
在 MySQL 数据库设计中,外键是一个非常重要的概念,它如同桥梁一般,将不同的数据库表紧密地联系在一起,构建起数据之间的关联关系,确保数据的一致性和完整性。接下来,让我们详细了解 MySQL 外键的相关知识。
一、外键的概念与作用
外键是一个表中的字段,它指向另一个表的主键。通过外键,我们可以建立起两个表之间的父子关系,其中包含外键的表称为子表,外键所指向主键的表称为父表。这种关系能够保证数据的参照完整性,即子表中的外键值必须在父表的主键值中存在,或者为 NULL(如果外键允许为 NULL)。例如,在一个学校管理系统中,有students表和classes表,students表中的class_id字段可以作为外键,指向classes表中的id字段(主键),以此建立学生与班级的关联,确保每个学生所属的班级在classes表中真实存在。
二、创建外键
在 MySQL 中,创建外键有两种方式,分别是在创建表时直接定义外键约束,以及在已存在的表上添加外键约束。
(一)创建表时定义外键
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
...,
FOREIGN KEY (foreign_key_column) REFERENCES parent_table (primary_key_column)
);
假设我们创建students表和classes表,并在students表中定义外键:
CREATE TABLE classes (
id INT PRIMARY KEY AUTO_INCREMENT,
class_name VARCHAR(50)
);
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
class_id INT,
FOREIGN KEY (class_id) REFERENCES classes (id)
);
在上述代码中,students表中的class_id字段作为外键,引用了classes表中的id字段。
(二)为已存在的表添加外键
ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (foreign_key_column) REFERENCES parent_table (primary_key_column);
例如,为已存在的students表添加外键约束:
ALTER TABLE students ADD CONSTRAINT fk_class_id FOREIGN KEY (class_id) REFERENCES classes (id);
这里的constraint_name(即fk_class_id)是外键约束的名称,可自定义。
三、删除外键
当不再需要外键约束时,可以使用ALTER TABLE语句删除外键。
ALTER TABLE table_name DROP FOREIGN KEY constraint_name;
比如,删除students表中的fk_class_id外键约束:
ALTER TABLE students DROP FOREIGN KEY fk_class_id;
四、外键使用的注意事项
- 数据一致性:在进行数据操作时,尤其是插入、更新和删除操作,要确保不会破坏外键约束,否则操作会失败。例如,不能在students表中插入一个class_id在classes表中不存在的学生记录。
- 级联操作:在一些复杂的业务场景中,可能需要使用级联操作来简化数据管理。例如,当删除classes表中的一个班级记录时,希望同时删除students表中所有属于该班级的学生记录,可以在创建外键时使用ON DELETE CASCADE和ON UPDATE CASCADE选项。
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
class_id INT,
FOREIGN KEY (class_id) REFERENCES classes (id) ON DELETE CASCADE ON UPDATE CASCADE
);
七、查询语句
一、基础查询
最基本的查询语句是SELECT语句,用于从表中检索数据。
SELECT column1, column2,... FROM table_name;
例如,从students表中查询所有学生的姓名和年龄:
SELECT name, age FROM students;
如果要查询表中的所有列,可以使用通配符*:
SELECT * FROM students;
二、条件查询
使用WHERE子句可以添加查询条件,筛选出符合特定条件的数据。
SELECT column1, column2,... FROM table_name WHERE condition;
条件可以是比较运算符(如=、>、<、!=等)、逻辑运算符(如AND、OR、NOT)等。例如,查询students表中年龄大于 20 岁的学生姓名和年龄:
SELECT name, age FROM students WHERE age > 20;
查询年龄在 18 到 22 岁之间的学生:
SELECT * FROM students WHERE age >= 18 AND age <= 22;
三、排序查询
使用ORDER BY子句可以对查询结果进行排序,默认是升序(ASC),也可以指定降序(DESC)。
SELECT column1, column2,... FROM table_name ORDER BY column_name [ASC|DESC];
例如,按照年龄降序查询students表中的学生信息:
SELECT * FROM students ORDER BY age DESC;
如果要按照多个列排序,可以在ORDER BY后依次列出列名:
SELECT * FROM students ORDER BY age DESC, name ASC;
四、限制查询结果数量
使用LIMIT子句可以限制返回的结果数量,常用于分页查询。
SELECT column1, column2,... FROM table_name LIMIT [offset,] row_count;
offset表示偏移量,即从第几行开始返回,row_count表示返回的行数。例如,返回students表中的前 5 条记录:
SELECT * FROM students LIMIT 5;
返回第 6 到第 10 条记录(偏移量为 5,返回 5 条记录):
SELECT * FROM students LIMIT 5, 5;
五、多表查询
在实际应用中,往往需要从多个表中获取数据,这就涉及到多表查询。常见的多表查询方式有内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL OUTER JOIN,MySQL 中需通过LEFT JOIN和RIGHT JOIN联合实现)。
(一)内连接
内连接只返回两个表中连接条件匹配的行。
SELECT column1, column2,... FROM table1 INNER JOIN table2 ON table1.column = table2.column;
假设我们有students表和classes表,通过class_id关联,查询每个学生所属的班级名称:
SELECT students.name, classes.class_name
FROM students
INNER JOIN classes ON students.class_id = classes.id;
(二)左连接
左连接返回左表(LEFT JOIN左边的表)中的所有行,以及右表中连接条件匹配的行。如果右表中没有匹配的行,结果集中对应列的值为NULL。
SELECT column1, column2,... FROM table1 LEFT JOIN table2 ON table1.column = table2.column;
查询所有学生及其所属班级名称(包括没有班级的学生):
SELECT students.name, classes.class_name
FROM students
LEFT JOIN classes ON students.class_id = classes.id;
(三)右连接
右连接与左连接相反,返回右表中的所有行,以及左表中连接条件匹配的行。
SELECT column1, column2,... FROM table1 RIGHT JOIN table2 ON table1.column = table2.column;
(四)全连接(MySQL 中模拟实现)
全连接返回两个表中的所有行,当某行在另一表中没有匹配行时,对应列的值为NULL。在 MySQL 中,可以通过LEFT JOIN和RIGHT JOIN联合实现。
SELECT column1, column2,... FROM table1 LEFT JOIN table2 ON table1.column = table2.column
UNION
SELECT column1, column2,... FROM table1 RIGHT JOIN table2 ON table1.column = table2.column;
六、子查询
子查询是指在一个查询语句中嵌套另一个查询语句。子查询可以用于WHERE子句、FROM子句等。例如,查询年龄大于平均年龄的学生:
SELECT * FROM students
WHERE age > (SELECT AVG(age) FROM students);
这里,子查询(SELECT AVG(age) FROM students)先计算出平均年龄,然后主查询根据这个结果筛选出年龄大于平均年龄的学生。
八、数据类型
在 MySQL 数据库中,数据类型是一个至关重要的概念。它决定了数据如何存储在数据库中,以及能够对数据执行哪些操作。合理选择数据类型,不仅可以节省存储空间,还能提高数据处理的效率。接下来,让我们深入了解 MySQL 中的各种数据类型。
一、数值类型
MySQL 提供了丰富的数值类型,用于存储不同范围和精度的数值数据。
- 整数类型
-
- TINYINT:占用 1 个字节,范围是 - 128 到 127(无符号时为 0 到 255),适用于存储较小的整数,如状态码(0 表示禁用,1 表示启用)。
-
- SMALLINT:占用 2 个字节,范围是 - 32768 到 32767(无符号时为 0 到 65535),可用于存储一些相对较小的计数,如商品的库存数量。
-
- MEDIUMINT:占用 3 个字节,范围更大,适用于需要存储中等大小整数的场景。
-
- INT:占用 4 个字节,是最常用的整数类型,范围为 - 2147483648 到 2147483647(无符号时为 0 到 4294967295),适用于大多数整数数据的存储,如用户 ID、订单编号等。
-
- BIGINT:占用 8 个字节,范围极大,用于存储非常大的整数,如大型系统中的时间戳(以毫秒为单位)。
- 浮点数类型
-
- FLOAT:单精度浮点数,占用 4 个字节,可表示大约 7 位有效数字。适用于对精度要求不高的科学计算或统计数据,如商品的价格(保留到小数点后两位)。
-
- DOUBLE:双精度浮点数,占用 8 个字节,可表示大约 15 位有效数字,精度更高,适用于对精度要求较高的场景,如金融计算。
- 定点数类型
-
- DECIMAL:用于存储精确的小数,其精度和标度可以自定义。例如DECIMAL(10, 2)表示总共有 10 位数字,其中小数部分占 2 位。在涉及货币计算等对精度要求极高的场景中,DECIMAL类型是首选。
二、日期和时间类型
MySQL 提供了多种日期和时间类型,方便处理时间相关的数据。
- DATE:用于存储日期,格式为YYYY-MM-DD,如2025-02-25,占用 3 个字节。常用于记录事件发生的日期,如订单日期、注册日期等。
- TIME:用于存储时间,格式为HH:MM:SS,占用 3 个字节。可以表示一天中的时间,如营业时间、会议时间等。
- DATETIME:用于存储日期和时间,格式为YYYY-MM-DD HH:MM:SS,占用 8 个字节。能完整记录一个事件发生的具体时间点,在很多业务场景中广泛使用,如记录用户登录时间。
- TIMESTAMP:也用于存储日期和时间,格式与DATETIME相同,但占用 4 个字节。它的取值范围较小,从1970-01-01 00:00:01到2038-01-19 03:14:07。TIMESTAMP会自动根据服务器时区进行转换,并且在插入或更新数据时,如果未指定值,会自动设置为当前时间,常用于记录数据的创建时间或最后更新时间。
- YEAR:用于存储年份,占用 1 个字节,格式为YYYY或YY(YY格式时,00 - 69 表示 2000 - 2069,70 - 99 表示 1970 - 1999)。适用于仅关注年份的场景,如电影上映年份、产品发布年份等。
三、字符串类型
字符串类型用于存储文本数据,MySQL 提供了多种字符串类型以满足不同的需求。
- CHAR:固定长度字符串,最大长度为 255 个字符。在创建表时指定长度,如CHAR(10)。如果存储的字符串长度小于指定长度,会用空格填充;如果超过指定长度,会截断超出的部分。CHAR类型适用于存储长度固定且较短的字符串,如身份证号码、邮政编码等。
- VARCHAR:可变长度字符串,最大长度为 65535 个字节(实际长度受行的最大长度和字符集的限制)。它只存储实际字符的长度,不会填充空格,相比CHAR类型更节省空间。常用于存储长度不固定的文本,如用户姓名、地址等。
- TEXT:用于存储大文本数据,分为TINYTEXT(最大长度为 255 个字符)、TEXT(最大长度为 65535 个字符)、MEDIUMTEXT(最大长度为 16777215 个字符)和LONGTEXT(最大长度为 4294967295 个字符)。适用于存储文章内容、评论等大量文本数据。
- ENUM:枚举类型,允许在创建表时指定一个可能值的列表。例如ENUM('male', 'female'),只能存储列表中的值,常用于存储固定选项的数据,如性别、订单状态等。
- SET:集合类型,与ENUM类似,但可以存储多个值,每个值都是集合中的一个元素。例如SET('red', 'green', 'blue'),可用于存储具有多个属性的数据,如商品的颜色选项。
四、二进制类型
二进制类型用于存储二进制数据,如图片、音频、视频等文件的二进制内容。
- BINARY 和 VARBINARY:类似于CHAR和VARCHAR,分别是固定长度和可变长度的二进制字符串类型。BINARY的最大长度为 255 字节,VARBINARY的最大长度为 65535 字节。
- BLOB:二进制大对象,分为TINYBLOB(最大长度为 255 字节)、BLOB(最大长度为 65535 字节)、MEDIUMBLOB(最大长度为 16777215 字节)和LONGBLOB(最大长度为 4294967295 字节)。用于存储较大的二进制数据,如图片、文件等。不过,直接在数据库中存储二进制文件可能会影响数据库性能和可维护性,通常会将文件存储在文件系统中,而在数据库中存储文件路径。
九、扩展知识
一、视图
视图(View)可以看作是一个虚拟表,它并不实际存储数据,而是基于 SQL 查询结果动态生成的。视图就像是一个窗口,通过这个窗口可以查看数据库中真实表的数据子集或经过特定处理的数据。
(一)创建视图
使用CREATE VIEW语句来创建视图,语法如下:
CREATE VIEW view_name AS
SELECT column1, column2,...
FROM table_name
WHERE condition;
例如,创建一个名为students_view的视图,用于查看students表中年龄大于 20 岁的学生信息:
CREATE VIEW students_view AS
SELECT id, name, age
FROM students
WHERE age > 20;
(二)使用视图
视图创建后,使用方式与普通表类似,可以进行查询操作:
SELECT * FROM students_view;
(三)视图的作用
- 数据安全性:通过视图可以限制用户对某些敏感数据的访问,只暴露用户需要的数据字段,提高数据的安全性。
- 简化复杂查询:将复杂的查询逻辑封装在视图中,用户只需查询视图,而无需编写复杂的 SQL 语句,提高了开发效率。
- 数据独立性:视图可以隔离底层表结构的变化,即使底层表结构发生改变,只要视图的查询逻辑不变,对使用视图的用户来说是透明的。
二、函数与存储过程
(一)函数
MySQL 提供了丰富的内置函数,如数值函数、字符串函数、日期和时间函数等,用于对数据进行各种处理。同时,用户还可以自定义函数(UDF)来满足特定的业务需求。
自定义函数的语法如下:
DELIMITER //
CREATE FUNCTION function_name (parameters)
RETURNS return_type
BEGIN
-- 函数体
RETURN result;
END //
DELIMITER ;
例如,创建一个计算两个数之和的函数:
DELIMITER //
CREATE FUNCTION add_numbers(a INT, b INT)
RETURNS INT
BEGIN
DECLARE sum INT;
SET sum = a + b;
RETURN sum;
END //
DELIMITER ;
调用函数:
SELECT add_numbers(3, 5);
(二)存储过程
存储过程(Stored Procedure)是一组为了完成特定功能的 SQL 语句集合,它可以接收参数、执行复杂的业务逻辑,并返回结果。与函数不同,存储过程主要用于执行一系列操作,而不是返回一个单一的值。
创建存储过程的语法如下:
DELIMITER //
CREATE PROCEDURE procedure_name (parameters)
BEGIN
-- 存储过程体
END //
DELIMITER ;
例如,创建一个存储过程,用于向students表中插入一条学生记录:
DELIMITER //
CREATE PROCEDURE insert_student(IN p_name VARCHAR(50), IN p_age INT)
BEGIN
INSERT INTO students (name, age) VALUES (p_name, p_age);
END //
DELIMITER ;
调用存储过程:
CALL insert_student('王五', 23);
(三)函数与存储过程的优势
- 提高代码复用性:将常用的业务逻辑封装成函数或存储过程,可以在多个地方复用,减少代码冗余。
- 提升性能:减少了客户端与数据库之间的交互次数,因为复杂的操作可以在数据库服务器端一次性完成。
- 增强安全性:可以通过权限控制对函数和存储过程的访问,确保只有授权用户才能执行特定的操作。
三、索引
索引是一种特殊的数据结构,它可以提高数据库中数据的查询效率。就像一本书的目录,通过索引可以快速定位到需要的数据,而不必逐行扫描整个表。
(一)创建索引
MySQL 支持多种类型的索引,如普通索引、唯一索引、主键索引、全文索引等。
- 普通索引:使用CREATE INDEX语句创建,用于加快数据的查询速度。
CREATE INDEX index_name ON table_name (column_name);
- 唯一索引:确保索引列中的值唯一,使用CREATE UNIQUE INDEX语句创建。
CREATE UNIQUE INDEX index_name ON table_name (column_name);
- 主键索引:是一种特殊的唯一索引,每个表只能有一个主键索引,在创建表时可以同时定义主键。
CREATE TABLE table_name (
id INT PRIMARY KEY,
column1 datatype,
...
);
- 全文索引:用于全文搜索,适用于文本类型的字段,使用CREATE FULLTEXT INDEX语句创建。
CREATE FULLTEXT INDEX index_name ON table_name (column_name);
(二)索引的使用注意事项
- 索引并非越多越好:过多的索引会占用额外的存储空间,并且在插入、更新和删除数据时,需要花费更多的时间来维护索引,从而降低数据库的性能。
- 选择合适的索引列:应该选择经常用于查询条件的列创建索引,这样才能充分发挥索引的作用。
- 避免索引失效:一些操作,如在索引列上使用函数、进行数据类型转换等,可能会导致索引失效,从而降低查询效率。
四、存储引擎
存储引擎是 MySQL 数据库管理系统中负责数据存储和检索的组件,不同的存储引擎具有不同的特点和适用场景。
(一)常见的存储引擎
- InnoDB:是 MySQL 的默认存储引擎,支持事务、行级锁和外键约束。它具有较高的数据安全性和完整性,适用于大多数 OLTP(联机事务处理)应用场景。
- MyISAM:不支持事务和行级锁,但是具有较高的查询性能,适用于读操作频繁的应用场景,如数据仓库。
- Memory:将数据存储在内存中,读写速度非常快,但数据易丢失,适用于临时数据存储和缓存场景。
(二)选择存储引擎
在选择存储引擎时,需要根据应用的具体需求来决定,考虑因素包括数据的读写比例、事务支持、数据一致性要求、存储容量等。
五、事务
事务是一组作为单个逻辑工作单元执行的数据库操作,要么全部执行成功,要么全部失败回滚,以此保证数据的一致性和完整性。
(一)事务的操作
- 开始事务:使用START TRANSACTION语句开始一个事务。
START TRANSACTION;
- 提交事务:当事务中的所有操作都成功完成后,使用COMMIT语句将事务中的所有修改永久保存到数据库中。
COMMIT;
- 回滚事务:如果在事务执行过程中出现错误或需要放弃事务中的所有修改,可以使用ROLLBACK语句将数据库状态回滚到事务开始之前。
ROLLBACK;
(二)事务的特性(ACID)
- 原子性(Atomicity):事务中的所有操作要么全部执行,要么全部不执行,就像一个原子一样不可分割。
- 一致性(Consistency):事务执行前后,数据库的完整性约束不会被破坏,数据始终保持一致的状态。
- 隔离性(Isolation):多个事务并发执行时,相互之间不会产生干扰,每个事务都感觉不到其他事务的存在。
- 持久性(Durability):一旦事务被提交,其对数据库的修改将永久保存,即使系统发生故障也不会丢失。
十、pymysql的使用
一、安装 pymysql
在使用pymysql之前,需要先确保其已经安装在你的 Python 环境中。可以使用pip命令进行安装:
pip install pymysql
二、连接 MySQL 数据库
使用pymysql连接 MySQL 数据库的步骤如下:
import pymysql
# 建立数据库连接
conn = pymysql.connect(
host='localhost', # 数据库主机地址
user='root', # 数据库用户名
password='password', # 数据库密码
database='mydb', # 数据库名称
port=3306 # 数据库端口,默认为3306
)
在上述代码中,通过pymysql.connect()方法传入数据库的相关信息,成功建立连接后返回一个连接对象conn。后续对数据库的操作都将基于这个连接对象进行。
三、创建游标
建立连接后,需要创建一个游标对象来执行 SQL 语句。游标是用于执行 SQL 语句并获取结果的工具。
# 创建游标
cursor = conn.cursor()
四、执行 SQL 查询语句
(一)查询数据
# 执行SQL查询语句
sql = "SELECT * FROM students"
cursor.execute(sql)
# 获取所有查询结果
results = cursor.fetchall()
for row in results:
print(row)
# 关闭游标和连接
cursor.close()
conn.close()
在上述代码中,首先定义了一个 SQL 查询语句,然后使用游标对象的execute()方法执行该语句。执行成功后,通过fetchall()方法获取所有查询结果,并遍历打印。最后,关闭游标和数据库连接,释放资源。
(二)带参数的查询
有时候,我们需要根据不同的条件进行查询,这时候可以使用带参数的查询方式。
# 带参数的查询
sql = "SELECT * FROM students WHERE age > %s"
age = 20
cursor.execute(sql, age)
results = cursor.fetchall()
for row in results:
print(row)
cursor.close()
conn.close()
在这个例子中,%s是占位符,age变量的值会被自动替换到占位符的位置,避免了 SQL 注入的风险。
五、执行 SQL 插入语句
# 插入数据
sql = "INSERT INTO students (name, age) VALUES (%s, %s)"
data = ('张三', 22)
cursor.execute(sql, data)
# 提交事务
conn.commit()
cursor.close()
conn.close()
在插入数据时,同样使用execute()方法执行 SQL 插入语句,并传入相应的数据。由于插入操作会修改数据库,所以需要调用连接对象的commit()方法提交事务,确保数据被真正插入到数据库中。
六、执行 SQL 更新语句
# 更新数据
sql = "UPDATE students SET age = %s WHERE name = %s"
data = (23, '张三')
cursor.execute(sql, data)
conn.commit()
cursor.close()
conn.close()
更新语句的执行方式与插入类似,通过execute()方法执行 SQL 更新语句,并传入更新后的数据和条件。执行成功后,同样需要提交事务。
七、执行 SQL 删除语句
# 删除数据
sql = "DELETE FROM students WHERE name = %s"
name = '张三'
cursor.execute(sql, name)
conn.commit()
cursor.close()
conn.close()
删除数据时,使用execute()方法执行 SQL 删除语句,并传入删除条件。执行完成后提交事务,完成数据删除操作。