多个表之间可以通过主键外键之间的联系进行查询
创建表 表之间的关系一对一 多对一 常规操作
CREATE TABLE car(name varchar(20), color varchar(20), pid int,
CONSTRAINT c_p_fk FOREIGN KEY(pid) REFERENCES peison(id)
)
创建表的时候建立联系多对多
需要额外创建一张表
添加外键 将额外的关系表与实际的表联系起来
示意图
上代码
CREATE TABLE teach(tid INT PRIMARY KEY, name VARCHAR(50));
CREATE TABLE stu(sid INT PRIMARY KEY, name varchar(50));
CREATE TABLE tea_stu_rel(tid INT, sid INT);
ALTER TABLE tea_stu_rel ADD CONSTRAINT FOREIGN KEY(tid) REFERENCES teach(tid);
ALTER TABLE tea_stu_rel ADD CONSTRAINT FOREIGN KEY(sid) REFERENCES teach(sid);
为什么要拆分表,将表与表之间进行关联?都写在一个表里不好吗?
答:避免冗余。
例如上图的表,原本表中,为了显示张三的分数,其它多余的数据多次出现
解决方法 将成绩score令开一个表 通过sid->id之间的关系将两张表连接起来
多表查询合并结果集
连接查询
子查询
自连接
合并结果集
定义:合并结果集就是把两个select语句的查询结果合并到一起
方式:UNION --> 合并时取出重复记录
UNION --> 合并时不去除重复记录
格式:
SELECT * FROM 表1 UNION SELECT * FROM 表2;
SELECT * FROM 表1 UNION ALL SELECT * FROM 表2;
注意事项:被合并的两个结果,列数,列类型必须相同
示例:
首先创建两张表:
合并
连接查询
定义:也叫跨表查询,需要关联多个表进行查询
笛卡尔集:
笛卡尔集会产生不必要的数据,这是我们在实际应用中不需要的
举例:
首先创建两张表
直接查询 产生笛卡尔集
SELECT * FROM stu,score;
既然这样查询会出现笛卡尔集 那如何多表联查,保证数据正确?查询时要把主键和外键保持一致
SELECT * FROM stu st, score sc WHERE st.id = sc.sid;主表当中的数据参照子表当中的数据
原理
逐行判断,相等的留下,不相等的全部不要