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的。