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、语法

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

3.1 参数分类

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

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

以delimiter 开始和结束

3.2 不加参数的存储过程

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

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

3.3 带参数的存储过程

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

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

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

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

3.4删除存储过程

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

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

事务

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

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

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

​ 减少数据库资源消耗

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

三、总结

1、连接查询

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

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

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

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

2、存储过程

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

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/103782.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C动态分配

动态分布与静态发布&#xff1a; 静态分配 1、 在程序编译或运行过程中&#xff0c;按事先规定大小分配内存空间的分配方式。int a [10] 2、 必须事先知道所需空间的大小。 3、 分配在栈区或全局变量区&#xff0c;一般以数组的形式。 4、 按计划分配。 动态分配 1、在程序运…

企业架构LNMP学习笔记7

PHP介绍&#xff1a; HTML&#xff1a;超文本标记语言 http: 超文本传输协议 端口80 浏览器将html代码解析成web页面。 PHP&#xff1a;超文本预处理器。后端语言开发&#xff0c;页面上需要动态改变修改的&#xff0c;需要连接数据库查询数据&#xff0c;转为html。 主要…

3D印刷电路板在线渲染查看工具

从概念上讲&#xff0c;这是有道理的&#xff0c;因为PCB印制电路板上的走线从一个连接到下一个连接的路线基本上是平面的。 然而&#xff0c;我们生活在一个 3 维世界中&#xff0c;能够以这种方式可视化电路以及相应的组件&#xff0c;对于设计过程很有帮助。本文将介绍KiCad…

MDK-Keil AC6 Compiler屏蔽特定警告

最近在使用STM32CubeMX生成MDK工程是&#xff0c;使用了 AC6 版本的编译器进行编译代码&#xff0c;然后发现了一些警告&#xff0c;但是在 AC5 版本下编译又正常。于是研究了下怎么屏蔽特定的警告&#xff0c;这里记录一下。 1. Keil AC6屏蔽特定警告 遇到的警告如下&#x…

【计算机网络】HTTP(上)

文章目录 1.HTTP概念2. URLurlencode 和 urldecode转义规则 3. HTTP的宏观理解HTTP的请求HTTP的响应 4. 见一见HTTP请求和响应请求报头 1. 模拟一个简单的响应response响应报头 2. 从路径中获取内容ReadFile函数的实现 3.不同资源进行区分反序列化的实现ReadOneLine函数的实现P…

Delphi、C# 和 TypeScript 之父 Anders Hejlsberg(安德斯·海尔斯伯格,海神)赶潮AI

自2022年11月ChatGPT横空出世&#xff0c;一波由AIGC引发的热潮轰轰烈烈持续传播。 全球各国政府及大型互联网企业都在积极布局人工智能解决方案&#xff0c;抢占人工智能高地&#xff0c;推动人工智能产业健康发展。 Delphi、C# 和 TypeScript 之父&#xff0c;位列Microsof…

flink的物理DataFlow图及Slot处理槽任务分配

背景 在flink中&#xff0c;有几个比较重要的概念&#xff0c;逻辑DataFlow图&#xff0c;物理DataFlow图以及处理槽执行任务&#xff0c;本文就来讲解下这几个概念 概念详解 假设有以下代码&#xff1a;数据源和统计单词算子的并行度是2&#xff0c;数据汇算子的并行度是1&…

HotSpot垃圾收集算法实现细节

文章目录 根节点枚举安全点安全区域记忆集与卡表写屏障三色标记 根节点枚举 在可达性分析算法中&#xff0c;由于GC Roots众多&#xff0c;所以在从GC Roots集合中进行引用链查找时会耗费大量时间。 迄今为止&#xff0c;所有收集器在根节点枚举这一步骤时都是必须暂停用户线…

​怎么安全无损地将操作系统转移到固态硬盘?

为什么需要转移系统到固态硬盘&#xff1f; 现如今&#xff0c;许多用户想要将自己的操作系统转移到固态硬盘&#xff0c;这是为什么呢&#xff1f;我们在下面向大家简单地介绍了一下迁移系统的优势&#xff1a; ​提升计算机性能&#xff1a;硬盘&#xff08;HDD…

储能直流侧计量表DJSF1352

安科瑞 华楠 具有CE/UL/CPA/TUV认证 DJSF1352-RN导轨式直流电能表带有双路直流输入&#xff0c;主要针对电信基站、直流充电桩、太阳能光伏等应用场合而设计&#xff0c;该系列仪表可测量直流系统中的电压、电流、功率以及正反向电能等。在实际使用现场&#xff0c;即可计量总…

Golang-GJSON 快速而简单的方法来从 json 文档获取值

GJSON 是一个 Go 包&#xff0c;它提供了一种快速而简单的方法来从 json 文档获取值。它具有单行搜索、点符号路径、迭代和解析 json 行等功能。 GJSON 也可用于Python和Rust 入门 安装中 要开始使用GJSON 请安装 Go 并运行 go get &#xff1a; $ go get -u github.com/ti…

使用rabbitmq进行支付之后的消息通知

订单服务完成支付后将支付结果发给每一个与订单服务对接的微服务&#xff0c;订单服务将消息发给交换机&#xff0c;由交换机广播消息&#xff0c;每个订阅消息的微服务都可以接收到支付结果. 微服务收到支付结果根据订单的类型去更新自己的业务数据。 相关技术方案 使用消息…