一、Win10 与Ubuntu安装
以下是一篇针对 Ubuntu 安装 MySQL 的过程中写的示例:
---
# Ubuntu 安装 MySQL 详细指南
在本教程中,我们将向您展示如何在 Ubuntu 上安装 MySQL,并完成基本的安全配置。以下是具体步骤:
# 1. 安装 MySQL
在终端中输入以下命令以安装 MySQL 服务器:
```
sudo apt install mysql-server
```
安装过程中,您可能需要输入管理员密码进行确认。
安装完成后,MySQL 服务将自动启动。
# 2. 运行安全脚本
MySQL 提供了一个安全脚本,可以帮助您完成一些基本的安全配置。运行以下命令:
```
sudo mysql_secure_installation
```
### 脚本交互内容:
- **设置 Root 用户密码验证插件**:
选择您希望使用的密码验证插件。如果您希望禁用密码验证,可以选择 `2` 或 `3`。
```
Select a password validation policy (Press [Enter] to skip):
1) Low Length >=8
2) Medium Length >=8, numeric, mixed case, and special characters
3) Strong Length >=8, numeric, mixed case, special characters and dictionary file
```
- **设置 Root 用户密码**:
如果您之前没有设置 Root 用户密码,需要在此处设置。输入您选择的密码并确认。
- **删除匿名用户**:
建议删除匿名用户以增强安全性。输入 `Y` 并按回车。
- **禁止 Root 用户远程登录**:
禁止 Root 用户远程登录可以提高安全性。输入 `Y` 并按回车。
- **删除测试数据库**:
删除测试数据库以减少不必要的安全隐患。输入 `Y` 并按回车。
- **刷新权限**:
输入 `Y` 并按回车以刷新权限并应用更改。
## 3. 登录 MySQL
使用以下命令以 Root 用户身份登录 MySQL:
```
sudo mysql
```
您将进入 MySQL 的命令行界面。
## 4. 创建新用户
为了增强安全性,建议创建一个新的 MySQL 用户。运行以下命令:
```
CREATE USER 'temp'@'%' IDENTIFIED BY '123456';
```
这条命令将在所有网络接口上创建一个名为 `temp` 的用户,密码为 `123456`。
## 5. 修改 MySQL 配置文件
编辑 MySQL 的配置文件以允许远程访问。运行以下命令:
```
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
```
找到 `bind-address` 行,并将其值修改为 `0.0.0.0`,如下所示:
```
bind-address = 0.0.0.0
```
保存并退出文件。
## 6. 重启 MySQL 服务
运行以下命令以重启 MySQL 服务,使配置更改生效:
```
sudo systemctl restart mysql
```
## 7. 验证远程访问
使用以下命令从远程机器连接到 MySQL 服务器:
```
mysql -utemp -p -h 192.168.29.128
```
输入用户 `temp` 的密码 `123456`,如果连接成功,您将进入 MySQL 的命令行界面。
## 8. 测试 MySQL
运行以下命令以测试 MySQL 是否正常工作:
```
SHOW DATABASES;
```
您应该能够看到 MySQL 数据库列表。
---
# 总结
通过以上步骤,您已经在 Ubuntu 上成功安装并配置了 MySQL。如果您遇到任何问题,请随时联系我。
二、Navicat客户端连接
以下是一篇关于使用 Navicat 客户端连接 MySQL 数据库的示例:
# 使用 Navicat 客户端连接 MySQL 数据库
## 一、Navicat 简介
Navicat 是一个强大的数据库管理工具,支持多种数据库系统,如 MySQL、MariaDB、SQL Server、Oracle 等。它提供了一个直观的图形界面,方便用户管理和操作数据库。
## 二、使用 Navicat 客户端连接 MySQL 数据库
### 1. 启动 Navicat 客户端
双击 Navicat 图标,启动客户端。在主界面中,您可以看到左侧的导航栏和右侧的数据库连接列表。
### 2. 创建新的数据库连接
点击导航栏中的“连接”按钮,或使用快捷键 `Ctrl + N`,打开“新建连接”对话框。
### 3. 配置连接参数
- **连接名称**:输入一个易于识别的名称,例如“Local MySQL”。
- **主机名或 IP 地址**:如果 MySQL 服务器运行在本地计算机上,请输入 `127.0.0.1` 或 `localhost`。如果是远程服务器,请输入对应的 IP 地址或域名。
- **端口**:MySQL 的默认端口是 `3306`。如果您使用了其他端口,请输入对应的端口号。
- **用户名**:输入您的 MySQL 用户名,例如 `temp`。
- **密码**:输入对应的用户密码,例如 `123456`。
- **默认数据库**(可选):如果您希望在连接时自动选择某个数据库,请在此输入数据库名称。如果不确定,可以留空。
### 4. 测试连接
点击“测试连接”按钮,检查连接是否成功。如果连接失败,Navicat 将提示错误信息。请根据错误信息检查连接参数是否正确。
### 5. 保存连接
如果测试连接成功,点击“保存”按钮,将连接信息保存到连接列表中。您可以在左侧导航栏中看到新创建的连接。
### 6. 连接到数据库
在连接列表中双击新创建的连接,或右键点击连接并选择“连接”。输入用户密码(如果需要),然后点击“确定”。
### 7. 进行基本操作
连接成功后,您可以在 Navicat 的右侧窗口中看到数据库列表、表结构、数据记录等信息。您可以通过以下方式执行基本操作:
- **查看数据库列表**:在左侧导航栏中展开“数据库”节点,查看所有数据库。
- **执行 SQL 查询**:点击“查询”按钮或使用快捷键 `Ctrl + Shift + N` 打开查询编辑器。输入 SQL 查询语句并点击“运行”按钮,查看查询结果。
- **管理表**:右键点击数据库或表,可以创建、修改、删除表,以及导入和导出数据。
## 三、使用 Navicat 的小贴士
- **优化连接设置**:在连接属性中,您可以设置字符集、连接超时、SSL 等选项,以优化连接性能和安全性。
- **管理数据和对象**:Navicat 提供了丰富的数据和对象管理功能,如数据编辑器、架构设计工具、数据导出和导入工具等,方便您进行数据库开发和维护工作。
- **备份和恢复数据库**:Navicat 的“数据传输”功能可以帮助您轻松备份和恢复数据库。您可以将数据从一个数据库传输到另一个数据库,或者导出数据为 SQL 脚本文件。
## 四、总结
Navicat 是一个非常实用的数据库管理工具,可以帮助您高效地管理和操作 MySQL 数据库。通过以上步骤,您可以轻松地使用 Navicat 客户端连接 MySQL 数据库,并进行各种操作。如果您遇到任何问题或需要进一步的帮助,请随时联系我。
三、DDL
表相关的 DDL 操作详解
在数据库管理中,表是存储数据的基本结构。通过 DDL(Data Definition Language,数据定义语言)语句,我们可以创建、查看、修改和删除表。以下是关于表操作的 DDL 语句的详细说明和示例。
## 一、展示所有表
要查看当前数据库中的所有表,可以使用以下命令:
```
SHOW TABLES;
```
## 二、创建表
创建表是定义表结构的过程,包括列名、数据类型和约束等。以下是创建表的基本语法:
```
CREATE TABLE 表名 (
列名1 数据类型 约束,
列名2 数据类型 约束,
...
);
```
### 示例:创建 `employees` 表
```
CREATE TABLE employees (
employee_id INT PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(50),
last_name VARCHAR(50),
department_id INT,
hire_date DATE,
salary DECIMAL(10, 2)
);
```
- **解释**:
- `employee_id`:员工 ID,主键,自动递增。
- `first_name`:员工名,最大长度 50。
- `last_name`:员工姓,最大长度 50。
- `department_id`:部门 ID,整数类型。
- `hire_date`:雇佣日期,日期类型。
- `salary`:薪水,小数类型,最多 10 位数字,其中 2 位小数。
## 三、查看表结构
要查看表的结构,可以使用以下命令:
```
DESCRIBE 表名;
```
或者简写为:
```
DESC 表名;
```
### 示例:查看 `employees` 表结构
```
DESCRIBE employees;
```
执行该命令后,数据库将返回 `employees` 表的列信息,包括列名、数据类型、是否允许 NULL 等。
## 四、删除表
删除表是永久删除表及其所有数据的操作。以下是删除表的语法:
```
DROP TABLE 表名;
```
### 示例:删除 `employees` 表
```
DROP TABLE employees;
```
- **注意**:删除表是不可逆的操作,执行后表及其所有数据将被永久删除。在执行删除操作前,请确保已经备份重要数据。
## 五、修改表
修改表包括添加列、删除列和修改列等操作。以下是修改表的语法:
```
ALTER TABLE 表名
操作;
```
### 1. 添加列
```
ALTER TABLE 表名
ADD 列名 数据类型 约束;
```
### 示例:向 `employees` 表添加 `age` 列
```
ALTER TABLE employees
ADD age INT;
```
### 2. 删除列
```
ALTER TABLE 表名
DROP COLUMN 列名;
```
### 示例:从 `employees` 表删除 `age` 列
```
ALTER TABLE employees
DROP COLUMN age;
```
### 3. 修改列
```
ALTER TABLE 表名
CHANGE 原列名 新列名 数据类型 约束;
```
### 示例:将 `employees` 表的 `first_name` 列重命名为 `name`
```
ALTER TABLE employees
CHANGE first_name name VARCHAR(50);
```
通过以上 DDL 语句,您可以轻松地创建、查看、修改和删除表,从而有效地管理数据库中的数据结构。在实际应用中,根据具体需求选择合适的 DDL 语句,可以提高数据库的灵活性和可维护性。
四、DML
DML(数据操纵语言):数据的增删改查
在数据库操作中,DML(Data Manipulation Language,数据操纵语言)是用于对数据库中的数据进行操作的语言。DML 主要包括数据的增删改查操作,即插入(INSERT)、删除(DELETE)、更新(UPDATE)和查询(SELECT)。以下是 DML 的详细说明和示例。
## 一、查询(SELECT)
查询操作用于从数据库中检索数据。以下是查询的基本语法:
```
SELECT * FROM 表名;
```
- **解释**:查询表中的所有列和所有数据。
### 示例:查询 `employees` 表中的所有数据
```
SELECT * FROM employees;
```
### 查询特定列
```
SELECT 列名 FROM 表名;
```
- **解释**:只查询表中的指定列。
### 示例:查询 `employees` 表中的 `first_name` 和 `salary` 列
```
SELECT first_name, salary FROM employees;
```
## 二、插入(INSERT)
插入操作用于向数据库表中添加新数据。以下是插入的基本语法:
# 1. 全列插入
```
INSERT INTO 表名 VALUES (列1, 列2, ...), (列1, 列2, ...), ...;
```
- **解释**:向表中插入多行数据,每行数据包含所有列的值。
### 示例:向 `employees` 表中插入多行数据
```
INSERT INTO employees VALUES
(1, '张', '三', 1, '2024-01-01', 8000.00),
(2, '李', '四', 2, '2024-02-15', 9000.00);
```
### 2. 缺省插入
```
INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...), ...;
```
- **解释**:向表中插入多行数据,每行数据只包含指定列的值,其他列使用默认值或 NULL。
### 示例:向 `employees` 表中插入多行数据,只指定部分列
```
INSERT INTO employees (first_name, last_name, department_id, hire_date, salary) VALUES
('王五', '周', 2, '2024-07-10', 9500.00),
('赵六', '钱', 3, '2024-08-20', 10000.00);
```
### 3. 使用 `SET` 语法插入
```
INSERT INTO 表名 SET 列1 = 值1, 列2 = 值2, ...;
```
- **解释**:向表中插入一行数据,指定列的值。
### 示例:向 `employees` 表中插入一行数据
```
INSERT INTO employees SET
first_name = '孙八',
last_name = '孙',
department_id = 1,
hire_date = '2024-09-01',
salary = 8500.00;
```
## 三、删除(DELETE)
删除操作用于从数据库表中删除数据。以下是删除的基本语法:
```
DELETE FROM 表名 WHERE 条件;
```
- **解释**:删除表中满足指定条件的数据。
### 示例:删除 `employees` 表中 `employee_id` 为 4 的记录
```
DELETE FROM employees WHERE employee_id = 4;
```
- **注意**:删除操作是不可逆的,执行前请确保条件正确,避免误删数据。
## 四、修改(UPDATE)
修改操作用于更新数据库表中的数据。以下是修改的基本语法:
```
UPDATE 表名 SET 列1 = 值1, 列2 = 值2, ... WHERE 条件;
```
- **解释**:更新表中满足指定条件的记录,将指定列的值修改为新值。
### 示例:将 `employees` 表中 `employee_id` 为 2 的记录的 `salary` 修改为 11000.00
```
UPDATE employees SET salary = 11000.00 WHERE employee_id = 2;
```
- **注意**:修改操作会立即更新数据,执行前请确保条件和修改内容正确。
## 五、总结
DML 语句是数据库操作中常用的语句,用于对数据进行增删改查操作。通过合理使用 DML 语句,可以有效地管理和操作数据库中的数据。在实际应用中,根据具体需求选择合适的 DML 语句,确保数据的准确性和完整性。
五、DCL
# DCL(数据控制语言):用户与权限管理
在数据库管理中,DCL(Data Control Language,数据控制语言)用于管理用户和权限。通过 DCL 语句,可以创建用户、修改密码、删除用户,以及分配和取消权限。以下是 DCL 的详细说明和示例。
## 一、用户管理
### 1. 创建用户
```
CREATE USER '用户名'@'%' IDENTIFIED BY '密码';
```
- **解释**:创建一个新用户,`用户名` 是用户的名称,`%` 表示用户可以从任何主机连接,`密码` 是用户的登录密码。
### 示例:创建用户 `temp`
```
CREATE USER 'temp'@'%' IDENTIFIED BY '123456';
```
### 2. 修改密码
```
ALTER USER '用户名'@'%' IDENTIFIED BY '新密码';
```
- **解释**:修改指定用户的密码,`新密码` 是用户的新的登录密码。
### 示例:修改用户 `temp` 的密码
```
ALTER USER 'temp'@'%' IDENTIFIED BY '654321';
```
### 3. 删除用户
```
DROP USER '用户名'@'%';
```
- **解释**:删除指定用户。
### 示例:删除用户 `temp`
```
DROP USER 'temp'@'%';
```
## 二、权限管理
### 1. 查看权限
```
SHOW GRANTS FOR '用户名'@'%';
```
- **解释**:查看指定用户的权限。
### 示例:查看用户 `temp` 的权限
```
SHOW GRANTS FOR 'temp'@'%';
```
### 2. 分配权限
#### (1)列权限
```
GRANT SELECT, UPDATE(列名) ON 数据库.表 TO '用户名'@'%';
```
- **解释**:授予用户对指定列的权限,如 SELECT 和 UPDATE。
### 示例:授予用户 `temp` 对 `employees` 表的 `salary` 列的 SELECT 和 UPDATE 权限
```
GRANT SELECT, UPDATE(salary) ON employees.employees TO 'temp'@'%';
```
#### (2)表权限
```
GRANT SELECT, UPDATE, DELETE, INSERT ON 数据库.表 TO '用户名'@'%';
```
- **解释**:授予用户对指定表的权限,如 SELECT、UPDATE、DELETE 和 INSERT。
### 示例:授予用户 `temp` 对 `employees` 表的所有权限
```
GRANT SELECT, UPDATE, DELETE, INSERT ON employees.employees TO 'temp'@'%';
```
#### (3)数据库权限
```
GRANT SELECT, UPDATE, DELETE, INSERT ON 数据库.* TO '用户名'@'%';
```
- **解释**:授予用户对指定数据库中所有表的权限,如 SELECT、UPDATE、DELETE 和 INSERT。
### 示例:授予用户 `temp` 对 `employees` 数据库中所有表的所有权限
```
GRANT SELECT, UPDATE, DELETE, INSERT ON employees.* TO 'temp'@'%';
```
#### (4)全局权限
```
GRANT ALL ON *.* TO '用户名'@'%';
```
- **解释**:授予用户对所有数据库和表的全部权限。
### 示例:授予用户 `temp` 全局权限
```
GRANT ALL ON *.* TO 'temp'@'%';
```
### 3. 取消权限
```
REVOKE 权限 ON 数据库.表 FROM '用户名'@'%';
```
- **解释**:取消用户对指定对象的权限。
### 示例:取消用户 `temp` 对 `employees` 表的 SELECT 和 UPDATE 权限
```
REVOKE SELECT, UPDATE ON employees.employees FROM 'temp'@'%';
```
## 三、总结
DCL 语句是数据库管理中用于用户和权限管理的重要工具。通过合理使用 DCL 语句,可以有效地控制用户对数据库的访问权限,确保数据库的安全性和完整性。在实际应用中,根据具体需求分配和取消权限,可以提高数据库的安全性和可维护性。
六、外键
# 外键约束:确保数据完整性的强大工具
在数据库设计中,外键(Foreign Key)约束是一种用于确保数据完整性的机制。通过外键约束,可以建立表与表之间的关联关系,确保数据的一致性和准确性。本文将详细介绍外键的基本概念、创建方法、以及在删除或更新操作中的行为。
## 一、外键的基本概念
外键是一个表中的列或列的组合,它引用了另一个表的主键列或唯一键列。通过外键约束,可以确保在一个表中引用的值在另一个表中是存在的。例如,在一个学校管理系统中,`student` 表中可能有一个 `teacher_id` 列,该列引用了 `teacher` 表中的 `teacher_id` 列。这样,通过外键约束,可以确保 `student` 表中的 `teacher_id` 值在 `teacher` 表中是存在的。
## 二、创建表时设置外键
在创建表时,可以通过 `CONSTRAINT` 关键字设置外键约束。以下是一个示例:
```
CREATE TABLE student (
student_id INT PRIMARY KEY AUTO_INCREMENT,
student_name VARCHAR(50),
teacher_id INT,
CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(teacher_id) ON UPDATE CASCADE ON DELETE CASCADE
);
```
- **解释**:
- `CONSTRAINT fk_teacher_id`:定义外键约束的名称,通常命名为 `fk_` 加上引用的列名,例如 `fk_teacher_id`。
- `FOREIGN KEY (teacher_id)`:指定 `teacher_id` 列为外键列。
- `REFERENCES teacher(teacher_id)`:指定外键列引用的表和列,即 `teacher` 表的 `teacher_id` 列。
- `ON UPDATE CASCADE`:当引用的主键值更新时,级联更新外键列的值。
- `ON DELETE CASCADE`:当引用的主键值删除时,级联删除外键列的记录。
## 三、创建表之后添加外键
如果在创建表时没有设置外键约束,可以在之后通过 `ALTER TABLE` 语句添加外键约束。以下是一个示例:
```
ALTER TABLE student
ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(teacher_id);
```
- **解释**:
- `ALTER TABLE student`:指定要修改的表为 `student` 表。
- `ADD CONSTRAINT fk_teacher_id`:添加名为 `fk_teacher_id` 的外键约束。
- `FOREIGN KEY (teacher_id)`:指定 `teacher_id` 列为外键列。
- `REFERENCES teacher(teacher_id)`:指定外键列引用的表和列,即 `teacher` 表的 `teacher_id` 列。
## 四、删除外键
如果需要删除外键约束,可以使用 `ALTER TABLE` 语句。以下是一个示例:
```
ALTER TABLE student
DROP FOREIGN KEY fk_teacher_id;
```
- **解释**:
- `ALTER TABLE student`:指定要修改的表为 `student` 表。
- `DROP FOREIGN KEY fk_teacher_id`:删除名为 `fk_teacher_id` 的外键约束。
## 五、删除或更新操作中的行为
在外键约束中,可以指定在删除或更新引用的主键值时的行为。以下是常见的行为选项:
### 1. RESTRICT(默认行为)
- **解释**:当尝试删除或更新引用的主键值时,如果存在依赖的外键记录,操作将被拒绝。
- **示例**:如果在 `teacher` 表中删除一个 `teacher_id`,而 `student` 表中存在引用该 `teacher_id` 的记录,则删除操作将被拒绝。
### 2. CASCADE
- **解释**:当删除或更新引用的主键值时,依赖的外键记录将被级联删除或更新。
- **示例**:如果在 `teacher` 表中删除一个 `teacher_id`,而 `student` 表中存在引用该 `teacher_id` 的记录,则这些记录将被级联删除。
## 六、总结
外键约束是数据库设计中确保数据完整性的重要工具。通过合理使用外键约束,可以建立表与表之间的关联关系,确保数据的一致性和准确性。在实际应用中,根据具体需求选择合适的外键约束行为(如 RESTRICT 或 CASCADE),可以有效地管理数据的删除和更新操作。
七、查询语句
查询语句:SQL 中的强大工具
在数据库操作中,查询语句(SQL)是用于从数据库中检索数据的基本工具。通过查询语句,可以实现各种复杂的数据检索需求,包括查询所有数据、按条件查询、排序、去重、模糊查询以及使用聚合函数等。以下是查询语句的详细说明和示例。
## 一、查询表中所有数据
### 1. 查询表中所有数据
```sql
SELECT * FROM employees;
```
- **解释**:查询 `employees` 表中的所有数据,`*` 表示选择所有列。
## 二、按条件查询
### 2. 按条件查询
```sql
SELECT first_name, last_name FROM employees WHERE department_id = 2;
```
- **解释**:查询 `employees` 表中 `department_id` 为 2 的员工的 `first_name` 和 `last_name`。
## 三、按某一列排序
### 3. 按某一列排序
```sql
SELECT first_name, salary FROM employees ORDER BY salary DESC;
```
- **解释**:
- `ASC`:升序(默认),按某一列的值从小到大排序。
- `DESC`:降序,按某一列的值从大到小排序。
- 示例中按 `salary` 列降序排列,显示 `first_name` 和 `salary`。
## 四、查询去重值
### 4. 查询去重值
```sql
SELECT DISTINCT department_id FROM employees;
```
- **解释**:查询 `employees` 表中所有唯一的 `department_id`。
## 五、使用通配符模糊查询
### 5. 使用通配符模糊查询
```sql
SELECT * FROM employees WHERE first_name LIKE '张%';
```
- **解释**:
- `%`:表示任意字符序列,可以是零个或多个字符。
- `_`:表示任意单个字符。
- 示例中查询 `first_name` 以 `张` 开头的所有员工。
## 六、聚合函数
聚合函数用于对一组值进行计算并返回单个值。以下是常用的聚合函数及其示例。
### 1. COUNT(*)
- **解释**:统计查询结果中的记录行数。如果需要统计特定列中的非空值的记录数,可以使用 `COUNT(column_name)`;如果需要统计所有行(包括 NULL 值),则应使用 `COUNT(*)`。
#### 示例:统计 `employees` 表中的所有记录数
```sql
SELECT COUNT(*) FROM employees;
```
### 2. SUM()
- **解释**:计算数值列的总和。
#### 示例:计算 `employees` 表中 `salary` 列的总和
```sql
SELECT SUM(salary) FROM employees;
```
### 3. AVG()
- **解释**:计算数值列的平均值。
#### 示例:计算 `employees` 表中 `salary` 列的平均值
```sql
SELECT AVG(salary) FROM employees;
```
### 4. MAX()
- **解释**:返回数值列的最大值。
#### 示例:返回 `employees` 表中 `salary` 列的最大值
```sql
SELECT MAX(salary) FROM employees;
```
### 5. MIN()
- **解释**:返回数值列的最小值。
#### 示例:返回 `employees` 表中 `salary` 列的最小值
```sql
SELECT MIN(salary) FROM employees;
```
## 七、GROUP BY
### 1. GROUP BY
- **解释**:用于将数据按照某一列或多列进行分组,通常与聚合函数搭配使用。
#### 示例:按 `department_id` 分组,计算每个部门的员工数量和平均薪水
```sql
SELECT department_id, COUNT(*) AS employee_count, AVG(salary) AS average_salary
FROM employees
GROUP BY department_id;
```
- **解释**:
- `GROUP BY department_id`:按 `department_id` 列进行分组。
- `COUNT(*) AS employee_count`:计算每个部门的员工数量。
- `AVG(salary) AS average_salary`:计算每个部门的平均薪水。
## 八、HAVING
### 1. HAVING
- **解释**:用于过滤分组后的结果,类似于 `WHERE`,但 `HAVING` 用于聚合后的结果。
#### 示例:按 `department_id` 分组,计算每个部门的员工数量和平均薪水,只显示员工数量大于 5 的部门
```sql
SELECT department_id, COUNT(*) AS employee_count, AVG(salary) AS average_salary
FROM employees
GROUP BY department_id
HAVING employee_count > 5;
```
- **解释**:
- `HAVING employee_count > 5`:过滤分组后的结果,只显示员工数量大于 5 的部门。
## 九、常用函数集合
### 1. 字符串函数
- `LENGTH(string)`:返回字符串的长度。
- `UPPER(string)`:将字符串转换为大写。
- `LOWER(string)`:将字符串转换为小写。
- `CONCAT(string1, string2, ...)`:连接多个字符串。
- `SUBSTRING(string, start, length)`:从字符串的指定位置开始,提取指定长度的子字符串。
### 2. 数学函数
- `ROUND(number, decimal_places)`:将数字四舍五入到指定的小数位数。
- `CEIL(number)`:返回大于或等于指定数字的最小整数。
- `FLOOR(number)`:返回小于或等于指定数字的最大整数。
- `ABS(number)`:返回数字的绝对值。
- `SQRT(number)`:返回数字的平方根。
### 3. 日期和时间函数
- `NOW()`:返回当前日期和时间。
- `CURDATE()`:返回当前日期。
- `CURTIME()`:返回当前时间。
- `DATE_ADD(date, INTERVAL expr)`:在日期上添加指定的时间间隔。
- `DATE_SUB(date, INTERVAL expr)`:在日期上减去指定的时间间隔。
## 十、总结
查询语句(SQL)是数据库操作中不可或缺的一部分,通过灵活使用各种查询语句和函数,可以实现复杂的数据检索和分析需求。在实际应用中,根据具体需求选择合适的查询语句和函数,可以提高数据检索的效率和准确性。
八、数据类型
数据类型总结
### 一、基础数据类型
1. **整数(int)**
- Python 中的整数可以是正数、负数或零,没有大小限制。
- 示例:`x = 10`
2. **浮点数(float)**
- 浮点数用于表示小数,支持科学计数法。
- 示例:`y = 3.14`,`z = 1.2e-3`
3. **字符串(str)**
- 字符串是字符的序列,可以用单引号、双引号或三引号定义。
- 示例:`name = "Alice"`
4. **布尔值(bool)**
- 布尔值只有两个可能的值:`True` 和 `False`。
- 示例:`is_valid = True`
5. **None 类型(None)**
- None 是一个特殊的值,表示“空”或“无”。
- 示例:`result = None`
### 二、容器数据类型
1. **列表(list)**
- 列表是一种有序集合,可以包含不同类型的元素。
- 示例:`numbers = [1, 2, 3, 4, 5]`
2. **元组(tuple)**
- 元组是不可变的有序集合,用于存储固定的数据。
- 示例:`point = (3, 4)`
3. **字典(dict)**
- 字典是键值对的集合,用于存储任意类型的数据。
- 示例:`person = {"name": "Bob", "age": 25}`
4. **集合(set)**
- 集合是无序且不重复的元素集合,用于数学运算。
- 示例:`fruits = {"apple", "banana", "orange"}`
## MySQL 数据类型总结
### 一、数字类型
1. **整数类型**
- **TINYINT**:1 个字节,范围 -128 ~ 127(有符号),0 ~ 255(无符号)
- **SMALLINT**:2 个字节,范围 -32768 ~ 32767(有符号),0 ~ 65535(无符号)
- **MEDIUMINT**:3 个字节,范围 -8388608 ~ 8388607(有符号),0 ~ 16777215(无符号)
- **INT**:4 个字节,范围 -2147483648 ~ 2147483647(有符号),0 ~ 4294967295(无符号)
- **BIGINT**:8 个字节,范围 -9223372036854775808 ~ 9223372036854775807(有符号),0 ~ 18446744073709551615(无符号)
2. **浮点数类型**
- **FLOAT**:4 个字节,单精度浮点数
- **DOUBLE**:8 个字节,双精度浮点数
3. **高精度小数类型(DECIMAL)**
- **DECIMAL(M, D)**:可以精确地表示固定点数,其中 `M` 是整数和小数的总位数,`D` 是小数位数。
- 示例:`salary DECIMAL(10, 2)` 表示可以存储最多 10 位数字,其中 2 位是小数。
### 二、字符串类型
1. **固定长度字符串(CHAR)**
- **CHAR(N)**:固定长度的字符串类型,最多可以存储 `N` 个字符。
- 示例:`name CHAR(50)` 表示该字段最多存储 50 个字符。
2. **可变长度字符串(VARCHAR)**
- **VARCHAR(N)**:可变长度的字符串类型,最多可以存储 `N` 个字符。
- 示例:`description VARCHAR(255)` 表示该字段最多存储 255 个字符。
3. **文本类型(TEXT)**
- **TEXT**:用于存储大量文本数据。
- 示例:`content TEXT` 用于存储文章内容。
4. **枚举类型(ENUM)**
- **ENUM**:用于定义一组有限的值,这些值必须在列创建时指定。
- 示例:`gender ENUM('男', '女', '保密') DEFAULT '保密'` 定义了一个性别字段,其可能的值只能是 `男`、`女` 或 `保密`。
### 三、时间与日期类型
1. **DATE**
- 日期类型,格式为 `YYYY-MM-DD`。
- 示例:`birth_date DATE` 用于存储日期。
2. **DATETIME**
- 日期和时间类型,格式为 `YYYY-MM-DD HH:MM:SS`。
- 示例:`create_time DATETIME` 用于存储日期和时间。
3. **TIMESTAMP**
- 时间戳类型,格式为 `YYYY-MM-DD HH:MM:SS`,可以自动更新为当前时间。
- 示例:`regist_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP` 定义了一个注册时间字段,默认值为当前时间。
4. **TIME**
- 时间类型,格式为 `HH:MM:SS`。
- 示例:`duration TIME` 用于存储时间。
### 四、布尔值类型
- 在 MySQL 中没有专门的布尔类型,通常使用 `TINYINT` 类型来表示布尔值,其中 `0` 表示假(False),`1` 表示真(True)。
- 示例:`is_active TINYINT` 可以用作布尔类型。
### 五、二进制类型
1. **BLOB**
- **BLOB** 用于存储二进制数据,如图片、音频文件等。
- 示例:`photo BLOB` 用于存储照片。
2. **BIT**
- **BIT(N)** 表示比特位,可以存储二进制数据,最多 `N` 位。
- 示例:`flags BIT(8)` 用于存储 8 位的比特数据。
## 总结
- **Python** 数据类型涵盖了基本数据类型和容器数据类型,提供了丰富的数据表示方式。
- **MySQL** 数据类型用于定义数据库表中列的属性,包括数字类型、字符串类型、时间与日期类型等,每种类型都有其特定的用途和存储方式。
- 在实际开发中,根据数据的性质和需求选择合适的数据类型,可以提高数据存储和查询的效率。
九、扩展知识
一、表关系
表关系是数据库设计中的基础概念,它描述了不同表之间的关联方式。常见的表关系包括一对一、一对多和多对多。
1.1 一对一关系
在一对一关系中,两个表通过一个外键字段相互关联,每个表中的一条记录只能对应另一个表中的一条记录。例如,员工表和身份证表之间的一对一关系。员工表中可以包含一个“身份证号”字段,作为外键关联到身份证表的主键。
1.2 一对多关系
一对多关系是最常见的一种表关系,一个表中的一条记录可以对应另一个表中的多条记录。例如,用户表和收货地址表之间的一对多关系。用户表中的每个用户可以有多个收货地址,收货地址表中通过一个外键字段关联到用户表的主键。
1.3 多对多关系
多对多关系需要通过一个中间表来实现,中间表包含两个相关表的外键。例如,顾客和商品之间通过订单表建立多对多关系。订单表中包含顾客的外键和商品的外键,从而实现顾客和商品之间的关联。
二、视图
视图是一种虚拟表,其内容由查询定义。视图可以简化复杂的查询,提供数据的逻辑抽象,并且可以作为数据库安全机制的一部分。
2.1 示例
sql复制
CREATE VIEW vue_students AS
SELECT name, age FROM students WHERE gender = 'male';
该视图从学生表中筛选出性别为男的学生的姓名和年龄信息,用户可以通过视图来查询数据,而无需关心底层表的结构。
三、函数与存储过程
函数和存储过程是数据库中的重要编程工具,用于实现复杂的业务逻辑。
3.1 函数
函数用于执行特定的计算并返回一个值。例如,SELECT database(), user(), version(), now(), currentdate();
是一些内置函数的示例。
3.2 存储过程
存储过程是一组预编译的 SQL 语句,用于执行复杂的任务。例如,以下是一个更新员工工资的存储过程:
sql复制
DELIMITER //
CREATE PROCEDURE update_salary(
IN employee_id INT,
IN new_salary DECIMAL(10, 2)
)
BEGIN
UPDATE employees
SET salary = new_salary
WHERE id = employee_id;
END //
DELIMITER ;
通过调用存储过程 CALL update_salary(1, 9000);
,可以更新指定员工的工资。
四、索引
索引是提高数据库查询性能的关键技术。以下是一些常见的索引类型和方法。
4.1 索引类型
-
主键索引:基于表的主键创建的索引。
-
唯一索引:确保索引列中的值是唯一的。
-
普通索引:最常用的索引,没有唯一性限制。
-
联合索引:基于多个列创建的索引。
-
全文本索引:用于全文搜索。
4.2 常见的方法
-
B 树索引:适用于范围查询和排序。
-
哈希索引:适用于精确匹配查询。
五、存储引擎
存储引擎是 MySQL 用于处理数据存储和检索的核心组件。以下是一些常见的存储引擎。
5.1 InnoDB
-
特点:支持外键、事务和行级锁。
-
适用场景:适用于需要高可靠性和事务支持的场景。
5.2 MyISAM
-
特点:不支持事务,查询性能较好。
-
适用场景:适用于以读操作为主的场景。
六、事务
事务是数据库中的一个重要概念,用于确保数据的一致性和完整性。事务需要满足 ACID 原则。
6.1 ACID 原则
-
原子性:事务中的所有操作要么全部成功,要么全部失败。
-
一致性:事务执行前后数据库的状态保持一致。
-
隔离性:事务之间的执行相互隔离。
-
持久性:事务一旦提交,其结果是永久的。
十、Pymysql使用
pymysql 是一个用于与 MySQL 数据库交互的 Python 库。以下是使用 pymysql 进行数据库操作的示例。
python"># 2. 数据库连接
import pymysql
# 数据库连接配置
db_config = {
"host": "localhost",
"user": "root",
"password": "123456",
"database": "python2412",
"port": 3306,
"charset": "utf8mb4"
}
# 建立连接
connection = pymysql.connect()
try:
# 创建表
create_table_sql = """
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT,
email VARCHAR(100)
)
"""
with connection.cursor() as cursor:
cursor.execute(create_table_sql)
print("表创建成功!")
#
# 插入数据
insert_sql = "INSERT INTO users (name, age, email) VALUES (%s, %s, %s)"
data = ("Alice", 25, "alice@example.com")
with connection.cursor() as cursor:
cursor.execute(insert_sql, data)
connection.commit()
print("数据插入成功!")
#
# 查询数据
select_sql = "SELECT id, name, age, email FROM users"
with connection.cursor() as cursor:
cursor.execute(select_sql)
result = cursor.fetchall()
print("查询结果:")
for row in result:
print(row)
#
# 更新数据
update_sql = "UPDATE users SET age = %s WHERE name = %s"
data = (26, "Alice")
with connection.cursor() as cursor:
cursor.execute(update_sql, data)
connection.commit()
print("数据更新成功!")
#
# 删除数据
delete_sql = "DELETE FROM users WHERE name = %s"
data = ("Alice",)
with connection.cursor() as cursor:
cursor.execute(delete_sql, data)
connection.commit()
print("数据删除成功!")
#
finally:
# 关闭数据库连接
connection.close()
#