• MySQL 连接查询和存储过程


    一、连接查询

    mysql的连接查询,通常都是将来自两个或多个表的记录行结合起来,基于这些表之间的共同字段,进行数据的拼接

    首先,要确定一个主表作为结果集,然后将其它表的行有选择性的连接到选定的主表结果上,使用较多的 连接查询包括:内连接(子查询)、左连接和右链接(外连)。

    下面的实验,均以下两个表进行实验

    1、内连查询

    mysql中的内连接就是两张或多张中同时符合某种条件的数据记录的组合,通常在from子句中使用关键字inner join 来连接多张表,并使用on子句设置连接条件,内连接是系统默认的表连接,所以在from子句后可以省略inner 关键字,值使用关键字join。

    同时有多个表时,也可以联系使用inner join来实现多表的内连接,不过为了更好的性能,建议最好不要超过三个表。

    语法格式:select 表名1.字段1 表名2.字段2 from 表名1 inner join 表名2 on 表名1.字段=表名2.字段;

    select info.name,info.score from info inner join info2 on info.name=info2,name;
    #查询info表和info2表中name相同的行,只显示,info表中的name和score字段数据

    2、左连接

    左连接也可以被称为左外连接, 在from子句中使用left join 或者 left outer join 关键字来表示

    左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参考中的记录进行匹配,也就是说 匹配左表的所有行以及右表中符合条件的行。

    select * from info left join info2 on info.name=info2.name;
    #左表的内容将全部显示,右表只会显示与左表共同字段的记录,当右表没有数据将与null显示

    3、右链接

    右连接也称为右外连接,在from子句中使用right join 或者right outer join 关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中所有行,并用这些记录与左表中的行进行匹配。

    select * from info right join info2 on info.name=info2.name;
    #右表全部的内容显示,左表只显示相同字段的记录,左表不足的地方以null显示

    二、存储过程

    1、存储过程简介

    存储过程与函数的直接效果类似,只不过存储过程,封装的是一组sql语句。

    mysql数据库过程是一组为了完成特定功能的sql语句的集合。

    存储过程这个功能时从5.0版本才开始支持的,它可以加快数据库的处理速度,增强数据库在实际应用中的灵活性。

    存储过程在使用过程中是将常用或复杂的工作预先使用sql语句写好,并用一个指定的名称存储起来,这个过程编译和优化后存储在数据库服务器中,当需要使用该存储过程时,只需要调用它即可。

    操作数据库的传统sql语句在执行时,需要先编译,然后再去执行,跟存储过程一对比,明显存储过程在执行速度更快,效率更高。存储过程在数据库中创建并保存。它不仅仅是sql了语句的集合,还可以加入一些特殊的控制结构,也可以控制数据的访问方式。

    2、存储过程的优点

    执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
    sql语句加上控制语句的集合,灵活性高
    在服务器端存储,客户端调用时,降低网络负载
    可多次重复被调用,可随时修改,不影响客户端调用。
    可完成所有的数据库操作,也可控制数据库的信息访问权限

    3、语法

    1. create procedure  <过程名> ([过程参数....]) <过程体>
    2. [过程参数....] 格式
    3. <过程名>:尽量避免与内置的函数或字段重名
    4. <过程体>:语句
    5. [in|out|inout] <参数名><类型>

    3.1 参数分类

    存储过程的主题部分,即过程体

    以begin 开始,end结束,若只有一条sql语句,可省略begin 和end

    以delimiter 开始和结束

    3.2 不加参数的存储过程

    1. delimiter @@ ##将语句的结束符号从分号临时修改为@@,以防出问题,可以自定义
    2. create proceduer ydq() #创建存储过程,过程自定义,()可带参数
    3. begin #过程体以关键字begin开始
    4. select * from info; #过程体语句(可有多条)
    5. end @@ #过程体以关键字end结尾
    6. delimiter ; #将语句的结束符号恢复为分号
    7. show create proceduer ydq\G
    8. #查看存储过程信息
    9. call ydq(); #调用存储过程

    以下面两个表,写出内连查询的存储过程

    3.3 带参数的存储过程

    in输入参数: in 表示调用者向过程传入值(传入值可以是字面量或变量)

    out输出参数: out表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)

    inout输入/输出参数: inout,即表示调用者向过程传入值,又表示过程向调用者传入值(只能是变量)

    1. delimiter $$
    2. create procedure ydq01(in inname varchar(40))
    3. begin
    4. create table if not exists ydq(id int(4),name varchar(40),score decimal(5,2));
    5. insert into ydq values(1,'zhangsan',100),(2,'lisi',99);
    6. select * from ydq where name=inname;
    7. end $$
    8. delimiter ;
    9. call ydq01('lisi')

    3.4删除存储过程

    1. drop procedure if exists ydq;
    2. #删除ydq存储过程

    3.5 事务和存储过程有什么区别?

    事务

    实际而言,是存储引擎的特性
    目的性: 事务,是为了保证数据的一致性、完整性、原子性、持久性(ACID)
    存储过程

    存储过程中,包含了事务。(要看具体的存储引擎,因为myisam不支持事务)

    存储过程的目的性: 简化复杂性操作

    ​ 减少数据库资源消耗

    ​ 可以通过传参,方便、灵活的进行sql查询类操作

    三、总结

    1、连接查询

    连接查询分为内连查询和左查询、右查询。

    内连接:使用inner join 连接不同的表,显示的数据为左右表都同时满足的条件

    左连接: 使用left join 连接不同的表,以左表为基础显示,去匹配右表显示满足条件的记录

    右连接: 使用 right joi 连接不同的表,以右表为基础显示,去匹配左表显示满足条件的记录

    2、存储过程

    存储过程是将一些sql语句存储在集合里面,当需要执行这些语句的时候,就可进行call调用这个存储过程,整体逻辑跟shell中函数一致。

    主要可避免提高执行sql语句的效率、提高灵活率。

     

  • 相关阅读:
    2022年网络安全国赛内存取证WP
    MySQL:码包安装mysql(5.6.51)
    vscode在mac上保存项目文件提示保存失败
    vue3 响应式 API 之 reactive
    AntDB数据并行加载工具的实现
    使用 OpenSSL 创建ssl证书
    作为前端你还不懂MutationObserver?那Out了
    【云原生Kubernetes系列第二篇】kubeadm v1.20 部署K8S 集群架构【admin部署】
    2023年建筑电工(建筑特殊工种)证考试题库及建筑电工(建筑特殊工种)试题解析
    redis高可用之持久化
  • 原文地址:https://blog.csdn.net/khvbjhb/article/details/132708983