最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

SQL-Server-2008数据库—创建、建表、查询语句

来源:动视网 责编:小OO 时间:2025-09-29 21:37:45
文档

SQL-Server-2008数据库—创建、建表、查询语句

SQLServer2008数据库—创建、建表、查询语句一、创建数据库1、利用对象资源管理器创建用户数据库:(1)选择“开始”—“程序”—MicrosoftSQLServer2008—SQLServerManagementStudio命令,打开SQLServerManagementStudio。(2)使用“Windows身份验证”连接到SQLServer2008数据库实例。(3)展开SQLServer实例,右击“数据库”,然后人弹出的快捷菜单中选择“新建数据库存”命令,打开“新建数据库”对话框。
推荐度:
导读SQLServer2008数据库—创建、建表、查询语句一、创建数据库1、利用对象资源管理器创建用户数据库:(1)选择“开始”—“程序”—MicrosoftSQLServer2008—SQLServerManagementStudio命令,打开SQLServerManagementStudio。(2)使用“Windows身份验证”连接到SQLServer2008数据库实例。(3)展开SQLServer实例,右击“数据库”,然后人弹出的快捷菜单中选择“新建数据库存”命令,打开“新建数据库”对话框。
SQL Server 2008数据库—创建、建表、查询语句

一、创建数据库 

1、利用对象资源管理器创建用户数据库:

(1)选择“开始”—“程序”—Microsoft SQL Server 2008—SQL Server Management Studio命令,打开SQL Server Management Studio。

(2)使用“Windows身份验证”连接到SQL Server 2008数据库实例。

(3)展开SQL Server 实例,右击“数据库”,然后人弹出的快捷菜单中选择“新建数据库存”命令,打开“新建数据库”对话框。

(4)在“新建数据库”对话框中,可以定义数据库的名称、数据库的所有者、是否使用全文索引、数据文件和日志文件的逻辑名称和路径、文件组、初始大小和增长方式等。输入数据库名称student。

2、利用T-SQL语句创建用户数据库:

在SQL Server Management Studio中,单击标准工具栏的“新建查询”按钮,启动SQL编辑器窗口,在光标处输入T-SQL语句,单击“执行”按钮。SQL编辑器就提交用户输入的T-SQL语句,然后发送到服务器执行,并返回执行结果。

创建数据库student的T-SQL语句如下:

Create data base student

On primary

(

name=student_data,

filename='E:\\SQL Server2008 SQLFULL_CHS\\student_data.mdf',

size=3,

maxsize=unlimited,

filegrowth=1

)

Log on

(name=student_log,

filename='E:\\SQL Server2008 SQLFULL_CHS\\student_log.ldf',

size=1,

maxsize=20,

filegrowth=10%

)

二、创建数据表

1、利用表设计器创建数据表:

(1)启动SQL Server Management Studio,连接到SQL Server 2008数据库实例。

(2)展开SQL Server实例,选择“数据库”—student—“表”,单击鼠标右键,然后从弹出的快捷菜单中选择“新建表”命令,打开“表设计器”。

(3)在“表设计器”中,可以定义各列的名称、数据类型、长度、是否允许为空等属性。

(4)当完成新建表的各个列的属性设置后,单击工具栏上的“保存”按钮,弹出“选择名称”对话框,输入新建表名stu_info,SQL Server数据库引擎会依据用户的设置完成新表的创建。

2、利用T-SQL语句创建数据表:

Create table stu_info(

stu_id char(10)not null,

name nvarchar(20)not null,

birthday date null,

sex nchar(2)null,

address nvarchar(20)null,

mark int null,

major nvarchar(20)null,

sdept nvarchar(20)null

);

3、样本数据库student表数据:

学生信息表(stu_info):

课程信息表(course_info):

学生成绩表(stu_grade):

三、完整性与约束

数据库中的数据是现实世界的反映,数据库的设计必须能够满足现实情况的实现,即满足现实商业规则的要求,这也是数据完整性的要求。

在数据库的管理系统中,约束是保证数据库中数据完整性的重要方法。

1、完整性:

