join......onの後ろのandとwhere
3216 ワード
実行プラットフォーム:Mysql
目的:joinを比較する......onの後ろのandとwhereの違い
1)建設表
Aテーブルの作成
Bテーブルの作成
2)下記の運転結果を比較する
3)結論
3.1)whereは、2つのテーブルjoinが完了した後、where条件を添付します.
すなわち
3.2)
andは、テーブル接続前にAテーブルまたはBテーブルのどのレコードが接続条件に合致するかをフィルタリングし、left joinかright joinかを両立させる.すなわち
左の接続であれば、左のテーブルのレコードが接続条件に合致しない場合は、
接続は行われませんが、結果セットに残ります(右側の部分の接続結果はNULL).
3.3)
複雑な論理的考慮を避けるために、できるだけwhereで条件をフィルタリングすることをお勧めします.(場合によっては(他のsql文に続く)andを使用するとandが間違って報告されますが、正しい結果に影響するかどうかを考慮します.)
目的: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が間違って報告されますが、正しい結果に影響するかどうかを考慮します.)