USE dbName与dbName.TableName之间的区别?

时间:2019-08-30 08:28:19

标签: sql sql-server

有什么区别
USE SchoolDB;
SELECT * FROM  StudentTable;

vs

SELECT * FROM SchoolDB.dbo.StudentTable;

这两者的优点和缺点是什么?对查询性能有影响吗?

我几乎在所有地方搜索过,找不到任何资源。如果有任何重复的问题或链接,将非常有帮助。 我在Microsoft SQL Management Studio中发现的唯一一件事是'USE'关键字,使连接保持与db的连接打开,而dbName.TableName却没有。

3 个答案:

答案 0 :(得分:1)

  

这两者的优点和缺点是什么?对查询性能有影响吗?

使用DBName

  • 切换默认数据库上下文,这样您就不必在查询中输入三部分名称

多部分名称

  • 当您的脚本在同一查询(选择,删除,更新等)中将多个数据库作为目标时很有用
  • 要消除名称解析错误,尤其是在查询针对多个数据库时。即使,如果您的查询没有针对多个数据库,则最佳做法始终是提及具有两部分名称的对象,即for everyRegion in enumerate(data['data'][0]['regions']): pd.io.json.json_normalize(data['data'][0]['regions'][everyRegion])

总而言之,使用这两种方法都不会影响性能,但是如上所述,如果不使用Multi-part names

,则可能会出现语法错误

答案 1 :(得分:1)

正如其他人所说,“使用”创建上下文,以便所有后续查询都针对该数据库执行;由三部分组成的名称明确命名数据库。此选择不会影响性能。

但是您可能会做出一些设计选择,这些选择会影响您的决定。

例如,您可能具有开发,测试和生产数据库。如果您有一个SQL批处理文件(例如),则最好显式设置数据库上下文,然后执行不包含三部分名称的查询。

您可能具有一个应用程序设计,该应用程序将数据拆分到不同的数据库(例如,客户,产品,销售)中;在这种情况下,可能更容易同意使用三部分名称样式,因此您的查询可以在任何一个数据库中执行。

答案 2 :(得分:0)

  

我发现的唯一一件事是...'USE'关键字保持连接   打开数据库

...不,与连接无关。

USE只需将数据库设置为默认的 context 。这意味着任何未来的命令(直到下一个USE语句)都将被命名为USE语句中指定的数据库。 / p>

例如

USE MyDatabase
SELECT * FROM MyTable
SELECT * FROM SomeOtherDatabase.dbo.SomeOtherTable
SELECT * FROM MyView
USE AThirdDatabase
SELECT * FROM AThirdTable

在以上命令集中,由于使用MyDatabase命令,第2行和第4行中的语句将被视为引用USE中的对象。 (它也分别假定默认的dbo模式,因为它也未指定)。

相比之下,

第3行专门为数据库命名。这是一次性的,不会更改USE

定义的上下文

在第二个USE命令之后,将假定第6行的语句引用了AThirdDatabase中的对象。


P.S。您问题中的示例代码不能完全代表您所询问的问题-您尚未考虑架构。

您的第一个查询将从StudentTable中默认模式(通常为dbo)的SchoolDB中进行选择。没关系。但是在第二个查询中,将假设SchoolDB是架构名称,而不是数据库名称。 SQL将假定与默认数据库的连接(通常为master,除非已登录的用户配置了其他数据库)。

dbName.TableName(根据您的标题)不是对象名称的有效结构-如果您指定数据库,则还必须指定架构(否则,两个不同对象之间的引用可能不明确相同名称的模式)。