SQL查询还是子查询?
Posted
技术标签:
【中文标题】SQL查询还是子查询?【英文标题】:SQL query or sub-query? 【发布时间】:2008-12-26 09:26:56 【问题描述】:我在 mysql 中有一个学生信息表,看起来像这样(简化):
| age : int | city : text | name : text |
-----------------------------------------------------
| | | |
我希望选择给定城市内的所有学生姓名和年龄,以及每个学生在他的年龄组中有多少其他学生(即有多少学生共享他的年龄值)。
我设法通过子查询做到了这一点;类似:
select
name,
age as a,
(select
count(age)
from
tbl_students
where
age == a)
from
tbl_students
where
city = 'ny'
但这似乎有点慢,而且我不是 SQL 专家,所以我想我会问是否有更聪明的方法来做到这一点。该表按年龄和城市编制索引。
【问题讨论】:
【参考方案1】:select
t1.name,
t1.age as a,
count(t2.age) NumberSameAge
from
tbl_students t1 inner join tbl_students t2
on t1.age=t2.age
where
city = 'ny'
group by t1.name, t1.age
未经测试,但类似。 I.o.w.加入时的 groupby。这有时会更快,因为您正在运行的查询正在为返回的 每一 行执行嵌套子查询,并且我在上面发布的查询(或至少,具有连接和 groupby 的结构)执行只对相关学生进行一次查询。
【讨论】:
ooh.. 从来没有想过在同一张桌子上做一个连接。聪明..我下周试试。 虽然自联接是此查询的正确习惯用法,但我想指出,您在证明自己的理由时一直存在一些神话。相关子查询通常由数据库引擎优化为连接。它很少会为每一行执行嵌套查询。识别子查询何时是特定任务的最佳语法很重要;通常,子查询的意图更清晰,有时它是获得正确结果的唯一方法。我没有在这台机器上安装 MySQL,但是尝试EXPLAIN
ing 这两个查询——它们可能比你想象的更相似。
然而,值得指出的是,MySQL 的查询优化器在所有其他可用的主要 DBMS 之后几乎是气喘吁吁。您的里程可能会有所不同。【参考方案2】:
获取一次获取所有内容的子查询可能更容易(与运行子查询 1000 次的 1000 行相比)。
SELECT Age, count(*) AS SameAge FROM tbl_students
进行完整的查询:
SELECT t.Name, t.Age, s.SameAge
FROM tbl_students t
INNER JOIN (
SELECT Age, count(*) AS SameAge FROM tbl_students
) AS s
ON (t.Age = s.Age) -- m:1
WHERE t.City = 'NY'
【讨论】:
以上是关于SQL查询还是子查询?的主要内容,如果未能解决你的问题,请参考以下文章