一、第一天:MySQL 数据库基础介绍
MySQL 数据库是一种广泛应用的关系型数据库管理系统。
基本概念:
它由数据、表、数据库、数据库管理系统和数据库系统等部分组成。数据是描述事物的符号记录,表是不同记录组织存储具体数据的结构,数据库是表的集合,数据库管理系统用于有效组织、管理和存取数据,而数据库系统则是由硬件、操作系统、数据库、DBMS、应用软件和用户组成的人机系统。
特点:
- 使用 C 和 C++编写,源代码可移植性强。
- 支持多种操作系统,如 Windows、Linux 等。
- 为多种编程语言提供 API,方便开发。
- 支持多线程,能充分利用 CPU 资源。
- 具有优化的 SQL 查询算法,查询速度快。
- 提供多种管理和优化工具。
- 开源免费,成本低。
应用场景:
广泛应用于 Web 网站系统,如常见的电商、社交平台等。在企业应用中,如 ERP、CRM 等系统也常使用 MySQL 存储和管理数据。对于移动应用,能存储用户和消息等信息。在大数据、云计算、游戏和物联网等领域也发挥着重要作用。
安装与配置:
首先,前往 MySQL 官网下载适合的安装包。然后,以管理员身份打开命令行,切换到安装目录的 bin 目录下。执行安装服务、初始化等命令,设置好登录密码,并开启服务。为了方便使用,可以设置全局变量。
登录数据库:
可以通过多种方式登录 MySQL 数据库,如使用命令行工具,输入类似 mysql -h 主机地址 -P 端口号 -u 用户名 -p 的命令,并输入正确的密码即可登录。还可以使用 MySQL 自带的客户端或第三方工具进行登录。
二、第二天:数据库与表的操作
(一)创建数据库
创建数据库是使用 MySQL 的基础操作之一。在 MySQL 中,可以使用 CREATE DATABASE 语句来创建数据库。例如,要创建一个名为 mydatabase 的数据库,可以使用以下语句:
CREATE DATABASE mydatabase;
如果希望在数据库已存在的情况下不报错,可以使用 IF NOT EXISTS 选项:
CREATE DATABASE IF NOT EXISTS mydatabase;
(二)删除数据库
当数据库不再需要时,可以使用 DROP DATABASE 语句将其删除。需要注意的是,删除数据库会永久删除其中的所有表和数据。例如,要删除名为 mydatabase 的数据库,可以使用以下语句:
DROP DATABASE mydatabase;
为了防止删除不存在的数据库时出错,可以添加 IF EXISTS 选项:
DROP DATABASE IF EXISTS mydatabase;
(三)创建数据表
创建数据表需要指定表名、列名、数据类型和约束等信息。以下是一个创建名为 users 数据表的示例:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
birthdate DATE
);
在上述示例中,id 列是自增的主键,username 和 email 列不允许为空。
(四)修改数据表
修改数据表可以包括修改表名、修改列名、修改列的数据类型、添加或删除列等操作。
- 修改表名:使用 ALTER TABLE 语句,例如将表 users 改名为 new_users :
ALTER TABLE users RENAME TO new_users;
- 修改列名:
ALTER TABLE new_users CHANGE username new_username VARCHAR(100);
- 修改列的数据类型:
ALTER TABLE new_users MODIFY email VARCHAR(200);
- 添加列:
ALTER TABLE new_users ADD age INT;
- 删除列:
ALTER TABLE new_users DROP age;
(五)删除数据表
使用 DROP TABLE 语句可以删除数据表,例如删除 new_users 表:
DROP TABLE new_users;
(六)表的结构设计与字段类型选择
在设计表结构时,需要根据实际业务需求合理选择字段类型。例如,如果存储整数且范围较小,可以选择 TINYINT 或 SMALLINT ;存储字符串且长度固定,选择 CHAR ;长度不固定则选择 VARCHAR 。对于日期类型,根据精度需求选择 DATE 或 DATETIME 等。同时,要尽量避免使用过大或过小的数据类型,以节省存储空间和提高性能。
通过实际操作这些创建、删除、修改数据表的语句,能够更深入地理解和掌握数据库与表的操作。
三、第三天:数据的插入、修改与删除
(一)数据插入
在 MySQL 中,向表中插入数据有多种方式。
- 单条数据插入
-
- 可以明确指定列名和对应的值进行插入,例如:INSERT INTO users (id, username, email) VALUES (1, 'zhangsan', '[email protected]');
-
- 若不指定列名,则需要按照表中列的顺序提供所有列的值,如:INSERT INTO users VALUES (2, 'lisi', '[email protected]');
- 多条数据插入
-
- 可以一次性插入多条数据,提高效率,例如:INSERT INTO users (id, username, email) VALUES (3, 'wangwu', '[email protected]'), (4, 'zhaoliu', '[email protected]');
(二)数据修改
使用 UPDATE 语句可以修改表中的数据。
- 例如,要将 users 表中 id 为 1 的用户的 email 修改为 [email protected],可以使用以下语句:UPDATE users SET email = '[email protected]' WHERE id = 1;
- 注意,若不添加 WHERE 条件,会修改表中所有行对应列的数据。
(三)数据删除
通过 DELETE FROM 语句来删除表中的数据。
- 比如,删除 users 表中 id 为 2 的用户数据:DELETE FROM users WHERE id = 2;
- 若不指定 WHERE 条件,会删除表中的所有数据,使用时需格外谨慎。
(四)注意事项和操作技巧
- 在插入数据时,要确保值的类型与列的数据类型匹配,否则可能会导致插入失败。
- 修改和删除数据时,务必先确认 WHERE 条件的准确性,避免误操作导致不必要的数据更改或删除。
- 对于大规模的数据操作,建议先在测试环境中进行测试,确保操作的正确性和性能。
- 定期备份重要的数据,以防意外情况导致数据丢失。
四、第四天:数据查询基础
(一)简单查询
简单查询用于获取表中的部分或全部数据。例如,要获取表 users 中的所有列数据,可以使用以下语句:
SELECT * FROM users;
如果只想获取特定的列,如 id 和 username ,则使用:
SELECT id, username FROM users;
(二)条件查询
条件查询通过指定条件来筛选出符合要求的数据。常见的条件运算符有 =, <, >, <=, >=, != 等。例如,获取年龄大于 25 岁的用户信息:
SELECT * FROM users WHERE age > 25;
还可以使用逻辑运算符 AND, OR, NOT 组合多个条件。比如,获取年龄大于 25 岁且性别为男性的用户信息:
SELECT * FROM users WHERE age > 25 AND gender = 'M';
(三)排序
排序用于对查询结果进行有序排列。可以使用 ORDER BY 子句指定排序的列和排序方式(升序 ASC 或降序 DESC )。例如,按照年龄升序排列用户信息:
SELECT * FROM users ORDER BY age ASC;
若要按照年龄降序排列,则使用:
SELECT * FROM users ORDER BY age DESC;
(四)分页
当数据量较大时,分页查询可以提高查询效率和用户体验。在 MySQL 中,使用 LIMIT 子句实现分页。假设每页显示 10 条数据,获取第一页数据的语句为:
SELECT * FROM users LIMIT 0, 10;
获取第二页数据的语句为:
SELECT * FROM users LIMIT 10, 10;
(五)实际案例
假设我们有一个学生表 students ,包含 id 、 name 、 age 、 grade 等列。以下是一些综合运用上述查询技术的实际案例。
案例 1:获取成绩大于 80 分且年龄小于 20 岁的学生姓名和成绩
SELECT name, grade FROM students WHERE grade > 80 AND age < 20;
案例 2:按照成绩降序排列并获取前 5 名学生的信息
SELECT * FROM students ORDER BY grade DESC LIMIT 0, 5;
通过实际案例的练习,能够更加熟练地运用数据查询的基本语句,满足不同的业务需求。
五、第五天:高级查询与函数
(一)聚合函数
聚合函数用于对一组数据进行计算并返回一个汇总值。常见的聚合函数包括 SUM(求和)、AVG(平均值)、COUNT(计数)、MAX(最大值)和 MIN(最小值)。
-- 计算表中某列的总和
SELECT SUM(column_name) FROM table_name;
-- 计算平均值
SELECT AVG(column_name) FROM table_name;
-- 统计行数
SELECT COUNT(*) FROM table_name;
-- 获取最大值
SELECT MAX(column_name) FROM table_name;
-- 获取最小值
SELECT MIN(column_name) FROM table_name;
(二)日期函数
MySQL 提供了丰富的日期函数来处理日期和时间数据。
- CURDATE() 函数返回当前日期,如 SELECT CURDATE(); 。
- CURTIME() 函数返回当前时间,例如 SELECT CURTIME(); 。
- DATE_FORMAT(date, format) 函数用于按照指定格式格式化日期,例如 SELECT DATE_FORMAT('2023-09-20', '%Y-%m-%d') AS formatted_date; 。
(三)字符串函数
字符串函数用于操作和处理字符串数据。
- CONCAT(str1, str2,...) 函数用于连接字符串,如 SELECT CONCAT('Hello', ' ', 'World'); 。
- SUBSTRING(str, start, length) 函数用于截取字符串的一部分,例如 SELECT SUBSTRING('HelloWorld', 1, 5); 。
(四)多表连接查询
多表连接查询用于将多个表中的数据按照一定的条件进行关联和组合。
- 内连接(INNER JOIN):只返回两个表中匹配的行,例如 SELECT * FROM table1 INNER JOIN table2 ON table1.column = table2.column; 。
- 左连接(LEFT JOIN):返回左表的所有行以及与右表匹配的行,右表中不匹配的行为 NULL ,如 SELECT * FROM table1 LEFT JOIN table2 ON table1.column = table2.column; 。
- 右连接(RIGHT JOIN):与左连接相反,返回右表的所有行以及与左表匹配的行,左表中不匹配的行为 NULL 。
(五)子查询
子查询是一个嵌套在主查询中的查询语句。
- 单行子查询:结果集只有一行,例如 SELECT column_name FROM table_name WHERE column_name = (SELECT column_name FROM another_table WHERE condition); 。
- 多行子查询:结果集有多行,通常与 IN 、ANY 、ALL 等关键字一起使用。
通过学习和实践这些高级查询和函数,可以更灵活高效地处理复杂的数据库操作,满足多样化的业务需求。
六、第六天:数据完整性与约束
(一)唯一性约束
唯一性约束确保表中的某一列或一组列的值不能重复。在 MySQL 中,可以在创建表时或修改表时设置唯一性约束。
创建表时设置唯一性约束:
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50) UNIQUE
);
修改表时添加唯一性约束:
ALTER TABLE users ADD UNIQUE (email);
唯一性约束的作用在于防止重复数据的插入,保证数据的唯一性,适用于用户名、邮箱等不允许重复的字段。
(二)外键约束
外键约束用于建立两个表之间的关联,确保数据的一致性和完整性。
创建表时设置外键约束:
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
修改表时添加外键约束:
ALTER TABLE orders ADD FOREIGN KEY (customer_id) REFERENCES customers(customer_id);
外键约束的主要作用包括:
- 保证数据的一致性:例如,订单表中的客户 ID 必须在客户表中存在。
- 防止无效数据插入:无法插入不存在于主表中的外键值。
- 自动处理关联数据:当主表中的数据被删除或更新时,根据设置的规则自动处理从表中的相关数据。
(三)主键约束
主键约束用于唯一标识表中的每一行记录,一个表只能有一个主键。
创建表时设置主键约束:
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(100)
);
主键约束的特点和作用:
- 唯一性:主键的值不能重复。
- 非空性:主键列不允许为空值。
- 用于快速检索和关联数据。
(四)非空约束
非空约束确保列中必须有值,不能为 NULL。
创建表时设置非空约束:
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL
);
非空约束的意义在于保证关键信息的完整性,避免出现缺失重要数据的情况。
(五)检查约束
检查约束用于限制列中可接受的值范围。虽然 MySQL 对检查约束的支持有限,但在实际应用中仍有一定作用。
创建表时设置检查约束(MySQL 中此约束仅做语法检查,不强制约束):
CREATE TABLE employees (
id INT PRIMARY KEY,
age INT,
CHECK (age >= 18)
);
通过合理使用上述各种约束,可以有效地保证数据库中数据的完整性和准确性,减少数据错误和不一致的情况发生。
七、第七天:综合实战与总结
(一)综合实战项目
假设我们要设计一个电商平台的数据库。首先,创建一个名为 products 的表来存储商品信息:
CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT,
product_name VARCHAR(100) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
stock INT NOT NULL
);
然后,创建一个 orders 表来记录订单:
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
customer_id INT,
order_date DATE NOT NULL,
total_price DECIMAL(10, 2) NOT NULL
);
接下来,创建一个 order_items 表来关联订单和商品:
CREATE TABLE order_items (
order_item_id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT,
product_id INT,
quantity INT NOT NULL,
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
(二)数据操作
向 products 表插入一些商品数据:
INSERT INTO products (product_name, price, stock)
VALUES ('iPhone 14', 7999.99, 100),
('iPad Pro', 5999.99, 50),
('MacBook Air', 9999.99, 80);
查询库存小于 50 的商品:
SELECT * FROM products WHERE stock < 50;
更新某个商品的价格:
UPDATE products SET price = 8999.99 WHERE product_id = 1;
删除库存为 0 的商品:
DELETE FROM products WHERE stock = 0;
(三)总结回顾
经过一周的学习,我们从 MySQL 的基础概念入手,逐步深入到数据库与表的操作、数据的增删改查、高级查询与函数、数据完整性与约束等方面。通过实际的案例和项目实践,我们更加深入地理解了 MySQL 的工作原理和应用场景。
在数据库设计中,要根据业务需求合理规划表结构,选择合适的数据类型和约束。在数据操作时,要注意条件的准确性,避免误操作导致数据错误。同时,熟练掌握各种查询和函数,能够提高数据处理的效率和准确性。
总之,这一周的学习为我们进一步深入学习和实际应用 MySQL 打下了坚实的基础。在今后的学习和工作中,还需要不断实践和探索,以提高自己的数据库技能。