参照SQL Server 2008 R2图形化操作界面总结.docx
1.数据完整性:正确反映实际情况;存在一定的数据冗余(数据重复)
2.系统数据库:
A.Master数据库:系统级别的信息:
(1)登录账户和系统配置信息
(2)所有其他数据库及数据库文件的位置
(3)初始化信息
B.Temp数据库:临时数据库,存放临时表、临时存储过程、临时工作表
(1)每次启动的时候都要重新创建
C.Model:系统上创建的数据库模板
D.Ms数据库:代理程序、作业及记录、备份和还原记录。
3.sa登录名:
A.不能把sa的密码设置为空
4.数据库文件:
A.一个数据库至少包含一个数据库文件和一个事务日志文件
B.数据库文件:存放数据和数据库对象的文件,一个数据库可以有一个或多个数据库文件;
C.一个数据库文件只属于一个数据库
D.数据库文件可以包含:主数据文件(.mdf)、次数据库文件(.ndf)、事务日志文件(.ldf);
E.文件组:主文件组和次文件组
A.实体完整性约束:每一行反映不同的实体,不能存在相同数据行。
实现方式:索引、唯一约束、主键约束、标识列
B.域完整性约束:输入有效性。
实现方式:索引、唯一约束、主键约束、标识列
C.引用完整性约束:保持表之间定义的主外键关系。
实现方式:外键约束
规则:
(1)主表中先插入数据,再插入外键表中的数据,而且外键表中外键的数据必须来源于主表被引用的列
(2)更改主表中被引用的数据,外键表中的数据也应当随之改变
(3)不能直接删除主表中被外键表引用的数据。
D.自定义完整性约束:使用特定规则。
实现方式:使用数据库的规则,存储过程等
定义:唯一标识表中的每一行;不允许重复、不允许为空;一个表中只能有一个主键。
方式:单列主键;符合主键。
原则:最少性和稳定性
定义:自增长。
要求:
(1)只能是整数类型的数据
(2)标识种子:起始值;标识增量:每一次增加值
(3)每一次执行新增语句都会自动增加。
(4)一张表中只允许有一个标识列。
(5)修改和删除不会占用标识列增长。
(6)标识列不允许赋值、也不可以设置默认值
(1)性别只能是男或女:Sex='男' OR Sex='女'
(2)年龄大于0并且小于100:Age>=0 AND Age<=100 BETWEEN 0 AND 100
(3)密码长度至少6位:Len(password)>=6;
(4)姓张的学员:Sname LIKE '张%'
(5)性别只能是男或女:Sex='男' OR Sex='女'
1.给指定列添加数据
INSERT INTO Students (SName,SAddress,SGrade,SEmail,SSEX) VALUES ('张青裁','上海松江',6,'[email protected]',0);
**2.给指定列添加数据**
INSERT INTO Students (SName,SAddress,SGrade,SSex) VALUES('李四','shenzhen2',5,0);
**3.给指定列添加数据(省略字段)**
INSERT INTO Students VALUES('王五','shenzhen4',5);
**4.给指定列添加数据(省略字段)**
INSERT INTO Students VALUES('赵六','shenzhen',5,'[email protected]',1);
**5.给指定列添加数据(省略字段、默认值)**
INSERT INTO Students VALUES('jim',DEFAULT,5,'[email protected]',1);
小结:
1.语法:INSERT [INTO] 表名 [([列名)] VALUES(值列表);
2.[]代表的部分可以省略,标识列不允许赋值;除标识列以外如果其他字段都需要赋值,则可以省略
3.列名需要与值列表匹配(数目一致,类型对应,顺序对应)
4.对于字符、日期类型数据,使用''
5.建议列名不要省略;关键字大写。
6.值列表需要满足检查约束要求
7.外键列需要满足外键要求。
小结:
1.语法:
INSERT INTO <表名>(列名)
SELECT <列名>
FROM <源表名>
2.新表必须提前创建;字段类型需要与源表一致;
3.查询数据个数、顺序、数据类型等必须一致
INSERT INTO AddressList(姓名,地址,电子邮箱) SELECT SName,SAddress,SEmail FROM Students;
1.语法:SELECT 源列 INTO 新表 FROM 源表
2.新表不能提前创建,在执行的过程中创建新表
3.SQL语句只能执行一次
*/
SELECT SName,SAddress,SEmail INTO AddressList2 FROM Students;
--创建表的同时创建标识列
SELECT SName,SAddress,SEmail,IDENTITY(INT ,1,1) INTO AddressList2 FROM Students;
INSERT Students (SName,SGrade,SSex)
SELECT '张可',7,1 UNION
SELECT '李扬',4,0 UNION
SELECT '杨晓',2,0 UNION
SELECT '汤美',3,0 UNION
SELECT '苏三东',7,1 UNION
SELECT '王立岩',3,1 UNION
SELECT '张伟',7,1 UNION
SELECT '陈刚',4,1 UNION
SELECT '王娟娟',7,0
1.语法:UPDATE 表名 SET 列名 = 更新值 [WHERE 更新条件]
2.更新多列数据使用逗号隔开
--修改单列数据
UPDATE Scores
SET Scores = Scores + 5
WHERE Scores <= 95;
--修改多列数据
UPDATE Scores
SET Scores = Scores + 5,ClassHour=68
WHERE Scores <= 95
--多条件的联合使用AND
UPDATE Scores SET Scores = Scores + 5 WHERE ExamDate='2013-9-13' AND SubjectId=1 AND StudentResult<60
1.语法:DELETE FROM 表名 [WHERE 更新条件]
DELETE FROM Students
--TRUNCATE删除数据特点
语法:TRUNCATE TABLE 表名
1.表结构、列、约束等不被改动
2.不能用于有外键约束引用的表(即主表);外键表可以直接使用
3.标识列重新开始编号
4.少用TRUNCATE TABLE,因为它删除的数据不能恢复
TRUNCATE TABLE Students
语法:
SELECT <列名>
FROM <表名>
[WHERE <查询条件表达式>]
[ORDER BY <排序的列名>[ASC或DESC]]
1.查询的结果是虚拟表(从真实数据表中得到的临时数据)
SELECT * FROM Students;
--查询完整写法
SELECT SCode,SName,SAddress FROM Students WHERE SSEX = 0 ORDER BY SCode;
--给查询出来的列起别名(AS方式)
SELECT SCode AS 学生编号,SName AS 学生姓名,SAddress AS 学生地址 FROM Students;
--给查询出来的列起别名(姓名 =方式)
SELECT 姓名 = FirstName+'.'+LastName FROM Employees;
--查询空值
SELECT SName FROM Students WHERE SEmail IS NULL;
SELECT SName FROM Students WHERE SEmail='';
SELECT SName FROM Students WHERE SEmail IS NULL OR SEmail='';
--使用常量
SELECT 姓名=SName,地址= SAddress , '北京新兴桥' AS 学校名称 FROM Students;
--限定返回行数
SELECT TOP 5 SName, SAddress FROM Students WHERE SSex = 0;
--限定返回行数(百分比形式):得到的结果可以反推出总数(只是大约)
SELECT TOP 20 PERCENT SName, SAddress FROM Students WHERE SSex = 0;
--单列排序
SELECT StudentID,Score FROM Score ORDER BY Score;
--多列排序
SELECT StudentID AS 学生编号, CourseID AS 课程ID, Score AS 成绩 FROM Score WHERE Score > 60 ORDER BY CourseID, Score;
--CHARINDEX:查找字符串在源字符串中出现的位置,从1开始;最后一个参数可选
SELECT CHARINDEX('MY','My Jbns Course',1 );
--字符串长度函数:相当于String.length();
SELECT LEN('SQL Server课程');
--转换为大写
SELECT UPPER('sql server课程');
--左边去除空格
SELECT LTRIM (' 周智宇 ');
--右边去除空格
SELECT RTRIM (' 周智宇 ');
--从右往左取出指定长度的字符串
SELECT RIGHT('买卖提.吐尔松',3);
--从左往右取出指定长度的字符串
SELECT LEFT('买卖提.吐尔松',3);
--替换指定文本为新的内容
SELECT REPLACE('莫乐可切.杨可','可','兰');
--从指定位置删除一定长度的字符串,添加新的字符串到该位置
SELECT STUFF('ABCDEFG', 2, 3, '我的音乐我的世界');
--获得当前日期
SELECT GETDATE();
--添加日期中指定的部分(可以是负数)
SELECT DATEADD(MM,4,'01/01/2009');
--获得指定日期部分的相隔差
SELECT DATEDIFF(DD, '01/01/2009', '05/01/2009');
--获得指定日期部分的字符串
SELECT DATENAME(DW, '01/01/2000');
--获得指定日期部分的整数(注意是西方的日期习惯:如星期天是1)
SELECT DATEPART(day, '01/15/2000');
--获得随机数(参数表示种子,种子相同则返回的随机数结果相同)
SELECT RAND();
SELECT RAND(20);
SELECT RAND(20);
SELECT RAND(200);
--返回绝对值
SELECT ABS(-43);
--向上取整
SELECT CEILING(43.4);
SELECT CEILING(43.5);
SELECT CEILING(43.6);
--向下取整
SELECT FLOOR(43.4);
SELECT FLOOR(43.5);
SELECT FLOOR(43.6);
--求幂
SELECT POWER(5,2);
--四舍五入
SELECT ROUND(43.543,1)
--区分正、负、0
SELECT SIGN(-43);
--求平方根
SELECT SQRT(9);
--4).系统函数:
--转换数据类型
SELECT CONVERT (VARCHAR (5),12345);
--获得字符串的字节长度
SELECT DATALENGTH ('中国A联盟');
--获得所属用户名dbo
SELECT CURRENT_USER;
--获得当前连接登录名(如:sa);
SELECT SYSTEM_USER;
A.通配符
1._:匹配一个字符
2.%:匹配任意长度字符串
3.[]:匹配括号中指定范围内的一个字符
4.[^]:与[]相反,排除[]中的字符
LIKE关键字
SELECT * FROM Students WHERE 姓名 like '张%';
IS NULL
SELECT SName As 姓名, SAddress AS 地址 FROM Students WHERE SAddress IS NULL;
--''空内容
SELECT SName As 姓名, SAddress AS 地址 FROM Students WHERE SAddress = '';
BETWEEN
1.包含60和80
2.等价于Score>=60 AND Score<=80
3.必须小的数字在前,不可以颠倒(如Score BETWEEN 80 AND 60);
SELECT StudentID, Score FROM SCore WHERE Score BETWEEN 60 AND 80;
IN关键字
1.查询某一列中内容与所列出的内容列表匹配的记录
2.等价于SAddress='北京' OR SAddress='广州' OR SAddress='上海'
SELECT SName AS 学生姓名,SAddress AS 地址 FROM Students WHERE SAddress IN ('北京','广州','上海');
1.聚合函数不能出现在WHERE 字句中
2.只返回一个数值,不能与可能返回多行的列一起使用。
SUM():求和
1.忽略空值
2.只能处理数字类型
SELECT SUM(Score) AS 学号为23的学生总分 FROM Score WHERE StudentID = 23;
AVG():求平均值
1.忽略空值
2.只能处理数字类型
SELECT AVG(SCore) AS 及格平均成绩 FROM Score WHERE Score >= 60;
MAX():求最大值
1.返回最大值,忽略空值
2.可以处理数字类型、字符类型、日期/时间类型的数据
SELECT AVG(SCore) AS 平均成绩, MAX (Score) AS 最高分, MIN (Score) AS 最低分 FROM Score WHERE Score >= 60;
MIN():求最小值
1.返回最小值,忽略空值
2.可以处理数字类型、字符类型、日期/时间类型的数据
SELECT AVG(SCore) AS 平均成绩, MAX (Score) AS 最高分, MIN (Score) AS 最低分 FROM Score WHERE Score >= 60;
COUNT():计数
1.返回总数
2.除去text、image、ntext以外的数据类型
3.COUNT(*)包含空值的行;COUNT(列)不包含
SELECT COUNT (*) AS 及格人数 FROM Score WHERE Score >= 60;
SELECT COUNT (Score) AS 及格人数 FROM Score WHERE Score >= 60;
1.语法:
SELECT 列 FROM 表 [WHERE 条件]
GROUP BY 分组列1[,分组列2,....]
[HAVING 筛选条件]
[ORDER BY 排序列1[,排序列2,....]]
2.列:被分组的列;为每个分组返回一个值的表达式,如聚合函数
3.分组的列可以有多个,使用,隔开
4.WHERE 字句表示分组前的数据筛选
5.HAVING字句:分组后的筛选;可以出现聚合函数
SELECT CourseID, AVG(Score) AS 课程平均成绩 FROM Score GROUP BY CourseID;
SELECT CourseID, AVG(Score) AS 课程平均成绩 FROM Score GROUP BY CourseID ORDER BY AVG(Score);
SELECT COUNT(*) AS 人数,SGrade AS 年级,SSex AS 性别 FROM StudentS GROUP BY SGrade,SSex ORDER BY SGrade;
SELECT COUNT(*) AS 人数,SGrade AS 年级 FROM Students GROUP BY SGrade HAVING COUNT(*)>15;
1.内连接 INNER JOIN ON
2.外连接
左外连接:LEFT [OUTER] JOIN ON
右外连接:RIGHT [OUTER] JOIN ON
内连接:
两表连接
SELECT S.SName,C.CourseID,C.Score FROM Students AS S INNER JOIN Score AS C ON C.StudentID = S.SCode;
SELECT Students.SName, Score.CourseID, Score.Score FROM Students,Score WHERE Students.SCode = Score.StudentID;
两表连接加WHERE条件
SELECT G.GradeName,J.SubjectName FROM Subject AS J INNER JOIN Grade AS G ON J.GradeId=G.GradeId WHERE G.GradeId=1;
SELECT Students.SName, Score.CourseID, Score.Score FROM Students,Score WHERE Students.SCode = Score.StudentID WHERE Score.StudentID =1;
三表连接:表没有顺序要求
SELECT S.SName AS 姓名, CS.CourseName AS 课程, C.Score AS 成绩 FROM Students AS S
INNER JOIN Score AS C ON (S.SCode = C.StudentID)
INNER JOIN Course AS CS ON (CS.CourseID = C.CourseID);
左外连接:
1、匹配,返回到结果集
2、无匹配,NULL值返回到结果集
3.LEFT左边的表是主要的表,要求它的主键列中的编号都要在结果中有所体现
4.两个表出现的顺序不同,代表的结果和意义不同
--Students主表作为主要的表:有可能会出现主键编号对应其它数据为NULL
SELECT S.SName,C.CourseID,C.Score FROM Students AS S LEFT JOIN Score AS C ON C.StudentID = S.SCode;
--Score外键表作为主要的表,不可能出现对应不到的主键编号
SELECT S.SName,C.CourseID,C.Score FROM Score AS C LEFT JOIN Students AS S ON C.StudentID = S.SCode;
右外连接:
1、匹配,返回到结果集
2、无匹配,NULL值返回到结果集
3.RIGHT右边的表是主要的表,要求对应列的编号都要在结果中有所体现
4.两个表出现的顺序不同,代表的结果和意义不同
--Score外键表作为主要的表,不可能出现对应不到的主键编号
SELECT S.SName,C.CourseID,C.Score FROM Students AS S RIGHT JOIN Score AS C ON C.StudentID = S.SCode;
--Students主表作为主要的表:有可能会出现主键编号对应其它数据为NULL
SELECT S.SName,C.CourseID,C.Score FROM Score AS C RIGHT JOIN Students AS S ON C.StudentID = S.SCode;
以下情况可以等价转换的原因解释:
1.在引用关系中:Students是主表;Score为外键表;
2.根据引用关系原理:Score中的外键列中的数据必然可以在Students中找到
3.左外连接LEFT左边的是外键表
4.右外连接RIGHT右边的表是外键表
5.根据匹配条件既然外键表Score都是主要的表;必然可以在Student中找到对应的数据,所以结果相同。
SELECT S.SName,C.CourseID,C.Score FROM Students AS S INNER JOIN Score AS C ON C.StudentID = S.SCode;
SELECT S.SName,C.CourseID,C.Score FROM Score AS C LEFT JOIN Students AS S ON C.StudentID = S.SCode;
SELECT S.SName,C.CourseID,C.Score FROM Students AS S RIGHT JOIN Score AS C ON C.StudentID = S.SCode;