多表查询及表与表之间关系

如何判断表与表之前的关系

各自站在对面的角度上看待问题,eg:人和银行卡

在人的立场上看待银行卡,一张银行卡只能被一个人所拥有,那人为1;

在银行卡的的立场看待人,一个人能拥有多张银行卡,那银行卡为多;

人对银行卡就是1对多,银行卡对人就是多对1。

一对多 表与表之间的关系

例如人和银行卡两个表的关系关联

如图的所示,bank_card表中person_id字段不加unique的属性,那么表示此表的person_id可以有多个重复的Int类型的值,我们估且认为它的值是1, 我们探讨下。此表的好多条记录的person_id字段都为1 这样成立与否

显然是成立的, 些表中的一条记录代表一张银行卡,多张银行卡可以被同一个人所拥有

反之,如果我在此表中的person_id加上Unique,表示银行卡这张表中不能重复出现一个id,也就代表一张银行卡只能被同一个人所拥有这样显然就不符合了,

加了unique的对应关系符合人和身份证的关系,一对一,一对一

接下来的人的表与身份证的表的设计就很简单了
身份证表的person id 一定要设计为unique因为是一对一的关系,设计Unique之后那么身份证这张表中的记录的personid 字段就不会出现 重复的person_id,就代表一个身份证属于一个人人

mysql只要你join了一张表就代表了你关联了这张表,那么这张表的所有信息你都可以查的到

如图:Join了job这张表后查询 的是job.id = pj.job_id(第三张表的id)表示 我已经关联了这张表,所有信息我只都可以从select中查的到,从这个角度来讲这个Join和from的作用是一样的

SELECT
p.,
ic.id id_card_id,
ic.no id_card_no,
ic.address id_card_adress,
bc.id bank_card_id,
bc.no bank_card_no,
bc.amout bank_card_amout,
pj.
,
j.id job_id,
j.name job_name,
j.duty job_duty

FROM
person p
JOIN id_card ic ON p.id = ic.person_id
LEFT JOIN bank_card bc ON p.id = bc.person_id
LEFT JOIN person_job pj ON p.id = pj.person_id
LEFT JOIN job j ON j.id = pj.job_id

posted @ 2021-04-04 18:15  JargonFire  阅读(232)  评论(0)    收藏  举报