0

我有三张桌子 {animal, food, animal_food}

DROP   TABLE IF EXISTS `tbl_animal`; 
CREATE TABLE `tbl_animal` (
    id_animal       INTEGER     NOT NULL PRIMARY KEY AUTO_INCREMENT,
    name            VARCHAR(25) NOT NULL DEFAULT "no name",
    sex             CHAR(1)     NOT NULL DEFAULT "M",
    size            VARCHAR(10) NOT NULL DEFAULT "Mini",
    age             VARCHAR(10) NOT NULL DEFAULT "born",
    hair            VARCHAR(5 ) NOT NULL DEFAULT "short",
    color           VARCHAR(25) NOT NULL DEFAULT "not defined",
    FOREIGN KEY (sex)           REFERENCES `tbl_sexes`    (sex),
    FOREIGN KEY (tamanio)       REFERENCES `tbl_sizes`    (size),
    FOREIGN KEY (age)           REFERENCES `tbl_ages`     (age),
    FOREIGN KEY (hair)          REFERENCES `tbl_hair_length` (hair_length),
    CONSTRAINT `uc_Info_Animal` UNIQUE (`id_animal`)           
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;




DROP    TABLE IF EXISTS `tbl_food`; 
CREATE TABLE `tbl_food` (
    id_food       INTEGER       NOT NULL PRIMARY KEY,
    type_food     VARCHAR(20)   NOT NULL DEFAULT "Other",
    label         VARCHAR(50)   NOT NULL,
    CONSTRAINT `uc_Info_Food`   UNIQUE  (`id_food`)     
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;


DROP    TABLE IF EXISTS `animal_food`; 
CREATE  TABLE `animal_food` (
    id_animal       INTEGER     NOT NULL,
    food            VARCHAR(50) NOT NULL DEFAULT "",
    quantity        VARCHAR(50) NOT NULL DEFAULT "",        
    times           VARCHAR(50) NOT NULL DEFAULT "",
    description     VARCHAR(50) NOT NULL DEFAULT "",            
    date_last   DATE DEFAULT '0000-00-00 00:00:00',     
    date_water      DATE DEFAULT '0000-00-00 00:00:00',
    CONSTRAINT fk_ID_Animal_Food FOREIGN KEY (id_animal) REFERENCES `tbl_animal`(id_animal)  
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

我有一个视图,我根据 ID 选择 animal 和 animal_food 中的值列

CREATE VIEW `CAT_animal_food` AS
       SELECT a.name, a.sex,a.size,a.age,a.hair,a.color,
              a_f.*  
       FROM  `tbl_animal` a, `animal_food` a_f
       WHERE a.id_animal = a_f.id_animal;

创建一个像上面这样的视图或者加入这些动物和动物食物表会更好吗?

SELECT ...
  FROM A.table t1
  JOIN B.table2 t2 ON t2.column = t1.col

例如,这种视图和左连接之间的真正区别是什么?

4

2 回答 2

1

SELECT两个语句之间的唯一区别是语法风格。两者都执行INNER JOINS。换句话说,这种风格使用了所谓的“隐式”语法:

SELECT ...
  FROM A.table t1, B.table2 t2
  WHERE t2.column = t1.col

它是“隐含的”,因为该WHERE子句隐含了连接条件。此版本使用“显式”语法:

SELECT ...
  FROM A.table t1
  JOIN B.table2 t2 ON t2.column = t1.col

大多数人更喜欢看到“显式”语法,因为它使您的代码更易于遵循;连接条件是明确理解的,任何WHERE子句都是显而易见的。

当然,这些都与此无关LEFT JOINS这是一个著名的链接,对连接类型进行了很好的视觉描述。

于 2013-03-11T00:07:46.197 回答
-1

有一个很大的不同。

使用表列表的老式风格只允许内部连接。

此外,在正确连接的 ON 子句中放置非关键条件可以提供更高的性能和功能,而 where 子句无法提供。这样做的主要原因是在进行连接时会评估 ON 子句,但在进行所有连接后才评估 WHERE 子句。

这个主题太复杂了,无法在这里做到公正。

于 2013-03-11T00:14:09.043 回答