join......onの後ろのandとwhere

3216 ワード

実行プラットフォーム:Mysql
目的:joinを比較する......onの後ろのandとwhereの違い
1)建設表
Aテーブルの作成

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `a`
-- ----------------------------
DROP TABLE IF EXISTS `a`;
CREATE TABLE `a` (
  `id` decimal(10,0) NOT NULL DEFAULT '0',
  `link` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `a_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- ----------------------------
-- Records of a
-- ----------------------------
INSERT INTO `a` VALUES ('1', '1', 'jack');
INSERT INTO `a` VALUES ('2', '1', 'jack');
INSERT INTO `a` VALUES ('3', '1', 'leo');

Bテーブルの作成

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `b`
-- ----------------------------
DROP TABLE IF EXISTS `b`;
CREATE TABLE `b` (
  `id` decimal(10,0) NOT NULL DEFAULT '0',
  `link` varchar(11) COLLATE utf8_unicode_ci DEFAULT NULL,
  `b_name` varchar(11) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- ----------------------------
-- Records of b
-- ----------------------------
INSERT INTO `b` VALUES ('1', '1', 'frowna');
INSERT INTO `b` VALUES ('2', '1', 'frowna');
INSERT INTO `b` VALUES ('3', '1', 'kiki');

2)下記の運転結果を比較する
select * from A left join B on A.link =B.link where A.a_name='jack'
 
select * from A left join B on A.link =B.link and A.a_name='jack'
select * from A inner join B on A.link =B.link where A.a_name='jack'
 
select * from A inner join B on A.link =B.link and A.a_name='jack'
select * from A right join B on A.link =B.link where A.a_name='jack'
 
select * from A right join B on A.link =B.link and A.a_name='jack'
select * from A right join B on A.link =B.link where A.a_name is null
 
select * from A right join B on A.link =B.link and A.a_name is null 

3)結論
3.1)whereは、2つのテーブルjoinが完了した後、where条件を添付します.
すなわち
select * from (select A.a_name,B.b_name from A left join B on A.link =B.link)t where t.a_name='jack';
   
select A.a_name,B.b_name from A left join B on A.link =B.link  where A.a_name='jack'

3.2)
andは、テーブル接続前にAテーブルまたはBテーブルのどのレコードが接続条件に合致するかをフィルタリングし、left joinかright joinかを両立させる.すなわち
左の接続であれば、左のテーブルのレコードが接続条件に合致しない場合は、
接続は行われませんが、結果セットに残ります(右側の部分の接続結果はNULL).
3.3)
複雑な論理的考慮を避けるために、できるだけwhereで条件をフィルタリングすることをお勧めします.(場合によっては(他のsql文に続く)andを使用するとandが間違って報告されますが、正しい結果に影響するかどうかを考慮します.)