MySQL----MySQL数据库入门----第五章 多表操作
5.1 外键
比如说有两个数据表,分别是学生信息表student和年级表grade。在student表中有存储学生年级的字段gid(外键),在grade表也有存储学生年级的字段id(主键),student表和grade表之间通过学生年级建立关联,两者是主从关系。在这种关联关系中:
①学生表student是引用表;------------------------------------------------->引用表是从表
②年级表grade是被引用表;------------------------------------------------->被引用表是主表
③引用表中引用字段gid要引入grade表中id字段,所以是外键;
④被引用表中的字段id,是grade中的主键或者对其设置唯一性约束;
⑤引入外键后,外键列只能插入参照列存在的值,参照列被参照的值不能被删除。这就保证了数据的参照完整性;
为表添加外键约束
alter table 引用表名 add constraint 外键名 foreign key (外键字段名) references 被引用表名(主键字段名)
删除外键约束
alter table 引用表名 drop foreign key 外键名
注意:
①建立外键的表必须是innodb型,不能是临时表。因为在mysql中只有innodb类型的表才支持外键。
②定义外键名时,不能加引号。
5.2 连接查询
①内连接查询
select 表1.字段1,表2.字段2,...,表1.字段n from 表1 [inner] join 表2 on 表1和表2的约束条件 [where条件];
②内连接的类似方法查询
select 表1.字段1,表2.字段2,...,表1.字段n from 表1,表2 where条件;
注意:使用where子句的查询结果与使用inner join的查询结果是一致的,但是inner join是内连接语句,where是条件判断语句,在where语句后可以直接添加其他条件,而inner join语句不可以。
③左连接查询
select 表1.字段1,表2.字段2,...,表1.字段n from 表1 left join 表2 on 表1和表2的约束条件 [where条件];
④右连接查询
select 表1.字段1,表2.字段2,...,表1.字段n from 表1 right join 表2 on 表1和表2的约束条件 [where条件];
注意:
1、左连接的结果包括left join 子句中指定的左表的所有记录,以及所有满足连接条件的记录。如果左表的某条记录在右表中不存在,则在右表中显示为空;
2、同理,右连接的结果包括right join 子句中指定的右表的所有记录,以及所有满足连接条件的记录。如果右表的某条记录在左表中不存在,则在左表中显示为空;
5.3 子查询
子查询就是一个查询的结果作为另外一个查询的条件使用。外层的查询称为父查询,作为条件的查询称为子查询(subquery),在查询语句执行时,首先会执行子查询中的语句,然后将返回结果作为外层查询的过滤条件。
①带in关键字的子查询
select * from 数据表 where 字段名 in (select 字段名 from 数据表 [where条件]);
②带exists关键字的子查询
select * from 数据表 where exists (select 字段名 from 数据表 [where条件]);
注意:exists关键字后面的参数可以是任意一个子查询,这个子查询的作用相当于测试,不产生任何数据,只返回true或者false,当返回值为true时,外层查询才会执行。
③带any关键字的查询
select * from 数据表 where 字段名 > | < | >= | <= | != any(select 字段名 from 数据表 [where条件]);
注意:any关键字标识满足其中任意一个条件,它允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任意一个比较条件,就返回一个结果作为外层查询条件。
④带all关键字的查询
select * from 数据表 where 字段名 > | < | >= | <= | !=all (select 字段名 from 数据表 [where条件]);
注意:all关键字与any有点类似,只不过带all关键字的子查询返回的结果需要同时满足所有内层查询条件。