赞
踩
1. namespace关键字:
Namespace(命名空间)是C#中组织代码的方式,他的作用类似于java中的package(包)这样我门就可以把紧密相关的一些代码放在同一个命名空间中,大大提高管理和使用的效率。
2.using关键字:
在java中,如果导入其他包,应该使用import关键字,而在c#中, 使用using关键字来引用其他命名空间,它的作用和java中的import类似,
3.Class关键字:
与java一样C#也是一种面向对象的语言,使用class关键字表示类,我们编写的代码都应该包含在一个类中,类要包含在一个命名空间中,在程序模板生成时,Visual Studio自动船舰了一个类,名为Program。如果你不喜欢,可以改掉它 注意:c#与java不同,不要求类名必须与原文件的名称一样!
2. Main方法
C#中的Main()方法和Java中的main方法是一样的,是程序运行的入口,应用程序从这里开始运行,但要注意的是:C#中的Main()方法首字母必须大写,Main()方法的返回值可以是void或者int、类型Main()方法可以没用命令行参数,因此,这样组合一下,C#中Main()方法有四种形式!
语法:
Static void Main (string[] args){}
Static int Main(string[] args){}
Static void Main(){}
Static int Main(){}
当创建一个项目的时候,编译器会创建一个第一种形式的Main()方法
注意:编写程序的时候,一般会采用编译器自动生成的Main()方法,也可以根据需要修改成其他三种形式,例如,当Main()方法被调用时,如果希望通过命令行传递一些参数,可以采用带参数的Main()方法:当Main()方法执行结束需要返回一个结果,(如执行成功还是失败)时,可以采用有返回值的Main()方法,
对比:
组织代码的方式:c#使用命名空间(namespace),java使用包(package)。
引用命名空间或者包的关键字:c#使用using,java使用import
程序入口:c#的Main()有四种形式,java 的main()有一种方式
C#中的数据类型
使用数据类型 | Java | C# | 举例 |
整形 | Int | Int | 年龄 |
浮点型 | Float | Float | 成绩 |
双精度型 | Double | Double | 圆周率 |
字符串型 | String | String | 姓名 |
布尔型 | Boolean | Bool | 是否是少数民族 |
注意:C#中布尔型的关键字和java 的不同,使用bool C#中字符串型的关键字首字母是小写的
在为浮点型变量赋值时,c#语言要求赋值数据必须以字母f或者F结束
c#中的变量声明方式和java是相同的,
数据类型 变量名称
C#的变量命名规则与java也基本相同,只是”$”符号在C#中是不能使用的,因此变量的命名规则可以简单总结为以下三条:
组成:52个英文字母(A~Z,a~z), 10个数字(0~9), 下划线(_)除此之外不能含有其他的字符
开头:只能以字母或者下划线开头
不能使用的:不能是C#中的关键字,C#中的关键字完整列表参见附录2
变量命名规范:
>变量的名称要有意义,尽量用对应的英文命名,具有见名知意的作用,例如,一个变量代表姓名,不要用aa,bb等,要使用name
>避免使用单个字符作为变量名,如a,b,c等,应该使用 index temp等,但循环变量除外!
>当使用多个单词组成变量名是,应该使用骆驼(Camel)命名法,即第一个单词的首字母小写,其他单词的首字母大写,如myName,yourAge等。
C#中的常量,什么是常量?
常量就是在程序运行中保持不变的值,例如,示例2中的dayMax表示一周的天数,应该是不变的,就可以定义为常量,常量定义的语法如下:
语法:
Const 数据类型常量名称 = 值;
常量的命名规范如下:
>常量名称必须具有一定的实际意义
>常量的名称最好以大写字母来命名,中间可根据意义的连接线用下划线做链接,每个常量定义的右侧最好有简单的注释,说明其作用
>常量的名称长度最好不要超过25个字符,否则可读性差
何时使用常量????
就是用于在程序中一旦设定就不允许被改变的值:例如,圆周率的值是整个程序范围内一般是不能随意修改的!
Console类
c#向控制台输出
利用Console WhiteLine()方法输出有三种方式;
语法:
方式一:Console.WriteLine();
方式二:Console.WriteLine(要输出的值);
方式三:Console.WriteLine(“格式字符串”,变量列表);
注:方式三是c#语言中的新语法。先看一个例子:
String course=”C#”;//course是课程的意思
Console.WriteLin(“我的课程名称是:{0}”,course);
C#从控制台读入:
与Console.WriteLine();对应,从控制台输入可以使用Console.ReadLine();方法,Write是写的意思Read是读的意思
语法:
Console.ReadLine();
这句话返回一个字符串,可以直接把他赋给一个字符串变量,例如:
Name=Console.ReadLine();
如果需要输入整形数据怎么办呢?只需要一个简单的转换就可以了。
Int age= int.Parse (Console.ReadLine());
Int,Parse()方法的作用是把字符串转换为整数。
自定义方法:
在C#中定义方法的语法与java语法类似
语法:
[访问修饰符]返回值类型 方法名(参数列表)
{
//方法的主体
}
1. 访问修饰符
在java课程中已经学习了访问修饰符public 在本课程中将会使用两个访问修饰符,一个是public(共有的)另一个是private(私有的),这两个访问修饰符的具体应用将会学到的
2. 方法的返回值类型
我们编写的方法是实现特定功能的模块,可供他人调用,在调用后可以返回一个值,这个返回值的数据类型就是方法的返回值类型,可以是 int float double bool string等,如果方法不返回任何值,需要使用Void关键字
3.方法名
每个自定义的方法都要有一个名称.方法的名称应该有明确的含义,这样别人在使用的时候,就能清楚的知道这个方法能实现什么功能,例如,我们用了无数遍的WriteLine()方法,从名称上就知道是输入的一行信息的意思
4.参数列表
调用方法时,可以想方法中传递参数,这些参数构成了参数列表,如果没用参数就不用参数列表。参数列表中的每个参数都是通过”类型参数名”形式进行声明的,各个参数之间用逗号分开
5. 方法的主体
方法的主体部分就是这个方法实现某一特定功能的代码。自定义方法时,应该先写方法的声明。包括访问修饰符,返回值类型,方法名,参数列表。然后写方法的主体,
提示-方法命名规范如下:
>方法名要有实际的含义,最好使用动宾短语,表示能完成什么任务
>方法名一般要使用Pascal命名法,就是组成方法名的单词直接相连,每个单词的首字母大写,如WriteLine().ReadLine();
类是对象类型,对象是类的示例,这就是类和对象之间的关系
语法:
[访问修饰符] class类名
{
//类的主体
}
在java中我们学习过,在类中可以包含属性和方法,属性,(java中也叫做成员变量)用来描述类的特征,方法用来描述类的行为,在c#中类的定义与java语言相似,在类中可以包含字段,属性和方法,每个类可以使用访问修饰符来设置该类的访问权限。
Java和C#中注释的区别:
Java | 单行注释// | 多行注释/**/ | 文档注释/** */ |
|
|
|
|
C# | 单行注释// | 多行注释/**/ | 文档注释/// |
随着类的定义不断完善,其代码也越来越多,你能很快找到你想要查看的代码吗?如何使你写的代码可读性更高?教你一招。将每个方法都折叠成一句并提供说明。做法:把方法的代码写在#region和#endregion之间。在#endregion后面就可以添加说明
注释规范的具体内容如下
>类名前应使用文档注释,说明类的简单功能和使用方法。
>方法前应该使用注释,说明方法的功能,参数的含义,返回值等
>关键性的语句要使用注释,如变量声明,条件判断,循环等。
1. 设置断点(断点:breakpoint),如果要在”student.Show():”代码行设置一个断点,采取的方法是将光标停在最左边,按F9键
技巧:程序调试时常用的快捷键如下.
> F5:开始调试
> Shift+F5:停止调试
> F9:设置或者取消断点。
> Ctrl+F9:取消断点。
> F10:单步执行
> F2:转到所调用过程或者变量的定义
> Ctrl+F2:将焦点转换到类的下拉列表框
2. 监视变量值:省略不想写了.....
>使用Visual Studio 创建和运行c#控制台应用程序的步骤如下:
1.启动 Visual Studio 2018.
2.新建项目
3.生成可执行文件
4.开始运行
> C#采用命名空间组织程序,引入其他命名空间用using关键字。
> C#中使用控制台类Console的ReadLine()和WriteLine()方法输入和输出信息
> C#中Main()方法的首字母大写,根据返回值和参数的不同Main()方法有四种形式
> C#中布尔类型使用bool关键字。
> C#使用const关键字声明常量
> C#中三种注释类型,其中文档注释使用///表示
> 类是创建对象的模板,对象是类的一个具体实例
> 调试程序的步骤如下:
1. 设置断点:按F9快捷键
2. 启动调试:按F5快捷键
3. 在监视窗口中查看变量的当前值
C#中if结构的语法和java完全相同,
语法:
If (条件表达式)
{
//代码块
}
If else 语法如下:
If (条件表达式)
{
//代码块1
}
else if(条件表达式2)
{
//代码块2
}
C#中的多重if选择结构如下。
If (条件表达式1)
{
//代码块1
}
else if (条件表达式2)
{
//代码块2
}
else if(条件表达式3)
{
//代码块3
}
else if(条件表达式4)
{
//代码块4
}
嵌套if结构就是在if里面再嵌入if结构,他的结构如下
语法:
if(条件表达式1)
{
If (条件表达式2)
{
//代码块1
}
else
{
//代码块2
}
}
else
{
//代码块3
}
注意:>只有当满足外套if的条件时,才会判断内层if的条件
>else与离他最近的那个缺少else的if相匹配。
If结构书写规范如下:
>为了使if结构更加清晰,应该把每个if或else包含的语句都用大括号括起来。
>相匹配的一对if和else应该左对齐。
>内层的if结构相对于外层的if结构要有一定的缩进。
大括号按规范写法:c#中大括号“{”和“}”各占据新的一行,而java中左大括号紧跟if结构的条件后面。右大括号“}”则需要另起新的一行这是一种编程习惯,可以提高程序的可读性
速记方法:
ICBC(爱存不存):中国工商银行
CBC(存不存):中国建设银行
ABC(啊不存):中国农民银行
语法:
数据类型 [ ] 数组名;
数据类型 数组名[ ];
但是,在c#中只能使用第一种方式,即不能把方括号放在数组名的后面。
语法:
数据类型 [ ] 数组名;
例如:Int [ ] array ;
C#中的数组和java中初始化数组的语法是一样的,
例如:int [ ] array=new int [5] { 0, 1, 2, 3, 4, 5 };
通过数组Length属性,可以获得数组的长度
语法如下:
数组名:.Length
同java一样,访问数组的元素使用的形式如下:下边从0开始 在c#中我们也把下标叫做索引。
语法如下:
数组名 [下标]
如果要存储三个学员对象应该怎么做呢?没错!我们可以使用一个Student(s学员类)类型的数组,此时,数组元素为学员对象我们称之为对象数组
语法:
Student [ ] stus=new Student [3];//定义对象数组
1. while循环
While循环是先判断条件是否满足,如果成立再执行循环体。
语法如下:
While(条件表达式)
{
//代码块
}
2. do-while循环
do-while循环是先执行再判断条件,所以至少会执行一次循环体中的语句。
语法:
do
{
//代码块
}while(条件表达式);
3. for循环
for循环常常用在确定循环次数的情况下
语法:
For(表达式1;表达式2表达式3)
{
//代码块
}
4. forecah循环
Foreach循环结构用于便利一个数据集合的每一项(目前只学习了数组)需要设置一个标识符(变量)依次表示其中的每一项,在循环期间可以对各数据项执行制定的操作
语法:
foreach(元素类型 元素变量名 in 数组)
{
//代码块
}
语法中的”元素”是一个只读变量
foreach结构的执行过程是循环体一次取出数组中的每一个元素,然后对每个元素都执行一次循环体的操作。
1. break语句
Break语句将使程序跳出当前循环结构,并继续执行该循环后面的语句
2. continue语句
Continue语句的作用是退出当前循环结构的本次循环,并开始执行当前循环结构的下一次循环,而不是退出
Break语句和continue语句在当前循环结构中跳转的位置是不同的
演示:
Int i , j ;//循环变量
//外层循环控制打印行数
For( i =1; i<=5;i++)
{
//内层循环控制打印的行数
for( j = 1 ; j <=5; j ++)
{
Console.WriteLine( j );//打印一个数字
}
Console.WhiteLine();//打印完一行后换行
}
外层循环每执行一次,内层循环都会从头到尾的完整的执行一遍
语法:
//开始排序——使用冒泡排序
for( i =0; i < scores.Length -1;i++)//控制比较多少轮
{
//将最大元素交换到最后
for ( j=0; j<scores.Length -1 -i; j++)
{
If (scores[j]>scores[j+1])
{
//交换元素
Temp=scores[j];
Scores[j] =scores[j+1];
Scores[j+1]=temp;
}//if
}//内for
}//外for
>C#一维数组的声明和初始化与java略有不同,声明时不能将数组名放在数据类型和方括号之间
>C#中有四种循环结构:while、do-while、for、foreach、其中foreach用来遍历数组中的每个元素
> 二重循环就是在一个循环中嵌套另一个循环,必须将内层循环完整地包含在外层循环的循环体内
> break和continue语句用在内层循环时,只对内层循环的执行有影响,并不影响外层循环。
> 使用二重循环可以实现冒泡排序算法,排序的过程是比较相邻的两个数并交换,直到所有的数都比较过并排好顺序
访问修饰符 | 访问权限 | 访问级别 |
Public | 不受任何限制 | 最高 |
Private | 只有类的内部可以使用 | 最低 |
c#中的访问修饰符
This._name=_name;
1. c#的属性
在c#中,字段通常是私有的,如果要访问类中的字段,需要通过get和set访问器实现,这种结合了字段和方法的实现方式我们称之为属性(property)
语法:
Private string _name;
Public string Name
{
Get { return _name;}
Set {_name=value;}
}
Get访问器用来返回相应的私有字段的值,get访问器与方法相似,必须用return语句返回字段的值,执行get访问器相当于读取类中私有字段的值
Set访问器用来设定相应的私有字段的值,set访问器类似于返回类型void的方法,它使用一个隐含的输入参数value。当对属性赋值时:将会调用set访问器,并将新的参数值赋予对应的字段
2. 属性的数据类型
定义类中的一个属性时,属性的数据类型必须与它所访问的字段类型一致,例如,年龄字段_age是整形,那么他的属性Age也必须是整形的。如果姓名字段_name为string类型,那么它对应的属性Name也一定是String类型
3.属性的访问类型
属性除了可以约束数据访问外。还可以设置读,写属性来限定它的访问类型,属性的访问类型分为以下三种:
只读属性。只包含Get访问器
只写属性。只包含set访问器
读写属性,包含get和set访问器
如果要将一个属性设置为只读属性,即只能读取字段的值而不能给该字段赋值,那么。只需要为这个属性定义get访问器,但不定义set访问器就可以实现,例如,学员姓名字段通常不允许改变可以设置为只读属性
同样,如果要将一个属性设置为只读属性,那么只需要只读set访问器即可,例如,按照银行的规定,只允许账户修改自己的密码 但不提供输出操作,这就可以将账户密码设置为只写属性。
由此可以看出,get和set访问去的灵活运用,可以保障类中字段的安全。
4.在编码中快速的创建属性
除了手动输入代码外。Visual Studio 还提供了一个快捷的方法:重构-封装字段,在一个类中,定义一个字段,通常设定为私有。选定这个字段右击,在弹出的快捷菜单中选择 ”重构”—”封装字段”选项。选择”封装字段”选项后 Visual Studio 会打开一个窗口,可以修改属性的名称 在单击“确定”按钮后就会将选择的字段与属性建立关联
规范:
在C#中,一般为类的私有字段和属性命名时会采用不同的命名法。
在为类的私有字段命名时,要以下划线“_”开头,随后出现的英文字母采用Camel命名法即第一个单词的首字母小写,如果字段由多个单词组成,其后单词的首字母大写,如_cardID、_stuName。在为类的属性命名时,采用Pascal命名法,即组成的属性名称的多个单词的首字母要大写,如CardID、StuName.
技巧:封装字段的快捷键是Ctrl+R、e。
5. 对象初始化器
在Main()方法中,先实例化了一个Student对象,然后给属性赋值,如下面的代码
Student student = new Student ();
Student . Age= -20;
在C#中,提供了对象初始化器,可以更方便的为对象的属性赋值,如下面的代码;
Student student = new Student () { Age=-20};
当类中有多个属性时,使用对象初始化器可以同时为多个属性赋值。多个属性之间用逗号间隔,使用{ }封闭,
利用对象初始化器就可以这样为Name属性和Age属性赋值
Student stu =new student() { Name =”Mike”,Age = 20 };
值传递是将变量的值复制一份传递给方法,使得该方法的形参和实参的值相同。在调用 的方法中修改形参也只是对实参复制品的数据做更新,并没用真正改变实参的值
引用传递是将要传递的对象的引用复制给方法的形参,使得被调用的方法直接对引用对象进行更改,会影响实参原来的值。
> public 访问修饰符修饰的成员可以被其他的类访问,private访问修饰符修饰的成员只能在本类中被访问。
> this关键字代表的是当前的对象,在类的内部,可以用this关键字访问它的成员
> c#属性可以利用get访问器获得字段的值,利用set访问器设置字段的值,在访问器中可以对数据进行约束
>封装是将数据和操作方法保存在一起的技术。或是有选择地隐藏或公开类中的属性和方法的过程
> 方法的参数传递有两种方法,即按值传递和按引用传递
> ref关键字修饰的参数可以将被调用的方法中参数的更新值传递给调用者
方法 | 说明 |
int Compare(string A,StringB) | 比较两个字符串的大小关系,返回一个整数,若strA小于StrB,则返回值小于0,若strA等于StrB,则返回值等于0,若strA大于StrB,则返回值大于0 |
bool Equals(String value) | 比较一个字符串与另一个字符串value的值是否相等,若二者相等,则返回true;若不相等则返回false |
int IndexOf(string value) | 获取指定的value字符串在当前字符串中第一个匹配项的位置,如果 找到了value就返回他的位置,如果没有找到,就返回-1 |
string join(string separator,string[]value) | 把字符串数组的value中的每个字符串用指定的分隔符separator连接,返回连接后的字符串 |
string[]Split(char separator) | 用指定的分隔符 separator 分割字符串 返回分割后的字符串数组 |
string ToLower() | 获得字符串的小写形式 |
string ToUpper() | 获得字符串的大写形式 |
string Trim() | 去掉字符串前后两端多余的空格 |
> 运算“==”和equals()方法:
运算符“==”和equals()方法应用于两个字符串。所判断的内容是有差别的,简单的讲,“==”
是判断两个字符串对象在内存中的地址,即判断是否是同一个字符串对象。而equals()方法判断的是两个字符串对象的值是否相等。
> ””和String.Empty:
“”:为String 对象分配一个长度为零的存储空间。在c#中,大多数情况下,“ ”和String.Empty可以互换使用,一般建议使用后者
调用String 类的 Split ( ) 和 join( ) 方法可以解决这个问题
//以空格作为分隔符分割字符串
splitStrings=input String.Split (“”);
//将分割后的字符串使用下划线链接在一起
JoinString =string.Join(“_”, splitStrings);
语法:
String myString = string.Formart(“格式字符串”,参数列表);
其中,格式字符串中包含固定文本和格式项,格式项的形式如下所示
{索引[,对齐] [:格式字符串]}
其中,索引从0开始,与变量列表对应 对其部分设置显示的宽度和对齐的方式,是一个带符号的整数,整数的大小表示数据的宽度,正数为右对齐,负数为左对齐,格式字符串部分包含格式说明符。
例如:
String myString = String.Format(“{0} 乘以{1}等于{2}”,2,3,2*3);
“ {0}乘以{1}等于{2} ”就是一个格式字符串,占位符中{0},{1},{2}分别对应于后面的参数列表中的第1、2、3个参数,这和Console.WriteLine()方法中的使用方式是一样的。这条语句的结果就是字符串myString的值为“2*3/6”
字符 | 说明 | 示例 | 输出结果 |
C | 货币样式 | String.Format(“{0:C3}”,2000) | ¥2 000.000 |
D | 十进制格式 | String.Format(“{0:D3}”,2000) | 2000 |
F | 小数点后的位数固定 | String.Format(“{0:F3}”,2000) | 2000.000 |
N | 用逗号(,)隔开的数字 | String.Format(“{0:N}”,25000) | 250.000 |
P | 百分比记数法 | String.Format(“{0:P3}”,0.29768) | 29.768 |
X | 十六进制格式 | String.Format(“{0:X000}”,12) | C |
简单的类型转换
1. 隐式类型转换
还记得在什么条件下进行隐式类型转换吗?其实规则很简单,对于任何数值类型A,只要其取值范围完全包含在类型B的取值范围内,就可以隐式转换为类型B,也就是说,int 型可以隐式转换为float型或double型,float型可以隐式转换为double型
2. 显示类型转换
那么,在什么情况下要进行显示类型转换呢?与隐式类型转换相反,当要把取值范围大的类型转换为取值范围小的类型时,就需要执行显示转换
如下代码:
Double score =58.5;//原始代码
Int bonus =2;//加分
Int sum;//总分
Sum= score+bonus;//计算总分
编译器明确提示上面的代码缺少强制转换,我们将代码修改为
Sum=(int)score+bonus;//再次执行编译,编译成功
1. 字符串转换为数值型
还记得如何从控制台接收整数的代码吗?
Int.Parse(Console.ReadLine());
当要把字符串转换为数据类型时,可以调用不同的数值类型的Parse()方法(Parse的中文意思是解析)。
例如,将字符串转换为整形的代码
Int.Parse(string);
将字符串转换为单精度浮点型的代码‘
Float.Parse(string);
将字符串转换为双精度浮点型的代码
Double.Parse(string);
注意,要转换的字符串必须是数字的有效表示形式,什么意思呢?简单的讲就是表面上看起来是对应的数字,例如,可以把“32”转换为整数,因为他是数字构成的,但是不能把“name”转换为整数,因为他不是整数的有效表达式。
2. 数值型转换为字符串
字符串可以转换为数值,那么怎样讲数值类型的数据转换为字符串呢?同java一样,C#只要调用ToString()方法就可以,例如:
Int age =18;
String myage =age.ToString();
我们知道Parse()方法可以讲字符串类型转换为数值型,其实c#中还有一个更全能的类——Convert类。它可以在各种基本类型之间执行数据类型的互相转换,Convert类为每种类型转换都提供了一个对应的方法,Convert类常用的方法如表:
方法 | 说明 |
Convert.ToInt32 | 转换为整形(int 型); |
Convert.ToString() | 转换为单精度浮点型(float型) |
Convert.ToDouble() | 转换为双精度浮点型(double型) |
Convert.ToString() | 转换为字符串类型(string型) |
先来对比以下他们的使用情况
<1. 隐式类型转换:常用于数值型之间。讲取值范围小的数值类型转换为取值范围大的数值类型
<2. 显示类型转换:常用于数值型之间,将取值范围大的数值类型转换为取值范围小的数值类型,用法是(xxx)变量或者对象
<3. Parse()方法:将字符串转换为其他类型。用法为xxx.Parse(string)。
<4. Convert类:任何基本数据类型之间的相互关系
需要注意:使用Parse()方法和Convert类进行转换的时候,如果转换没用意义。则可能会出错
到现在为止,我们已经完成了c#基础语法的全部热身,这一章我们学习了以下内容:
> String类提供了很多常用的字符串处理方法。
1. Split()方法分割字符串,返回数组;join()方法链接字符串。
2. Format()方法格式化字符串
> 在c#中进行数据类型转换有多种方式:隐式类型转换。显示类型转换,Parse()方法,Convert类。
> 对与任何数值类型A,只要其取值范围完全包含在类型B的取值范围内。就可以隐式转换为类型B
> 当要把取值范围大的类型转换为取值范围小的类型时,就需要执行显示转换
>Parse()方法将String类型数据转换为其他类型,用法为xxx.Parse();
> Convert类可以实现任何类型之间的相互转换
当作有把~~
1996——SQL server6.5
1998——SQL server7.0
2000——SQL server2000
2005——SQL server2005
2008——SQL server2008
2012——SQL server2012
2014——SQL server2014
1.企业版 (SQL Server 2008Enterprise Edition)
企业版最全面的版本,支持所有的SQL Server 2008提供的功能,能够满足大型企业复杂的业务需求
2.标准版本(SQL Server 2008 Standard Edition)
标准版适合中小型企业的需求,在价格上比企业版有优势
3.工作组版( SQL Server2008 Workgroup Edition)
对于那些在大小和用户数量上对数据库没有限制的小型企业,工作组版是理想的数据管理解决方案它可以用作前端Web服务器,也可以用作部门或分支机构的运营
4. 开发版(SQL Server 2008 Express)
开发版覆盖了企业版所有的功能, 但是只允许,作为开发和测试系统,不允许作为生产系统
5.免费版 (SQL Server 2008 Express)
可以的 不错 666
数据库中的数据是按照数据的格式是一样的方式进行存储的,而不是杂乱无章的,相同格式和类型的数据统一存放在一起。
数据冗余: 存在着重复的数据
数据完整性: 保证数据库中的数据准确可靠
数据库
系统数据库
master
model
tempdb
MSDB
Resource
用户数据库
数据库文件
数据文件
主要数据文件 .mdf
次要数据文件 .ndf
日志文件 .ldf
创建一个数据库,最少需要二个文件, .mdf .ldf
身份验证方式
window身份验证
SQL Server身份验证
> 用数据库来管理数据,将使数据的存储,检索变得更加安全和高效
>SQL Server 2008是微软公司提供的关系型数据库管理系统,SQL Server 也是当今流行的数据库,
>数据库是表和数据库访问对象的集合,其中表分类存储了不同的实体信息,每一行数据对应一个实体的描述信息。
> 数据冗余是指数据库存在一些重复的数据。数据完整性,是指数据库中的数据能够正确反映实际情况,数据库中允许有一些的数据冗余,但是要保持数据的完整性。
>SQL Server Management Studio 是SQL Server 2008 最常用的操作环境。能够执行对数据库的日常管理操作和数据查询,如分离和附加数据库,备份和还原数据库,收缩数据库等
> 连接 SQL Server 之前应先启动 SQL Server服务。建库之前建好使用该数据库的用户,
> SQL Server 数据库的物理文件包括数据文件和日志文件两部分,在创建数据库时指定
表相关的几个基本概念
7.1.1数据完整性
数据完整性要求数据库中的数据具有准确性,准确性是通过数据库表的设计和约束来实现的,例如在存储学生信息的表中,如果允许任意输入学生信息的话,那么可以重复输入同一个学生的信息,如果不对表中存储的年龄信息加以限制,那么学生的年龄可能会出现负数,这样的数据都不具备完整性
为了实现完整性,数据库需要做以下两方面的工作,
(1)检验每行数据是否符合要求。
(2)检验每列数据是否符合要求。
为实现以上要求,SQL Server提供了以下四种类型的约束(Constraint)
1. 实体完整性约束
实体完整性要求表中的每一行数据都反应不同的实体,不能存在相同的数据行。
通过索引,唯一约束,主键约束或标识列属性,可以实现表的实体完整性。
2. 域完整性约束
域完整性指的是给定列输入的有效性。通过限制属性类型,检查约束,输入格式,外键约束,默认值,非空约束等多种方法,可以实现表的域完整性
3. 引用完整性约束
在输入或删除数据行时,引用完整性约束用来保持表之间已定义的关系,
4. 在强制引用完整性时, SQL Server禁止用户进行下列操作
(1)主表中没有关联记录时,将记录添加到从表中,也就是说学生成绩表中不能够出现在学生信息表中不存在的学号。
(2)更改主表中的值并导致相关表中的记录孤立,如果学生信息表中的学号改变了,学生成绩表中的学号也应当随之改变
(3)从主表中删除记录。但在相关表中仍存在与该记录匹配的相关记录,如果把学生信息表中的学生删除了,则该学生的学号不能出现在学生成绩表中。引用完整性通过主键和外键之间的引用关系来实现
1. 主键:(Primary Key):主关键字
如果在表中存储了很多行数据,就会引发这样的问题,如何判断表中没有重复的数据行,如何判断一个学生的信息没有被输入两次?
这就需要一个列。这个列的值用来唯一标识表中的每一行,用于强制表的实体完整性,这样的列定义为表的主键
一个表中只能有一个主键,并且主键列不允许出现null值,尽管有的表中允许没有主键,但是通常情况下建议为表设置一列为主键,
提示:如果两列或多列组合起来唯一的标识表中的每一行,则该主键也叫做“复合主键”。
有时候,在同一张表中,有多个列可以用来当作主键,在选择哪个列作为主键的时候,需要考虑两个原则,最少性和稳定性。
(1)最少性是指列数最少的键,如果可以从单个主键和符合主键中选择,应该选择单个主键,这是因为操作一列,比操作多列要快,当然该规则也有例外,例如,两个整数类型的列和组合比一个很大的字符类型的列要快。
(2)稳定性是指列中数据的特征,由于主键通常用来在两个表中建立联系,所以主键的数据不要经常更新,理想情况下,应该永远不要改变。
2. 外键(Foreign Key):外键部
一把情况下,学生的信息和学生的考试成绩是存放在不同的数据表中的,在成绩表中可以存储一行学生的学号来表示是哪个学生的考试成绩,这时有引发了一个问题,如果在成绩表中输入的学号根本不存在(如输入的时候把学号写粗了)该怎么办?
这个时候就应当建立一种“引用”的关系,确保“从表”中的某个数据项在“主表”中必须存在,避免以上错误发生。
“外键”就是用来达到这个目的的,他是相当于主键而言的,就是“从表”中对应“主表”的列,在从表中称为外键或者引用键,他的值要求与主键或者唯一键,相对应,外键用来强制引用完整性,一个表可以有多个外键,
明确了完整性规则之后,就可以创建数据库表了,创建数据库表实际上就是实施不同的约束,实现完整性规则的过程
标识列
标识列的实现方式如下:
(1)如果一列的数据属于数字类型(如整形),那么可以把该列定义为标识列
(2)定义成标识列之后还需要分别指定“标识种子”和“标识增量”默认值都是1
(3)定义了标识列之后,在以后每次输入数据的时候,该列随数据行的增加而自动增加数值,并且不会重复,第一次的数字就是“标识种子”值,以后每次按照“标识增量”增加数值,标识列通常也被定义为主键,通常所说的“自动编号”就是指标识列的数字自动增加
> SQL Server 创建表的过程是设置数据列属性的过程,同时也是实施数据完整性(包括实体完整性,引用完整性和域完整性等)的过程
>实体完整性要求数据行不能有重复,每一行数据都由主键来唯一确定
>域完整性实现了对输入到特定列的数值的限制
>创建数据库表需要确定表的列名,数据类型,是否允许为空,还需要确定主键,必要的是默认值,标识列和检查约束
>如果建立了主表和从表的关系,则有以下几种情况
1. 从表中相关项目的数据在主表中必须存在
2. 主表中相关项的数据更改了。则从表对应的数据项也应当随之更改
3. 在删除从表之前,不能够删除主表
8.1.3 SQL的组成
SQL 语言主要由以下及部分组成。
(1)DML (Data Manipulation Language,数据操作语言,也称为数据操纵语言);用来插入,修改和删除数据库中的数据,如INSERT、UPDATE及 DELETE等。
(2)DDL(Data Definition Language,数据定义语言):用来建立数据库,数据库对象和定义其列,大部分是以CREATE开头的命令,如CREATE TABLE CREATE VIEW 及DROP TABLE等。
(3)DQL(Data Query Language,数据查询语言):用来对数据库中的数据进行查询,如SELECT等,
(4)DCL (Data Control Language,数据控制语言):用来控制数据库组件的存款许可,存款权限等,如GRANT,REVOKE等。
8.1.4 SQL中的运算符
1.算术运算符
算术运算符:+(加),—(减),*(乘),/(除),%(模)五个算术运算符用来在两个数或表达式上执行数学运算,这两个表达式可以是任意两个数字数据类型的表达式。
2.赋值运算符
即‘=’符号,用于将一个数或变量表达式/赋值给另一个变量
3.比较运算符
运算符 | 说明 |
= | 等于,例如age=23 |
> | 大于,例如,price>100 |
< | 小于 |
<> | 不等于 |
>= | 大于等于 |
<= | 小于等于 |
!= | 不等于(非SQL-92标准) |
比较运算符计算结果为布尔数据类型,并根据测试条件的输出结果返回TRUE或FALSE
4. 逻辑运算符
逻辑运算符用来对某个条件进行判断,以获得判断条件的真假,返回带有TRUE或FALSE值的布尔数据类型
T-SQL中的逻辑运算符
运算符 | 说明 |
AND | 当且仅当两个布尔表达式都为TRUE时,返回TRUE |
OR | 当且仅当两个布尔表达式都为FALSE时,返回FALSE |
NOT | 对布尔表达式的值取反,优先级别最高 |
语法:INSERT [INTO]表名 [(列名列表)]VALUES(值列表);
其中:
(1)[INTO]是可选的,也可以省略。
(2)表名是必须的
(3)表的列名是可选的,如果省略,将依次插入所以列
(4)多个列名和多个值列表用逗号分隔。
(5)分号(;)是T-SQL语句终止符,不是必需的
例如:以下的语句为向学生表中插入一行数据。
INSERT INTO Students (SName,SAddress,SGrade,SEmail,SSEX)
VALUES (‘ 张青裁’,’上海松江’,6,’ZQC@Sohu.com’,0)
在插入数据的时候,需要注意以下事项。
(1)每次插入一整行数据,不可能只插入半行或者几列数据,但允许某些列为空或使用默认值
(2)数据值的数目必须与列数相同,每个数据值的数据类型,精度和小数位数也必须与相应的列匹配
(3)INSERT语句不能为标识列指定值,因为它的数字是自动增长的
(4)对于字符类型,日期类型的列当插入数据的时候,用单引号(‘)将其引起来
(5)尽管可以不指定列名,但是最好明确指定插入的列和对应的值,以便能够将列和值清晰地对应起来
(6)若在设计表的时候指定某列不允许为空,则该列必须插入数据,否则将报告错误信息,
(7)插入的数据项,要求符合检查约束的要求,例如,我们在前面设置了SEmail列必须包含一个字符@,如果插入语句修改为 INSERT INTO Students(SName,SAddress,SGrade,SEmail,SSEX)
VALUES(‘张青裁’,’上海松江’,’6,’ZQC’,0)
1通过 INSERT SELECT 语句向表中添加数据
例如,创建一张新表,来存储本班的通讯录信息,则可以从学生表中提取相关的数据插入建好的AddressList表中,T-SQL语句如下:
INSERT INTO AddressList (姓名,地址,电子邮件)
SELECT SName,SAddress,SEmail
FROM Students
SELECT语句用于查询,上面的SQL语句 用来把学生信息表中的姓名,地址和Email信息读取并保存到新的AddressList表中
需要注意以下两点,
(1)查询得到的数据个数,顺序,数据类型等,必须与插入的项保持一致。
(2)AddressList表必须预先创建好,并且具有姓名,地址和电子邮件三列
3. 通过SELECT INTO 语句将现有表中的数据添加到新表中。
与上面的INSERT INTO 类似,SELECT INTO 语句也是从一个表中选择一些数据插入新表中,所以不同的是,这个新表是执行查询语句的时候创建的,不能够事前存在
例如,以下的T-SQL语句:
SELECT Student.SName ,Students,SAddress,Students.SEmail
INTO AddressList
FROM Students
将创建新表AddressList,把Student表中的SName SAddress,SEmail 作为AddressList表的新列,并且把查询到的数据全部插入新表中,
在向一个新表插入数据的时候,又会牵扯到一个新的问题,如何插入标识列?
因为标识列的数据是不允许指定的,因此我们可以创建一个新的标识列,语法如下
语法:SELECT IDENTITY(数据类型,标识种子,标识增长量)AS 列名
INTO 新表
FROM 原始表
上面的语句可以修改为
SELECT Students.SName,Students.SAddress,Students.SEmail,IDENTITY(int,1,1)AS StudentID
INTO AddressList
FROM Students
3.通过UNION关键字合并数据进行插入
UNION语句用于将两个不同的数据或查询结果组合成一个新的结果集。
当然,不同的数据或查询结果,也要求数据个数,顺序,数据类型都一致,因此当向新表中多次插入数据的时候,可以使用SELECT...UNION 来简化操作
例如,以下的T-SQL语句
INSERT Students(SName,SGrade,SSex)
SELECT ’李一,7,1 UNION
SELECT ’李二,4,1 UNION
SELECT ’李三,2,1 UNION
SELECT ’李四,3,1 UNION
SELECT ’李五,3,0 UNION
SELECT ’李六,4,0 UNION
这样的效果其实与上面INSERT...SELECT的效果是 一样的,只不过多行数据是手写的,然后用UNION合并组成多行数据记录,最后把这些多行记录数据一起插入,
使用T-SQL更新表中某行的语法格式如下,
语法:
UPDATE 表名 SET 列名,=更新值[WHERE更新条件]
其中:
(1) SET 后面可以紧随多个’’列名=更新值’’,修改多个数据列的值,不限一个,使用逗号分隔
(2) WHERE 子句是可选的,用来限制更新数据的条件,若不限制,则整个表的所有数据行将被更新
需要注意的是,使用UPDATE语句,可能更新一行数据,也可能更新多行数据,还可能不会更新任何数据
提示:
在更新数据的时候,一般都有条件限制,别忘了书写WHERE条件语句,否则将更新表中所有行的数据,这就可能导致有效数据的丢失
使用DELETE删除数据
语法:
DELETE [FROM] 表名 [WHERE<删除条件>]
在学生信息表中,删除姓名为‘张青裁’的数据的SQL语句如下。
DELETE FROM Students
WHERE SName=’张青裁’
还有一种情况。如果要删除的行的主键值被其他表引用,例如,分数表中的StudentID引用了学生信息表中的SCode列,那么删除被引用的行时:
DELETE FROM Students
WHERE SCode=22
SQL Server将报告与约束冲突的错误信息
提示:DELETE语句删除的是整条记录,不会只删除单个列,所有在DELETE后不能出现列名
例如,以下语句:
DELETE SAddress FROM Students
将报告错误信息
TRUNCATE TABLE 用来删除表中的所有行,功能上它类似于没有WHERE子句的DELETE语句,
例如,要删除学习信息表中的所有记录行,可以使用以下语句,
TRUNCATE TABLE Students
但TRUNCATE TABLE 比DELETE执行速度快,使用的系统资源和事物日志资源更少,并且删除数据后的表的标识列会重新开始编号,
提示:TRUNCATE TABLE 删除表中的所有行,但是表的结构,列,约束,索引等不会被改动,TRUNCATE TABLE 不能用于有外键约束引用的表,这种情况下,需要使用DELETE语句
实际工作中,不建议使用TRUNCATE TABLE 语句,因为使用它删除的数据不能恢复还原。
1> SQL语言是数据库能够识别的通用的指令集
2> 在T-SQL中,WHERE 用来限制条件,其后紧跟条件表达式
3> 一次插入多行数据,可以使用INSERT SELECT语句,SELECT INTO 语句或者UNION关键字来实现
4> 使用UPDATE 更新数据,一般都有限制条件
5> 使用DELETE 删除数据时。不能删除主键值被其他数据表引用的数据行,
6> 数据库的导入,导出功能可以实现与文本,Excel等文件交换数据
在实现查询之前,有必要说明一下查询的机制,
查询是针对表中已经存在的数据行而言的,可以简单地理解为‘筛选’,将符合条件的数据抽取出来。
数据表在接受查询请求的时候,可以简单的理解为,‘它将逐行判断’判断是否符合查询条件,如果符合查询条件就提取出来,然后把所有被选中的行组织在一起,形成另外一个类似于表的结构,构成查询的结果,通常叫做记录级(RecordSet)
由于记录集的结构实际上和表的结构类似,都是由行组成的,因此在记录集上依然可以进行再次查询,
语法:
SELECT <列名>
FROM<表名>
[WHERE<查询条件表达式>]
[ORDER BY <排序的列名>[ASC或DESC]]
其中,WHERE 条件是可选的,若不限制,则查询返回所有行的数据项,ORDER BY 是用来排序的
经验:查询语句可以分为多个子句部分,例如,上面的查询语句可以划分为SELECT...FROM...WHERE..ORDER BY四个子句,对于复杂的SQL语句,可以将每个字句单独写成一行以方便调试和查找错误
查询语句一般都在SQL Server Management Studio的查询窗口中进行调试和运行,
1> 查询所有的数据行和列
把表中的所有行和列都列举出来比较简单,这时候可以使用 * 表示所有的列
SELECT * FROM Students
2> 查询部分行或列
查询部分列需要列举不同的列名,而查询部分行需要使用WHERE子句进行条件限制,例如:
SELECT SCode,SName,SAddress
FROM Students
WHERE SAddress=’河南新乡’
以上的查询语句,将只查询地址为‘河南新乡’的学生,并且只显示编号,姓名和地址列,同理,以下语句用来查询地址不是‘河南新乡’的学生信息
SELECT SCode,SName,SAddress
FROM Students
WHERE SAddress <>‘河南新乡’
3> 在查询中使用列的别名
AS子句可以用来改变结果集中列的名称,也可以为组合或者计算出的列指定名称,还有一种情况是让标题列的信息更易懂,例如,把SCode列名查询
SELECT SCode AS 学生编号,SName AS 学生姓名, SAddress AS 学生地址
FROM Students
WHEREN SAddress <>’河南新乡’
还有一种情况是使用计算合并得到新列的命名,例如,假设在某数据库,的雇员表Employees中存在FirstName 列和lastName列,现在需要将这两列合并成一个叫做‘姓名’的列,可以使用以下查询语句
SELECT FirstName+‘.’ +LastName AS 姓名
FROM Employees
重新命名列名还有一种方法,就是采用‘=’来命名,例如:
SELECT 姓名 = FirstName+‘.’+LastName
FROM Employees
4> 查询空值
在SQL 语句中采用‘IS NULL’ 或者‘IS NOT NULL’ 来判断是否为空,因此,如果要查询学生信息表中没有填写Email信息的学生,可以使用以下查询语句
SELECT SName FROM Students WHERE SEmail IS NULL
5> 在查询中使用常量列
有时候,需要将一些常量的默认信息添加到查询输出中,以方便统计或计算,例如,查询学生信息的时候,学校名称统一都是“北京新兴桥”,查询语句如下:
SELECT 姓名=SName,地址=SAddress,“北京新兴桥” AS 学校名称
FROM Student
查询输出多了一列“学校名称”该列的所以数据都是“北京新兴桥”
6> 查询返回限制的行数
一些查询需要返回限制的行数,例如,在测试的时候,如果数据库中有上万条记录,而只要检查前面十行数据是否有效就可以了,没有必要查询输出全部的数据,以提高查询速度,这时候就要用到限制返回行数的查询
在T-SQL中,限制行数使用TOP关键字来约束,例如,要查询返回众多学生记录中前五位女生的姓名和地址信息,查询语句如下:
SELECT TOP 5 Sname,SAddress
FROM Students WHERE SSex =0
还有一种情况是需要从表中按一定的百分比提取记录,这时候还需要用到PERCENT 关键字来限制,例如,要提取20%的女生数据如下
SELECT TOP 20 PERCENT SName,SAddress
FROM Students WHERE SSex=0
如果需要按照一定顺序排列查询语句选中的行,则需要使用ORDER BY 子句,并且排序可以是升序(ASC)或者降序(DESC)如果不指定ASC或者DESC ,结果集按默认ASC升序排序
SQL语句,都可以在其后面再加上ORDER BY 来排序
例如,查询学生成绩的时候,如果把所以成绩都降低到10%后加5分,再查询及格成绩并按照成绩高来进行排序,SQL语句如下
SELECT StudentID AS 学生编号,(Score*0.9+5) AS 综合成绩
FROM Score
WHERE (Score*0.9+5)>60
ORDER BY Score
还可以按照多个列进行排序,例如,要在学生成绩排序的基础上,再按照课程ID进行排序的语句如下:
SELECT StudentID AS 学生编号,CourseID AS 课程ID,Score AS 成绩
FROM Score
WHERE Score>60
ORDER BY Score,CourseID
函数名 | 描述 | 举例 |
CHARINDEX | 用来寻找一个指定的字符串在另一个字符串中的起始位置 | SELECT CHARINDEX(’NAME’,’My name is tom’,1) 返回:4 |
LEN | 返回传递给它的字符串长度 | SELECT LEN (‘SQL Server课程’) 返回:13 |
UPPER | 把传递给它的字符串转换为大写 | SELECT UPPER(‘sql server课程’ 返回:SQL SERVER课程 |
LTRIM | 清除字符左边的空格 | SELECT LTRIM(‘周智宇’) 返回:周智宇(后面的空格保留) |
RTRIM | 清除字符右边的空格 | SELECT RTRIM(‘周智宇’) 返回:周智宇(前面的空格保留) |
RIGHT | 从字符串右边返回指定数目的字符 | SELECT RIGHT(‘买买提,吐尔松’,3) 返回吐尔松 |
REPLACE
STUFF | 替换一个字符串中的字符
在一个字符串中,删除指定长度的字符并在该位置插入一个新的字符串 | SELECT REPLACE(‘莫乐可切,杨可’,’可’,’兰’) 返回:莫乐兰切.杨兰
SELECT STUFF(‘ABCDEFG’,2,3,’’我的音乐我的世界’) 返回:A我的音乐我的世界EFG
|
函数还是看书吧, 太多了
> 查询将逐行筛选表中的数据,最后将符合要求的记录重新组合成“记录集”记录集的结构类似于表结构
> 使用 IS NULL 判断一行中的某列是否为空
> 使用ORDER BY 进行查询记录集的排序,并且可以按照多个列进行排序
> 在查询中,可以使用常量,表达式,运算符
> 在查询中使用函数,能够像程序中那样处理数据
模糊查询和聚合函数
模糊查询可以使用LIKE关键字,通配符来进行,前面章节学习过的 IS NULL 查询严格说也是一种模糊查询,模糊查询还有基于某个范围内的查询和查询在某些列举值内的查询
10.1.1通配符
简单的将,通配符是一类字符,他可以代替一个或多个真正的字符,查找信息时作为替代字符出现,T-SQL中的通配符必须与LIKE关键字一起使用,以完成特殊的约束或要求
通配符
通配符 | 解释 | 示例 |
_ | 一个字符 | A LIKE ‘C_’,则符合条件的A如CS、Cd等 |
% | 任意长度的字符 | B LIKE ‘CO%’,则符合条件的B如CONST、COKE等 |
[] | 括号中所指定范围内的一个字符 | C LIKE ‘9W0[1-2]’,则符合条件的C如9w01或9w02 |
[^] | 不在括号中所指定范围内的任意一个字符 | D LIKE ‘9W0[^1-2]’,则符合条件的D如9w03或9w07等 |
Like运算符用于匹配字符串或字符串的一部分,由于该运算符只用于字符串,因此仅与字符数据类型(如char或varchar等)联合使用
在进行数据更新,删除或者查询的时候,依然可以使用like关键字进行匹配查找,例如,查找姓张的学生信息
SELECT * FROM Students WHERE SName LIKE‘张
或者查询住址包含‘北京’字样的学生信息:
SELECT * FROM Student WHERE SAddress LIKE’%北京%’
使用关键字BETWEEN 可以查找那些介于两个已知值之间的一组未知值,要实现这种查找,必须知道查找得初值和终值,并且初值小于等于终值,初值和终值用AND关键字分开,例如,查询分数60(含)到80(含)之间的信息如下:
SELECT * FROM Score WHERE Score BETWEEN 60 AND 80
如果写成如下形式:
SELECT * FROM Score WHERE SCORE BETWEEN 80 AND 60
虽不会语法报错,但也不会查询到任何信息
此外,BETWEEN查询在查询日期范围的时候使用的比较多,例如,查询不在2013年1月1号到2013年8月1号之间订购的图书列表:
SELECT * FROM Sales WHERE ord_date NOT BETWEEN ‘2013-1-1’ AND ‘2013-8-1’
使用NOT来对限制条件进行“取反”操作
查询的值是指定的某些值 之一,可以使用带列举值得IN关键字来进行查询,将列举值放在圆括号里,用逗号分开,例如,查询北京,广州或者上海的学生姓名
SELECT SName AS 学生姓名 FROM Students WHERE SAddress
IN(’北京’,’广州’,’上海’)ORDER BY SAddress
同样可以把IN关键字和NOT 关键字合起来使用,这样可以把得到所有不匹配例举值得行
提升:列举值类型必须与匹配的列具有相同的数据类型
在查询中还会经常碰到取某些列的最大值,最小值,平均值等信息,有时候还需计算出究竟查询到多少行数据,这个时候,查询的’’统计数据’’是用户比较关心的,这就涉及T-SQL的另外一类内部函数——“聚合函数”。聚合函数能够基于列进行计算,将多个值合并为一个值,其作用是对一组值进行计算,并返回计算后的值
Sum()函数返回表达式中所有的数值的总和,空值将被忽略,sum()函数只能用于数字类型的列,不能够汇总字符,日期等其他数据类型,例如,查询学生编号为23 的考试总分可以使用如下查询:
SELECT SUM(Score) AS 学号为23的学生总分FROM Score WHERE StudentID=23
注意这种查询只返回一个数值,因此,不能够直接与可能返回多行的列一起使用来进行查询,例如:
SELECT SUM(Score) AS 学号为23的学生总分,CourseID AS 科目编号
FROM Score WHERE StudentID=23
将报告错误信息,但是在一个查询中可以同时使用多个聚合函数
Avg函数返回表达式中所有数值的平均值,空值将被忽略,avg()函数也只能用于数字类型的列,
要查询及格线以上学生的平均成绩,语句如下
SELECT AVG(Score) AS 平均成绩 FROM Score WHERE Score>=60
MAX()函数返回表达式中的最大值,MIN()函数返回表达式中的最小值,这两个函数同样都忽略了任何空值,并且他们都可以用于数字型,字符型及日期/时间类型的列,对于字符序列 max()函数查找排序序列的最大值,而min()函数同理,返回排序列的最小值
例如:查询平均成绩,最高分,最低分的语句如下:
SELECT AVG(Score) AS 平均成绩,MAX(Score) AS 最高分,min(Score) AS 最低分 FROM SCORE WHERE Score>=60
Count()函数返回提供的组或记录集中的计数,count()函数可以用于出去text image ntext以外任何类型的列,另外,也可以使用星号(*)作为count表达式,使用星号可以不必指定特定的列而计算所有的行数,当对所有的行进行计数时,包括包含空值的行
例如,查询总记录数的语句如下
SELECT COUNT(*) AS 总记录数 FROM Score
例如,查询单列(Score)记录总数的语句如下
SELECT COUNT(Score) AS 分数记录集 FROM Score
> 通配符是一类字符,他可以代替一个或多个真正的字符,查找信息时作为替代字符出现
>‘’_”和”%”分别匹配一个字符和多个字符
> 使用LIKE BETWEEN IN 关键字,能够进行模糊查询
> 聚合函数能够对列进行计算,对于分析和统计非常有用
> 常用的聚合函数有 SUM()、AVG()、MAX()、MIN()、COUNT()
T-SQL语句如下:
SELECT CourseID, AVG(Score) AS 课程平均成绩
FROM Score
Group By CourseIDS
进行排序时,应该是对分完组后的平均分进行排序,这样想来应该放在Group by子句之后
SELECT CourseID, AVG(score) AS 课程平均成绩 from score
GROUP BY CourseId
ORDER BY AVG (Score) DESC
分组查询获取每个年级的总人数,
SELECT COUNT(*) AS 人数,SGrade AS 年级 FROM Students
GROUP BY SGrade
在SELECT 语句中,WHERE,GROUP BY HAVING 子句和聚合函数的执行次序如下:
WHERE 子句从数据源中去掉不符合其搜索条件的数据,group by 子句搜集数据行到各个组中,统计函数为各个组计算统计值,HAVING 子句去掉不符合其组搜索条件的各组数据行
内连接查询是最典型,最常用的链接查询,他根据表中共同的列来进行匹配,特别是两个表存在主外键关系时,通常会使用内连接查询
外连接查询是至少返回一个表中的所有记录,根据匹配条件有选择性性地返回另一张表的记录外连接可以是左外连接,右外连接
内连接查询通常会使用‘=’或者‘<>’等比较运算符来判断两列数据值是否相等
内链接使用 INNER JOIN...ON 关键字或WHERE子句来进行表之间的关联,内链接查询可以通过两种方式实现
1. 在WHERE子句中指定链接条件
例如:查询学生姓名和成绩的T-SQL如下
SELECT Students.SName, Score.CourseID, Score.Score
FROM Students,score
WHERE Students.SCode=Score.StudentID
2. 在FROM子句中使用INNER JOIN...ON
SELECT S.SName, C.CourseID , C.Score
FROM Students AS S
INNER JOIN Score AS C ON (S.SCode = c.studentID)
左外连接查询的结果集包括LEFT JOIN 子句中指定的左表的所有行,而不仅仅是连接列所匹配的行,若左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列均为空值,
左外连接查询使用 LEFT JOIN ....ON 或 OUTER JOIN ..ON 关键字来进行表之间的关联,例如,要统计所有学生的考试情况要求显示所有参加考试学生的每次考试分数没有参加考试的学生也要显示出来,这时候,以学生信息表为主表(有时也叫左表)
右外连接查询与外连接查询类似
1. >分组查询是针对表中不同的组分类统计的,GROUP BY 子句通常会结合聚合函数一起使用
2. >HAVING 子句能够在分组的基础上,再次进行筛选
3. >多表之间的查询可以使用连接查询连接查询又分为内连接查询和外连接查询
4. >最常见的连接查询是内连接查询(INNER JOIN...ON,通常会在相关表之间提取引用列的数据项
ADO.NET提供了两个组件,用来访问和处理数据,如下:
1. .NET Framework 数据提供程序是专门为数据处理及快速的只进,只读访问数据而设计的组件,使用它可以连接数据源,执行命令和检索结果,直接对数据源进行操作。
2. DataSet 是专门为独立于任何数据源的数据访问而设计的,使用它煤科院不必直接和数据源打交道,大批量地操作数据,也可以将数据绑定在控件上。
.NET Framework 数据提供程序包含了访问各种数据源数据的对象,他是和数据库类型有关的,目前有五种类型的数据提供程序,如下:
.NET Framework | 说明 |
.NET Framework用于SQL Server的数据提供程序 | 提供对Microsoft SQL Server 数据的访问,使用,System.Data.SqlClient命名空间 |
.NET Framework用于OLE DB的数据提供程序 | 提供对OLE DB公开的数据源中数据的访问,使用System.Data.OleDb命名空间 |
.NET Framework用于ODBC的数据提供程序 | 提供对使用ODBC公开的数据源中数据的访问,使用System.Data.Odbc |
.NET Framework用于Oracle的数据提供程序 | 适用于Oracle数据源,用于Oracle的,.NET Framework数据提供程序,支持Oracle客户端软件8.1.7版和更高版本,使用System.Data.OracleClient命名空间 |
Entity Client 提供程序 | 提供对实体数据模型(EDM)应用程序的数据访问,使用System.Data.EntityClitet命名空间 |
.NET Framework数据提供程序包括四个核心对象,如下:
对象 | 说明 |
Connection | 建立与特定数据源的连接 |
Command | 对数据源执行命令 |
DataReader | 从数据源中读取只进且只读的数据流 |
DataAdapter | 用数据源填充DataSet并解析更新 |
不同的命名空间中都有相应的对象。比如要操作SQL Server数据库,需要使用System.Data.SqlClient命名空间,SQL数据提供程序中的类都以“Sql”开头。所以它的四个核心对象,分别为SqlConnection、SqlCommand、SqlDataReader、SqlDataAdapter.本课程的示例都是利用SQL Server .NET数据提供程序来操作数据库的。
为了建立应用程序与数据库的连接,Connection对象提供来一些属性和方法,Connection对象的常用属性和方法,
属性 | 说明 |
ConnectionString | 设置、获取应用程序连接数据库的连接字符串 |
方法 | 说明 |
Void Open() | 使用ConnectionString属性所指定的设置打开数据库连接 |
Void Close() | 关闭与数据库的连接 |
在ADO.NET中,如果使用,.NET Framework 数据提供程序操作数据库,必须显式地打开和关闭与数据库的连接,也就是说在操作完数据库之前,必须调用Connection对象的Open()方法打开连接,在操作完数据库后,必须调用Connection对象的Close()方法关闭连接
创建Connection对象
语法:
SqlConnection connection = new sqlconnection(connString)
> ADO.NET是.NET Framework 中的一组允许应用程序与数据库交互的类。
> ADO.NET的两个主要组件是.NET Framework 数据提供程序和DataSet
> .NET Framework 数据提供程序包括四个核心对象:Connection、Command、DataAdapter、DataReader
> Connection 对象用于建立应用程序和数据库之间的连接,需要定义连接字符串,必须显式打开和关闭数据库连接
> Command对象允许向数据库传递请求,以及检索和操作数据库中的数据,
> Command对象的ExecuteScalar()方法可以检索数据库并返回一个值。
> 数据库操作过程中可能出现异常,可以使用try – catch – finally语句处理异常
ADO.NET的组成(二大组件)
DataSet数据集 : 相当于内存中的数据库,独立于数据源,支持断开式的连接
.NET Framework数据提供程序
.NET Framework数据提供程序四大对象
Connection 连接数据库
ConnectionString连接字符串
Open() 打开连接
Close() 关闭连接
Command 执行SQL语句
CommandText 执行的SQL语句
Connection 连接对象
ExecuteScalar() 查询单个值,返回第一行第一列的值, 值的类型是object类型
ExecuteNonQuery() 执行没有返回结果的SQL语句,返回受影响的行数,例如,insert
ExecuteReader() 返回只进只读的结果集DataReader对象
DataReader 只进只读的结果集
HasRows 表示是否返回记录
Read() 每次读取一行记录,有记录返回true,没有记录返回false
Close() 关闭DataReader对象
DataAdapter 负责数据集和数据库的交互
增加 删除 修改
1. 连接字符串
string conStr=”server=.;database=myschool;uid=sa;pwd=sa”;
2. 连接对象
SqlConnection connection=new SqlConnection(conStr);
3. SQL语句
string sql=”增或删或改的SQL语句”;
4. 创建Command对象
SqlCommand cmd=new SqlCommand(sql,connection);
5. 打开连接
connection.Open();
6. 执行SQL语句
int i=cmd.ExecuteNonQuery() i为受影响的行数,根据其判断是否成功
7. 关闭连接
connection.Close();
查询单个值
1. 连接字符串
string conStr=”server=.;database=myschool;uid=sa;pwd=sa”;
2. 连接对象
SqlConnection connection=new SqlConnection(conStr);
3. SQL语句
string sql=” SQL语句”;
4. 创建Command对象
SqlCommand cmd=new SqlCommand(sql,connection);
5. 打开连接
connection.Open();
6. 执行SQL语句
object obj=cmd.ExecuteScalar() 根据需要进行相应的转换
7. 关闭连接
connection.Close();
查询结果集
1. 连接字符串
string conStr=”server=.;database=myschool;uid=sa;pwd=sa”;
2. 连接对象
SqlConnection connection=new SqlConnection(conStr);
3. SQL语句
string sql=”查询的SQL语句,例如: select studentno,studentname from student”;
4. 创建Command对象
SqlCommand cmd=new SqlCommand(sql,connection);
5. 打开连接
connection.Open();
6. 执行SQL语句
SqlDataReader reader=cmd.ExecuteReader() ;
while(reader.Read())
{
Console.WriteLine(reader[“studentno”]+”\t”+reader[“studentname”]);
//可以用列名或索引读取
}
reader.Close();
7. 关闭连接
connection.Close();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。