mysql约束和高级sql详解

 更新时间:2024年11月12日 10:47:12   作者:瓜牛_gn  
文章介绍了MySQL中的约束类型(如主键、外键、唯一约束、非空约束、检查约束、默认值和自增)以及高级SQL功能(如子查询、连接、事务和存储过程),感兴趣的朋友一起看看吧

约束

MySQL中的约束用于定义表中数据的规则,以确保数据的准确性和可靠性。以下是MySQL中常用的一些约束类型及其概述:

  • PRIMARY KEY(主键):唯一标识表中每条记录的字段或字段组合, 一个表中只能有一个主键。
  • 主键字段的值不能为NULL。
  • FOREIGN KEY(外键):用于建立两个表之间的关系,确保引用的数据的完整性,外键字段的值必须在它所引用的表中存在,或者为NULL(取决于外键约束的设置)。
  • UNIQUE(唯一约束):保证列中的所有值都是唯一的,即不允许有重复的值
  • NOT NULL(非空约束):确保列中的值不能为NULL。
  • CHECK(检查约束):用于限制列中的值必须满足的条件。(在MySQL 8.0.16及更高版本中支持)
  • DEFAULT(默认值):当没有为列提供值时,将使用默认值。
  • AUTO_INCREMENT(自增):用于整数类型的列,自动为新记录生成一个唯一的数字。

 高级sql

MySQL 提供了多种高级功能来处理复杂的数据操作和业务逻辑。以下是你提到的几个关键概念的简要介绍:

1.子查询(Subquery):子查询是嵌套在另一个查询中的 SQL 查询。它可以返回单个值、一行或多行结果。子查询通常用在SELECT、INSERT、UPDATE和DELETE语句中,可以用于条件表达式或作为值提供者。

SELECT name, MAX(salary) AS max_salary
FROM employees
WHERE salary = (
  SELECT MAX(salary)
  FROM salaries
);

首先确定 salaries 表中最高的薪资是多少,然后在外层查询中查找 employees 表中薪资等于这个最高值的员工信息。

2. 连接(JOIN):连接用于结合两个或多个表的行,基于相关的列。MySQL 支持多种类型的连接,包括内连接、左连接、右连接和全连接(FULL JOIN)。

SELECT books.title, authors.name
FROM books
INNER JOIN authors ON books.author_id = authors.id;

这个查询的结果将是一个包含两列的表 books.title 和 authors.name,每一行都对应一个书籍及其作者的名称。

3.事务 (Transaction) : 事务用于处理操作量大,复杂度高的数据。事务是一组SQL语句的集合,它们要么全部成功执行,要么全部不执行,把一系列的操作放在一个地方,然后再决定是否生效。这种特性被称为原子性(Atomicity)。事务还必须满足一致性(Consistency)、隔离性(Isolation)和持久性(Durability)这三个特性,通常合称为ACID特性。

事务的基本操作MySQL通过以下三个主要的SQL语句来管理事务:

  • START TRANSACTION 或 BEGIN:标记事务的开始。
  • COMMIT:提交事务,将事务中的所有更改永久保存到数据库中。
  • ROLLBACK:回滚事务,撤销自事务开始以来的所有更改,使数据库回到事务开始前的状态。

自动提交模式默认情况下,MySQL在执行每个SQL语句后会自动提交事务。但是,你可以通过设置autocommit变量来控制这个行为:

  • SET autocommit=OFF或SET autocommit=0:关闭自动提交,这样就需要显式地使用COMMIT或ROLLBACK来结束事务。
  • SET autocommit=ON或SET autocommit=1:开启自动提交,每个SQL语句执行后都会自动提交。

事务的使用示例:

-- 开始事务
START TRANSACTION;
-- 给学生ID为1的学生增加10分
UPDATE student_scores SET score = score + 10 WHERE student_id = 1;
-- 检查是否更新成功
IF (SELECT ROW_COUNT()) > 0 THEN
    -- 如果更新成功,提交事务
    COMMIT;
    -- 查询更新后的结果
    SELECT * FROM student_scores WHERE student_id = 1;
ELSE
    -- 如果更新失败,回滚事务
    ROLLBACK;
    -- 查询当前的分数,确认没有变化
    SELECT * FROM student_scores WHERE student_id = 1;
END IF;

正确使用事务可以确保数据库操作的原子性和一致性,避免数据不一致的问题。

4.存储过程: MySQL存储过程是一组为了完成特定功能的SQL语句集合,它被编译并存储在数据库中,可被多次调用执行,使用存储过程可以提高性能,加强可维护性。

