0

{animal, food, animal_food} という 3 つのテーブルがあります。

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;

上記のようなビューを作成したり、これらの animal テーブルと animal_food テーブルを結合したりするのに、どちらが良いでしょうか?

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

たとえば、そのようなビューと左結合の実際の違いは何ですか?

4

2 に答える 2

1

SELECT2 つのステートメントの唯一の違いは、構文スタイルです。どちらも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 に答える