连接

当我们需要从多个表查询数据时,我们就需要使用到连接操作,mysql支持内连接,左连接以及右连接三种连接方式。

数据库准备

首先我们创建两个表t1, t2:

create table t1(i1 int, c1 varchar(10));
create table t2(i2 int, c2 varchar(10));

  插入数据:

insert into t1 values (1, 'a'), (2, 'b'), (3, 'c');
insert into t2 values (2, 'c'), (3, 'b'), (4, 'a');

  最后可以查看我们的数据库表如下:

内连接

如果在SELECT语句的FROM子句中列出多个数据表,并用INNER JOIN将它们的名字隔开,MYSQL将执行内连接操作,这将通过把一个数据表里的数据行与另一个数据表里的数据行进行匹配产生结果。比如,下面的查询将把t1里的每一个数据行与t2里的每一个数据行组合:

不加任何条件的内连接将产生笛卡尔积,结果行数是两张数据表行数的乘积,例如两张表分别有1000条数据,那么结果行数将有100万条数据,所以我们在用内连接时一般会加上条件,下面的查询只会选出t1.i1=t2.i2的行,大大减少了检出行:

外连接

内连接只显示在两个数据表里都能找到匹配的数据行,外连接除了显示同样的匹配结果,还可以把其中一个数据表在另一个数据表里没有匹配的数据行也显示出来,mysql支持的外连接分左外连接(LEFT JOIN)和右外连接(RIGHT JOIN)。

LEFT JOIN的工作情况是这样的:两个数据表,以左表为基准,当来自左表的某个数据行与右表的某个数据行匹配时,那两个数据表的内容就会作为一个输出行;如果右表没有匹配行,那么也会产生输出行,此时右表的内容用NULL填充。

RIGHT JOIN与LEFT JOIN相似,只是以右表为基准,如果左表不匹配,用NULL填充。

我们用LEFT JOIN代替上例的INNER JOIN,得到的输出如下:

有时候,我们在编写左连接时,真正感兴趣的是那些左数据表里没被匹配的行,这时候我们可以用IS NULL判断条件把这些行挑选出来:

RIGHT JOIN与LEFT JOIN十分相似,而且所有RIGHT JOIN都能改写成LEFT JOIN这里就不举例了,而且就我的工作经验来看,工作中统一写LEFT JOIN更好。

存储过程                                                                                           

存储过程简单来说,就是为以后的使用而保存的一条或多条MYSQL语句的集合,可将其视为批文件,虽然它们的作用不仅限于批处理。

1、数据库准备

首先使用以下命令创建一个数据库并批量插入数据:

create table g(num int,value  varchar(10)); 

insert into g values(1, '1'),(10, '10'),(60, '60'),(100, '100');

查看该表数据如下:

  

2、调用存储过程

在创建存储过程之前,先说一下如何调用存储过程,调用存储过程的命令如下:

call 存储过程名字();

2.1、创建封装sql存储过程

存储过程的一个作用就是封装sql,我们创建的第一个存储过程就是封装一个select语句:

DELIMITER //
CREATE PROCEDURE p1()
BEGIN
select * from g;
END//
DELIMITER ;

"DELIMITER //"的作用是把行结束符替换为//,默认的行结束符是";"。为什么要替换行结束符呢?因为创建存储过程是一条独立语句,但是这条创建语句内部一般都会包含以";"结束的语句,如果我们不更改结束符,那么语句解析到";"就会提前结束。

以上面的语句为例,如果我们不更改行结束符,那么创建语句到"select * from g;"就会结束(因为遇到了行结束符";"),这显然不是我们想要的,但是我们更改结束符后,创建语句会一直解析到"END //",成功创建存储过程。

最后别忘了调用"DELIMITER ;"把行结束符改回来。

创建完后我们调用一下该存储过程,结果如下:

        

2.2、创建包含参数的存储过程

存储过程还可以包含参数,下面我们创建一个包含参数的存储过程 

DELIMITER //
CREATE PROCEDURE p2(IN n int, OUT avg double, INOUT min int)
BEGIN
select avg(num) from g where num > n INTO avg;
select min(num) from g where num > n INTO min;
END//
DELIMITER ;

注意,在参数前面包含IN,OUT,INOUT关键字,IN表示传入值,OUT表示传出值,INOUT表示即可以传入也可以传出。

最后,我们调用一下我们创建的存储过程如下:

2.3、包含控制结构的存储过程

存储过程还可以包含if-else结构,例子如下:

DELIMITER //
CREATE PROCEDURE p3(IN n int, IN switch char(1))
BEGIN
if switch='a' then
select * from g where num > n;
else
select * from g where num > n;
end if;
END//
DELIMITER ;

  调用该存储过程的结果如下:

2.4、包含循环的存储过程

除了包含if-else结构,存储过程还可以包含while循环结构,举例如下:

DELIMITER //
CREATE PROCEDURE p4(IN n int)
BEGIN
declare i int;
declare s int;
set i = 1;
set s = 0;
while i <= n do
set s = s + i;
set i = i + 1;
end while;
select s;
END//
DELIMITER ;

  该存储过程将计算从1到n的累加,调用该存储过程的例子如下:

3、查看现有的存储过程

如果想知道数据库有哪些存储过程,我们可以使用以下命令查看:

show procedure status

4、删除存储过程

如果想要删除存储过程,我们可以使用如下命令:

drop procedure 存储过程的名字

5、查看存储过程的创建语句

