SQL Server 数据库创建建表查询语句.docx
《SQL Server 数据库创建建表查询语句.docx》由会员分享,可在线阅读,更多相关《SQL Server 数据库创建建表查询语句.docx(21页珍藏版)》请在冰点文库上搜索。
SQLServer数据库创建建表查询语句
SQLServer2008数据库—创立、建表、查询语句之欧侯瑞魂创作
创作时间:
二零二一年六月三十日
一、创立数据库
1、利用对象资源管理器创立用户数据库:
(1)选择“开始”—“法式”—MicrosoftSQLServer2008—SQLServerManagementStudio命令,翻开SQLServerManagementStudio.
(2)使用“Windows身份验证”连接到SQLServer2008数据库实例.
(3)展开SQLServer实例,右击“数据库”,然后人弹出的快捷菜单中选择“新建数据库存”命令,翻开“新建数据库”对话框.
(4)在“新建数据库”对话框中,可以界说数据库的名称、数据库的所有者、是否使用全文索引、数据文件和日志文件的逻辑名称和路径、文件组、初始年夜小和增长方式等.输入数据库名称student.
2、利用T-SQL语句创立用户数据库:
在SQLServerManagementStudio中,单击标准工具栏的“新建查询”按钮,启动SQL编纂器窗口,在光标处输入T-SQL语句,单击“执行”按钮.SQL编纂器就提交用户输入的T-SQL语句,然后发送到服务器执行,并返回执行结果.
创立数据库student的T-SQL语句如下:
Createdatabasestudent
Onprimary
(
name=student_data,
filename='E:
\SQLServer2008SQLFULL_CHS\MicrosoftSQLServer\MSSQL10.MSSQLSERVER\MSSQL\DATA\student_data.mdf',
size=3,
maxsize=unlimited,
filegrowth=1
)
Logon
(name=student_log,
filename='E:
\SQLServer2008SQLFULL_CHS\MicrosoftSQLServer\MSSQL10.MSSQLSERVER\MSSQL\DATA\student_log.ldf',
size=1,
maxsize=20,
filegrowth=10%
)
二、创立数据表
1、利用表设计器创立数据表:
(1)启动SQLServerManagementStudio,连接到SQLServer2008数据库实例.
(2)展开SQLServer实例,选择“数据库”—student—“表”,单击鼠标右键,然后从弹出的快捷菜单中选择“新建表”命令,翻开“表设计器”.
(3)在“表设计器”中,可以界说各列的名称、数据类型、长度、是否允许为空等属性.
(4)当完成新建表的各个列的属性设置后,单击工具栏上的“保管”按钮,弹出“选择名称”对话框,输入新建表名stu_info,SQLServer数据库引擎会依据用户的设置完成新表的创立.
2、利用T-SQL语句创立数据表:
Createtablestu_info(
stu_idchar(10)notnull,
namenvarchar(20)notnull,
birthdaydatenull,
sexnchar
(2)null,
addressnvarchar(20)null,
markintnull,
majornvarchar(20)null,
sdeptnvarchar(20)null
);
3、样本数据库student表数据:
学生信息表(stu_info):
课程信息表(course_info):
学生成果表(stu_grade):
三、完整性与约束
数据库中的数据是现实世界的反映,数据库的设计必需能够满足现实情况的实现,即满足现实商业规则的要求,这也是数据完整性的要求.
在数据库的管理系统中,约束是保证数据库中数据完整性的重要方法.
1、完整性:
数据完整性是数据库设计方面一个非常重要的问题,数据完整性代表数据的正确性、一致性和可靠性.实施数据完整性的目的在于确保数据的质量.
在SQLServer中,根据数据完整性办法所作用的数据库对象和范围分歧,可以将数据完整性分类为实体完整性、域完整性和参照完整性.
实体完整性把数据表中的每行看作一个实体,它要求所有的行都具有唯一的标识;域完整性要求数据表中指定列的数据具有正确的数据类型、格式和有效的数据范围;参照完整性维持被参照表和参照表之间的数据一致性.
2、约束:
约束是数据库中的数据完整性实现的具体方法.在SQLServer中,包括5种约束类型:
primarykey约束、foreignkey约束、unique约束、check约束和default约束.
四、数据查询
1、查询语句:
查询就是根据客户真个要求,数据库服务器搜寻出用户所需要的信息资料,并按用户规定的格式进行整理后返回给客户端.查询语句select在SQLServer中是使用频率最高的语句,可以说select语句是SQL语言的灵魂.
select语句的语法结构:
selectselect_list
[intonew_table]
Fromtable_source
[wheresearch_condition]
[groupbygroup_by_expression]
[havingsearch_condition]
Orderbyorder_expression[asc|desc]]
参数说明如下:
Select子句:
指定由查询结果返回的列.
Into子句:
将查询结果存储到新表或视图中.
From子句:
用于指定命据源,即使用的列所在的表或视图.如果对象不止一个,那么它们之间必用逗号分开.
Where子句:
指定用于限制返回的行的搜索条件.如果select语句没有where子句,dbms假设目标表中的所有行都满足搜索条件.
Groupby子句:
指定用来放置输出行的组,而且如果select子句select_list中包括聚合函数,则计算每组的汇总值.
Having子句:
指定组或聚合函数的搜索条件.Having通常与groupby子句一起使用.
Orderby子句:
指定结果集的排序方式.ASC关键字暗示升序排列结果,DESC关键字暗示降序排列结果.如果没有指定任何一个关键字,那么ASC就是默认的关键字.如果没有orderby子句,DBMS将根据输入表中的数据的寄存位置来显示数据.
在这一系列的子句中,select子句和from子句是必需的,其他的子句根据需要都是可选的.
2、简单查询:
2.1、查询列:
(1)查询指定列:
数据表中有很多列,通常情况下其实不需要检查全部的列,因为分歧的用户所关注的内容分歧.
在指定列的查询中,列的显示顺序由select子句指定,与数据在表中的存储顺序无关;同时,在查询多列时,用“,”将各字段隔开.
例7-1、查询所有同学学号、姓名和成果信息.
Selectstu_id,name,mark
fromstu_info
查询结果如下:
(2)查询所有列:
使用“*”通配符,查询结果将列出表中所有列的值,而不用指明各列的列名,这在用户不清楚表中各列的列名时非常有用.服务器会按用户创立表格时声明列的顺序来显示所有的列.
例7-2、查询所有同学的所有信息.
select*
fromstu_info
查询结果如下:
(3)使用运算列:
YEAR为系统函数,获取指定日期的年份;GEDDATE()为系统函数,获取以后日期和时间.
例7-3、查询所有同学的年龄信息.
Selectstu_id,name,YEAR(getdate())-YEAR(birthday)
fromstu_info
查询结果如下:
(4)改变列题目显示:
通常在查询结果显示的列题目就是创立表时所使用的列名,可是,这在实际使用中往往会带来一些方便,因此,可以利用’列题目’=列名或as‘列题目’来根据需要修改列题目的显示.
例7-4、查询所有同学的年龄信息.
Selectnameas'姓名',YEAR(getdate())-YEAR(birthday)as'年龄'
fromstu_info
查询结果如下:
(5)除去结果的重复信息:
使用distinct关键字能够从返回的结果数据集合中删除重复的行,使返回的结果更简洁.
例7-5、查询所有的院系信息.
Selectdistinctsdept
fromstu_info
查询结果如下:
(6)返回查询的部份数据:
在SQLServer2008中,提供了top关键字让用户指定返回一定命量的数据.
Topn暗示返回最前面的n行,n暗示返回的行数;topnpercent暗示返回前面的n%行.
例7-6、查询前5位同学的学号、姓名和成果信息.
Selecttop5stu_id,name,mark
fromstu_info
查询结果如下:
例7-7、查询60%同学的学号、姓名和成果信息.
Selecttop60percentstu_id,name,mark
fromstu_info
查询结果如下:
2.2、选择行:
Where子句用于指定查询条件,使得select语句的结果表中只包括那些满足查询条件的记录.
在使用时,where子句必需紧跟在from子句后面.Where子句中的条件表达式包括算术表达式和逻辑表达式两种,SQLServer对Where子句中的查询条件的数目没有限制.
(1)使用比力表达式:
例7-8、查询所有的男同学学号、姓名、生日和性别信息.
Selectstu_id,name,birthday,sex
fromstu_info
wheresex='男'
查询结果如下:
例7-9、查询所有的总分年夜于550分的同学学号、姓名、生日和性别信息.
Selectstu_id,name,birthday,sex
fromstu_info
wheremark>550
查询结果如下:
(2)使用逻辑比力表达式:
例7-10、查询所有总分年夜于550的男同学信息.
Selectstu_id,name,birthday,sex
fromstu_info
wheremark>550andsex='男'
查询结果如下:
例7-11、查询所有总分年夜于550分或男同学信息.
Selectstu_id,name,birthday,sex
Fromstu_info
Wheremark>550orsex='男'
查询结果如下:
为了增强法式可读性,一般采纳括号()来实现需要的执行顺序,而不考虑其默认的优先级顺序.
例7-12、查询所有信息学院和会计学院而且总分年夜于550分的同学信息.
select*
fromstu_info
where(sdept='信息学院'orsdept='会计学院')andmark>550
查询结果如下:
(3)空值(null)的判断:
如果在创立数据表时没有指定notnull约束,那么数据表中某些列的值就可以为null.所谓null就是空,在数据库中,其长度为0.
例7-13、查询所有籍贯为空的同学信息.
select*
fromstu_info
whereaddressisnull
查询结果如下:
(4)限定命据范围:
使用between限制查询数据范围时同时包括了鸿沟值,效果完全可以用含有“>=”和“<=”的逻辑表达式来取代;而使用notbetween进行查询时没有包括鸿沟值,效果完全可以用含有“>”和“<”的逻辑表达式来取代.
例7-14、查询总分在530—560之间的同学信息.
select*
fromstu_info
wheremarkbetween530and560
查询结果如下:
(5)限制检索数据的范围:
对列值不在一个连续的取值区间,而是一些离散的值,利用between关键字就无能为力了,可以利用SQLServer提供的另一个关键字IN.
在年夜大都情况下,OR运算符与IN运算符可以实现相同的功能.
例7-15、查询所有在信息学院或会计学院就读的同学信息.
select*
fromstu_info
wheresdeptin('信息学院','会计学院')
查询结果如下:
(6)模糊查询:
在实际的应用中,用户不会总是能够精确的给出查询条件.因此,经常需要根据一些其实不确切的线索来搜索信息.SQLServer提供了like子句来进行这类模糊搜索.
Like子句在年夜大都情况下会与通配符配合使用.
所有通配符只有在like子句中才有意义,否则通配符会被看成普遍字符处置.
各通配符也可以组合使用,实现复杂的模糊查询.
(通配符“%”暗示任意字符的匹配;通配符“_”只能匹配任何单个字符;通配符“[]”用于指定范围(如[a-z])或集合(如[abcdef])中的任何单个字符;通配符“[^]”用于匹配没有在方括号中列出的字符.)
在使用like进行模糊查询时,当“%”、“_”和“[]”符号独自呈现时,城市被作为通配符进行处置.可是有时可能需要搜索的字符串包括量一个或多个特殊通配符,例如,数据表中可能存储含百分号(%)的折扣值.若要搜索作为字符而不是通配符的百分号,必需提供escape关键字和转义符,例如,“like‘%B%’escape‘B’”就是使用了escape关键字界说了转义字符B,将字符串“%B%”中的第二个百分号(%)作为实际值,而不是通配符.
例7-16、查询所有姓“张”的同学信息.
select*
fromstu_info
wherenamelike'张%'
查询结果如下:
例、查询所有姓“张”,而且姓名是两个字的同学信息.
select
fromstu_info
wherenamelike张_
查询结果如下:
例、查询所有姓“张”或姓“王”的同学信息.
select
fromstu_info
wherenamelike'[张王]%'
查询结果如下:
例7-19、查询所有不姓“张”也不姓“王”的同学信息.
select*
fromstu_info
wherenamelike'[^张王]%'
查询结果如下:
2.3、排序查询结果:
在SQL语句中,orderby子句用于排序.Orderby子句总是在where子句(如果有的话)后面说明的,可以包括一个或多个列,每个列之间以逗号分隔.可以选择使用asc|desc关键字指定依照升序|降序排序.如果没有特别说明,值是以升序列进行排序的,即默认情况下使用的是asc关键字.
例7-20、查询所有同学课程编号701的课程成果,并按由年夜到小的顺序输出.
select*
fromstu_grade
wherecourse_id='701'
orderbygradedesc
查询结果如下:
使用orderby子句也可以根据两列或多列的结果进行排序,并用逗号分隔开分歧的排序关键字.其实际排序结果是根据orderby子句后面列名的顺序确定优先级的.即查询结果首先以第一列的顺序进行排序,而只有当第一列呈现相同的信息时,这些相同的信息再按第二列的顺序进行排序,依此类推.
例7-21、查询所有同学课程编号701的课程成果,并按由年夜到小的顺序输出,如果成果相同,则按学号由小到年夜排序.
select*
fromstu_grade
wherecourse_id='701'
orderbygradedesc,stu_id
查询结果如下:
Orderby子句除可以根据列名进行排序外,还支持根据列的相对位置(即序号)进行排序.
例7-22、查询所有同学课程编号701的课程成果,并按由年夜到小的顺序输出,如果成果相同,则按学号由小到年夜排列.
Selectstu_id,course_id,grade
Fromstu_grade
Wherecourse_id='701'
orderby3desc,1
查询结果如下:
2.4、分组与汇总:
(1)聚合函数:
聚合函数是T—SQL所提供的系统函数,可以返回一列,几列或全部列的汇总数据,用于计数或统计.这类函数(除count外)仅用于数值型列,而且在列上使用聚合函数时,不考虑null值.
例7-23、统计学生信息表中学生人数.
SelectCOUNT(*)as'学生人数'
Fromstu_info
查询结果如下:
例7-24、统计学生成果表中学号为2007070102同学的最高分、最低分、平均分和总分.
SelectMAX(grade),MIN(grade),AVG(grade),SUM(grade)
Fromstu_grade
Wherestu_id='2007070102'
查询结果如下:
(2)分组汇总:
使用聚合函数只返回单个汇总,而在实际应用中,更多的是需要进行分组汇总数据.使用groupby子句可以进行分组汇总,为结果集中的每一行发生一个汇总值.Groupby子句与聚合函数有密切关系,在某种意义上说,如果没有聚合函数,groupby子句也没有多年夜用处了.
Groupby关键字后面跟着的列名称为分组列,分组列中的每个得复值将被汇总为一行.
如果包括where子句,则只对满足where条件的行进行分组汇总.
例7-25、统计学生成果表中每个同学的最高分、最低分、平均分和总分.
Selectstu_id,MAX(grade),MIN(grade),AVG(grade),SUM(grade)
Fromstu_grade
Groupbystu_id
查询结果如下:
例7-26、统计学生成果表中每个同学的最高分、最低分、平均分和总分,80分以下的成果不介入统计.
Selectstu_id,MAX(grade),MIN(grade),AVG(grade),SUM(grade)
Fromstu_grade
Wheregrade>=80
Groupbystu_id
查询结果如下:
(3)分组筛选:
如果使用groupby子句分组,则还可用having子句对分组后的结果进行过滤筛选.Having子句通常与groupby子句一起使用,用于指定组或合计的搜索条件,其作用与where子句相似,二者的区别如下:
作用对象分歧:
where子句作用于表和视图中的行,而having子句作用于形成的组.Where子句限制查找的行,having子句限制查找的组.
执行顺序分歧.若查询句中同时有where子句和having子句,执行时,先去失落不满足where条件的行,然后分组,分组后再去失落不满足having条件的组.
Where子句中不能直接使用聚合函数,但having子句的条件中可以包括聚合函数.
例7-27、统计学生成果表中每个同学的最高分、最低分、平均分和总分,并输出平均分年夜于87分的信息.
Selectstu_id,MAX(grade),MIN(grade),AVG(grade),SUM(grade)
Fromstu_grade
Groupbystu_id
HavingAVG(grade)>87
查询结果如下:
(4)明细汇总:
使用groupby子句对查询数据进行分组汇总,为每一组发生一个汇总结果,每个组只返回一行,无法看到详细信息.使用compute和computeby子句既能够看到统计经营部的结果又能够浏览详细数据.
例7-28、使用compute子句对所有学生的人数进行明细汇总.
select*
fromstu_info
computecount(stu_id)
查询结果如下:
在使用compute和computeby时,需要注意以下几点:
Compute[by]子句不能与selectinto子句一起使用.
Compute子句中的列必需在select子句的字段列表中呈现.
Computeby暗示按指定的列进行明细汇总,使用by关键字时必需同时使用orderby子句,而且computeby中呈现的列必需具有与orderby后呈现的列相同的顺序,且不能跳过其中的列.
例7-29、使用computeby子句依照院系对所有学生的人数进行明细汇总.
select*
fromstu_info
orderbysdept
computecount(stu_id)
bysdept
查询结果如下:
3、连接查询:
前面介绍的查询都是针对单一的表,而在数据通库管理系统中,考虑到数据的冗余度低、数据一致性等问题,通常对数据表的设计要满足范式的要求,因此也会造成一个实体的所有信息保管在多个表中.当检索数据时,往往在一个表中不能够获得想要的信息,通过连接把持,可以查询出寄存在多个表中同一实体的分歧信息,给用户带来很年夜的灵活性.
多表连接实际上就是实现如何使用一个表中的数据来选择另一个表中的行.而连接条件则主要通过以下方法界说两个表在查询中的关联方式:
指定每个表中要用于连接的列.典范的连接条件在一个表中的指定外键,在另一个表中指定与其关联的键.
指定比力各列的值时要使用的比力运算符(=、<>等).
表的连接的实现可以通过两种方法:
利用select语句的where子句;在from子句中使用join(innerjoin,crossjoin,outerjoin,leftouterjoin,fullouterjoin等)关键字.
例7-30、查询所有选修课程编号701的同学学号、姓名和成果.
Selectstu_info.stu_id,name,mark
Fromstu_info,stu_grade
Wherestu_info.stu_id=stu_grade.stu_idandcourse_id='701'
查询结果如下:
例7-31、查询所有选修课程的同学选修课程的成果.
Selectstu_info.stu_id,name,course_name,grade
Fromstu_info,stu_grade,course_info
Wherestu_info.stu_id=stu_grade.stu_idand
查询结果如下:
有时表名比力烦琐,使用起来很麻烦,为了法式的简洁明了,在SQL中,也可以通过AS关键字为表界说别名.
例7-32、查询所有同学所有课程的成果.
SelectA.stu_id,name,course_name,mark
Fromstu_infoasA,stu_gradeasB,course_infoasC
查询结果如下:
在select语句的from子句中,通过指定分歧类型的join关键字可以实现分歧的表的连接方式,而在on关键字后指定连接条件.
例7-33、查询所有选修课程的同学学号、姓名和成果.