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,但是尝试EXPLAINing 这两个查询——它们可能比你想象的更相似。 然而,值得指出的是,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查询还是子查询?的主要内容,如果未能解决你的问题,请参考以下文章

子查询和相关子查询的区别

SQL中的子查询

SQL 子查询

SQl子查询

5. SQL子查询—内嵌的SQL子句

moon 子查询 SQL