数据完整性是数据库设计方面一个非常重要的问题,数据完整性代表数据的正确性、一致性和可靠性。实施数据完整性的目的在于确保数据的质量。

在SQL Server中,根据数据完整性措施所作用的数据库对象和范围不同,可以将数据完整性分类为实体完整性、域完整性和参照完整性。

实体完整性把数据表中的每行看作一个实体,它要求所有的行都具有唯一的标识;域完整性要求数据表中指定列的数据具有正确的数据类型、格式和有效的数据范围;参照完整性维持被参照表和参照表之间的数据一致性。

2、约束:

约束是数据库中的数据完整性实现的具体方法。在SQL Server中,包括5种约束类型:primary key约束、foreign key约束、unique约束、check约束和default约束。

四、数据查询

1、查询语句:

查询就是根据客户端的要求,数据库服务器搜寻出用户所需要的信息资料,并按用户规定的格式进行整理后返回给客户端。查询语句select在SQL Server中是使用频率最高的语句,可以说select语句是SQL语言的灵魂。

select语句的语法结构:

select select_list

[into new_table]

From table_source

[where search_condition]

[group by group_by_expression]

[having search_condition]

Order by order_expression[asc|desc]]

参数说明如下:

Select子句:指定由查询结果返回的列。

Into子句:将查询结果存储到新表或视图中。

From子句:用于指定数据源,即使用的列所在的表或视图。如果对象不止一个,那么它们之间必用逗号分开。

Where子句:指定用于返回的行的搜索条件。如果select语句没有where子句,dbms假设目标表中的所有行都满足搜索条件。

Group by子句:指定用来放置输出行的组,并且如果select子句select_list中包含聚合函数,则计算每组的汇总值。

Having子句:指定组或聚合函数的搜索条件。Having通常与groupby子句一起使用。

Order by子句:指定结果集的排序方式。ASC关键字表示升序排列结果,DESC关键字表示降序排列结果。如果没有指定任何一个关键字,那么ASC就是默认的关键字。如果没有orderby子句,DBMS将根据输入表中的数据的存放位置来显示数据。

 在这一系列的子句中,select子句和from子句是必需的,其他的子句根据需要都是可选的。

2、简单查询:

2.1、查询列:

(1)查询指定列:

数据表中有很多列,通常情况下并不需要查看全部的列,因为不同的用户所关注的内容不同。

在指定列的查询中,列的显示顺序由select子句指定,与数据在表中的存储顺序无关;同时,在查询多列时,用“,”将各字段隔开。

例7-1、查询所有同学学号、姓名和成绩信息。

Select stu_id,name,mark

from stu_info

查询结果如下:

(2)查询所有列:

使用“*”通配符,查询结果将列出表中所有列的值,而不必指明各列的列名,这在用户不清楚表中各列的列名时非常有用。服务器会按用户创建表格时声明列的顺序来显示所有的列。

例7-2、查询所有同学的所有信息。

select*

from stu_info

查询结果如下:

(3)使用运算列:

YEAR为系统函数,获取指定日期的年份;GEDDATE()为系统函数,获取当前日期和时间。

例7-3、查询所有同学的年龄信息。

Select stu_id,name,YEAR(getdate())-YEAR(birthday)

from stu_info

查询结果如下:

(4)改变列标题显示:

通常在查询结果显示的列标题就是创建表时所使用的列名,但是,这在实际使用中往往会带来一些不便,因此,可以利用 ’列标题’=列名 或 as ‘列标题’ 来根据需要修改列标题的显示。

例7-4、查询所有同学的年龄信息。

Select name as'姓名',YEAR(getdate())-YEAR(birthday)as'年龄'

from stu_info

1.函数year(getdate()) 表示当前的年份

2.函数year(birthday) 表示出生的年份

3.year(getdate())-year(birthday)=22

就是“当前的年份”-“出生的年份”=22(单位是年)

计算出来的结果是当前年龄

查询结果如下:

(5)除去结果的重复信息:

使用 distinct 关键字能够从返回的结果数据集合中删除重复的行,使返回的结果更简洁。

例7-5、查询所有的院系信息。

Select distinct sdept

from stu_info

查询结果如下:

(6)返回查询的部分数据:

