SQL中,同一题目使用“联接”与“子查询”哪一种效率高呢?

时间:2022-02-10 19:56:55
SQL中,同一题目使用“联接”与“子查询”哪一种效率高呢?

7 个解决方案

#1


不能一概而论

#2


具体化呢

#3


如果子查询是从一张大表里面抽取少量记录,那么子查询应该比直接的join要好

#4


我个人认为:最好还是能用连接的就尽量用连接

#5


一个10000条无重复记录的表A,将其COPY一份表B,再往B中插入一条不重复的记录x,然后用A,B来做试验,找出x。结果是(按所用时间比较):
外连接 < exists < in。
所用时间一次为0.2X秒,0.9X秒,很久。
这是同事前两天才刚刚专门试过的。在Oracle下。

#6


联接应该快吧
========================================
我的签名(2004年12月25日 13时58分46秒)

#7


几乎所有用于联接表格以及使用了联接操作符的select语句都可以用子查询重新编写,反之亦然。
将select写成联接的格式,通常更易于SQL程序员的阅读和理解,也可以帮助SQL Server找到一种
更有效的策略来获取适当的数据。
  ⒈子查询的优势: 当你需要频繁地计算聚集函数并将其用在外查询中作比较时,子查询就可以
显示出它的优势。
  如:有2张表 
      表employee
      结构为:emp_no   emp_fname   emp_lname  dept_no
      表works_on
      结构为: emp_no  project_no  job   enter_date
  例:获取参与项目的日期与表中最早的日期相等的所有职员的编号和参与日期
       select emp_no,enter_date
         from works_on
         where enter_date=(select min(enter_date)
                              from works_on)
      此例就不能用联接来解决,因为那样的话你就必须在where子句中编写聚集函数,而这是不
  允许的。
   
  ⒉联接的优势:若一个查询中的select列表所包含的列是来自多于一个表的,则联接的优势就
  体现出来了。
   例:获取在1998年10月15日加入项目的所有职员的编号、姓和工种
       select employee.emp_no,emp_lname,job
          from employee,works_on
          where employee.emp_no=works_on.emp_no and enter_date=10.15.1998
   此查询中的select列表中包含了表employee中的列emp_no和emp_lname,以及表works_on中的
 列表job。就因为这个原因,此例中是使用子查询的解决方法将会显示错信息,因为子查询只
 能显示外部表中的信息。
    理解了上述内容后相信你知道何时使用联接和子查询了吧!

#1


不能一概而论

#2


具体化呢

#3


如果子查询是从一张大表里面抽取少量记录,那么子查询应该比直接的join要好

#4


我个人认为:最好还是能用连接的就尽量用连接

#5


一个10000条无重复记录的表A,将其COPY一份表B,再往B中插入一条不重复的记录x,然后用A,B来做试验,找出x。结果是(按所用时间比较):
外连接 < exists < in。
所用时间一次为0.2X秒,0.9X秒,很久。
这是同事前两天才刚刚专门试过的。在Oracle下。

#6


联接应该快吧
========================================
我的签名(2004年12月25日 13时58分46秒)

#7


几乎所有用于联接表格以及使用了联接操作符的select语句都可以用子查询重新编写,反之亦然。
将select写成联接的格式,通常更易于SQL程序员的阅读和理解,也可以帮助SQL Server找到一种
更有效的策略来获取适当的数据。
  ⒈子查询的优势: 当你需要频繁地计算聚集函数并将其用在外查询中作比较时,子查询就可以
显示出它的优势。
  如:有2张表 
      表employee
      结构为:emp_no   emp_fname   emp_lname  dept_no
      表works_on
      结构为: emp_no  project_no  job   enter_date
  例:获取参与项目的日期与表中最早的日期相等的所有职员的编号和参与日期
       select emp_no,enter_date
         from works_on
         where enter_date=(select min(enter_date)
                              from works_on)
      此例就不能用联接来解决,因为那样的话你就必须在where子句中编写聚集函数,而这是不
  允许的。
   
  ⒉联接的优势:若一个查询中的select列表所包含的列是来自多于一个表的,则联接的优势就
  体现出来了。
   例:获取在1998年10月15日加入项目的所有职员的编号、姓和工种
       select employee.emp_no,emp_lname,job
          from employee,works_on
          where employee.emp_no=works_on.emp_no and enter_date=10.15.1998
   此查询中的select列表中包含了表employee中的列emp_no和emp_lname,以及表works_on中的
 列表job。就因为这个原因,此例中是使用子查询的解决方法将会显示错信息,因为子查询只
 能显示外部表中的信息。
    理解了上述内容后相信你知道何时使用联接和子查询了吧!