MySQL 入门“鸡”础

news/2025/2/26 5:52:00

一、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()
#

 


http://www.niftyadmin.cn/n/5868104.html

相关文章

ubuntu22.04 如何扩根目录空间,当空间不够时

根目录没扩容之前的空间,只有24G 8、使用 lsblk 查看新硬盘是否被系统识别,如果没有识别请重启虚拟机 9、对新添加的硬盘进行分区 fdisk /dev/sdb 在 command 输入 m 进行帮助 n   增加一个新分区e 扩展分区p 主…

Flink 中的滚动策略(Rolling Policy)

在 Apache Flink 中,滚动策略(Rolling Policy)是针对日志(或数据流)文件输出的一种管理策略,它决定了在日志文件的大小、时间或其他条件满足特定标准时,如何“滚动”生成新的日志文件。滚动策略…

计算机视觉算法实战——产品分拣(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ 1. 领域简介✨✨ 产品分拣是工业自动化和物流领域的核心技术,旨在通过机器视觉系统对传送带上的物品进行快速识别、定位和分类&a…

个人电脑小参数GPT预训练、SFT、RLHF、蒸馏、CoT、Lora过程实践——MiniMind图文版教程

最近看到Github上开源了一个小模型的repo,是真正拉低LLM的学习门槛,让每个人都能从理解每一行代码, 从零开始亲手训练一个极小的语言模型。开源地址: GitHub - jingyaogong/minimind: 🚀🚀 「大模型」2小时…

Java 接收 XML 格式参数并转换为 JSON

在 Java 应用程序中&#xff0c;处理 XML 数据并将其转换为 JSON 格式是很常见的任务。以下是一个示例代码&#xff0c;展示如何使用 Java 完成这一操作&#xff1a; 前期准备 确保你的项目中包含以下依赖&#xff1a; <dependency><groupId>com.fasterxml.jack…

C++之vector和list辨析

std::vector 和 std::list 是 C 标准库中两种常用的容器&#xff0c;它们都用于存储和管理元素集合&#xff0c;但在底层实现和性能特性上有显著的区别。 1. 底层实现 std::vector: 基于动态数组实现。元素在内存中是连续存储的。支持随机访问&#xff08;通过下标访问元素&a…

02、Hadoop3.x从入门到放弃,第二章:集群环境搭建

Hadoop3.x从入门到放弃&#xff0c;第二章&#xff1a;集群环境搭建 一、安装JDK并配置环境变量 /etc/profile中部分代码如下&#xff1a; for循环profile.d中的sh文件并使之生效&#xff0c;所以我们只需要在profile.d文件夹下配置我们的my_env.sh文件就好了 vim /etc/prof…

7.grafana的内存和CPU同时在一个表中的调整

如图所示&#xff0c;当CPU和内存同在一个表的时候&#xff0c;左y轴只显示内存单位&#xff0c;那么我们就需要让右y轴显示CPU单位百分之 1. 在axes 中显示左y轴和右y轴 2. 在左y轴单位选择bytes&#xff0c;右y轴单选选择百分比 3. 选择Series overrides&#xff0c;开始填…