在SQL Server 2008中,提供了 top 关键字让用户指定返回一定数量的数据。

Top n 表示返回最前面的n 行,n 表示返回的行数;top n percent 表示返回前面的n%行。

例7-6、查询前5位同学的学号、姓名和成绩信息。

Select top 5 stu_id,name,mark

from stu_info

查询结果如下:

例7-7、查询60%同学的学号、姓名和成绩信息。

Select top 60 percent stu_id,name,mark

from stu_info

查询结果如下:

2.2、选择行:

Where 子句用于指定查询条件,使得select 语句的结果表中只包含那些满足查询条件的记录。

在使用时,where 子句必须紧跟在 from 子句后面。Where 子句中的条件表达式包括算术表达式和逻辑表达式两种,SQL Server对Where 子句中的查询条件的数目没有。

(1)使用比较表达式:

例7-8、查询所有的男同学学号、姓名、生日和性别信息。

Select stu_id,name,birthday,sex

from stu_info

where sex='男'

查询结果如下:

例7-9、查询所有的总分大于550分的同学学号、姓名、生日和性别信息。

Select stu_id,name,birthday,sex

from stu_info

where mark>550

查询结果如下:

(2)使用逻辑比较表达式:

例7-10、查询所有总分大于550的男同学信息。

Select stu_id,name,birthday,sex

from stu_info

where mark>550 and sex='男'

查询结果如下:

例7-11、查询所有总分大于550分或男同学信息。

Select stu_id,name,birthday,sex

From stu_info

Where mark>550 or sex='男'

查询结果如下:

为了增强程序可读性,一般采用括号()来实现需要的执行顺序,而不考虑其默认的优先级顺序。

例7-12、查询所有信息学院和会计学院并且总分大于550分的同学信息。

select*

from stu_info                                                                                 

where (sdept='信息学院'or sdept='会计学院')and mark>550

查询结果如下:

(3)空值(null)的判断:

如果在创建数据表时没有指定 not null 约束,那么数据表中某些列的值就可以为null。所谓null就是空,在数据库中,其长度为0。

例7-13、查询所有籍贯为空的同学信息。

select*

from stu_info

where address is null

查询结果如下:

(4)限定数据范围:

使用between查询数据范围时同时包括了边界值,效果完全可以用含有“>=”和“<=”的逻辑表达式来代替;而使用not between进行查询时没有包括边界值,效果完全可以用含有“>”和“<”的逻辑表达式来代替。

例7-14、查询总分在530—560之间的同学信息。

select*

from stu_info

where mark between 530 and 560

查询结果如下:

(5)检索数据的范围:

对于列值不在一个连续的取值区间,而是一些离散的值,利用between关键字就为力了,可以利用SQL Server提供的另一个关键字 IN。

在大多数情况下,OR 运算符与IN 运算符可以实现相同的功能。

例7-15、查询所有在信息学院或会计学院就读的同学信息。

select*

from stu_info

where sdept in('信息学院','会计学院')

查询结果如下:

(6)模糊查询:

在实际的应用中,用户不会总是能够精确的给出查询条件。因此,经常需要根据一些并不确切的线索来搜索信息。SQL Server提供了like子句来进行这类模糊搜索。

Like子句在大多数情况下会与通配符配合使用。

所有通配符只有在like子句中才有意义,否则通配符会被当作普遍字符处理。

各通配符也可以组合使用,实现复杂的模糊查询。

(通配符 “%” 表示任意字符的匹配;通配符“_ ”只能匹配任何单个字符;通配符“[]”用于指定范围(如[a-z])或集合(如[abcdef])中的任何单个字符;通配符“[^]”用于匹配没有在方括号中列出的字符。)

在使用like进行模糊查询时,当“%”、“_”和“[]”符号单独出现时,都会被作为通配符进行处理。但是有时可能需要搜索的字符串包含量一个或多个特殊通配符,例如,数据表中可能存储含百分号(%)的折扣值。若要搜索作为字符而不是通配符的百分号,必须提供escape关键字和转义符,例如,“like ‘%B%’ escape ‘B’ ”就是使用了escape关键字定义了转义字符B,将字符串“%B%”中的第二个百分号(%)作为实际值,而不是通配符。

