1. 创建–CREATE
1.1 基本使用方法
语法:
CREATE TABLE table_name (column1 datatype [constraints],column2 datatype [constraints],...
);
table_name
: 要创建的表的名称。column1
,column2
, …: 表中的列名。datatype
: 列的数据类型,如INT
,VARCHAR(n)
,DATE
等。[constraints]
: 可选的约束条件,例如主键、外键、唯一性等。
案例:
创建一张用户表
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,password VARCHAR(255) NOT NULL,email VARCHAR(100),created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
创建一个带有外键关系的订单表
CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,user_id INT,product_name VARCHAR(100),quantity INT,order_date DATETIME DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (user_id) REFERENCES users(id)
);
向 users
表插入数据
INSERT INTO users (username, password, email) VALUES
('john_doe', 'securepassword1', 'john@example.com'),
('jane_smith', 'securepassword2', 'jane@example.com'),
('alice_jones', 'securepassword3', 'alice@example.com');
向 orders
表插入数据
INSERT INTO orders (user_id, product_name, quantity) VALUES
(1, 'Product A', 2),
(2, 'Product B', 1),
(1, 'Product C', 5),
(3, 'Product D', 3);
查看 users
表的结构
mysql> SHOW COLUMNS FROM users;
+------------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(50) | NO | | NULL | |
| password | varchar(255) | NO | | NULL | |
| email | varchar(100) | YES | | NULL | |
| created_at | datetime | YES | | CURRENT_TIMESTAMP | |
+------------+--------------+------+-----+-------------------+----------------+
5 rows in set (0.00 sec)
查看 orders
表的结构
mysql> SHOW COLUMNS FROM orders;
+--------------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+-------------------+----------------+
| order_id | int(11) | NO | PRI | NULL | auto_increment |
| user_id | int(11) | YES | MUL | NULL | |
| product_name | varchar(100) | YES | | NULL | |
| quantity | int(11) | YES | | NULL | |
| order_date | datetime | YES | | CURRENT_TIMESTAMP | |
+--------------+--------------+------+-----+-------------------+----------------+
5 rows in set (0.00 sec)
查看users
中的内容
mysql> SELECT * FROM users;
+----+-------------+-----------------+-------------------+---------------------+
| id | username | password | email | created_at |
+----+-------------+-----------------+-------------------+---------------------+
| 1 | john_doe | securepassword1 | john@example.com | 2024-10-30 22:47:26 |
| 2 | jane_smith | securepassword2 | jane@example.com | 2024-10-30 22:47:26 |
| 3 | alice_jones | securepassword3 | alice@example.com | 2024-10-30 22:47:26 |
+----+-------------+-----------------+-------------------+---------------------+
3 rows in set (0.00 sec)
查看orders
中的内容
mysql> SELECT * FROM orders;
+----------+---------+--------------+----------+---------------------+
| order_id | user_id | product_name | quantity | order_date |
+----------+---------+--------------+----------+---------------------+
| 1 | 1 | Product A | 2 | 2024-10-30 22:47:35 |
| 2 | 2 | Product B | 1 | 2024-10-30 22:47:35 |
| 3 | 1 | Product C | 5 | 2024-10-30 22:47:35 |
| 4 | 3 | Product D | 3 | 2024-10-30 22:47:35 |
+----------+---------+--------------+----------+---------------------+
常见问题:
主键 或者 唯一键 没有冲突,则直接插入
主键 或者 唯一键 如果冲突,则删除后再插入
1.2 插入否则更新
如果遇到主键冲突(例如,ID 已存在),则更新已有记录
语法:
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
ON DUPLICATE KEY UPDATE
column = value [, column = value] ...
- table_name: 要插入数据的表名。
- column1, column2, …: 插入时要填充的列名。
- value1, value2, …: 对应列要插入的值。
- ON DUPLICATE KEY UPDATE: 指定当遇到重复键(主键或唯一索引)时执行更新操作。
- column = value ,column=value,column=value …: 在发生冲突时,要更新的列及其新值,可以是一个或多个。
案例:
#更新数据前
mysql> select * from users;
+----+-------------+-----------------+-------------------+---------------------+
| id | username | password | email | created_at |
+----+-------------+-----------------+-------------------+---------------------+
| 1 | john_doe | securepassword1 | john@example.com | 2024-10-30 22:47:26 |
| 2 | jane_smith | securepassword2 | jane@example.com | 2024-10-30 22:47:26 |
| 3 | alice_jones | securepassword3 | alice@example.com | 2024-10-30 22:47:26 |
+----+-------------+-----------------+-------------------+---------------------+
3 rows in set (0.00 sec)
#插入数据
mysql> INSERT INTO users (id, username, password, email, created_at)-> VALUES -> (2, 'charlie_black', 'securepassword5', 'charlie@example.com', NOW()),-> (3, 'diana_green', 'securepassword6', 'diana@example.com', NOW()),-> (4, 'edward_white', 'securepassword7', 'edward@example.com', NOW())-> ON DUPLICATE KEY UPDATE -> password = VALUES(password), -> email = VALUES(email), -> created_at = NOW();
Query OK, 5 rows affected (0.00 sec)
Records: 3 Duplicates: 2 Warnings: 0
#更新数据后
mysql> select * from users;
+----+--------------+-----------------+---------------------+---------------------+
| id | username | password | email | created_at |
+----+--------------+-----------------+---------------------+---------------------+
| 1 | john_doe | securepassword1 | john@example.com | 2024-10-30 22:47:26 |
| 2 | jane_smith | securepassword5 | charlie@example.com | 2024-10-31 08:25:29 |
| 3 | alice_jones | securepassword6 | diana@example.com | 2024-10-31 08:25:29 |
| 4 | edward_white | securepassword7 | edward@example.com | 2024-10-31 08:25:29 |
+----+--------------+-----------------+---------------------+---------------------+
4 rows in set (0.00 sec)
2. 读取–RETRIEVE
2.1 基本使用方法
语法:
SELECT[DISTINCT] {* | {column [, column] ...}[FROM table_name][WHERE ...][ORDER BY column [ASC | DESC], ...][LIMIT ...]
SELECT
是用于指定要从数据库中检索哪些数据的关键字。[DISTINCT]
是可选的,用于指示只返回唯一的结果集,去除重复行。{* | {column [, column]...}
可以选择返回所有列(用*
表示)或者指定具体的一列或多列FROM table_name
指定要从中检索数据的表。这是查询的基础,明确数据的来源。WHERE...
用于添加筛选条件,只有满足这些条件的行才会被包含在结果集中。可以根据特定的列值、逻辑运算符等进行条件判断。ORDER BY column [ASC | DESC],...
用于对结果集进行排序。可以指定一个或多个列作为排序依据,并且可以选择升序(ASC
,默认如果不指定排序方式)或降序(DESC
)。LIMIT...
用于限制结果集的行数。可以指定要返回的最大行数,常用于分页查询等场景。
案例:
SELECT DISTINCT username, email
FROM users
WHERE created_at >= '2024-01-01'
ORDER BY username ASC
LIMIT 5;
2.2 SELECT列
- 全列查询
语法:
SELECT * FROM table_name;
案例:
##返回employees表中的所有列和所有行的数据。
SELECT * FROM employees;
- 指定列查询
语法:
SELECT column1, column2,... FROM table_name;
案例:
#返回员工的姓名和所属部门两列的数据
SELECT name, department FROM employees;
- 查询字段为表达式
语法:
SELECT column1 + column2 AS sum_column FROM table_name;
案例:
#查询员工的姓名、当前薪水以及将薪水增加 10% 后的结果,并将增加后的薪水列命名为increased_salary
SELECT name, salary, salary * 1.1 AS increased_salary FROM employees;
- 为列指定别名
语法:
SELECT column_name AS alias_name FROM table_name;
案例:
#将name列别名为employee_name,department列别名为dept
SELECT name AS employee_name, department AS dept FROM employees;
- 为表指定别名
语法:
SELECT t.column_name FROM table_name AS t;
案例:
#为employees表设置别名为e,然后在查询中使用别名来引用表的列
SELECT e.name, e.department FROM employees AS e;
- 结果去重
语法:
SELECT DISTINCT column1, column2,... FROM table_name;
案例:
#此查询返回employees表中所有不同的部门名称,去除了重复的部门值
SELECT DISTINCT department FROM employees;
2.3 WHERE条件
2.3.1 比较运算符
运算符 | 说明 |
---|---|
>,>=,<,<= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL |
<=> | 等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1) |
!=, <> | 不等于 |
BETWEEN a0 AND a1 | 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1) |
IN (option, …) | 如果是 option 中的任意一个,返回 TRUE(1) |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE | 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符 |
2.3.2 逻辑运算符
运算符 | 说明 |
---|---|
AND | 多个条件必须都为 TRUE(1),结果才是 TRUE(1) |
OR | 任意一个条件为 TRUE(1), 结果为 TRUE(1) |
NOT | 条件为 TRUE(1),结果为 FALSE(0) |
2.4 结果排序
语法:
SELECT column1, column2,...
FROM table_name
[WHERE condition]
ORDER BY column_name [ASC|DESC],...;
SELECT
:选择要查询的列。FROM
:指定要查询的表。WHERE
(可选):添加筛选条件。ORDER BY
:指定用于排序的列名。可以指定多个列进行排序,以逗号分隔。ASC
(可选,默认值):升序排序。如果不指定排序方式,默认为升序。DESC
:降序排序。
2.5 筛选分页结果
-- 起始下标为 0
-- 从 s 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n
-- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
;
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
3. 更新–UPDATE
3.1 基本使用方法
UPDATE table_name
SET column1 = value1, column2 = value2,...
[WHERE condition];
UPDATE
:指定要进行更新操作的关键字。table_name
:要更新数据的表名。SET
:用于指定要更新的列和新的值。可以同时更新多个列,列与值之间用等号连接,不同列的更新之间用逗号分隔。WHERE
(可选):添加筛选条件,只有满足条件的行才会被更新。如果不指定WHERE
子句,将会更新表中的所有行
3.2 更新单个列的值
UPDATE employees SET salary = 6000 WHERE id = 1;
3.3 更新多个列的值
UPDATE employees SET salary = 5500, department = 'HR' WHERE name = 'John';
4. 删除–DELETE
4.1 基本使用方法
语法:
DELETE FROM table_name
[WHERE condition];
DELETE FROM
:指定要进行删除操作的关键字。table_name
:要删除数据的表名。WHERE
(可选):添加筛选条件,只有满足条件的行才会被删除。如果不指定WHERE
子句,将会删除表中的所有行。
删除满足特定条件的行:
DELETE FROM employees WHERE department = 'Marketing';
删除表中的所有行:
DELETE FROM employees;
5. 截断表
语法:
TRUNCATE [TABLE] table_name
注意事项:
- TRUNCATE在删除数据的时候,并不经过真正的事物,所以无法回滚
- 会重置 AUTO_INCREMENT 项
- 只能对整表操作
6. 聚合函数
函数 | 说明 |
---|---|
COUNT([DISTINCT] expr) | 返回查询到的数据的 数量 |
SUM([DISTINCT] expr) | 返回查询到的数据的 总和,不是数字没有意义 |
AVG([DISTINCT] expr) | 返回查询到的数据的 平均值,不是数字没有意义 |
MAX([DISTINCT] expr) | 返回查询到的数据的 最大值,不是数字没有意义 |
MIN([DISTINCT] expr) | 返回查询到的数据的 最小值,不是数字没有意义 |
7. group by子句
GROUP BY
用于将数据按照一个或多个列进行分组,通常与聚合函数一起使用,以便对每个组进行计算
语法:
SELECT column1, column2,...
FROM table_name
WHERE condition
GROUP BY column1, column2,...;
SELECT
:选择要查询的列,可以是原始列或聚合函数的结果。FROM
:指定要查询的表。WHERE
(可选):添加筛选条件,用于在分组之前过滤数据。GROUP BY
:指定用于分组的列。可以使用一个或多个列进行分组.