SQL Server代码之间的区别?

时间:2013-11-19 20:13:39

标签: sql sql-server

对于学校作业,我必须创建一个数据库并运行报告。我已经创建了代码,同学也创建了代码并运行相同的东西,但他的格式是我没见过的,也不太明白。

这是我的:

SELECT
    Course.Name AS 'Course Name', 
    Program.Name AS 'Program Name'
FROM
    Course, Program, ProgramCourse
WHERE 
    ProgramCourse.CourseID = Course.ID
AND
    ProgramCourse.ProgramID = Program.ID
GO

这是他的:

CREATE VIEW NumberOfCoursePerProgram AS
        SELECT
                p.name AS ProgramName,  
                c.name AS CourseName
        FROM
                Program p
        JOIN
                ProgramCourse pc ON pc.ProgramID = p.ID
        JOIN 
                Course c ON c.ID = pc.CourseID
GO

我使用我创建的表中的数据运行了两个查询。它们返回几乎相同的结果,只是略有不同的顺序,但它完成了分配问题。无论如何,如果我从他的代码中删除p中的Program p,则会返回错误

  

无法绑定多部分标识符“p.name”。

那么当我还没有建立这些变量时,SQL Server如何能够接受p.namep.ID等?我不太明白代码是如何工作的。我看似简单明了,我当然明白那里发生了什么。有人可以解释一下吗?

由于

5 个答案:

答案 0 :(得分:10)

有一些差异。首先,他正在创建一个VIEW而不是只是一个选择语句:

CREATE VIEW NumberOfCoursePerProgram AS

创建视图后,您可以像查询表一样查询视图:

SELECT * FROM NumberOfCoursePerProgram;

其次,他使用ANSI JOIN而不是隐式JOIN。根据今天的标准,他的方法更现代,更有可能被认为是正确的

JOIN ProgramCourse pc ON pc.ProgramID = p.ID
JOIN Course c ON c.ID= pc.CourseID

而不是:

FROM Course, Program, ProgramCourse

另外,请注意他在引用表时指定table aliases

FROM Program p

最后的p允许您替换p,而不是在查询的其他位置指定Program的整个表名。例如,您现在可以说WHERE p.Foo > 5而不是WHERE Program.Foo > 5。在这种情况下,它只是一个快捷方式,并保存一些字符。但是,假设您两次引用同一个表(例如,在同一个表中的两个不同的行中加入)。在这种情况下,您可能拥有为每个表提供别名以消除哪一个是哪个。

答案 1 :(得分:4)

这些在SQL中称为alias。 Alias基本上是为了提高可读性和更好地编写代码而创建的。

  

通过给出一个可以改善SELECT语句的可读性   表别名,也称为相关名称或范围变量。一个   可以使用或不使用AS关键字分配表别名:

     
      
  • table_name AS表别名
  •   
  • table_name table_alias
  •   

因此,在您的查询中,pProgram的别名,这意味着您现在可以使用Program的名称引用您的表p,而不是写出整个名称Program无处不在。

类似地,您可以通过简单地用点写入p然后使用列名来访问表程序列的名称。像p.column这样的东西。当您使用 JOINS 时,此技术非常有用,而某些表的列名称相似。

修改: -

虽然大多数要点都包含在其他人的答案中。我只是补充一点,你应该像现在这样做,避免习惯JOINING table。

您可以查看Aaron Bertrand的

Bad habits to kick : using old-style JOINs

作为参考。

答案 2 :(得分:2)

CREATE VIEW NumberOfCoursePerProgram AS
    BEGIN
        SELECT
                p.name AS ProgramName,  
                c.name AS CourseName
        FROM
                Program p
        JOIN
                ProgramCourse pc ON pc.ProgramID= p.ID
        JOIN Course c ON c.ID= pc.CourseID
    END

GO

观察表ProgramCourse都定义了表别名。

选择部分必须指定列名来自的表。这正是你所做的。您的合作伙伴刚刚在表名中添加了别名。这些别名较短,使查询看起来不像文本的大墙。

另一个区别是关节的使用。连接通常用于链接两个具有相应列的表的结果。

列通常是主键,第二个表中是外键。

您的查询很好,但首选连接语法。

编辑:创建视图后,它现在已经编译,可以像表格一样在选择中使用。

SELECT * FROM NumberOfCoursePerProgram

如果您需要修改视图,可以使用

ALTER VIEW NumberOfCoursePerProgram AS 
......
......

答案 3 :(得分:1)

在SQL Server中,您可以为表提供一个不带AS的别名,它是可选的。

如果您要添加AS,它将像您一样工作。

值得注意的是,他正在使用连接而不是where子句连接,这是我的偏好,因为它更容易阅读和更新代码道德。

有时你需要加入一个WHERE子句,因为连接有多个条件,但在你的情况下这种情况非常罕见。

答案 4 :(得分:1)

这里有一些事情发生:

  

如果我从他的代码中删除“Program p”中的“p”,则返回“多部分标识符”p.name“无法绑定。”

Pprogram的别名。通过这样做。如果您需要使用Program,可以将其称为P

就他所做的事情而言:在这种情况下最好做一个JOIN而不是做你正在做的多表SELECT。在简单的情况下,它并不重要,但如果课程和程序都有数百万行。在你的方式你基本上选择一切。通过ProgramID上的加入,您只能在ProgramCourse中获得与Program中的条目相对应的项目(由IDCourseID绑定在一起)。

另一个重要的注意事项。你正在做一个简单的SELECT语句。在SQL中,有一些名为VIEWS的对象充当虚拟表。他现在可以随时SELECT * FROM NumberOfCoursePerProgram做任何时间,他将永远不必进行任何连接,并再次选择。

希望有帮助...