例7-16、查询所有姓“张”的同学信息。

select*

from stu_info

where name like '张%'

查询结果如下:

例7-17、查询所有姓“张”,而且姓名是两个字的同学信息。

select*

from stu_info

where name like '张_'

查询结果如下:

例7-18、查询所有姓“张”或姓“王”的同学信息。

select*

from stu_info

where name like '[张王]%'

查询结果如下:

例7-19、查询所有不姓“张”也不姓“王”的同学信息。

select*

from stu_info

where name like '[^张王]%'

查询结果如下:

2.3、排序查询结果:

在SQL语句中,order by 子句用于排序。Order by子句总是在where子句(如果有的话)后面说明的,可以包含一个或多个列,每个列之间以逗号分隔。可以选择使用asc|desc关键字指定按照升序|降序排序。如果没有特别说明,值是以升序列进行排序的,即默认情况下使用的是asc关键字。

例7-20、查询所有同学课程编号701的课程成绩,并按由大到小的顺序输出。

select*

from stu_grade

where course_id='701'

orderby grade desc

查询结果如下:

使用order by子句也可以根据两列或多列的结果进行排序,并用逗号分隔开不同的排序关键字。其实际排序结果是根据order by子句后面列名的顺序确定优先级的。即查询结果首先以第一列的顺序进行排序,而只有当第一列出现相同的信息时,这些相同的信息再按第二列的顺序进行排序,依此类推。

例7-21、查询所有同学课程编号701的课程成绩,并按由大到小的顺序输出,如果成绩相同,则按学号由小到大排序。

select*

from stu_grade

where course_id='701'

orderby grade desc,stu_id

查询结果如下:

 Order by子句除了可以根据列名进行排序外,还支持根据列的相对位置(即序号)进行排序。

例7-22、查询所有同学课程编号701的课程成绩,并按由大到小的顺序输出,如果成绩相同,则按学号由小到大排列。

Select stu_id,course_id,grade

From stu_grade

Where course_id='701'

orderby 3 desc,1

查询结果如下:

2.4、分组与汇总:

(1)聚合函数:

聚合函数是T—SQL所提供的系统函数,可以返回一列,几列或全部列的汇总数据,用于计数或统计。这类函数(除count外)仅用于数值型列,并且在列上使用聚合函数时,不考虑null值。

例7-23、统计学生信息表中学生人数。

Select COUNT(*) as '学生人数'

From stu_info

查询结果如下:

例7-24、统计学生成绩表中学号为2007070102同学的最高分、最低分、平均分和总分。

Select MAX(grade),MIN(grade),AVG(grade),SUM(grade)

From stu_grade

Where stu_id='2007070102'

查询结果如下:

(2)分组汇总:

使用聚合函数只返回单个汇总,而在实际应用中,更多的是需要进行分组汇总数据。使用group by子句可以进行分组汇总,为结果集中的每一行产生一个汇总值。Group by子句与聚合函数有密切关系,在某种意义上说,如果没有聚合函数,group by子句也没有多大用处了。

Group by关键字后面跟着的列名称为分组列,分组列中的每个得复值将被汇总为一行。

如果包含where子句,则只对满足where条件的行进行分组汇总。

例7-25、统计学生成绩表中每个同学的最高分、最低分、平均分和总分。

Select stu_id,MAX(grade),MIN(grade),AVG(grade),SUM(grade)

From stu_grade

Group by stu_id

查询结果如下:

例7-26、统计学生成绩表中每个同学的最高分、最低分、平均分和总分,80分以下的成绩不参与统计。

Select stu_id,MAX(grade),MIN(grade),AVG(grade),SUM(grade)

From stu_grade

Where grade>=80

Group by stu_id

查询结果如下:

(3)分组筛选:

如果使用group by子句分组,则还可用having子句对分组后的结果进行过滤筛选。Having子句通常与group by子句一起使用,用于指定组或合计的搜索条件,其作用与where子句相似,二者的区别如下:

作用对象不同:where 子句作用于表和视图中的行,而having子句作用于形成的组。Where子句查找的行,having子句查找的组。

