初始化脚本
CREATE DATABASE /*!32312 IF NOT EXISTS*/`test_db` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `test_db`;
DROP TABLE IF EXISTS `cities`;
CREATE TABLE `cities` (
`mid` int(11) NOT NULL AUTO_INCREMENT,
`cnty` varchar(20) DEFAULT NULL COMMENT '城市名称',
PRIMARY KEY (`mid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
insert into `cities`(`mid`,`cnty`) values (1,'中国'),(2,'日本');
DROP TABLE IF EXISTS `fight`;
CREATE TABLE `fight` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`originating` int(11) DEFAULT NULL COMMENT '始发地',
`destination` int(11) DEFAULT NULL COMMENT '目的地',
`start_time` datetime DEFAULT NULL COMMENT '飞行开始时间',
`end_time` datetime DEFAULT NULL COMMENT '飞行结束时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
insert into `fight`(`id`,`originating`,`destination`,`start_time`,`end_time`) values (1,1,2,'2018-06-17 22:02:25','2018-06-29 22:02:29'),(2,2,1,'2018-06-24 22:02:25','2018-06-29 22:02:29'),(3,5,4,'2018-06-24 22:02:25','2018-06-29 22:02:29'),(4,1,3,'2018-03-05 22:02:25','2018-06-29 22:02:29');
参考地址:
https://segmentfault.com/q/1010000002479002
查询 中国飞日本的飞机航班,效率低
SELECT * FROM fight,
(SELECT `MID` FROM cities WHERE cnty='中国') AS tb1,
(SELECT `MID` FROM cities WHERE cnty='日本') AS tb2
WHERE fight.originating=tb1.mid AND fight.destination=tb2.mid
查询中国
SELECT fight.*,cities.* FROM fight,cities
WHERE fight.originating=cities.mid AND cnty='中国';
查询日本
SELECT fight.*,cities.* FROM fight,cities
WHERE fight.destination=cities.mid AND cnty='日本';
EXISTS 写法
EXPLAIN
SELECT f1.*,cities.*
FROM fight f1,cities
WHERE f1.originating=cities.mid AND cnty='中国'
AND EXISTS
( SELECT f2.*,cities.* FROM fight f2,cities
WHERE f2.destination=cities.mid AND cnty='日本' AND f1.id=f2.id
)
IN 写法
EXPLAIN
SELECT f1.*,cities.*
FROM fight f1,cities
WHERE f1.originating=cities.mid AND cnty='中国'
AND f1.id IN
( SELECT f2.id FROM fight f2,cities
WHERE f2.destination=cities.mid AND cnty='日本'
)