1.创建存储过程

  • DELIMITER:改变MySQL的命令结束符,因为存储过程中会用;作为SQL语句的结束,如果不改变结束符,MySQL会错误地在第一个;处结束存储过程的定义。
  • CREATE PROCEDURE:用来创建新的存储过程。
  • 参数:存储过程可以有参数,参数有三种类型:IN(输入参数)、OUT(输出参数)和INOUT(既可输入也可输出)。

2.存储过程体

  • BEGIN ... END:存储过程的主体部分,包含了要执行的SQL语句。
  • DECLARE:用来声明局部变量。
  • SET:用来给变量赋值。

示例:

DELIMITER //
CREATE PROCEDURE SumTwoNumbers(IN num1 INT, IN num2 INT, OUT result INT)
BEGIN
    SET result = num1 + num2;
END //
DELIMITER ;
  • DELIMITER //改变了MySQL的默认分隔符,这样我们就可以在存储过程内部使用分号。
  • CREATE PROCEDURE SumTwoNumbers 创建了一个名为  SumTwoNumbers  的存储过程。
  • IN num1 INT, IN num2 INT   定义了两个输入参数  num1  和  num2  ,它们都是整数类型。
  • OUT result INT   定义了一个输出参数  result  ,它也是整数类型,用于存储计算结果。
  • SET result = num1 + num2;   是存储过程的核心,它将两个输入参数相加,并将结果赋值给输出参数  result  。
  • END   标记了存储过程的结束。
  • DELIMITER ;   将分隔符重置回默认的分号。

如果要调用该存储内容:

CALL SumTwoNumbers(10, 20, @sumResult);
SELECT @sumResult;

到此这篇关于mysql约束和高级sql的文章就介绍到这了,更多相关mysql约束和高级sql内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Ubuntu Server下启动/停止/重启MySQL数据库的三种方式

    详解Ubuntu Server下启动/停止/重启MySQL数据库的三种方式

    本篇文章主要介绍了buntu Server下启动/停止/重启MySQL数据库的三种方式,具有一定的参考价值,有兴趣的可以了解一下。
    2017-01-01
  • MySQL延迟问题和数据刷盘策略流程分析

    MySQL延迟问题和数据刷盘策略流程分析

    这篇文章主要介绍了MySQL延迟问题和数据刷盘策略流程分析,本文要给大家提到了mysql复制流程,需要的朋友可以参考下
    2020-02-02
  • 浅谈MySql update会锁定哪些范围的数据

    浅谈MySql update会锁定哪些范围的数据

    本文主要介绍了记录一下MySql update会锁定哪些范围的数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • mySQL中in查询与exists查询的区别小结

    mySQL中in查询与exists查询的区别小结

    最近被一个朋友问到mySQL中in查询和exists的区别,当然只是草草的回答了下,今天偶然看到了一篇关于mysql中的exists查询的文章,读完感觉太”冷落”它了,这里总结一下,也跟自己常用的in查询做一下对比。有需要的朋友们可以参考借鉴,下面来一起学习学习吧。
    2016-11-11
  • 详解mysql建立索引的使用办法及优缺点分析

    详解mysql建立索引的使用办法及优缺点分析

    索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。下面介绍mysql建立索引的优缺点及常用使用方法。
    2016-07-07
  • MySQL 8.0数据字典缓存管理机制解析

    MySQL 8.0数据字典缓存管理机制解析

    MySQL 8.0中的数据字典,通过对两级缓存的逐级访问,以及精妙的对缓存未命中情况的处理方式,有效的加速了在不同场景下数据库对DD的访问速度,显著的提升了数据库访问元数据信息的效率,这篇文章主要介绍了解读MySQL 8.0数据字典缓存管理机制,需要的朋友可以参考下
    2024-07-07
  • MySQL5.0存储过程教程

    MySQL5.0存储过程教程

    Introduction 简介 MySQL 5.0 新特性教程是为需要了解5.0版本新特性的MySQL老用户而写的。简单的来说是介绍了“存储过程、触发器、视图、信息架构视图”,在此感谢译者陈朋奕的努力.
    2008-04-04
  • linux下mysql提示"mysql deamon failed to start"错误的解决方法

    linux下mysql提示"mysql deamon failed to start"错误的解决方法

    网站突然连接不上数据库,于是朋友直接重启了一下服务器。进到cli模式下,执行 service myqsld start 发现还是提示"mysql deamon failed to start"错误信息
    2013-04-04
  • mysql创建用户并赋予用户权限详细操作教程

    mysql创建用户并赋予用户权限详细操作教程

    这篇文章主要给大家介绍了关于mysql创建用户并赋予用户权限详细操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • mysql 8.0.25 解压版安装配置方法图文教程

    mysql 8.0.25 解压版安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 8.0.25 解压版安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07

最新评论