1. 为了实现数据的完整性,SQL Server提供了哪些的约束(Constraint)?
答案:(如何保证数据完整性?)
1. 实体完整性约束:实体完整性要求表中的每一行数据都反映不同的实体,不能存在相同的数据行。
2. 域完整性约束:域完整性是指给定列的输入有效性。
3. 引用完整性约束:在输入或删除数据行时,引用完整性约束用来保持表之间已定义的关系。
4. 自定义完整性约束:用户自定义完整性用来定义特定的规则。
2. T-SQL语言主要有基本分组成?
答案:
Ø 数据操作语言DML(Data Manipulation Language):用来查询、插入、删除和修改数据库中的数据,如SELECT、Insert、Update和Delete等。
Ø 数据控制语言DCL(Data Control Language):用来控制数据库组件的存取许可、存取权限等,如 Grant、 Revoke等。
Ø 数据定义语言DDL(Data Description Language):用来建立数据库、数据库对象和定义其列,大部分是以Create开头的命令,如Create Table、Create View及Drop Table等。
除此之外,T-SQL还包括变量说明、内嵌函数以及其他的命令等。
3. 一次性插入多行数据有几种方法?
答案:
1. 通过Insert Select语句将现有表中的数据添加到新表中。
insert into TongXunLu (姓名,地址,电子邮件) select SName,SAddress,SEmail from Students
2. 通过Select Into语句将现有表中的数据添加到新表中。
select Students.SName,Students.SEmail,identity(int,1,1) as StuID into TongXunLu from Students
3. 通过Union关键字合并数据进行插入。
insert Students (SName,SSex) select ‘张可’,1 union select ‘李洋’,0
4. SQL Server提供了哪些聚合函数?分别讲解一下。答案:
1. Sum:Sum返回表达式中所有数值的总和,Sum只能用于数字类型的列,不能够汇总字符、日期等其他数据类型。
2. Avg:Avg函数返回表达式中所有数值的平均值,Avg函数也只能用于数字类型的列。
3. Max和Min:Max返回表达式中的最大值,Min返回表达式中的最小值,它们都可以用于数字型、字符型以及日期/时间类型的列。
4. Count:Count返回提供的表达式中非空值的计数,Count可以用于数字和字符类型的列。
5. 数据库多表连接查询有几种类型?答案:
1、内连接:内连接是最典型、最常用的连接查询,它根据表中共同的列来进行匹配,特别是两个表存在主外键关系时通常会使用到内连接查询。
2、 外连接:外连接可以是左外连接、右外连接或完整外连接。
1)左外连接:Left Join或Left Outer Join。左外连接的结果集包括Left join子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列均为空值。
2)右外连接:Right Join或Right Outer Join。右外连接是左外连接的反向链接,将反向右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
3)完整外连接:Full Join或 Full Outer Join.。完整外连接返回左表和右表中的所有行,当某行在另一个表中没有匹配时,则另一个表选择列包含空值,如果表之间有匹配行,则整个结果集行包含基表的数据值。
3、 交叉连接:交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行再一一组合,相当于两个表“相乘”。
6. Microsoft SQL Server提供了哪些系统数据库?答案:
1)Master数据库:Master数据库记录SQL Server系统的所有系统级别信息。
2)Tempdb数据库:Tempdb数据库保存所有的临时表和临时存储过程,以及临时生成的工作表。
3)Model数据库:Model数据库用作在系统上创建的所有数据库的模板。
4)Msdb数据库:Msdb数据库供SQL Server代理程序调度报警、作业以及记录操作时使用。
7. DBMS(数据库管理系统)发展至今经历了哪几个时代?答案:
1. 第一代的网状、层次数据库。
2. 第二代的关系数据库。
3. 第三代以面向对象模型为主要特征的数据库系统。
8. SQL Server 2005提供的主要版本有哪几种? 答案:
1. 企业版(SQL Server 2005 Enterprise Edition)
2. 标准版(SQL Server 2005 Standard Edition)
3. 工作组版(SQL Server 2005 Workgroup Edition)
4. 开发版(SQL Server 2005 Developer Edition)
5. 评估版(SQL Server 2005 Evaluation Edition)
9. 数据库的访问限制选项有几种?分别是什么?答案:
Ø Multiple:数据库的正常状态,允许多个用户同时访问该数据库。
Ø Single:用于维护操作的状态,一次只允许一个用户访问该数据库。
Ø Restricted:只有管理员角色或特定的成员才能使用该数据库。
10. 使用Select语句进行最基本的查询有几种情况?答案:
1. 查询所有的数据行和列
把表中的所有行和列都列举出来比较简单,这时候需要使用“*”通配符来表示所有的列。
2. 查询部分行列——条件查询
查询部分列需要列举不同的列名,而查询部分行需要使用Where子句进行条件限制。
3. 在查询中使用列名
As子句可以用来改变结果集列的名称,也可以为组合或者计算出的列指定名称,还有一种情况是让标题列的信息更易懂。
4. 查询空行
在SQL语句中采用“Is Null”或者“Is Not Null”来判断是否为空行。
5. 在查询中使用常量列
有时候需要将一些常量的默认信息添加到查询输出中,以方便统计或计算。
6. 查询返回限制的行数
查询需要返回限制的行数。
11. 在Select语句中,Where、Group By、Having子句和统计函数的执行次序是什么?
答案: Where子句从数据源中去掉不符合其搜索条件的数据;Group By子句搜索数据列到各个组中,统计函数为各个组计算统计值;Having子句去掉不符合其组搜索条件的各组数据行。
eg:在按照部门分类的员工表中,要查询“有多个员工的工资不低于2000的部门编号,
select 部门编号,count(*) from 员工信息表 where 工资 >= 2000 group by 部门编号 having count(*) > 1
12. 选择主键的原则是什么?
答:需要考虑两个原则:最少性和稳定性。最少性是指列数最少的键,如果可以从单个主键和组合键中选择时,应该选择单个主键。稳定性是指列中数据的特征,由于主键通常用来在两个表之间建立联系,所以主键的数据不要经常更新,理想情况下,应该永远不要变。
update Card set PassWord = '0023abc',Balance = 98 where ID = '0023_ABC'
insert into TrainInfo values('K21','石家庄','武汉')
delete from Card where ID = '0024_ABD'
insert TrainInfo (TNumber, TFrom, TDest, TDistance)
select 'K21','石家庄','武汉' union
select 'K181','长沙','北京'
查询密码与姓名或者密码与卡号一样的姓名:
use [NetBar]
select * from Card where (PassWord = ID) OR (PassWord = UserName)
最近一次使用B01计算机的卡号:
use [NetBar]
select top 1 CardID,BeginTime from Record
where ComputerID = 'B01' order by EndTime DESC
周末半价上机:
update Record set Fee = Fee/2 where (DatePart(Weekday,BeginTime) = 7) OR (DatePart(Weekday,BeginTime) = 1)
本月上机时间最长的前三名用户:
use [NetBar]
select top 3 CardID From Record where
DatePart(month,BeginTime) = Month(GetTime) Order by DateDiff(mi,BeginTime,EndTime) DESC
查询全部T字头列车的信息:
use [TrainOfChina]
Select * from TrainInfo where TNumber Like 'T%'
查询始发站是长沙的车站、到站、始发时间、到站时间:
use [TrainOfChina]
select TNumber AS 车次, TDest AS 到站, TStartTime AS 开发时间, TEndTime AS
到站时间from TrainInfo where TFrom = '长沙'
查询所有票价大于200的车次、始发站、到站,并且按照票价从高到低排列:
use [TrainOfChina]
select TNumber,TFrom,TDest from TrainInfo where (TDistance/10*TUnitPrice)>200
order by (TDistance/10*TUnitPrice) DESC
列车提速:
use [TrainOfChina]
update TrainInfo set TSpeed = TSpeed*1.2 where TNumber like 'T%'
update TrainInfo set TSpeed = TSpeed*1.25 where TNumber like 'Z%'
从武汉始发的列车全部停运:delete from TrainSchedular where SNumber = 'Z11'
查询指定卡的本月上机次数:
select count(*) as 上机次数from Record where CardID = '0023_ABC' and
DatePart(Month, BeginTime) = DatePart(Month, GetDate())
最近一次使用B01计算机的卡号:
select C.UserName from Card as C inner join Record as R on C.ID = R.CardID
where R.BeginTime between DateAdd(day,-1,Getdate()) and Getdate()
本周上机人员、费用总汇:
select C.UserName,sum(R.Fee) from Card as C inner join Record as R
on C.ID = R.CardID where DatePart(week,BeginTime) = DatePart(week,GetDate()) group by C.UserName
卡号第6位和第7位是“AB”的人员的消费情况:
select C.UserName,sum(R.Fee) from Card as C inner join Record as R
on C.ID = R.CardID where SubString(R.CardID,6,1) = 'A'
and SubString(R.CardID,7,1) = 'B' group by C.UserName
查询出K字头的列车平均车速:
select avg(TSpeed) as K字头列车from TrainInfo where TNumber like 'K%'
查询始发站是长沙的车次、到站、始发时间、到站时间:
select A.SNumber,B.TDistance/10*B.TunitPrice as 价格fromTrainScheduler as A inner join TrainInfo as B on (A.SNumber = B.TNumber) and (A.SLieNumber>0) and (A.SDate = '2006-5-7') and (B.TFrom = '长沙') and (B.TDest = '北京')
2006-5-7发车的车次、车号、始发站、终点站、值班列车长:
select A.TNumber as 车次, A.TFrom as 起点站, A.TDest as 终点站,
B.SConductor as 值班列车长from TrainInfo as A inner join
TrainScheduler as B on B.SDate = '2006-5-7' and A.TNumber = B.Snumber五一放假期间(2006-5-1到2006-5-7)值班列车长各自加班的天数:
select Sconductor as 值班列车长, count(*) as 加班天数from TrainScheduler
where SDate between '2006-5-1' and '2006-5-7' group by SConductor
补充题:
1、如何过滤重复的数据行,例如查询参加过内部测试的学员的姓名
select distinct (B.SName) from Score as A inner join Students as B on
StudentID = SCode
2、请用一条SQL语句查询出每门课都大于80分的学生成绩。
select 学员姓名from 考试成绩表group by 学生姓名having Min(成绩)>80
3、表Students中有字段Address、Name和State,并且都是字符数据,其中,State列存储了从A~Z之间的单个字母表示状态信息。如何查询出State列中字符在A~P之间的所有数据行?
select * from Students where State in ('A'-'P')
【子查询经典】例子
找出某个表中的第11条至20条记录(包括第11条和第20条记录,表名:Record,字段名:Number)
select top 10 Number from Record
where Number Not In (select top 10 Number from Record)
use [pubs]
select top 10 au_id from titleauthor
where au_id Not In (select top 10 au_id from titleauthor)
【联合查询】例子
找出某个表中的同年同月同日生且姓名也相同的记录(表名:StudentInfo,字段名(身份证号):IDNo,姓名:StuName)
use [StuInfoManage]
select StuName from StudentsInfo group by StuName,substring(IDNo, 7,8) having count(IDNo) > 1
在学生表中有若干个学生的名字重复,查询重复名字的学员信息:
use [MySchool]
select * from Student where StudentName in (select StudentName from Student group by StudentName having count(StudentName)>1)