有的时候我们想要查看存储过程的创建语句那么我们可以使用以下命令:

show create procedure 存储过程的名字

6、存储过程与存储函数  

  在mysql中除了存储过程,还有存储函数,存储过程与存储函数的区别有两点:

1、创建语句不一样,存储过程使用命令"CREATE PROCEDURE"创建,存储函数使用命令"CREATE FUNCTION"创建;

2、存储过程没有返回值,而函数有返回值。

MYSQL学习笔记——连接以及存储过程的更多相关文章

  1. MySQL学习笔记九:存储过程,存储函数,触发器

    存储过程 1.存储过程由一组特定功能的SQL语句组成,对于大型应用程序优势较大,相对不使用存储过程,具有以下优点: a.性能提高,因为存储过程是预编译的,只需编译一次,以后调用就不须再编译 b.重用性 ...

  2. MySQL学习笔记:调用存储过程或函数报1418错误

    问题 MySQL开启bin-log后,调用存储过程或者函数以及触发器时,会出现错误号为1418的错误: ERROR 1418 (HY000): This function has none of DE ...

  3. MySQL学习笔记:删除存储过程和函数

    删除存储过程.存储函数主要使用drop语句: drop procedure  —— 删除存储过程 drop function  —— 删除存储函数 语法: DROP {PROCEDURE|FUNCTI ...

  4. MySQL学习笔记一

    MySQL 学习笔记 一 一.数据库简单介绍 1. 按照数据库的发展时间顺序,主要出现了以下类型数据库系统: Ø 网状型数据库 Ø 层次型数据库 Ø 关系型数据库 Ø 面向对象数据库 上面4中数据库系 ...

  5. MySQL学习笔记-MySQL体系结构总览

    MySQL体系结构总览 不管是用哪种数据库,了解数据库的体系结构都是极为重要的.MySQL体系结构主要由数据库和数据库实例构成. 数据库:物理操作系统文件或者其它文件的集合,在mysql中,数据库文件 ...

  6. 【mysql学习笔记整理】

    /*mysql学习笔记整理*/ /*常用的数据库操作对象*/ #库的操作#创建#数据库的创建USE mysql;CREATE DATABASE db_x;#删除#删除数据库DROP DATABASE ...

  7. 数据库MySQL学习笔记高级篇

    数据库MySQL学习笔记高级篇 写在前面 学习链接:数据库 MySQL 视频教程全集 1. mysql的架构介绍 mysql简介 概述 高级Mysql 完整的mysql优化需要很深的功底,大公司甚至有 ...

  8. 一千行MySQL学习笔记 (转)

    出处:  一千行MySQL学习笔记 /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权 ...

  9. mysql basic operation,mysql总结,对mysql经常使用语句的详细总结,MySQL学习笔记

    mysql> select * from wifi_data where dev_id like "0023-AABBCCCCBBAA" ; 1.显示数据库列表.show d ...

随机推荐

  1. 特征提取算法(1)——纹理特征提取算法LBP

    模式识别中进行匹配识别或者分类器分类识别时,判断的依据就是图像特征.用提取的特征表示整幅图像内容,根据特征匹配或者分类图像目标. 常见的特征提取算法主要分为以下3类: 基于颜色特征:如颜色直方图.颜色 ...

  2. 小程序swiper实现订单页面

    小程序swiper实现订单页面 myOrder.wxml <!--pages/myorder/myorder.wxml--> <view class="swiper-tab ...

  3. 邻近双线性插值图像缩放的Python实现

    最近在查找有关图像缩放之类的算法,因工作中需要用到诸如此类的图像处理算法就在网上了解了一下相关算法,以及其原理,并用Python实现,且亲自验证过,在次与大家分享. 声明:本文代码示例针对的是plan ...

  4. 【HTML】<!DOCTYPE html>作用

    1.定义: DOCTYPE标签是一种标准通用标记语言的文档类型声明,它的目的是要告诉标准通用标记语言解析器,它应该使用什么样的文档类型定义(DTD)来解析文档. <!DOCTYPE> 声明 ...

  5. Caffe参数交换源码分析

    对境准备:对于多个GPU而言,一台机器2个GPU,参数交换的流程图: 参数交换从main()进入train()函数,在train函数中找到对应源码为: . . . . . ) { caffe::P2P ...

  6. 关于staticmethod() 函数

    说实话,我就不知这个是干什么的. 菜鸟教程写的无需实例化, 自己可以调用自己. 在同一个类面我使用到了 因为一个类了, 我可能会方法间互相调用. 类中间使用.不加这个,就会报错.无法识别这个 orig ...

  7. NanUI

    https://github.com/NetDimension/NanUI/wiki/%E4%B8%AD%E6%96%87%E8%AF%B4%E6%98%8E NanUI基于ChromiumFX项目进 ...

  8. layui框架中layer父子页面交互的方法分析

    本文实例讲述了layui框架中layer父子页面交互的方法.分享给大家供大家参考,具体如下: layer是一款近年来备受青睐的web弹层组件,官网地址是:http://layer.layui.com/ ...

  9. 【BASIS系列】SAP /usr/sap//DVEBMGS00满了怎么处理

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[BASIS系列]SAP /usr/sap//D ...

  10. Good teachers,they inspire you, they entertain you,and you end up learning a ton even when you don't know it.

    pardon. v. 原谅.抱歉.再说一次 honourable.adj.值得钦佩的 specification.n.规格.标准 amongst.prep.在...中 gallon.n.加仑 comp ...