MySQL(三):多表查询和存储程序

时间:2022-06-26
本文章向大家介绍MySQL(三):多表查询和存储程序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
今天内容:

多表查询(内连接 外连接 子查询)

存储程序(存储过程 函数)


多表查询

同时从多张数据表中查取到需要的数据即是多表查询. 多表查询时,参与查询的表中每条数据进行组合,这种效果称为笛卡尔积

顶哥说,多表查询就是将多张表的每一条数据都进行排列组合.其结果就是笛卡尔积.然后通过各种条件的限定筛选出有用的数据!!!

内连接

用左边表的记录去匹配右边表的记录,显示出符合条件的记录。

  # 隐式内连接: 无join 关键字 使用where指定条件
  # select * from 表1,表2 where 条件;
  
  # 显示内连接: 使用 inner join 关键字 使用on指定关联条件
  select * from 表1 [inner] join 表2  on 关联条件 where 筛选条件; 
  # where 后跟的是对结果的筛选条件
外连接

左外连接: 以join左边的表为主,查询其所有数据,根据关联条件查询join右边的表,将满足条件的数据查询出来,如果没有满足条件的数据则填充null, 可以理解为在内连接的基础上保证左表的数据全部显示。

  # select * from 表1 left [outer] join 表2 on 关联条件 where 筛选条件;

右外连接: 以join右边的表为主,查询其所有数据,根据关联条件查询join左边的表,将满足条件的数据查询出来,如果没有满足条件的数据则填充null,可以理解为在内连接的基础上保证右表的数据全部显示。

  # select * from 表1 rigth [outer] join 表2 on 关联条件 where 筛选条件;

Tips: 使用外连接要分清主次, 想要全部信息的表是主!

子查询

从另一条查询语句查到的结果里查询就是子查询. 根据第一次查询结果不同分为:

单一结果: select * from 表名 where (= 子查询结果)

单列多值: select * from 表名 where (in 子查询结果)

多列多值: select * from (子查询结果) as 别名 where ....


存储程序

可以看到, 连接查询语句是很复杂的.当数据表比较多的时候将会更加复杂,如果每次查询都写这么复杂的语句可真让人崩溃啊! 还好我们可以将复杂的连接查询创建为存储过程或函数。顶哥通过两个简单的小例子向大家介绍一下mysql中的存储过程和函数以抛砖引玉;感兴趣的同僚可以深入了解一下。

可以简单的说,存储过程就是一条或者多条sql语句的集合,可视为批文件,但是又不仅限于批处理. 数据库中存储程序除了存储过程还有函数,可以将函数理解为有名字的一段可执行sql语句。

Mysql中创建存储过程和函数的语句分别是:

create procedure p_name # 创建 名为 p_name的存储过程

create function fun_name # 创建 名为 fun_name 的函数

Tips: 存储过程使用call 语句来调用,只能用输出变量返回值. 存储过程也可调用其它存储过程。函数可从 语句外调用(通过函数名),也能返回标量值。

存储过程简单示例:

图1: 简单无参存储过程

当然这里只是简单的一条语句,也可以是很多语句的复杂组合.需要注意的是:

"DELIMITER // " 语句的作用是将mysql的结束符设置为//, 因为mysql默认的语句结束符号是';' , 为了避免与存储过程中sql语句的结束符冲突,需要使用DELIMITER改变存储过程的结束符, 并以 "END //" 结束存储过程,定义完毕后再使用"DELIMITER;'' 恢复默认结束符(所有语句一起执行,否则不成功)。

存储函数简单示例:

图2: 简单函数

创建函数时同存储过程一样需要修改默认的结束符;

这里需要注意的是指定返回类型的关键字是 returns 有s的。