执行顺序不同。若查询句中同时有where子句和having子句,执行时,先去掉不满足where条件的行,然后分组,分组后再去掉不满足having条件的组。

Where子句中不能直接使用聚合函数,但having子句的条件中可以包含聚合函数。

例7-27、统计学生成绩表中每个同学的最高分、最低分、平均分和总分,并输出平均分大于87分的信息。

Select stu_id,MAX(grade),MIN(grade),AVG(grade),SUM(grade)

From stu_grade

Group by stu_id

Having AVG(grade)>87

查询结果如下:

(4)明细汇总:

使用group by子句对查询数据进行分组汇总,为每一组产生一个汇总结果,每个组只返回一行,无法看到详细信息。使用compute和compute by子句既能够看到统计经营部的结果又能够浏览详细数据。

例7-28、使用compute子句对所有学生的人数进行明细汇总。

select*

from stu_info

compute count(stu_id)

查询结果如下:

在使用compute 和compute by时,需要注意以下几点:

Compute[by]子句不能与select into子句一起使用。

Compute 子句中的列必须在select子句的字段列表中出现。

Compute by表示按指定的列进行明细汇总,使用by关键字时必须同时使用order by子句,并且compute by中出现的列必须具有与order by后出现的列相同的顺序,且不能跳过其中的列。

例7-29、使用compute by子句按照院系对所有学生的人数进行明细汇总。

select*

from stu_info

order by sdept

compute count(stu_id)

by sdept

查询结果如下:

3、连接查询:

前面介绍的查询都是针对单一的表,而在数据通库管理系统中,考虑到数据的冗余度低、数据一致性等问题,通常对数据表的设计要满足范式的要求,因此也会造成一个实体的所有信息保存在多个表中。当检索数据时,往往在一个表中不能够得到想要的信息,通过连接操作,可以查询出存放在多个表中同一实体的不同信息,给用户带来很大的灵活性。

多表连接实际上就是实现如何使用一个表中的数据来选择另一个表中的行。而连接条件则主要通过以下方法定义两个表在查询中的关联方式:

指定每个表中要用于连接的列。典型的连接条件在一个表中的指定外键,在另一个表中指定与其关联的键。

指定比较各列的值时要使用的比较运算符(=、< >等)。

表的连接的实现可以通过两种方法:利用select语句的where子句;在from子句中使用join(inner join,cross join ,outer join,left outer join,full outer join等)关键字。

例7-30、查询所有选修课程编号701的同学学号、姓名和成绩。

Select stu_info.stu_id,name,mark

From stu_info,stu_grade

Where stu_info.stu_id=stu_grade.stu_id and course_id='701'

查询结果如下:

例7-31、查询所有选修课程的同学选修课程的成绩。

Select stu_info.stu_id,name,course_name,grade

From stu_info,stu_grade,course_info

Where stu_info.stu_id=stu_grade.stu_id and

course_info.course_id=stu_grade.course_id

查询结果如下:

有时表名比较烦琐,使用起来很麻烦,为了程序的简洁明了,在SQL中,也可以通过AS关键字为表定义别名。

例7-32、查询所有同学所有课程的成绩。

Select A.stu_id,name,course_name,mark

From stu_info as A,stu_grade as B,course_info as C

Where A.stu_id=B.stu_id and B.course_id=C.course_id

查询结果如下:

在select 语句的from子句中,通过指定不同类型的join关键字可以实现不同的表的连接方式,而在on关键字后指定连接条件。

例7-33、查询所有选修课程的同学学号、姓名和成绩。

Select stu_info.stu_id,name,mark

From stu_info inner join stu_grade

On stu_info.stu_id=stu_grade.stu_id

查询结果如下:

例7-34、从stu_info表中查询入学分数比学号为2007070101同学高的所有同学信息。

Select R1.stu_id,R1.name,R1.mark

From stu_info as R1 inner join stu_info as R2

On R2.stu_id='2007070101' and R1.mark>R2.mark

查询结果如下:

例7-35、查询所有同学的选修课程信息。

Select stu_info.stu_id,name,mark

From stu_info left outer join stu_grade

