Mysql常见sql

[复制链接]
发表于 2025-3-24 09:47:17 | 显示全部楼层 |阅读模式

以下是一些 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;
    
  • DESCRIBEDESC:查看表的结构,包括列名、数据类型等信息。
    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);
    

事务控制命令

  • START TRANSACTIONBEGIN:开始一个事务。
    START TRANSACTION;
    -- 或
    BEGIN;
    
  • COMMIT:提交事务,使事务中的所有操作永久生效。
    COMMIT;
    
  • ROLLBACK:回滚事务,撤销事务中的所有操作。
    ROLLBACK;
    

以上命令涵盖了 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(输入输出)。
  • BEGINEND:定义存储过程的主体部分。
  • 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...ELSECASELOOPWHILEREPEAT 等。

条件语句

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 ;

存储过程中的变量

可以在存储过程中声明变量,并使用 SETSELECT 语句为其赋值。

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 TRANSACTIONCOMMITROLLBACK

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

在存储过程中可以使用 PREPAREEXECUTE 语句来执行动态 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:定义每个分区的具体范围或值。

常见的分区类型

  1. 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)
    );
    

    这个例子创建了一个按订单日期年份进行范围分区的表。

  2. 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)
    );
    
  3. HASH 分区:基于用户定义的表达式的返回值来进行选择的分区。

    CREATE TABLE clients (
        id INT NOT NULL,
        name VARCHAR(50)
    )
    PARTITION BY HASH (id)
    PARTITIONS 4;
    
  4. KEY 分区:类似于 HASH 分区,但使用数据库提供的哈希函数。

    CREATE TABLE employees (
        id INT NOT NULL,
        name VARCHAR(50)
    )
    PARTITION BY KEY (id)
    PARTITIONS 4;
    

管理分区

  1. 添加分区

    ALTER TABLE orders ADD PARTITION (
        PARTITION p2025 VALUES LESS THAN (2026)
    );
    
  2. 删除分区

    ALTER TABLE orders DROP PARTITION p2022;
    
  3. 合并分区

    ALTER TABLE sales REORGANIZE PARTITION p3 INTO (
        PARTITION p5 VALUES LESS THAN (2023)
    );
    
  4. 查看分区信息

    SELECT * FROM information_schema.partitions WHERE table_name = 'orders';
    

注意事项

  • 分区列必须是表中的一个或多个列。
  • 对于 RANGE 和 LIST 分区,分区值必须严格递增。
  • 分区可以提高查询性能,尤其是在处理大量数据时,但需要合理设计分区策略。

以上是 MySQL 分区的基本语法和一些常用操作示例。根据实际需求选择合适的分区类型和策略,可以有效提高数据库的性能和可管理性。

GMT+8, 2025-9-5 18:30 , Processed in 0.096558 second(s), 35 queries Archiver|手机版|小黑屋|Attic ( 京ICP备2020048627号 )

快速回复 返回顶部 返回列表