left加入ON条件并选择条件差异

时间:2013-03-10 23:56:24

标签: mysql sql join view

我有三张桌子{动物,食物,动物_食物}

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

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

2 个答案:

答案 0 :(得分: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无关。 Here is a famous link具有很好的连接类型的可视化描述。

答案 1 :(得分:-1)

有很大的不同。

使用表格列表的旧学校风格只允许内部连接。

此外,将非键条件放在正确连接的ON子句中可以提高where子句无法提供的性能和能力。这样做的主要原因是ON子句在进行连接时被计算,但WHERE子句在所有连接完成后被计算。

这个主题过于复杂,无法在这里伸张正义。