SQL Server for C#程序员

Kre*_*dns 10 c# sql

我是一个非常优秀的C#程序员,需要学习SQL Server.学习SQL Server /数据库开发的最佳方法是什么?

注意:在数据库和SQL方面,我总是新手.

tpd*_*pdi 16

SQL是关于集合论的,或者更确切地说,是关系代数.阅读简要介绍.学会思考,而不是程序.

在实践方面,有四个基本操作,

  • 选择,显示表格数据的某些投影
  • 删除,删除表行的某些子集,
  • insert,向表中添加行,
  • 更新,(可能)更改表中的数据

(通过子集,我的意思是任何子集,包括空集,而不一定是适当的子集.)

在任何地方我都可以在DDL中编写列名(除了作为更新的目标),我可以编写一个使用列名,函数或常量的表达式.

select 1, 2, 3 from table将返回结果集"1 2 3",对表中的每一行返回一次.如果命名的列create_date是date类型,并且函数month返回给定日期的月份编号,select month( create_date) from table则会显示每个create_date的月份编号.

where子句是一个谓词,它将选定,删除或更新的行限制为谓词为true的行.A,其中的原因可以由通过逻辑运算符连接谓词的任意数量的and ornot.就像a中的列列表一样select,我可以在我的where子句中使用列名,函数和常量.您认为从哪个结果集返回select * from table where 1 = 1;

在查询中,表通过连接相关联,其中一个数据或一个键由操作符与另一个表中的数据或键相关联.关系运算符通常是相等的,但实际上可以是任何二元运算符甚至是函数.

如上所述,表格与密钥相关; 表中的行可能与另一个表中的零行,一行或多行有关; 这被称为关系的基数.关系可以是一对一,一对多,多对多.有标准的方式来表示每个关系.在查找标准方法之前,请考虑一下如何代表每个方法,以及每种方法的最低要求.你会发现,多对多关系实际上也可以模拟一对多和一对一; 问问自己为什么,鉴于此,所有的关系都不是多对多的.

除此之外,EF Codd在关系数据库中开创了正常形式的理念.通常有五到六种常规形式,但正常形式最重要的总结很简单:数据库模型应该只用一行和一行表示的每个实体,每个属性应该依赖于行的键,并且每一行都应该为实体或关系建模.阅读正常形式的入门读物,并了解如果您的数据库未规范化,您可以获得数据不一致的原因.

在这一切中,试着理解为什么我要说"如果你撒谎到数据库,那将骗你".通过这个我并不意味着糟糕的数据,我的意思是糟糕的设计.例如,如果您将一对多关系建模为多对多关系,那么可以记录什么是"谎言"?如果你的桌子没有正常化,会发生什么"谎言"?

实际上,视图是给定名称并存储在数据库中的选择查询.如果我经常通过多对多关系student将表连接到表,也许我可以编写一个视图来选择该连接中感兴趣的列,并使用视图而不是总是重写连接.majorstudent_major

实用技巧:首先,写一个视图.无论你做什么,如果你为每次计算或子计算写一个视图,它会更简单,更清晰.编写一个封装每个连接的视图,编写一个封装每个转换的视图.您想要做的几乎任何事情都可以在视图中完成.

将查询分解为视图与功能分解在过程代码中的作用相同:它允许您专注于做好一件事,使其更容易测试,并允许您从更简单的操作中组合更复杂的功能.这是一个示例,我使用视图将表转换为更容易允许我应用连续转换的表单,以达到目标.

不要混淆数据.每个表都应该明确地模拟一件事(一种实体)和一件事; 每列应该表达该事物的一个且仅一个属性.不同种类的实体属于不同的表.

元数据是你的朋友.您的数据库平台将提供一些元数据; 什么它没有提供你应该添加.由于元数据是数据,因此适用于建模数据的所有规则.例如,您可以从sytem表中获取数据库中所有对象的名称sysobjects; syscolumns包含所有列.要查找一个表中的所有列,您需要加入sysobjectssyscolumns使用id,并添加一个where将结果集限制为特定表名的子句:where sysobjects.name = 'mytable'.

实验.坐下来在一个数据库中问问自己,"我怎样才能代表有头发颜色,专业和住所的人?建模中隐含着哪些表格和关系?" 然后模型化,作为表格.

然后问问自己,"我怎样才能展示所有居住在亚特兰大的金发医生",并写出这样做的查询.通过撰写视图向您展示所有金发女郎,所有医生以及居住在亚特兰大的所有人.

你会发现,在询问"我怎样才能找到它"时,你会发现模型中存在缺陷,你会发现你想要甚至需要改变模型的工作方式.进行更改,看看它们如何使您的查询更容易或更难写.