Mysql 从3个不同的表创建视图?

Mysql 从3个不同的表创建视图?,mysql,join,create-view,Mysql,Join,Create View,我正在尝试在MySQL中创建一个视图,以包含来自3个不同表的视图 CREATE TABLE ACTOR ( ACTOR_ID DECIMAL (2,0) PRIMARY KEY NOT NULL, ACTOR_FIRST CHAR(25), ACTOR_LAST CHAR(30), DOB DATE ); CREATE TABLE DIRECTOR ( DIRECTOR_ID DECIMAL(2,0) PRIMARY

我正在尝试在MySQL中创建一个视图,以包含来自3个不同表的视图

CREATE TABLE ACTOR (
    ACTOR_ID    DECIMAL (2,0) PRIMARY KEY NOT NULL, 
    ACTOR_FIRST CHAR(25), 
    ACTOR_LAST  CHAR(30), 
    DOB         DATE
);

CREATE TABLE DIRECTOR (
    DIRECTOR_ID     DECIMAL(2,0) PRIMARY KEY NOT NULL, 
    DIRECTOR_FIRST  CHAR(25), 
    DIRECTOR_LAST   CHAR(30) 
);

CREATE TABLE FILM (
    FILM_ID         DECIMAL(2,0) PRIMARY KEY NOT NULL, 
    TITLE           CHAR(50), 
    RELEASE_DATE    DATE, 
    DIRECTOR_ID     DECIMAL(2,0), 
    GENRE_ID        CHAR(10), 
    PRODUCTION_ID   CHAR(3) 
);
我试图创建的
视图

create view film_production as 
select 
    title, 
    actor_first, 
    actor_last, 
    director_first, 
    director_last, 
    Production_id, 
    release_date 
from    film, 
        actor, 
        director
;

这给了我192个结果。但我只有3名演员,8部电影,8名导演,6部制片。另一件需要注意的是,一部电影有三个演员中的两个,所以我应该至少有9部不是192部的电影。我不知道我做错了什么。我就是想不出来。我在想也许是加入或者什么

是的,您的视图应该使用联接

但是,看起来你少了一张桌子,有点像电影演员。 使用缺少的表,并假设您正试图获得每部电影的演员和导演,它将是

SELECT 
  FILM.*
 ,ACTOR_FIRST + ' ' + ACTOR_LAST AS actor
 ,DIRECTOR_FIRST + ' ' + DIRECTOR_LAST AS director
FROM FILM
INNER JOIN FILM_ACTOR fa ON fa.FILM_ID = FILM.FILM_ID
INNER JOIN ACTOR ON ACTOR.ACTOR_ID = FILM_ACTOR.ACTOR_ID
INNER JOIN DIRECTOR d ON d.DIRECTOR_ID = FILM.DIRECTOR_ID

正如我提到的,您缺少一个可以容纳多个演员并将他们与一部电影关联的表:一对多关系

是的,您的视图应该使用联接

但是,看起来你少了一张桌子,有点像电影演员。 使用缺少的表,并假设您正试图获得每部电影的演员和导演,它将是

SELECT 
  FILM.*
 ,ACTOR_FIRST + ' ' + ACTOR_LAST AS actor
 ,DIRECTOR_FIRST + ' ' + DIRECTOR_LAST AS director
FROM FILM
INNER JOIN FILM_ACTOR fa ON fa.FILM_ID = FILM.FILM_ID
INNER JOIN ACTOR ON ACTOR.ACTOR_ID = FILM_ACTOR.ACTOR_ID
INNER JOIN DIRECTOR d ON d.DIRECTOR_ID = FILM.DIRECTOR_ID

正如我提到的,您缺少一个可以容纳多个演员并将他们与一部电影关联的表:一对多关系

是的,您的视图应该使用联接

但是,看起来你少了一张桌子,有点像电影演员。 使用缺少的表,并假设您正试图获得每部电影的演员和导演,它将是

SELECT 
  FILM.*
 ,ACTOR_FIRST + ' ' + ACTOR_LAST AS actor
 ,DIRECTOR_FIRST + ' ' + DIRECTOR_LAST AS director
FROM FILM
INNER JOIN FILM_ACTOR fa ON fa.FILM_ID = FILM.FILM_ID
INNER JOIN ACTOR ON ACTOR.ACTOR_ID = FILM_ACTOR.ACTOR_ID
INNER JOIN DIRECTOR d ON d.DIRECTOR_ID = FILM.DIRECTOR_ID

正如我提到的,您缺少一个可以容纳多个演员并将他们与一部电影关联的表:一对多关系

是的,您的视图应该使用联接

但是,看起来你少了一张桌子,有点像电影演员。 使用缺少的表,并假设您正试图获得每部电影的演员和导演,它将是

SELECT 
  FILM.*
 ,ACTOR_FIRST + ' ' + ACTOR_LAST AS actor
 ,DIRECTOR_FIRST + ' ' + DIRECTOR_LAST AS director
FROM FILM
INNER JOIN FILM_ACTOR fa ON fa.FILM_ID = FILM.FILM_ID
INNER JOIN ACTOR ON ACTOR.ACTOR_ID = FILM_ACTOR.ACTOR_ID
INNER JOIN DIRECTOR d ON d.DIRECTOR_ID = FILM.DIRECTOR_ID

正如我提到的,您缺少一个可以容纳多个演员并将他们与一部电影关联的表:一对多关系

您是否想过在演员和电影、导演和电影表之间添加参考键

演员

CREATE TABLE ACTOR (
    ID        INT PRIMARY KEY NOT NULL, 
    FIRSTNAME VARCHAR(25), 
    LASTNAME  VARCHAR(30), 
    DOB       DATE
);
CREATE TABLE DIRECTOR (
    ID         INT PRIMARY KEY NOT NULL, 
    FIRSTNAME  VARCHAR(25), 
    LASTNAME   VARCHAR(30) 
);
CREATE TABLE FILM (
    FILM_ID         INT PRIMARY KEY NOT NULL, 
    TITLE           VARCHAR(50), 
    RELEASE_DATE    DATE, 
    DIRECTOR_ID     INT, 
    GENRE_ID        INT, 
    PRODUCTION_ID   INT,
    ACTOR_ID        INT,
    CONSTRAINT FK_FILM_DIRECTOR_ID FOREIGN KEY (DIRECTOR_ID)
    REFERENCES DIRECTOR(ID),
    CONSTRAINT FK_FILM_ACTOR_ID FOREIGN KEY (ACTOR_ID)
    REFERENCES ACTOR(ID)
);
导演

CREATE TABLE ACTOR (
    ID        INT PRIMARY KEY NOT NULL, 
    FIRSTNAME VARCHAR(25), 
    LASTNAME  VARCHAR(30), 
    DOB       DATE
);
CREATE TABLE DIRECTOR (
    ID         INT PRIMARY KEY NOT NULL, 
    FIRSTNAME  VARCHAR(25), 
    LASTNAME   VARCHAR(30) 
);
CREATE TABLE FILM (
    FILM_ID         INT PRIMARY KEY NOT NULL, 
    TITLE           VARCHAR(50), 
    RELEASE_DATE    DATE, 
    DIRECTOR_ID     INT, 
    GENRE_ID        INT, 
    PRODUCTION_ID   INT,
    ACTOR_ID        INT,
    CONSTRAINT FK_FILM_DIRECTOR_ID FOREIGN KEY (DIRECTOR_ID)
    REFERENCES DIRECTOR(ID),
    CONSTRAINT FK_FILM_ACTOR_ID FOREIGN KEY (ACTOR_ID)
    REFERENCES ACTOR(ID)
);
与演员和导演有联系的电影

CREATE TABLE ACTOR (
    ID        INT PRIMARY KEY NOT NULL, 
    FIRSTNAME VARCHAR(25), 
    LASTNAME  VARCHAR(30), 
    DOB       DATE
);
CREATE TABLE DIRECTOR (
    ID         INT PRIMARY KEY NOT NULL, 
    FIRSTNAME  VARCHAR(25), 
    LASTNAME   VARCHAR(30) 
);
CREATE TABLE FILM (
    FILM_ID         INT PRIMARY KEY NOT NULL, 
    TITLE           VARCHAR(50), 
    RELEASE_DATE    DATE, 
    DIRECTOR_ID     INT, 
    GENRE_ID        INT, 
    PRODUCTION_ID   INT,
    ACTOR_ID        INT,
    CONSTRAINT FK_FILM_DIRECTOR_ID FOREIGN KEY (DIRECTOR_ID)
    REFERENCES DIRECTOR(ID),
    CONSTRAINT FK_FILM_ACTOR_ID FOREIGN KEY (ACTOR_ID)
    REFERENCES ACTOR(ID)
);
组合3个表的视图

create view film_production as 
select 
    title, 
    a.firstname as actor_firstname, 
    a.lastname as actor_lastname, 
    d.firstname as director_firstname, 
    d.lastname as directory_lastname, 
    Production_id, 
    release_date 
from       film f
left join actor a on f.actor_id = a.id
left join director d on f.director_id = d.id;
例如:


注意,我对ID字段使用INT而不是DECIMAL,对CHAR字段使用VARCHAR。这可能有助于为大多数通用用途分配适当的空间。

您是否想过在演员和电影以及导演和电影表之间添加参考键

演员

CREATE TABLE ACTOR (
    ID        INT PRIMARY KEY NOT NULL, 
    FIRSTNAME VARCHAR(25), 
    LASTNAME  VARCHAR(30), 
    DOB       DATE
);
CREATE TABLE DIRECTOR (
    ID         INT PRIMARY KEY NOT NULL, 
    FIRSTNAME  VARCHAR(25), 
    LASTNAME   VARCHAR(30) 
);
CREATE TABLE FILM (
    FILM_ID         INT PRIMARY KEY NOT NULL, 
    TITLE           VARCHAR(50), 
    RELEASE_DATE    DATE, 
    DIRECTOR_ID     INT, 
    GENRE_ID        INT, 
    PRODUCTION_ID   INT,
    ACTOR_ID        INT,
    CONSTRAINT FK_FILM_DIRECTOR_ID FOREIGN KEY (DIRECTOR_ID)
    REFERENCES DIRECTOR(ID),
    CONSTRAINT FK_FILM_ACTOR_ID FOREIGN KEY (ACTOR_ID)
    REFERENCES ACTOR(ID)
);
导演

CREATE TABLE ACTOR (
    ID        INT PRIMARY KEY NOT NULL, 
    FIRSTNAME VARCHAR(25), 
    LASTNAME  VARCHAR(30), 
    DOB       DATE
);
CREATE TABLE DIRECTOR (
    ID         INT PRIMARY KEY NOT NULL, 
    FIRSTNAME  VARCHAR(25), 
    LASTNAME   VARCHAR(30) 
);
CREATE TABLE FILM (
    FILM_ID         INT PRIMARY KEY NOT NULL, 
    TITLE           VARCHAR(50), 
    RELEASE_DATE    DATE, 
    DIRECTOR_ID     INT, 
    GENRE_ID        INT, 
    PRODUCTION_ID   INT,
    ACTOR_ID        INT,
    CONSTRAINT FK_FILM_DIRECTOR_ID FOREIGN KEY (DIRECTOR_ID)
    REFERENCES DIRECTOR(ID),
    CONSTRAINT FK_FILM_ACTOR_ID FOREIGN KEY (ACTOR_ID)
    REFERENCES ACTOR(ID)
);
与演员和导演有联系的电影

CREATE TABLE ACTOR (
    ID        INT PRIMARY KEY NOT NULL, 
    FIRSTNAME VARCHAR(25), 
    LASTNAME  VARCHAR(30), 
    DOB       DATE
);
CREATE TABLE DIRECTOR (
    ID         INT PRIMARY KEY NOT NULL, 
    FIRSTNAME  VARCHAR(25), 
    LASTNAME   VARCHAR(30) 
);
CREATE TABLE FILM (
    FILM_ID         INT PRIMARY KEY NOT NULL, 
    TITLE           VARCHAR(50), 
    RELEASE_DATE    DATE, 
    DIRECTOR_ID     INT, 
    GENRE_ID        INT, 
    PRODUCTION_ID   INT,
    ACTOR_ID        INT,
    CONSTRAINT FK_FILM_DIRECTOR_ID FOREIGN KEY (DIRECTOR_ID)
    REFERENCES DIRECTOR(ID),
    CONSTRAINT FK_FILM_ACTOR_ID FOREIGN KEY (ACTOR_ID)
    REFERENCES ACTOR(ID)
);
组合3个表的视图

create view film_production as 
select 
    title, 
    a.firstname as actor_firstname, 
    a.lastname as actor_lastname, 
    d.firstname as director_firstname, 
    d.lastname as directory_lastname, 
    Production_id, 
    release_date 
from       film f
left join actor a on f.actor_id = a.id
left join director d on f.director_id = d.id;
例如:


注意,我对ID字段使用INT而不是DECIMAL,对CHAR字段使用VARCHAR。这可能有助于为大多数通用用途分配适当的空间。

您是否想过在演员和电影以及导演和电影表之间添加参考键

演员

CREATE TABLE ACTOR (
    ID        INT PRIMARY KEY NOT NULL, 
    FIRSTNAME VARCHAR(25), 
    LASTNAME  VARCHAR(30), 
    DOB       DATE
);
CREATE TABLE DIRECTOR (
    ID         INT PRIMARY KEY NOT NULL, 
    FIRSTNAME  VARCHAR(25), 
    LASTNAME   VARCHAR(30) 
);
CREATE TABLE FILM (
    FILM_ID         INT PRIMARY KEY NOT NULL, 
    TITLE           VARCHAR(50), 
    RELEASE_DATE    DATE, 
    DIRECTOR_ID     INT, 
    GENRE_ID        INT, 
    PRODUCTION_ID   INT,
    ACTOR_ID        INT,
    CONSTRAINT FK_FILM_DIRECTOR_ID FOREIGN KEY (DIRECTOR_ID)
    REFERENCES DIRECTOR(ID),
    CONSTRAINT FK_FILM_ACTOR_ID FOREIGN KEY (ACTOR_ID)
    REFERENCES ACTOR(ID)
);
导演

CREATE TABLE ACTOR (
    ID        INT PRIMARY KEY NOT NULL, 
    FIRSTNAME VARCHAR(25), 
    LASTNAME  VARCHAR(30), 
    DOB       DATE
);
CREATE TABLE DIRECTOR (
    ID         INT PRIMARY KEY NOT NULL, 
    FIRSTNAME  VARCHAR(25), 
    LASTNAME   VARCHAR(30) 
);
CREATE TABLE FILM (
    FILM_ID         INT PRIMARY KEY NOT NULL, 
    TITLE           VARCHAR(50), 
    RELEASE_DATE    DATE, 
    DIRECTOR_ID     INT, 
    GENRE_ID        INT, 
    PRODUCTION_ID   INT,
    ACTOR_ID        INT,
    CONSTRAINT FK_FILM_DIRECTOR_ID FOREIGN KEY (DIRECTOR_ID)
    REFERENCES DIRECTOR(ID),
    CONSTRAINT FK_FILM_ACTOR_ID FOREIGN KEY (ACTOR_ID)
    REFERENCES ACTOR(ID)
);
与演员和导演有联系的电影

CREATE TABLE ACTOR (
    ID        INT PRIMARY KEY NOT NULL, 
    FIRSTNAME VARCHAR(25), 
    LASTNAME  VARCHAR(30), 
    DOB       DATE
);
CREATE TABLE DIRECTOR (
    ID         INT PRIMARY KEY NOT NULL, 
    FIRSTNAME  VARCHAR(25), 
    LASTNAME   VARCHAR(30) 
);
CREATE TABLE FILM (
    FILM_ID         INT PRIMARY KEY NOT NULL, 
    TITLE           VARCHAR(50), 
    RELEASE_DATE    DATE, 
    DIRECTOR_ID     INT, 
    GENRE_ID        INT, 
    PRODUCTION_ID   INT,
    ACTOR_ID        INT,
    CONSTRAINT FK_FILM_DIRECTOR_ID FOREIGN KEY (DIRECTOR_ID)
    REFERENCES DIRECTOR(ID),
    CONSTRAINT FK_FILM_ACTOR_ID FOREIGN KEY (ACTOR_ID)
    REFERENCES ACTOR(ID)
);
组合3个表的视图

create view film_production as 
select 
    title, 
    a.firstname as actor_firstname, 
    a.lastname as actor_lastname, 
    d.firstname as director_firstname, 
    d.lastname as directory_lastname, 
    Production_id, 
    release_date 
from       film f
left join actor a on f.actor_id = a.id
left join director d on f.director_id = d.id;
例如:


注意,我对ID字段使用INT而不是DECIMAL,对CHAR字段使用VARCHAR。这可能有助于为大多数通用用途分配适当的空间。

您是否想过在演员和电影以及导演和电影表之间添加参考键

演员

CREATE TABLE ACTOR (
    ID        INT PRIMARY KEY NOT NULL, 
    FIRSTNAME VARCHAR(25), 
    LASTNAME  VARCHAR(30), 
    DOB       DATE
);
CREATE TABLE DIRECTOR (
    ID         INT PRIMARY KEY NOT NULL, 
    FIRSTNAME  VARCHAR(25), 
    LASTNAME   VARCHAR(30) 
);
CREATE TABLE FILM (
    FILM_ID         INT PRIMARY KEY NOT NULL, 
    TITLE           VARCHAR(50), 
    RELEASE_DATE    DATE, 
    DIRECTOR_ID     INT, 
    GENRE_ID        INT, 
    PRODUCTION_ID   INT,
    ACTOR_ID        INT,
    CONSTRAINT FK_FILM_DIRECTOR_ID FOREIGN KEY (DIRECTOR_ID)
    REFERENCES DIRECTOR(ID),
    CONSTRAINT FK_FILM_ACTOR_ID FOREIGN KEY (ACTOR_ID)
    REFERENCES ACTOR(ID)
);
导演

CREATE TABLE ACTOR (
    ID        INT PRIMARY KEY NOT NULL, 
    FIRSTNAME VARCHAR(25), 
    LASTNAME  VARCHAR(30), 
    DOB       DATE
);
CREATE TABLE DIRECTOR (
    ID         INT PRIMARY KEY NOT NULL, 
    FIRSTNAME  VARCHAR(25), 
    LASTNAME   VARCHAR(30) 
);
CREATE TABLE FILM (
    FILM_ID         INT PRIMARY KEY NOT NULL, 
    TITLE           VARCHAR(50), 
    RELEASE_DATE    DATE, 
    DIRECTOR_ID     INT, 
    GENRE_ID        INT, 
    PRODUCTION_ID   INT,
    ACTOR_ID        INT,
    CONSTRAINT FK_FILM_DIRECTOR_ID FOREIGN KEY (DIRECTOR_ID)
    REFERENCES DIRECTOR(ID),
    CONSTRAINT FK_FILM_ACTOR_ID FOREIGN KEY (ACTOR_ID)
    REFERENCES ACTOR(ID)
);
与演员和导演有联系的电影

CREATE TABLE ACTOR (
    ID        INT PRIMARY KEY NOT NULL, 
    FIRSTNAME VARCHAR(25), 
    LASTNAME  VARCHAR(30), 
    DOB       DATE
);
CREATE TABLE DIRECTOR (
    ID         INT PRIMARY KEY NOT NULL, 
    FIRSTNAME  VARCHAR(25), 
    LASTNAME   VARCHAR(30) 
);
CREATE TABLE FILM (
    FILM_ID         INT PRIMARY KEY NOT NULL, 
    TITLE           VARCHAR(50), 
    RELEASE_DATE    DATE, 
    DIRECTOR_ID     INT, 
    GENRE_ID        INT, 
    PRODUCTION_ID   INT,
    ACTOR_ID        INT,
    CONSTRAINT FK_FILM_DIRECTOR_ID FOREIGN KEY (DIRECTOR_ID)
    REFERENCES DIRECTOR(ID),
    CONSTRAINT FK_FILM_ACTOR_ID FOREIGN KEY (ACTOR_ID)
    REFERENCES ACTOR(ID)
);
组合3个表的视图

create view film_production as 
select 
    title, 
    a.firstname as actor_firstname, 
    a.lastname as actor_lastname, 
    d.firstname as director_firstname, 
    d.lastname as directory_lastname, 
    Production_id, 
    release_date 
from       film f
left join actor a on f.actor_id = a.id
left join director d on f.director_id = d.id;
例如:



注意,我对ID字段使用INT而不是DECIMAL,对CHAR字段使用VARCHAR。这可能有助于为大多数通用用途分配适当的空间。

您可以加入的表在哪里?e、 g.有演员电影和导演电影关系的表格?如果没有这些,您将进行完整的外部联接,并获得所有表(演员、导演、电影)的产品,您可以联接的表在哪里?e、 g.有演员电影和导演电影关系的表格?如果没有这些,您将进行完整的外部联接,并获得所有表(演员、导演、电影)的产品,您可以联接的表在哪里?e、 g.有演员电影和导演电影关系的表格?如果没有这些,您将进行完整的外部联接,并获得所有表(演员、导演、电影)的产品,您可以联接的表在哪里?e、 g.有演员电影和导演电影关系的表格?如果没有这些表,您将执行一个完整的外部联接并获得所有表的乘积(#actors*#directors*#films),那么唯一有用的另一个表将是我的actor\u movies表,它只有FILM\u ID、actor\u ID、TITLE。也许我应该让那个表包括演员的名字,而不是演员的id。是的,这正是我所说的:)。这个表应该被称为演员的电影,但为了清晰起见(表明它与你的其他两个表相关),所以我会使用4个表和内部连接,但是更改我的演员电影表以包含演员的姓名,对吗?是,然后是否。您需要使用这四个表。actor\u movies表应该包含actor\u id和movie\u id,仅此而已。在你看来,加入到这个表中,你将得到电影的所有演员。唯一有用的另一个表是我的演员电影表,它只有电影ID,演员ID,标题。也许我应该让那个表包含演员的名字,而不是演员的id。是的,这正是我所说的:)。这个表应该被称为演员电影,但为了清楚起见(为了表明它与其他两个表相关),所以我会改为使用4个带有内部联接的表,但将我的演员电影表更改为包含