当前位置: 代码网 > it编程>数据库>Mysql > mysql约束和高级sql详解

mysql约束和高级sql详解

2024年11月13日 Mysql 我要评论
约束mysql中的约束用于定义表中数据的规则,以确保数据的准确性和可靠性。以下是mysql中常用的一些约束类型及其概述:primary key(主键):唯一标识表中每条记录的字段或字段组合, 一个表中

约束

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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com