无法从另一个表中不存在的表中查询名称

时间:2018-09-27 17:12:21

标签: mysql sql join inner-join

我有两个字段相同的表。我想查询table2中不在table1中的名称。两个表都具有name字段作为唯一字段(主键)。

这是信息。我的数据库设计: 我的查询是:

SELECT `table2`.`name` FROM `mydatabase`.`table2`, `mydatabase`.`table1` 
WHERE `table2`.`name` NOT IN (SELECT  `table1`.`name` FROM `mydatabase`.`table1`)
AND table2`.`name` NOT LIKE 'xyz%';

SHOW CREATE TABLE <table name>:

的输出

对于table1

table1, CREATE TABLE `table1` (
  `name` varchar(500) NOT NULL,
  `ip` varchar(500) DEFAULT NULL,
  `type` varchar(500) DEFAULT NULL,
  `grade` varchar(500) DEFAULT NULL,
  `extended_ip` text,
  PRIMARY KEY (`name`),
  UNIQUE KEY `mydatabase_name_UNIQUE` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

还有table2

tabl2, CREATE TABLE `table2` (
  `name` varchar(500) NOT NULL,
  `ip` varchar(500) DEFAULT NULL,
  `type` varchar(500) DEFAULT NULL,
  `grade` varchar(500) DEFAULT NULL,
  `extended_ip` text,
  PRIMARY KEY (`name`),
  UNIQUE KEY `mydatabase_name_UNIQUE` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

The output of EXPLAIN <my query>

# id, select_type, table, partitions, type, possible_keys, key, key_len, ref, rows, filtered, Extra
1, PRIMARY, table1, , index, , mydatabase_name_UNIQUE, 502, , 17584, 100.00, Using index
1, PRIMARY, table2, , index, , mydatabase_name_UNIQUE, 502, , 46264, 100.00, Using where; Using index; Using join buffer (Block Nested Loop)
2, SUBQUERY, table1 , index, PRIMARY,mydatabase_name_UNIQUE, mydatabase_name_UNIQUE, 502, , 17584, 100.00, Using index

编辑: 而且我忘了提及发生的情况是,数据库随我的查询而崩溃。我正在mysql-workbench中使用Ubuntu 18。当我执行此查询时,整个工作台将关闭,我必须重新开始重新打开它。

2 个答案:

答案 0 :(得分:1)

只需在name上进行LEFT JOIN,并以table2作为起始表,因为您要考虑来自table2所有名称table1中不存在。加入联接后,table1中不存在的名称将具有一个null值。请注意,这种基于连接的解决方案将比任何基于子查询的方法都快得多。

此外,您应该避免基于逗号(,)的隐式联接。它是旧语法,您应该使用基于显式JOIN的语法。阅读:Explicit vs implicit SQL joins

此外,使用Aliasing来提高可读性也是个好习惯

尝试以下操作:

SELECT t2.name 
FROM `mydatabase`.`table2` AS t2
LEFT JOIN `mydatabase`.`table1` AS t1 ON t1.name = t2.name 
WHERE t1.name IS NULL 
  AND t2.name NOT LIKE 'xyz%';

答案 1 :(得分:0)

尝试子查询:

SELECT `table2`.`name` FROM `mydatabase`.`table2` WHERE `table2`.`name` NOT IN (SELECT `table1`.`name` FROM `mydatabase`.`table1`);