一.关联关系
二.连接查询
三.子查询/嵌套查询
一.关联关系
通过在数据表中添加字段建立外键约束
1.一对一关联
方案1. 主键关联——两张数据表中主键相同的数据为相互对应的数据
方案2. 在任意一张表中添加一个字段添加外键约束与另一张表主键关联,并且将外键列添加唯一约束
2.一对多关联与多对一关联
方案. 在多的一端添加外键,与一的一端主键进行关联
3.多对多关联
方案. 额外创建一张关系表来维护多对多关联——在关系表中定义两个外键,分别与两个数据表的主键进行关联
4.外键约束
constraint FK_table1_table2 foreign key(columnName) references table(primary key);
5.级联操作(方便删除或修改一对多关系中,一表的数据)
在添加外键时,可设置级联修改和级联删除
alter table tableName add constraint FK_table1_table2 foreign key(columnName) references table(primary key) ON UPADTE CASCADE ON DELETE CASCADE;
二.连接查询
在MySQL中可以使用join实现多表的联合查询——连接查询,join按照其功能不同分为三个操作: inner join 内连接
left join 左连接
right join 右连接
1.内连接 inner join
只显示有匹配关系的数据
select ... from tableName1 inner join tableName2;
如果直接执行,则会获取数据集合的笛卡尔积(总数=A总数*B总数)
内连接条件:使用 on / where 设置两张表连接查询的匹配条件
where:select * from table1 INNER JOIN tabke2 where table1.foreign key=table2.primary key;(先生成笛卡尔积再过滤,效率低)
on:select * from table1 INNER JOIN tabke2 ON table1.foreign key=table2.primary key;(先判断连接条件是否成立,如果成立两张表的数据进行组合生成一条结果记录,后面也可再使用where进行筛选)
2.左连接 left join
显示左表中的所有数据,如果在右表中存在与左表记录满足匹配条件的数据,则进行匹配;如果右表中不存在匹配数据,则显示为Null
select * from leftTable LEFT JOIN rightTable on 匹配条件 [ where 条件 ];
三.子查询/嵌套查询
子查询:先进行一次查询,第一次查询的结果作为第二次查询的源/条件(第二次查询是基于第一次的查询结果来进行的)
select * from students where cid=(select class_id from classes where class_name= ' '); (返回单行单列,条件可以用= != ...)
select * from students where cid IN (select class_id from classes where class_name LIKE 'Java%' ); (返回多个值(单列多行),条件用IN / NOT IN)