mysql连接查询与存储过程

news/2024/11/28 8:49:23/

一,连接查询

        MySQL 的连接查询,通常都是将来自两个或多个表的记录行结合起来,基于这些表之间的 共同字段,进行数据的拼接。首先,要确定一个主表作为结果集,然后将其他表的行有选择 性的连接到选定的主表结果集上。使用较多的连接查询包括:内连接、左连接和右连接

        1,内连接

        MySQL 中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。通常在 FROM 子句中使用关键字 INNER JOIN 来连接多张表,并使用 ON 子句设置连接条件,内连接是系统默认的表连接,所以在 FROM 子句后可以省略 INNER 关键字,只使用 关键字 JOIN。同时有多个表时,也可以连续使用 INNER JOIN 来实现多表的内连接,不过为了更好的性能,建议最好不要超过三个表。

        内连查询:通过inner join 的方式将两张表指定的相同字段的记录行输出出来

        语法:SELECT column_name(s)FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

实验:

创建模板
create table infos(name varchar(40),score decimal(4,2),address varchar(40));
insert into infos values('wangwu',80,'beijing'),('zhangsan',99,'shanghai'),('lisi',100,'nanjing');select info.id,info.name from info inner join infos on info.name=infos.name;

        2,左连接

        左连接也可以被称为左外连接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 关键字来表示。左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参 考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行。

        左连接中左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录,右表记录不足的地方均为 NULL。

select * from info left join infos on info.name=infos.name;

        3,右连接

        右连接也被称为右外连接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配。
        在右连接的查询结果集中,除了符合匹配规则的行外,还包括右表中有但是左表中不匹 配的行,这些记录在左表中以 NULL 补足。

select * from info right join infos on info.name=infos.name;

        

二,存储过程

        1,什么是存储过程

        存储过程是一组为了完成特定功能的SQL语句集合。 

        存储过程这个功能是从5.0版本才开始支持的,它可以加快数据库的处理速度,增强数据库在实际应用中的灵活性。存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。操作数据库的传统 SQL 语句在执行时需要先编译,然后再去执行,跟存储过程一对比,明显存储过程在执行上速度更快,效率更高。

        存储过程在数据库中创建并保存,它不仅仅是 SQ语句的集合,还可以加入一些特殊的控制结构,也可以控制数据的访问方式。存储过程的应用范围很广,例如封装特定的功能、 在不同的应用程序或平台上执行相同的函数等等。

        2,存储过程的优点:

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

        3,语法:

CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体>
[过程参数[,…] ] 格式
<过程名>:尽量避免与内置的函数或字段重名
<过程体>:语句
[ IN | OUT | INOUT ] <参数名><类型>示例(不带参数的创建
##创建存储过程##
DELIMITER $$							#将语句的结束符号从分号;临时改为两个$$(可以自定义)
CREATE PROCEDURE Proc()					#创建存储过程,过程名为Proc,不带参数
-> BEGIN								#过程体以关键字 BEGIN 开始
-> create table mk (id int (10), name char(10),score int (10));
-> insert into mk values (1, 'wang',13);
-> select * from mk;			        #过程体语句
-> END $$								#过程体以关键字 END 结束
DELIMITER ;								#将语句的结束符号恢复为分号##调用存储过程##
CALL Proc();I    存储过程的主体都分,被称为过程体
II   以BEGIN开始,以END结束,若只有一条sQL语句,则可以省略BEGIN-END
III  以DELIMITER开始和结束  
mysgl>DEL工M工TER $$      $$是用户自定义的结束符 
省略存储过程其他步骤
mysql>DELIMITER ;  分号前有空格##查看存储过程##
格式:
SHOW CREATE PROCEDURE [数据库.]存储过程名;		#查看某个存储过程的具体信息示例
show create procedure proc\G查看存储过程
SHOW PROCEDURE STATUS 查看指定存储过程信息
mysql> SHOW PROCEDURE STATUS like '%proc%'\G##存储过程的参数##
IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
即表示调用者向过程传入值,又表示过程向调用者传出值(只能是变量)示例:
mysql> delimiter @@
mysql> create procedure proc (in inname varchar(40))     #行参-> begin-> select * from info where name=inname;-> end @@
mysql> delimiter @@			
mysql> call proc2('wangwu');              #实参修改存储过程
ALTER PROCEDURE <过程名>[<特征>... ]
ALTER PROCEDURE GetRole MODIFIES SQL DATA SQL SECURITY INVOKER;
MODIFIES sQLDATA:表明子程序包含写数据的语句
SECURITY:安全等级
invoker:当定义为INVOKER时,只要执行者有执行权限,就可以成功执行。##删除存储过程##
存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。DROP PROCEDURE IF EXISTS Proc;


http://www.ppmy.cn/news/1078764.html

相关文章

ViT论文Pytorch代码解读

ViT论文代码实现 论文地址&#xff1a;https://arxiv.org/abs/2010.11929 Pytorch代码地址&#xff1a;https://github.com/lucidrains/vit-pytorch ViT结构图 调用代码 import torch from vit_pytorch import ViTdef test():v ViT(image_size 256, patch_size 32, num_cl…

【前端demo】圣诞节灯泡 CSS动画实现轮流闪灯

文章目录 效果过程灯泡闪亮实现&#xff08;animation和box-shadow&#xff09;控制灯泡闪亮时间和顺序&#xff08;animation-delay&#xff09;按钮开关 代码htmlcssjs 参考代码1代码2 前端demo目录 效果 效果预览&#xff1a;https://codepen.io/karshey/pen/zYyBRWZ 参考…

spring AOP之代理

1.代理概念 什么是代理 为某一个对象创建一个代理对象&#xff0c;程序不直接用原本的对象&#xff0c;而是由创建的代理对象来控制原对象&#xff0c;通过代理类这中间一层&#xff0c;能有效控制对委托类对象的直接访问&#xff0c;也可以很好的隐藏和保护委托类对象&#x…

IBM安全发布《2023年数据泄露成本报告》,数据泄露成本创新高

近日&#xff0c;IBM安全发布了《2023年数据泄露成本报告》&#xff0c;该报告针对全球553个组织所经历的数据泄露事件进行深入分析研究&#xff0c;探讨数据泄露的根本原因&#xff0c;以及能够减少数据泄露的技术手段。 根据报告显示&#xff0c;2023年数据泄露的全球平均成…

ransac拟合平面,代替open3d的segment_plane

0.open3d打包太大了&#xff0c;所以决定网上找找代码 使用open3d拟合平面并且求平面的法向量&#xff0c;open3d打包大概1个g的大小。 import open3d as o3dpcd o3d.geometry.PointCloud()pcd.points o3d.utility.Vector3dVector(points)## 使用RANSAC算法拟合平面plane_m…

【ES6】Promise.race的用法

Promise.race()方法同样是将多个 Promise 实例&#xff0c;包装成一个新的 Promise 实例。 const p Promise.race([p1, p2, p3]);上面代码中&#xff0c;只要p1、p2、p3之中有一个实例率先改变状态&#xff0c;p的状态就跟着改变。那个率先改变的 Promise 实例的返回值&#…

union all 和 union 的区别,mysql union全连接查询

602. 好友申请 II &#xff1a;谁有最多的好友(力扣mysql题,难度:中等) RequestAccepted 表&#xff1a; ------------------------- | Column Name | Type | ------------------------- | requester_id | int | | accepter_id | int | | accept_date …

新款奥迪 A7L 正式上市,媒介盒子多家媒体助阵

新款奥迪 A7L 正式上市&#xff0c;媒介盒子多家媒体助阵&#xff01; 哈喽,大家好,今天媒介盒子小编又来跟大家分享媒体推广的干货知识了,本篇分享的主要内容是:新车上市,上汽奥迪A7L的营销策略。 新款奥迪 A7L 正式上市&#xff0c;新车推出 11 款车型&#xff0c;售价为 4…