这学期刚学数据库,讲讲遇到的难题。
用两个表(a_table、b_table),关联字段a_table.a_id和b_table.b_id 称为连接,现在我来演示一下MySQL的内连接、外连接( 左(外)连接、右(外)连接、全(外)连接)。
连接
建表
1 | CREATE TABLE `a_table` ( |

内连接 inner join … on …
执行语句:select * from a_table a inner join b_table bon a.a_id = b.b_id;

说明返回关联字段相符的记录,及返回交集部分。
左连接(左外连接) left (outer) join… on …
执行语句:select * from a_table a left join b_table bon a.a_id = b.b_id;
很直观:left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。
同理,右外连接反过来就行了,这里就不再说了。
以上说的都是最基本的情况,仅仅是为了留下最基础的印象,更复杂的情况还请自行解决。
视图
背景:关系型数据库中的数据是由一张一张的二维关系表所组成,简单的单表查询只需要遍历一个表,而复杂的多表查询需要将多个表连接起来进行查询任务。对于复杂的查询事件,每次查询都需要编写MySQL代码效率低下。为了解决这个问题,数据库提供了视图(view)功能。
| 操作指令 | 代码 |
|---|---|
| 创建视图 | CREATE VIEW 视图名( , , , )AS SELECT ( , , , ) FROM …; |
| 使用视图 | 和表一样 |
| 修改视图 | CREATE OR REPLACE VIEW 视图 AS SELECT() FROM() |
| 查看视图 | DESC / SHOW FIELDS FROM 视图 |
总之,视图时虚拟表,不存储数据,而是按照指定的方式进行查询。说了那么多还是不知道视图时干嘛的,我们直接来看看例子。
我们现在希望查询一个用户的多项数据,但是通常不是在一个表里面,所以我们此时把他们内连接起来然后select。
但是有一天我又要查看pid为p003的数据呢,又要写一次查询是吧,那真的是非常浪费时间和体力了,此时我们可以通过视图来实现。
具体流程
我们在场面的SELECT语句前面加上CREAT VIEW 视图名 AS就行了。
下次我们再要用直接用视图就行了。
下面是修改的视图。
下面是查看视图
视图与数据变更
很简单,普通的更新语句,将表product中的数据进行更新,再通过视图检索:
虽然视图时虚拟表,但是我们仍然可以插入数据。通过下图,我们可以看到,跨表插入数据系统反馈报错,提示不能修改超过一个表的数据。
如果在创建视图的时候制定了“WITH CHECK OPTION”,那么更新数据时不能插入或更新不符合视图限制条件的记录。
综上所述,我们需要注意的有两点:
- 视图不是表,不直接存储数据,是一张虚拟的表;
- 一般情况下,在创建有条件限制的视图时,加上“WITH CHECK OPTION”命令。