以下是一些 MySQL 数据库中常用的 SQL 命令:
数据库操作命令
CREATE DATABASE
:创建新的数据库。
CREATE DATABASE db_name;
SHOW DATABASES
:显示系统中所有的数据库。
SHOW DATABASES;
USE
:选择要操作的数据库。
USE db_name;
DROP DATABASE
:删除指定的数据库。
DROP DATABASE db_name;
数据表操作命令
CREATE TABLE
:创建新的数据表。
CREATE TABLE table_name (
column1 datatype [constraints],
column2 datatype [constraints],
...
);
SHOW TABLES
:显示当前数据库中的所有数据表。
SHOW TABLES;
DESCRIBE
或 DESC
:查看表的结构,包括列名、数据类型等信息。
DESCRIBE table_name;
-- 或
DESC table_name;
ALTER TABLE
:修改表的结构,如添加、删除或修改列等。
ALTER TABLE table_name ADD column_name datatype [constraints];
ALTER TABLE table_name DROP COLUMN column_name;
ALTER TABLE table_name MODIFY COLUMN column_name datatype [constraints];
DROP TABLE
:删除指定的数据表。
DROP TABLE table_name;
数据操作命令
INSERT INTO
:向表中插入新的数据行。
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
-- 或插入多行数据
INSERT INTO table_name (column1, column2, ...) VALUES
(value1_1, value1_2, ...),
(value2_1, value2_2, ...),
...;
SELECT
:从表中检索数据。
SELECT column1, column2, ... FROM table_name;
-- 或选择所有列
SELECT * FROM table_name;
UPDATE
:更新表中已存在的数据行。
UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;
DELETE FROM
:删除表中的数据行。
DELETE FROM table_name WHERE condition;
TRUNCATE TABLE
:清空表中的所有数据,但保留表的结构。
TRUNCATE TABLE table_name;
数据查询命令(SELECT
的扩展用法)
WHERE
:用于指定筛选条件,过滤查询结果。
SELECT column1, column2, ... FROM table_name WHERE condition;
ORDER BY
:对查询结果进行排序,可按升序(ASC,默认)或降序(DESC)排列。
SELECT column1, column2, ... FROM table_name ORDER BY column_name [ASC|DESC];
GROUP BY
:将查询结果按一个或多个列进行分组,通常与聚合函数一起使用。
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE condition
GROUP BY column_name;
HAVING
:用于筛选满足特定条件的分组,通常与 GROUP BY
一起使用。
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE condition
GROUP BY column_name
HAVING condition;
LIMIT
:限制查询结果返回的行数,常用于分页查询。
SELECT column1, column2, ... FROM table_name LIMIT start, count;
-- 例如,获取前10行
SELECT * FROM table_name LIMIT 0, 10;
-- 或获取第11到第20行
SELECT * FROM table_name LIMIT 10, 10;
数据完整性约束命令
PRIMARY KEY
:设置主键约束,确保列的值唯一且非空。
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
FOREIGN KEY
:设置外键约束,建立表之间的关联关系。
ALTER TABLE table_name ADD FOREIGN KEY (column_name) REFERENCES referenced_table_name (referenced_column_name);
UNIQUE
:设置唯一约束,确保列的值唯一。
ALTER TABLE table_name ADD UNIQUE (column_name);
NOT NULL
:设置非空约束,确保列必须有值。
ALTER TABLE table_name MODIFY COLUMN column_name datatype NOT NULL;
CHECK
:设置检查约束,限制列的取值范围。
ALTER TABLE table_name ADD CHECK (condition);
事务控制命令
以上命令涵盖了 MySQL 数据库中常见的操作,包括数据库和数据表的管理、数据的增删改查、数据查询的筛选与排序、数据完整性约束以及事务控制等。在实际应用中,这些命令可以根据需求组合使用,以实现更复杂的功能。
存储过程
在 MySQL 中,存储过程是一种在数据库中定义的程序,它包含了一系列 SQL 语句和控制流语句,用于执行特定的任务。以下是 MySQL 存储过程的基本 SQL 语法:
创建存储过程
DELIMITER $$
CREATE PROCEDURE procedure_name (parameter_list)
BEGIN
-- SQL 语句
END$$
DELIMITER ;
DELIMITER $$
:更改语句结束符为 $$
,以便能够定义包含多个 SQL 语句的存储过程。
CREATE PROCEDURE procedure_name
:定义存储过程的名称。
parameter_list
:可选参数列表,用于向存储过程传递参数。参数可以是 IN
(输入)、OUT
(输出)或 INOUT
(输入输出)。
BEGIN
和 END
:定义存储过程的主体部分。
DELIMITER ;
:将语句结束符改回默认的分号 ;
。
示例:创建一个简单的存储过程
DELIMITER $$
CREATE PROCEDURE SimpleProcedure()
BEGIN
SELECT 'Hello, World!';
END$$
DELIMITER ;
调用存储过程
CALL procedure_name(parameter_values);
CALL
:用于调用存储过程。
parameter_values
:调用存储过程时传递的参数值。
示例:调用存储过程
CALL SimpleProcedure();
创建带参数的存储过程
DELIMITER $$
CREATE PROCEDURE AddNumbers(IN num1 INT, IN num2 INT, OUT sum INT)
BEGIN
SET sum = num1 + num2;
END$$
DELIMITER ;
示例:调用带参数的存储过程
CALL AddNumbers(5, 3, @result);
SELECT @result;
删除存储过程
DROP PROCEDURE procedure_name;
示例:删除存储过程
DROP PROCEDURE AddNumbers;
存储过程中的控制流语句
MySQL 存储过程支持多种控制流语句,如 IF...ELSE
、CASE
、LOOP
、WHILE
、REPEAT
等。
条件语句
DELIMITER $$
CREATE PROCEDURE ConditionalProcedure(IN value INT)
BEGIN
IF value > 0 THEN
SELECT 'Positive number';
ELSEIF value < 0 THEN
SELECT 'Negative number';
ELSE
SELECT 'Zero';
END IF;
END$$
DELIMITER ;
循环语句
DELIMITER $$
CREATE PROCEDURE LoopProcedure()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 5 DO
SELECT i;
SET i = i + 1;
END WHILE;
END$$
DELIMITER ;
存储过程中的变量
可以在存储过程中声明变量,并使用 SET
或 SELECT
语句为其赋值。
DELIMITER $$
CREATE PROCEDURE VariableProcedure()
BEGIN
DECLARE var1 INT;
DECLARE var2 VARCHAR(50);
SET var1 = 10;
SET var2 = 'Hello, MySQL!';
SELECT var1, var2;
END$$
DELIMITER ;
存储过程中的事务
存储过程可以包含事务控制语句,如 START TRANSACTION
、COMMIT
和 ROLLBACK
。
DELIMITER $$
CREATE PROCEDURE TransactionProcedure()
BEGIN
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;
END$$
DELIMITER ;
动态 SQL
在存储过程中可以使用 PREPARE
和 EXECUTE
语句来执行动态 SQL。
DELIMITER $$
CREATE PROCEDURE DynamicSQLProcedure(IN tableName VARCHAR(50))
BEGIN
SET @query = CONCAT('SELECT * FROM ', tableName);
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;
以上是 MySQL 存储过程的基本语法和一些常用示例。通过存储过程,可以将复杂的业务逻辑封装在数据库中,提高代码的复用性和安全性。
mysql 分区
在 MySQL 中,分区是一种将大型表分解为更小、更易于管理的部分的技术。以下是 MySQL 分区的基本 SQL 语法和一些示例:
创建分区表
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
...
)
PARTITION BY partition_type (partition_column)
[SUBPARTITION BY subpartition_type (subpartition_expression)]
[ (partition_definition [, partition_definition] ...) ];
PARTITION BY
:指定分区类型和分区列。
SUBPARTITION BY
:可选,用于定义子分区。
partition_definition
:定义每个分区的具体范围或值。
常见的分区类型
-
RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区。
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
order_date DATE NOT NULL,
amount DECIMAL(10, 2) NOT NULL
)
PARTITION BY RANGE (YEAR(order_date)) (
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025)
);
这个例子创建了一个按订单日期年份进行范围分区的表。
-
LIST 分区:类似于 RANGE 分区,但 LIST 分区是基于列值匹配一个离散值集合中的某个值来进行选择。
CREATE TABLE tb_group (
id INT NOT NULL AUTO_INCREMENT,
group_name VARCHAR(20) DEFAULT NULL,
PRIMARY KEY (id)
)
PARTITION BY LIST (id) (
PARTITION p0 VALUES IN (1, 3, 5),
PARTITION p1 VALUES IN (2, 4, 6)
);
-
HASH 分区:基于用户定义的表达式的返回值来进行选择的分区。
CREATE TABLE clients (
id INT NOT NULL,
name VARCHAR(50)
)
PARTITION BY HASH (id)
PARTITIONS 4;
-
KEY 分区:类似于 HASH 分区,但使用数据库提供的哈希函数。
CREATE TABLE employees (
id INT NOT NULL,
name VARCHAR(50)
)
PARTITION BY KEY (id)
PARTITIONS 4;
管理分区
-
添加分区
ALTER TABLE orders ADD PARTITION (
PARTITION p2025 VALUES LESS THAN (2026)
);
-
删除分区
ALTER TABLE orders DROP PARTITION p2022;
-
合并分区
ALTER TABLE sales REORGANIZE PARTITION p3 INTO (
PARTITION p5 VALUES LESS THAN (2023)
);
-
查看分区信息
SELECT * FROM information_schema.partitions WHERE table_name = 'orders';
注意事项
- 分区列必须是表中的一个或多个列。
- 对于 RANGE 和 LIST 分区,分区值必须严格递增。
- 分区可以提高查询性能,尤其是在处理大量数据时,但需要合理设计分区策略。
以上是 MySQL 分区的基本语法和一些常用操作示例。根据实际需求选择合适的分区类型和策略,可以有效提高数据库的性能和可管理性。