SQL Server基础知识汇总

第六章:用表组织数据


	参照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.文件组:主文件组和次文件组

第七章:用表组织数据

小结:

1.数据完整性体现方式:

A.实体完整性约束:每一行反映不同的实体,不能存在相同数据行。
	实现方式:索引、唯一约束、主键约束、标识列
B.域完整性约束:输入有效性。
	实现方式:索引、唯一约束、主键约束、标识列
		
C.引用完整性约束:保持表之间定义的主外键关系。
	实现方式:外键约束
	规则:
		(1)主表中先插入数据,再插入外键表中的数据,而且外键表中外键的数据必须来源于主表被引用的列
		(2)更改主表中被引用的数据,外键表中的数据也应当随之改变
		(3)不能直接删除主表中被外键表引用的数据。
		
D.自定义完整性约束:使用特定规则。
	实现方式:使用数据库的规则,存储过程等

2.主键:

	定义:唯一标识表中的每一行;不允许重复、不允许为空;一个表中只能有一个主键。
	方式:单列主键;符合主键。
	原则:最少性和稳定性

3.标识列:

定义:自增长。
要求:
	(1)只能是整数类型的数据
	(2)标识种子:起始值;标识增量:每一次增加值
	(3)每一次执行新增语句都会自动增加。
	(4)一张表中只允许有一个标识列。
	(5)修改和删除不会占用标识列增长。
	(6)标识列不允许赋值、也不可以设置默认值

4.检查约束:

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='女'

第八章:用SQL语句操作数据

1).新增语句:单条语句。

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.外键列需要满足外键要求。

2).新增语句:多条语句(INSERT SELECT方式)

小结:

1.语法:
	INSERT INTO <表名>(列名)
	SELECT <列名>
	FROM <源表名>

2.新表必须提前创建;字段类型需要与源表一致;
3.查询数据个数、顺序、数据类型等必须一致

INSERT INTO AddressList(姓名,地址,电子邮箱) SELECT SName,SAddress,SEmail FROM Students;

3).新增语句:多条语句(SELECT INTO方式)

小结:

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;

4).新增语句:多条语句(UNION关键字联合方式)

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

4).更新数据

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 

5).删除数据


1.语法:DELETE FROM 表名 [WHERE 更新条件]

DELETE FROM Students

--TRUNCATE删除数据特点

语法:TRUNCATE  TABLE  表名 
1.表结构、列、约束等不被改动
2.不能用于有外键约束引用的表(即主表);外键表可以直接使用
3.标识列重新开始编号
4.少用TRUNCATE TABLE,因为它删除的数据不能恢复

TRUNCATE TABLE Students

第九章:数据查询基础

1).查询语句:

语法:
	SELECT    <列名> 
	FROM      <表名> 
	[WHERE    <查询条件表达式>] 
	[ORDER BY <排序的列名>[ASCDESC]]
	
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;

2).字符串函数:

--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, '我的音乐我的世界');

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');

4).数学函数:

--获得随机数(参数表示种子,种子相同则返回的随机数结果相同)
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;

第十章:模糊查询和聚合函数

1).模糊查询:

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.包含6080
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 ('北京','广州','上海');

2).聚合函数:

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).分组查询:

1.语法:
	SELECTFROM[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;

2).连接查询:

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;

猜你喜欢

转载自blog.csdn.net/wuhandecsdn/article/details/85245956