MySQL之连表操作
连表背景
在数据表中存储信息时,若将相关信息都存储在一张表中,则1、表的组织结构复杂不清晰;2、重复信息造成空间浪费;3、修改时动一发而牵全身,扩展性差。所以需要将相关信息存储在不同表里,利用相关字段建立联系。
表与表之间的关系
一对一
a表中的一条记录对应b表中的唯一一条记录,反之亦然。
实现方法:建立外键关联
一对多或多对一
a表中的一条记录对应b表中的多条记录,而b表中的一条记录不能对应a表中的多条记录。即单向的一对多关系。
实现方法:建立外键关联
多对多
a表中一条记录对应b表中多条记录,b表中一条记录对应a表中的多条记录。即双向的一对多关系
实现方法:建立第3张表,表中设置2个分别关联a表和b表的外键。
course表,teacher表
mysql> select * from course; +-----+-------------+------------+ | cid | course_name | teacher_id | +-----+-------------+------------+ | 1 | 生物 | 1 | | 2 | 物理 | 2 | | 3 | 化学 | 3 | | 4 | 语文 | 0 | +-----+-------------+------------+ mysql> select * from teacher; +-----+--------------+ | tid | teacher_name | +-----+--------------+ | 1 | 张磊 | | 2 | 于今 | | 3 | 王杰 | | 4 | 李毅 | +-----+--------------+
笛卡尔积
两张表交叉连接,不适用任何匹配条件,生成笛卡尔积
交叉连接
mysql> select * from course,teacher; +-----+-------------+------------+-----+--------------+ | cid | course_name | teacher_id | tid | teacher_name | +-----+-------------+------------+-----+--------------+ | 1 | 生物 | 1 | 1 | 张磊 | | 2 | 物理 | 2 | 1 | 张磊 | | 3 | 化学 | 3 | 1 | 张磊 | | 4 | 语文 | 0 | 1 | 张磊 | | 1 | 生物 | 1 | 2 | 于今 | | 2 | 物理 | 2 | 2 | 于今 | | 3 | 化学 | 3 | 2 | 于今 | | 4 | 语文 | 0 | 2 | 于今 | | 1 | 生物 | 1 | 3 | 王杰 | | 2 | 物理 | 2 | 3 | 王杰 | | 3 | 化学 | 3 | 3 | 王杰 | | 4 | 语文 | 0 | 3 | 王杰 | | 1 | 生物 | 1 | 4 | 李毅 | | 2 | 物理 | 2 | 4 | 李毅 | | 3 | 化学 | 3 | 4 | 李毅 | | 4 | 语文 | 0 | 4 | 李毅 | +-----+-------------+------------+-----+--------------+
内连接
mysql> select * from course inner join teacher on course.teacher_id=teacher.tid; +-----+-------------+------------+-----+--------------+ | cid | course_name | teacher_id | tid | teacher_name | +-----+-------------+------------+-----+--------------+ | 1 | 生物 | 1 | 1 | 张磊 | | 2 | 物理 | 2 | 2 | 于今 | | 3 | 化学 | 3 | 3 | 王杰 | +-----+-------------+------------+-----+--------------+
外连接之左连接
mysql> select * from course left join teacher on course.teacher_id=teacher.tid; +-----+-------------+------------+------+--------------+ | cid | course_name | teacher_id | tid | teacher_name | +-----+-------------+------------+------+--------------+ | 1 | 生物 | 1 | 1 | 张磊 | | 2 | 物理 | 2 | 2 | 于今 | | 3 | 化学 | 3 | 3 | 王杰 | | 4 | 语文 | 0 | NULL | NULL | +-----+-------------+------------+------+--------------+
外连接之右连接
mysql> select * from course right join teacher on course.teacher_id=teacher.tid; +------+-------------+------------+-----+--------------+ | cid | course_name | teacher_id | tid | teacher_name | +------+-------------+------------+-----+--------------+ | 1 | 生物 | 1 | 1 | 张磊 | | 2 | 物理 | 2 | 2 | 于今 | | 3 | 化学 | 3 | 3 | 王杰 | | NULL | NULL | NULL | 4 | 李毅 | +------+-------------+------------+-----+--------------+