简体   繁体   English

MySQL在多个表上加入+ FK

[英]MySQL Join on Multiple tables + FK

As an exercise I am working on building my first ever SQL database. 作为练习,我正在构建我的第一个SQL数据库。 I'm tried to create statements for all the tables in my database. 我试图为数据库中的所有表创建语句。 I was wondering if any of the foreign keys could be removed? 我想知道是否可以删除任何外键?

The second question I have is how to make a query for this database that uses a join on 4 or more tables. 我的第二个问题是如何对该数据库使用4个或更多表上的联接进行查询。

Any answer will be appriciated! 任何答案都将适用!

CREATE TABLE CLUB(
cl_id       INT     PRIMARY KEY     NOT NULL,
naam        TEXT                    NOT NULL,
adres       VARCHAR(200)                NOT NULL,
dtm_oprichta    TEXT                    NOT NULL
);


CREATE TABLE STADION(
sta_id      INT     PRIMARY KEY     NOT NULL,
cl_id       INT     REFERENCES CLUB(cl_id),
naam        TEXT                    NOT NULL,
adres       VARCHAR(200)                NOT NULL,
capaciteit  INT                 NOT NULL,
dtm_bouw    TEXT                    NOT NULL
);

CREATE TABLE TECHNISCHDIRECTEUR(
td_id       INT     PRIMARY KEY     NOT NULL,
cl_id       INT     REFERENCES CLUB(cl_id),
naam        TEXT                    NOT NULL,
adres       VARCHAR(200)                NOT NULL,
salaris     REAL                    NOT NULL,
nationaliteit   TEXT                    NOT NULL,
geslacht    CHAR                    NOT NULL,
dtm_geboorte    TEXT                    NOT NULL
);

CREATE TABLE FINANCIEELDIRECTEUR(
fd_id       INT     PRIMARY KEY     NOT NULL,
cl_id       INT     REFERENCES CLUB(cl_id),
naam        TEXT                    NOT NULL,
adres       VARCHAR(200)                NOT NULL,
salaris     REAL                    NOT NULL,
nationaliteit   TEXT                    NOT NULL,
geslacht    CHAR                    NOT NULL,
dtm_geboorte    TEXT                    NOT NULL
);


CREATE TABLE HOOFDTRAINER(
ht_id       INT     PRIMARY KEY     NOT NULL,
cl_id       INT     REFERENCES CLUB(cl_id),
td_id       INT     REFERENCES TECHNISCHDIRECTEUR(td_id),
naam        TEXT                    NOT NULL,
adres       VARCHAR(200)                NOT NULL,
salaris     REAL                    NOT NULL,
nationaliteit   TEXT                    NOT NULL,
geslacht    CHAR                    NOT NULL,
dtm_geboorte    TEXT                    NOT NULL
);


CREATE TABLE ASSISTENTTRAINER(
at_id       INT     PRIMARY KEY     NOT NULL,
cl_id       INT     REFERENCES CLUB(cl_id),
ht_id       INT     REFERENCES HOOFDTRAINER(ht_id),
naam        TEXT                    NOT NULL,
adres       VARCHAR(200)                NOT NULL,
salaris     REAL                    NOT NULL,
nationaliteit   TEXT                    NOT NULL,
geslacht    CHAR                    NOT NULL,
dtm_geboorte    TEXT                    NOT NULL
);

CREATE TABLE SPELER(
sp_id       INT     PRIMARY KEY     NOT NULL,
cl_id       INT     REFERENCES CLUB(cl_id),
ht_id       INT     REFERENCES HOOFDTRAINER(ht_id),
naam        TEXT                    NOT NULL,
adres       VARCHAR(200)                NOT NULL,
salaris     REAL                    NOT NULL,
nationaliteit   TEXT                    NOT NULL,
geslacht    CHAR                    NOT NULL,
dtm_geboorte    TEXT                    NOT NULL,
positie     TEXT                    NOT NULL,
rugnummer   INT                 NOT NULL
);

1) Can you remove the foreign keys. 1)可以删除外键吗? Looking at your table names: 查看您的表名:

STADION: cl_id     - Identifies a club associated to a stadium. 
TECHNISCHDIRECTEUR cl_id     - Identifies a club associated to a Technical Director
FINANCIEELDIRECTEUR cl_id     - Identifies a club associated to a Financial Director

If you remove any of those foreign keys, you will lose the ability to identify which club they belong to! 如果删除这些外键中的任何一个,您将无法识别它们属于哪个俱乐部! So, I would say, keep them. 所以,我要说,保留它们。

2) So here is an example query joining all four tables. 2)因此,这是连接所有四个表的示例查询。 This example shows a stadium, technical director and financial director for each club if they have them! 此示例显示了每个俱乐部的体育场,技术主管和财务主管(如果有)! The assumption is that each club only has one stadium\\technical director\\financial director. 假设每个俱乐部只有一名体育场,技术主管,财务主管。 If they have more then one you will see the club row duplicated (but as I said this is just a simple example). 如果他们的人多,那么您会看到重复的俱乐部行(但是正如我所说的,这只是一个简单的示例)。

Select c.cl_id as ClubId, c.naam as Club, td.naam as TechnicalDirector, fd.naam as FinancialDirector
From Club c
left join STADION s on s.cl_id = c.cl_id
left join TECHNISCHDIRECTEUR td on td.cl_id = c.cl_id
left join FINANCIEELDIRECTEUR fd on fd.cl_id = c.cl_id

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM