--1.SQL由什么文件和什么文件组成?
/*
答:SQL由数据文件和日志文件组成
*/
--2.SQL的数据文件分哪两类?扩展名分别是什么?分别可以有多少个?
/*
答:SQL的数据文件分主数据文件和二级数据文件。
主数据文件有且只有一个,二级数据文件0-N个
扩展名:主数据文件:MDF
二级数据文件:NDF
*/
--3.SQL文件组和文件的关系?
/*
答:文件存放在文件组中,一个文件只能属于一个文件组;
一个文件组可以有多个文件。
*/
--4.用代码创建多个数据文件的数据库?
/*
答:
CREATE DATABASE DatabaseName
primary ON
(
name=逻辑名,
filename=物理名, --扩展名是mdf
size=初始大小,
maxsize=最大值,
filegrowth=增长
), --多个文件组之间用逗号分隔
filegroup 文件组名
(
name=逻辑名,
filename=物理名, --扩展名是ndf
size=初始大小,
maxsize=最大值,
filegrowth=增长
)
log ON
(
name=逻辑名,
filename=物理名, --扩展名是ldf
size=初始大小,
maxsize=最大值,
filegrowth=增长
)
*/
--5.用代码创建表?
CREATE TABLE TABLE_NAME --创建表的表名
(
[ID] int IDENTITY(1,1) PRIMARY KEY, --设置ID为自增长的主键
[NAME] varchar(20) NOT NULL , --设置名字不为空
[AGE] tinyint CHECK([AGE]<120) --设置年龄小于120
)
--6.用代码实现修改数据库,添加文件组?
ALTER DATABASE DATABASENAME --要修改的数据库名
ADD FILEGROUP FILEGROUPNAME --要添加的文件组名
--7.用代码实现修改文件,文件组?
/*
答:
--修改文件示例
ALTER DATABASE DATABASENAME
modify file
(
[name]='原逻辑名',
[NEWNAME] = '新逻辑名',
[FILENAME] = '新文件名',
[SIZE] = '文件大小',
[MAXSIZE] = '文件的最大值',
[FILEGROWTH] = '文件增长值或增长百分比'
)
*/
--修改文件组
ALTER DATABASE Demo_20091230NEW
MODIFY FILEGROUP filegroup2 name = Newfilegroup_name
-- 8.用代码修改表实现添加列、修改列、删除列?
-- 添加列示例代码
ALTER TABLE Student
ADD [S_Number] Varchar(20)
-- 删除列例代码
ALTER TABLE Student
DROP COLUMN [S_Number]
-- 修改列例代码
ALTER TABLE Student
ALTER COLUMN [S_Name] varchar(8)
--修改列名通过系统存储过程
SP_RENAME 'Student.S_Name' ,'S_NAME_NEW'
-- 9.用代码实现查看表、数据库的信息?
/*
答:查看表:sp_help 表名
查看数据库:sp_helpDB 数据库名
*/
--示例代码:
--查看表:
sp_help class
--查看表:
sp_helpdb Demo_20091230NEW
-- 10.重命名数据库和表的SQL语句?
--重命名表的SQL语句(调用存储过程)
SP_RENAME class,classNew --不添加引号
SP_RENAME 'class','classNew' --添加引号
--重命名表的SQL语句(ALTER DATABASE)
ALTER DATABASE Demo_20091230NEW
Modify name = Demo_20091230
--重命名数据库的SQL语句
SP_RENAMEDB Demo_20091230NEW,Demo_20091230 --不添加引号
SP_RENAMEDB 'Demo_20091230','Demo_20091230NEW' --添加引号
-- 11.什么是数据库的完整性?
/*答:确保数据库的一致性和精确性,
可以用约束和触发器来实现。
*/
-- 12.数据库完整性的分类?
/*答:实体完整性:规定表的每一行在表中是唯一的实体。(主键)
域完整性:是指表中列满足特定的数据类型和约束。
引用完整性:两个表的主键和外键的关键字一致。
自定义完整性:用户自己定义的数据类型的约束。
*/
-- 13.约束分为哪两个级别,它和完整性的关系?
/*
答:约束分表级别和列级别,可以相互转换,只是写法不同。
创建联合主键的时候一定要用表级约束
PRIMARY KEY约束 (实现实体完整性)
UNIQUE KEY约束 (实现域完整性)
NOT NULL约束 (实现域完整性)
CHECK约束 (实现域完整性)
FOREIGN KEY约束 (实现引用完整性)
自定义数据类型(实现自定义完整性)
其中PRIMARY KEY、UNIQUE KEY、FOREIGN KEY
可以新建表级别和列级别约束。
*/
-- 14.用代码创建NOT NULL 约束?
-- 15.用代码创建primary key 约束(两种方式)?
-- 16.用代码创建foreign key 约束(两种方式)?
-- 17.用代码创建unique key 约束(两种方式)?
-- 18.用代码创建check 约束(两种方式)?
-- 19.用代码实现修改、删除约束?
-- 20.用代码实现查看约束的信息?
-- 21.SQL有哪些数据类型?
-- 22.SQL语句分类(DDL、DQL、DML、DCL)?
-- 23.关键字identity是什么意思?
-- 24.uniqueidentifier是什么意思?如何生成?
-- 25.默认值创建?绑定默认值?取消绑定默认值?
-- 26.规则创建?绑定规则?取消绑定规则?
-- 27.如何创建自定义类型?
-- 28.Select查询执行顺序?
--29.数据库中的表关系有哪几种?分别是什么?
/*
答:分四种(一对一、一对多、多对一、多对多)
多对多:必须要分表,分解成两个多对一
举例:如学生和课程是多对多关系,新增一个学生选修课程表。
学生和学生选修课程表是一对多关系
课程和学生选修课程表是一对多关系
*/
--30.级联删除、更新的关键字是什么?并写出代码?
/*
答:级联删除关键字:ON DELETE CASCADE
级联更新关键字:ON UPDATE CASCADE
代码示例如下:
*/
--修改表添加级联删除、级联更新外键约束
ALTER TABLE StudentClass
ADD CONSTRAINT jlDelete FOREIGN KEY (Fk_S_ID)
REFERENCES Student(S_ID)
ON DELETE CASCADE
ON UPDATE CASCADE
--31.表的连接有哪几种?它们的含义分别是什么?
/*
答:共五种。
INNER JOIN :内连接(以两个表中匹配的记录为准)
LEFT JOIN/LEFT OUTER JOIN: (以左边的表中有的记录为准)
RIGHT JOIN/RIGHT OUTER JOIN: (以右边的表中有的记录为准)
FULL JOIN/FULL OUTER JOIN: (以两边的表只要有一个表有的记录即可)
CROSS JOIN:(两个表的记录的笛卡尔积)
*/
--32.消除重复行的关键字是什么?
/*
答:DISTINCT(放在SELECT关键字后面)
*/
--33.分组时既能显示明细记录又能显示汇总值的关键字是什么?
--请写一个示例代码?
/*
答:关键字:COMPUTE\COMPUTE BY
*/
SELECT S_GROUP,S_AGE AS '平均年龄'
FROM Student
WHERE S_GROUP = '二组'
ORDER BY S_GROUP
COMPUTE AVG(S_AGE) BY S_GROUP
--34.SQL中的通配符有几种?每种的含义是什么?
/*
答:
'_' 表示一个任意字符;
'%' 表示0-N个任意字符;
'[ABC]'表示A或B或C中的一个任意字符,常与'%'连用;
'[^ABC]'表示不是A且B且C中的一个任意字符,常与'%'连用;
*/
--35.Rollup和CUBE的相同点和异同点是什么?
/*
答:都是对分组(GROUP)中的汇总结果集的扩展。
CUBE的扩展要比Rollup多。
*/
--只根据'组'分组
SELECT S_Group,AVG(S_age) FROM Student
GROUP BY S_Group
SELECT S_Group,AVG(S_age) FROM Student
GROUP BY S_Group WITH ROLLUP
SELECT S_Group,AVG(S_age) FROM Student
GROUP BY S_Group WITH CUBE
--根据'组'和'姓名'分组
SELECT S_Group,S_Name,AVG(S_age) FROM Student
GROUP BY S_Group,S_Name
SELECT S_Group,S_Name, AVG(S_age) FROM Student
GROUP BY S_Group,S_Name WITH ROLLUP
SELECT S_Group,S_Name,AVG(S_age) FROM Student
GROUP BY S_Group,S_Name WITH CUBE
--36.子查询的种类?它们的区别是什么?
/*
答:子查询分标准子查询(嵌套子查询)和相关子查询
区别:标准子查询(嵌套子查询)子查询只执行一次;
相关子查询:子查询执行0-N次;
*/
--示例:
--查找年龄在23岁以内的学生的信息(用子查询的方式)
--标准子查询
SELECT * FROM student
WHERE S_NAME IN
(SELECT S_NAME FROM student
WHERE student.S_age <23)
--查找学生信息并统计班级每个学生与班级平均年龄的差值
--相关子查询
SELECT *,
(SELECT AVG(S_age) FROM student) AS '班级平均年龄',
S_age - (SELECT AVG(S_age) FROM student) AS '差值'
FROM student
--37.子查询的意义和写子查询的注意事项?
/*
答:子查询的意义:简化复杂的查询,
将一个复杂的查询逻辑上分解成几个简单的查询。
子查询的注意事项:
1.带有小括号
2.可以在很多地方使用
a)使用别名时;
b)使用IN或NOT IN时;
c)使用UPDATE、INSERT、DELETE语句时;
e)使用比较运算符时;
f)使用ANY、SOME、ALL时;
g)使用EXIST或NOT EXIST时;
h)使用表达式的地方。
*/
--38.关键字SOME、ALL的含义?请写出代码示例?
/*
答:SOME、ALL都是和比较运算符(>、>=、<、<=、!=、<>、=)联用,
用于比较SOME、ALL字查询所返回的值。
*/
--示例:查找年长(年龄在平均年龄之上)的学生的信息
SELECT *
FROM u_student
WHERE [AGE] > ALL(SELECT AVG(ISNULL([AGE],0)) FROM u_student)
--39.关键字IN的含义?请写出代码示例?
/*
答:关键字IN表示在...里
*/
--示例:查找姓名等于张三或李四的学生的记录
SELECT *
FROM u_student
WHERE [NAME] in ('张三','李四')
--40.视图分为哪三类?请写出代码示例?
/*
答:单表视图:数据只来源于一个表。
多表视图:数据只来源于多个表。
嵌套视图:数据只来源于视图。
*/
--示例:嵌套视图
--创建学生信息视图(单表视图)
CREATE VIEW V_StudentInfo
AS
SELECT * FROM u_student us
--创建学生姓名信息视图(嵌套视图)
CREATE VIEW V_StudentNameInfo
AS
SELECT [NAME] FROM V_StudentInfo
--41.视图的优缺点是什么?
/*
答:视图优点:
1.简化查询操作
2.隐蔽敏感数据,提高安全性
3.定制数据
4.数据的查询和存储分离
视图缺点:
1.性能较低
2.更新不变:SELECT语句中使用了HAVING、GROUP BY、TOP、DISTINCT、
计算列、聚合函数关键字后就不能更新
*/
--42.索引的作用是什么?索引分为哪两类?它们的区别是什么?请写出代码示例?
/*
答:索引的作用是用来优化查询,提高查询速度的。
索引分为聚集索引(簇索引)或非聚集索引(非簇索引)
区别:1.聚集索引的页级页存放的是实际的数据而
非聚集索引得页级页存放的是索引信息,这些索引信息存放在索引页中。
2.非聚集索引可以建立在数据堆上也可以建立在聚集索引上。
3.唯一索引属于非聚集索引,但比非聚集索引多了一个UNIQUE(唯一)约束。
创建索引的关键字CREATE INDEX
*/
--示例:在u_STUDENT表的[NAME]列上创建聚集索引
CREATE CLUSTERED INDEX CLU_INDEX
ON u_STUDENT([NAME])
--示例:在u_STUDENT表的[NAME]列上创建非聚集索引
CREATE NONCLUSTERED INDEX CLU_INDEX
ON u_STUDENT([NAME])
--示例:在u_STUDENT表的[NAME]列上创建唯一聚集索引
CREATE UNIQUE INDEX CLU_INDEX
ON u_STUDENT([NAME])
--43.查看表的索引的SQL语句是什么?请写出代码示例?
/*
答:查看表的索引的SQL语句是 SP_HELPINDEX 表名
*/
--代码示例
SP_HELPINDEX Class
--44.重新整理索引的SQL语句是什么?请写出代码示例?
/*
答:重新整理索引的SQL语句是DBCC INDEXDEFRAG(数据库名称,表名,索引名)
DBCC 是一个数据库工具集
*/
--代码示例
DBCC INDEXDEFRAG(Demo_20091230NEW,Class,PK__Class__49C3F6B7)
--45.SQL的盘区分为哪两种,它们的区别是什么?
/*
答:SQL的盘区分:统一扩展盘区和混合扩展盘区。
统一扩展盘区:只存放一种类型数据页。
混合扩展盘区:存放二种或两种以上的数据页。
--46.SQL的数据页一共有几种?分别是什么?
/*
答:SQL的数据页一共有八种。数据页、索引页、文本\图像页、可用空间页、
全局分配映射表、辅助全局分配映射表、索引分配映射表、
大容量差异映射表\大容量差异更改映射表。
数据页:存放真实的数据。
索引页:存放索引数据,如非聚集索引的页级页。
文本\图像页:存放大容量数据类型,如Image、text、ntext。
可用空间页:数据库中数据页的使用情况,0表示没有使用,1表示使用。
*/
--47.E-R(Entity-Relationship)模型的三要素是什么?
/*
答:E-R(Entity-Relationship)模型的三要素是:实体、关系、属性。
实体:真实存在的事物。(客户为了完成自己的业务目标需要用到的人或事物)
关系:实体间的关系:有一对一、一对多、多对一、多对多(需要分表)
属性:实体的特征,可映射成数据库中的列。
--48.数据库设计的过程分为哪几个步骤?
/*
答:数据库的设计过程大致可分为4个步骤:
a)需求分析:调查和分析用户的业务活动和数据的使用情况,
弄清所用数据的种类、范围、数量以及它们在业务活动中交流的情况,
确定用户对数据库系统的使用要求和各种约束条件;
b)概念设计:用户要描述的现实世界的概念数据模型;
c)逻辑设计:主要工作是将现实世界的概念数据模型设计成数据库;
d)物理设计:确定数据库的存储结构。
*/
--49.关键字UNION /UNION ALL的含义?请写出代码示例?
/*
答:关键字UNION /UNION ALL表示连接两个表的内容进行查询。
*/
--示例代码:连接查询出‘语文’、‘数学’的课程信息
SELECT * FROM Class
WHERE Class_Name = '语文'
UNION ALL
SELECT * FROM Class
WHERE Class_Name = '数学'
--50.关键字EXISTS的含义?请写出代码示例?
/*
答:关键字EXISTS用来表示子查询中是否存在满足条件的记录。
如果存在返回TRUE,否则返回FALSE。
*/
--示例代码:查找‘数学’课的课程信息
SELECT * FROM Class a
WHERE EXISTS (SELECT * FROM Class b
WHERE b.Class_Name = '数学' AND a.ID = b.ID)
--示例代码:判断CLASS表是否在,存在则删除
IF EXISTS(SELECT name
FROM sysobjects
WHERE name = 'Class'
AND type = 'U')
DROP TABLE Class
GO
--51.数据库三范式是哪三范式?
/*
答:1NF:属性不可再分。
2NF:在1NF的基础上消除部分依赖(适用于联合主键)。
3NF:在2NF的基础上消除传递依赖。
*/
--52.用PowerDesigner生成数据库的步骤?
/*
答:1.创建概念数据模型:
定义:只有关系,没有外键的模型,是在数据库设计的前期创建的。
PowerDesigner操作步骤:File-》New -》Conceptual Data Model
2.检查概念数据模型:Check Model
PowerDesigner操作步骤:Tools-》Check Model
3.生成物理数据模型:由概念数据模型转换而来,是真实的数据模型。
PowerDesigner操作步骤:Tools-》Generate Physical Data Model
4.用企业管理器创建新的空数据库
5.创建SQL连接:
PowerDesigner操作步骤:DataBase-》Connection
6.生成SQL数据库:
PowerDesigner操作步骤:DataBase-》Generate DataBase
*/
--53.全局变量和局部变量的区别是什么?
/*
答:全局变量是系统预先定义的。
局部变量是用户自定义的。
*/
--54.定义局部变量的关键字是什么?请写出示例代码?
/*
答:定义局部变量的关键字DECLARE
*/
--示例代码:定义一个整型的局部变量。
DECLARE @Temp AS int
--55.给变量赋值有哪些方法?请写出示例代码?
/*
答:给变量赋值有2种,分别用SET关键字和SELECT关键字。
*/
--示例代码:用SET关键字给变量赋值
SET @Temp = 15
--示例代码:用SELECT关键字给变量赋值(查询赋值)
SELECT @Temp = AGE FROM Student
WHERE S_Name = '张三'
--56.数据类型转换的函数有哪些?请写出示例代码?
/*
答:CAST(字段 AS 数据类型) 和 CONVERT(数据类型,字段)
*/
--示例代码: 使用CAST将12转换成'12'再与‘张三’相加
SELECT '张三'+CAST(12 AS varchar(2)) AS 数据类型转换
--示例代码: 使用CONVERT将12转换成'12'再与‘张三’相加
SELECT '张三'+CONVERT(varchar(2),12) AS 数据类型转换
--57.全局变量@@RowCount、@@IDENTITY、@@Error的定义是什么?请写出示例代码?
/*
答:@@RowCount定义:返回受上一语句影响的行数。
@@IDENTITY定义:返回最后插入的自增长值(一定要包含自增长列)
@@ERROR定义:返回最后执行的 Transact-SQL 语句的错误代码。
*/
--示例代码:@@RowCount
SELECT * FROM StudentClass sc --查询StudentClass表
SELECT @@RowCount AS 上一行语句影响的条数 --显示StudentClass表的记录数
--示例代码:@@IDENTITY
--先决条件:操作的表中一定要含有自增长列,
--否则@@IDENTITY全局变量一直显示为NULL
INSERT INTO StudentClass --往StudentClass中插入记录
VALUES (1357,1)
SELECT @@IDENTITY AS 最后的自增长ID号
--示例代码:@@ERROR
priny 1 --编写一行错误的SQL语句
SELECT @@ERROR AS 最后一行SQL语句的错误编号 --查询最后一行SQL语句的错误编号
--58.SQL中表示循环的关键字有哪些?请写出示例代码?
/*
答:SQL中表示循环的关键字有:WHILE关键字
*/
--示例代码:
DECLARE @COUNT AS int --定义一个计数器
SET @COUNT = 1 --初始化计数器
WHILE @COUNT < 4 --循环打印循环变量
BEGIN
PRINT @COUNT
SET @COUNT = @COUNT + 1
END
--59.关键字break与关键字Continue的区别是什么?请写出示例代码?
/*
答:关键字break:结束全部循环
关键字Continue:跳过本次循环,进入下一次循环
*/
--示例代码:
DECLARE @COUNT AS int --定义一个计数器
SET @COUNT = 1 --初始化计数器
WHILE @COUNT < 4 --循环打印循环变量
BEGIN
IF @COUNT % 2 = 0 --跳过偶数循环
BEGIN
SET @COUNT = @COUNT + 1 --退出之前要加1
CONTINUE --跳过本次循环,进入下一次循环
END
PRINT @COUNT
SET @COUNT = @COUNT + 1
END
--示例代码:
DECLARE @COUNT AS int --定义一个计数器
SET @COUNT = 1 --初始化计数器
WHILE @COUNT < 4 --循环打印循环变量
BEGIN
PRINT @COUNT
SET @COUNT = @COUNT + 1
IF @COUNT > 2 --当计数器大于2的时候结束循环
BEGIN
BREAK --退出循环
END
END
--60.函数按照返回值分为几类?如何调用?请写出示例代码?
/*
答:函数按照返回值分为三类:
a)标量函数:返回的是SQL数据类型不包括大容量数据类型(Image、text、ntext)。
b)内联表值函数:返回的是SQL的数据表,类似于SQL参数化视图。
c)多声明表值函数:返回的是预先定义好的SQL的数据表。
*/
--创建标量函数:
--判断函数是否存在,存在则删除
IF EXISTS(SELECT *
FROM sysobjects
WHERE name = 'Fn_BL_GetStudentNameByStudentID')
DROP FUNCTION Fn_BL_GetStudentNameByStudentID
GO
CREATE FUNCTION Fn_BL_GetStudentNameByStudentID(@StudentID int)
RETURNS VARCHAR(20) --函数返回值是SQL数据类型
AS --函数开始的标志
BEGIN --函数体
DECLARE @NAME AS varchar(20) --定义一个变量
SELECT @NAME = [S_NAME] FROM Student s --给变量赋值
WHERE s.S_ID = @StudentID
RETURN @NAME --返回姓名
END
--调用标量函数:
SELECT dbo.Fn_BL_GetStudentNameByStudentID(1357) AS 学生姓名
--创建内联表值函数:
--判断函数是否存在,存在则删除
IF EXISTS(SELECT *
FROM sysobjects
WHERE name = 'Fn_NL_GetStudentIntoByStudentID')
DROP FUNCTION Fn_NL_GetStudentIntoByStudentID
GO
CREATE FUNCTION Fn_NL_GetStudentIntoByStudentID(@StudentID int)
RETURNS TABLE
AS
RETURN SELECT * FROM Student s
WHERE s.S_ID = @StudentID
--调用内联表值函数:
SELECT * FROM dbo.Fn_NL_GetStudentIntoByStudentID(1357)
--创建多声明表值函数:
--判断函数是否存在,存在则删除
IF EXISTS(SELECT *
FROM sysobjects
WHERE name = 'Fn_DSM_GetStudentIntoByStudentID')
DROP FUNCTION Fn_DSM_GetStudentIntoByStudentID
GO
CREATE FUNCTION Fn_DSM_GetStudentIntoByStudentID(@StudentID int)
RETURNS @TempTable TABLE([Name] varchar(20),
[GROUP] varchar(20))
AS
BEGIN
INSERT @TempTable
SELECT [S_NAME],[S_GROUP] FROM Student s
WHERE s.S_ID = @StudentID
RETURN
END
--调用多声明表值函数:
SELECT * FROM dbo.Fn_DSM_GetStudentIntoByStudentID(1357)
--61.标量函数、内联表值函数、多声明表值函数创建语法的区别和相同点?
/*
答:相同点:
1.都要使用CREATE FUNCTION关键字
2.返回关键字都是RETURNS关键字
3.都要使用AS关键字作为函数体开始的标识
不同点:
1.返回值类型不同。
2.调用方式不同。
*/
--62.查看函数内容的脚本关键字是什么?
/*
答:SP_HELPTEXT 函数名
*/
--代码示例:
SP_HELPTEXT Fn_DSM_GetStudentIntoByStudentID
-- 63.创建存储过程的关键字是什么?请写出示例代码?
--
-- 64.存储过程和函数的区别是什么?
--
-- 65.什么是存储过程?存储过程的优点是什么?
--
-- 66.存储过程分为几类?
--
-- 67.存储过程加密和重新编译的关键字是什么?
--
-- 68.查看存储过程、重命名存储过程的脚本是什么?
--
-- 69.什么是触发器?触发器的分类是什么?写出示例代码?
--
-- 70.创建触发器的关键字是什么?写出示例代码?
--
-- 71.删除触发器的语句是什么?写出示例代码?
--
-- 72.修改触发器的语句是什么?写出示例代码?
--
-- 73.查看触发器的语句是什么?写出示例代码?
--