多表查询及表与表之间关系
如何判断表与表之前的关系
各自站在对面的角度上看待问题,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

浙公网安备 33010602011771号