mysql查询连接/子查询/联合
假设我的MySQL数据库中有两个表——“Table1”和“Table2”。 “表1”中的“id”主键(自动增量)是“表2”-“选项卡id”中的参考键 一个“Table1”行可能有零个或多个“Table2”行 现在我正在尝试搜索“Table2”中的一列,比如“email”列,或者搜索“Table1”中的一列,比如“address”,并打印“Table1”行值 我认为有3种可能性: 1.参加 2.子查询 3.联合 1加入mysql查询连接/子查询/联合,mysql,Mysql,假设我的MySQL数据库中有两个表——“Table1”和“Table2”。 “表1”中的“id”主键(自动增量)是“表2”-“选项卡id”中的参考键 一个“Table1”行可能有零个或多个“Table2”行 现在我正在尝试搜索“Table2”中的一列,比如“email”列,或者搜索“Table1”中的一列,比如“address”,并打印“Table1”行值 我认为有3种可能性: 1.参加 2.子查询 3.联合 1加入 SELECT * FROM Table1 t1, Table t2 WHE
SELECT *
FROM Table1 t1, Table t2
WHERE t1.id = t2.tab_id
AND (t1.address like '%str%' OR t2.email like '%str%');
--这很好,但是当“表2”中没有与“表1”相关的行时。。联接将失败,因此输出是一致的
2子查询
SELECT *
FROM Table1 t1
WHERE t1.address like '%str%'
OR t1.id IN (SELECT t2.tab_id
FROM Table2 t2
WHERE t2.email like '%str%');
--这很好,但当“Table2”(比如5K)中有两行manys时,查询速度非常慢:(
3工会
SELECT 'relevant_columns'
FROM Table1 t1, Table t2
WHERE t1.id = t2.tab_id
AND (t1.address like '%str%' OR t2.email like '%str%')
UNION
SELECT 'relevant_columns'
FROM Table1 t1
WHERE t1.address like '%str%'
ORDER BY relevant_column
--这工作很好,可以创建一个具有类似联合的视图,完成此工作
现在,我的问题是,什么是正确的方式…总是给工会打电话可以吗
MySQL引擎:MyISAM
SELECT *
FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.id = t2.tab_id
WHERE t1.address like '%str%' OR t2.email like '%str%';
左联接
。当您从两个表中执行时,它将作为内部联接
(如果没有WHERE子句,则为交叉联接),这意味着输出仅显示两个表中匹配的行。使用左联接
时,您说希望左表(t1)中的所有行与右表(t2)中匹配的行一致。如果t2中没有匹配,则使用null
联合
没有任何优势。联合对于合并具有相同列的数据集非常有用联合
,这取决于当t2.email
具有匹配项时您想要输出的内容。下面是一个示例
SELECT t1.id, t1.address, null as email
FROM Table1 t1
WHERE t1.address like '%str%'
union
SELECT t2.tab_id as id, null as address, t2.email
FROM Table t2
WHERE t2.email like '%str%';
左联接
。当您从两个表中执行时,它将作为内部联接
(如果没有WHERE子句,则为交叉联接),这意味着输出仅显示两个表中匹配的行。使用左联接
时,您说希望左表(t1)中的所有行与右表(t2)中匹配的行一致。如果t2中没有匹配,则使用null
联合
没有任何优势。联合对于合并具有相同列的数据集非常有用联合
,这取决于当t2.email
具有匹配项时您想要输出的内容。下面是一个示例
SELECT t1.id, t1.address, null as email
FROM Table1 t1
WHERE t1.address like '%str%'
union
SELECT t2.tab_id as id, null as address, t2.email
FROM Table t2
WHERE t2.email like '%str%';
我不知道你想做什么,但这听起来像是一个外部加入的工作,而不是一个工会。也许调查一下?我不知道你想做什么,但听起来像是一个外部加入的工作,而不是一个工会。也许调查一下吧?谢谢你的回答。但是,当合作时,左加入大约需要13秒与需要0.13秒的简单连接(如我所写)相比,简单连接只在“Table2”有一个或多个引用时才起作用,UNION大约需要0.16秒。“Table1”有2600行,“Table2”有3000行左右的响应。但与简单连接(如我所写)相比,左连接大约需要13秒这需要0.13秒,同样的问题,简单连接只在“Table2”有一个或多个引用时有效,UNION大约需要0.16秒。“Table1”有2600行,“Table2”有3000行左右