On stu_info.stu_id=stu_grade.stu_id

查询结果如下:

例7-36、查询所有同学的选修课程信息。

Select stu_info.stu_id,name,mark

From stu_grade right outer join stu_info

On stu_info.stu_id=stu_grade.stu_id

查询结果如下:

4、嵌套查询:

所谓嵌套查询指的是在一个select 查询语句中包含另一个(或多个)select查询语句。其中,外层的select查询语句叫外部查询,内层的select 查询语句叫子查询。

嵌套查询的执行过程:首先执行子查询语句,得到的子查询结果集传递给外层主查询语句,作为外层主查询的查询项或查询条件使用。子查询也可以再嵌套子查询。

4、1单列单值嵌套查询:

例7-37、查询选修“计算机基础”的学生成绩信息。

select*

from stu_grade

where course_id=

(select course_id

From course_info

Where course_name='计算机基础')

查询结果如下:

例7-38、查询比“2007070101”同学年龄大的同学信息。

select*

from stu_info

where birthday<

(select birthday

From stu_info

Where stu_id='2007070101')

查询结果如下

4、2单列多值嵌套查询:

例7-39、查询所有会计学院的同学成绩信息。

select*

from stu_grade

where stu_id in

(select stu_id

From stu_info

Where sdept='会计学院')

查询结果如下

例7-40、查询其他系中比会计学院某一学生分数少的学生学号和姓名。

Select stu_id,name

From stu_info

Where mark(select mark

From stu_info

Where sdept='会计学院')

And sdept<>'会计学院'

查询结果如下

例7-41、查询选修“计算机基础”的学生成绩信息。

select*

from stu_grade

where exists

(select*

From course_info

Where stu_grade.course_id=course_id and course_name='计算机基础')

查询结果如下

例7-42、查询没有选修“计算机基础”的学生成绩信息。

select*

from stu_grade

where not exists

(select*

From course_info

Where stu_grade.course_id=course_id and course_name='计算机基础')

查询结果如下

5、集合查询:

如果有多个不同的查询结果数据集,但又希望将它们按照一定的关系连接在一起,组成一组数据,这就可以使用集合运算来实现。在SQL Server 2008中,T-SQL提供的集合运算符有union,except和intersect。

例7-43、查询stu_info表中信息学院或入学分数大于550分的学生信息。

Select stu_id,name,mark,sdept

From stu_info

Where sdept='信息学院'

union

select stu_id,name,mark,sdept

from stu_info

where mark>550

查询结果如下

例7-44、查询stu_info表中信息学院而且入学分数大于550分的学生信息。

Select stu_id,name,mark,sdept

From stu_info

Where sdept='信息学院'

except

select stu_id,name,mark,sdept

from stu_info

where mark<=550

查询结果如下

例7-45、查询stu_info表中信息学院而且入学分数大于550分的学生信息。

Select stu_id,name,mark,sdept

From stu_info

Where sdept='信息学院'

intersect

select stu_id,name,mark,sdept

from stu_info

where mark>550

查询结果如下

6、本章小结:

本章介绍了select语句的相关知识,其内容主要包括select语句的组成和select语句的各种查询方法。Select语句是SQL语言中功能最为强大、应用最为广泛的语句之一,用于查询数据库中符合条件的记录。利用select语句既可进行简单的数据查询,又可进行涉及多表的连接查询、嵌套查询和集合查询。

通过本章学习,应该熟练掌握以下内容:1)select语句的基本语法结构;2) select语句的简单查询;3)select语句的嵌套查询;4)select语句的集合查询。

文档

SQL-Server-2008数据库—创建、建表、查询语句

SQLServer2008数据库—创建、建表、查询语句一、创建数据库1、利用对象资源管理器创建用户数据库:(1)选择“开始”—“程序”—MicrosoftSQLServer2008—SQLServerManagementStudio命令,打开SQLServerManagementStudio。(2)使用“Windows身份验证”连接到SQLServer2008数据库实例。(3)展开SQLServer实例,右击“数据库”,然后人弹出的快捷菜单中选择“新建数据库存”命令,打开“新建数据库”对话框。
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top