对于学校作业,我必须创建一个数据库并运行报告。我已经创建了代码,同学也创建了代码并运行相同的东西,但他的格式是我没见过的,也不太明白。
这是我的:
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.name
和p.ID
等?我不太明白代码是如何工作的。我看似简单明了,我当然明白那里发生了什么。有人可以解释一下吗?
由于
答案 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
因此,在您的查询中,p
是Program
的别名,这意味着您现在可以使用Program
的名称引用您的表p
,而不是写出整个名称Program
无处不在。
类似地,您可以通过简单地用点写入p然后使用列名来访问表程序列的名称。像p.column
这样的东西。当您使用 JOINS 时,此技术非常有用,而某些表的列名称相似。
修改: - 强>
虽然大多数要点都包含在其他人的答案中。我只是补充一点,你应该像现在这样做,避免习惯JOINING table。
您可以查看Aaron Bertrand的
答案 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
观察表Program
和Course
都定义了表别名。
选择部分必须指定列名来自的表。这正是你所做的。您的合作伙伴刚刚在表名中添加了别名。这些别名较短,使查询看起来不像文本的大墙。
另一个区别是关节的使用。连接通常用于链接两个具有相应列的表的结果。
列通常是主键,第二个表中是外键。
您的查询很好,但首选连接语法。
编辑:创建视图后,它现在已经编译,可以像表格一样在选择中使用。
SELECT * FROM NumberOfCoursePerProgram
如果您需要修改视图,可以使用
ALTER VIEW NumberOfCoursePerProgram AS
......
......
答案 3 :(得分:1)
在SQL Server中,您可以为表提供一个不带AS的别名,它是可选的。
如果您要添加AS,它将像您一样工作。
值得注意的是,他正在使用连接而不是where子句连接,这是我的偏好,因为它更容易阅读和更新代码道德。
有时你需要加入一个WHERE子句,因为连接有多个条件,但在你的情况下这种情况非常罕见。
答案 4 :(得分:1)
这里有一些事情发生:
如果我从他的代码中删除“Program p”中的“p”,则返回“多部分标识符”p.name“无法绑定。”
P
是program
的别名。通过这样做。如果您需要使用Program
,可以将其称为P
。
就他所做的事情而言:在这种情况下最好做一个JOIN
而不是做你正在做的多表SELECT
。在简单的情况下,它并不重要,但如果课程和程序都有数百万行。在你的方式你基本上选择一切。通过ProgramID
上的加入,您只能在ProgramCourse
中获得与Program
中的条目相对应的项目(由ID
和CourseID
绑定在一起)。
另一个重要的注意事项。你正在做一个简单的SELECT
语句。在SQL中,有一些名为VIEWS的对象充当虚拟表。他现在可以随时SELECT * FROM NumberOfCoursePerProgram
做任何时间,他将永远不必进行任何连接,并再次选择。
希望有帮助...