为简单起见,假设所有相关字段都是NOT NULL.
你可以做:
SELECT
table1.this, table2.that, table2.somethingelse
FROM
table1, table2
WHERE
table1.foreignkey = table2.primarykey
AND (some other conditions)
Run Code Online (Sandbox Code Playgroud)
要不然:
SELECT
table1.this, table2.that, table2.somethingelse
FROM
table1 INNER JOIN table2
ON table1.foreignkey = table2.primarykey
WHERE
(some other conditions)
Run Code Online (Sandbox Code Playgroud)
这两个是以同样的方式工作MySQL吗?
在显式vs隐式内连接中是否存在效率差异?例如:
SELECT * FROM
table a INNER JOIN table b
ON a.id = b.id;
Run Code Online (Sandbox Code Playgroud)
与
SELECT a.*, b.*
FROM table a, table b
WHERE a.id = b.id;
Run Code Online (Sandbox Code Playgroud) 从MySQL中的多个表中进行选择时,以下两个查询都返回相同的结果集.
其中一个查询比另一个查询更好还是更有效?从我对小数据集的测试(每个表中约2k行),它们都在大约相同的执行时间内返回相同的结果集.
查询1:
SELECT
*
FROM
products,
product_meta,
sales_rights
WHERE
(
products.id = product_meta.product_id
AND products.id = sales_rights.product_id
)
AND (...)
LIMIT 0,10;
Run Code Online (Sandbox Code Playgroud)
查询2:
SELECT
*
FROM
products
INNER JOIN product_meta ON products.id = product_meta.product_id
JOIN sales_rights ON product_meta.product_id = sales_rights.product_id
WHERE
(...)
LIMIT 0,10;
Run Code Online (Sandbox Code Playgroud) 我正在执行多个查询(来自我网站的不同部分)
有些是这样的:
SELECT field, field1
FROM table1, table2
WHERE table1.id = table2.id
AND ....
Run Code Online (Sandbox Code Playgroud)
有些是这样的:
SELECT field, field1
FROM table1
JOIN table2
USING (id)
WHERE ...
AND ....
Run Code Online (Sandbox Code Playgroud)
有些是这样的:
SELECT field, field1
FROM table1
LEFT JOIN table2
ON (table1.id = table2.id)
WHERE ...
AND ....
Run Code Online (Sandbox Code Playgroud)
哪些查询更好,或更慢/更快或更标准?
可能重复:
内部联接vs其中
今天我和我的项目经理就Cartesian产品进行了辩论.他说'自然连接'比使用'select from where'要好得多,因为后者会导致db引擎在内部执行笛卡尔积,但前者使用另一种方法来阻止这种情况.据我所知,自然连接语法在性能或含义方面与"从哪里选择"没有任何不同,我的意思是你可以根据自己的喜好使用.
SELECT * FROM table1,table2 WHERE table1.id=table2.id
SELECT * FROM table1 NATURAL JOIN table2
Run Code Online (Sandbox Code Playgroud)
请详细说明导致笛卡尔积的第一个查询,但第二个查询更加智能
我正在使用此查询获取1000条数据记录:
SELECT
RIGHT(tagarr, LENGTH(tagarr) - LENGTH('encoder:')) enc, mo.src_ip, mo.datacenter
FROM
logical_service ls, mpeg_out mo, UNNEST(ls.tags) AS tagarr
WHERE
tagarr LIKE 'encoder:%'
AND mo.lid = ls.lid
Run Code Online (Sandbox Code Playgroud)
这将创建3列数据,如下所示:
encoder | src_ip | datacenter
Run Code Online (Sandbox Code Playgroud)
然后我有一个encoder包含字段的表
encoder | output_source_ip | datacenter
Run Code Online (Sandbox Code Playgroud)
output_source_ip主要为null,因此,encoder如果编码器和数据中心上的选择与编码器和数据中心匹配,我想用src_ip 更新表上的该列。
知道我该怎么做吗?这是我尝试做的尝试,但肯定被打破了:
UPDATE encoder
SET output_source_ip = (
SELECT
RIGHT(tagarr, LENGTH(tagarr) - LENGTH('encoder:')) encoder, mo.src_ip, mo.datacenter
FROM
logical_service ls, mpeg_out mo, UNNEST(ls.tags) AS tagarr
WHERE
tagarr LIKE 'encoder:%'
AND mo.lid = ls.lid
);
Run Code Online (Sandbox Code Playgroud) 我正在创建一个查询,该查询将显示从8个表派生的记录的信息.最初编写查询的开发人员使用'where this equals this'和'this equals this'的组合来创建连接.
我已经将查询更改为使用INNER JOINS.我想知道我的方法是否比使用WHERE运算符的组合更好.
在良好实践的衡量标准上,INNER JOINS的组合是一个很好的选择,或者我应该采用不同的技术.
我在SQL Server中有两个不同的模式(比如S1,S2).这些模式中有两个表(比如S1.Table1,S2.Table2).我想从模式S1查询这两个表.
S1和S2都在SQL Server 2005数据库中.我想做这样的事情:
select T1.Id
from S1.Table1 T1
, S2.Table2 T2
Where T1.Id = T2.refId
Run Code Online (Sandbox Code Playgroud) 所以我知道在查询的WHERE子句中添加过滤条件是一种很好的编程习惯,这样可以最大限度地减少连接中返回的行数,但是我们如何决定是否应该在WHERE中添加过滤器而不是FROM?例如:
SELECT a.ColA, a.ColB, a.ColC, b.ColD, b.ColE
FROM TblA a INNER JOIN TblB b
On a.ColA = b.ColD
AND a.ColA = 'X'
AND a.ColB = 'Y'
WHERE b.ColD = 'ABC'
Run Code Online (Sandbox Code Playgroud)
在这个查询中,如果我在AND子句而不是WHERE中添加b.ColD怎么办?这会不会使查询更有效率?我知道两种方法的结果有时会有所不同,但我不知道为什么?
谢谢.
我正在查看由不熟悉SQL的开发人员维护的代码.我在他的代码中经常看到以下代码片段:
SELECT *
FROM person, status
WHERE person.status_id = status.id
Run Code Online (Sandbox Code Playgroud)
我已向他建议他使用以下代码:
SELECT *
FROM person
INNER JOIN status ON status.id = person.status_id
Run Code Online (Sandbox Code Playgroud)
他指出,在这种特殊情况下,两个查询在相同的时间范围内返回相同的结果(67毫秒中的34k行).我的新查询在这种情况下没有改变任何事实这一事实证明了这种方法没有任何问题.我曾尝试向他解释笛卡尔等产品,但他坚持认为这种方法没有任何问题.有人可以帮助提供负面的例子,说明依赖于此的方法会失败,和/或为什么从实施的角度来看这种查询行是危险的?
sql ×7
mysql ×5
join ×4
inner-join ×3
performance ×2
sql-server ×2
cartesian ×1
left-join ×1
product ×1
select ×1
t-sql ×1
where ×1