SQL Server总结 | |||||||||
SQL Server | |||||||||
基本概念 | 数据库登录名 | SQL Server安装以后,有一个超级管理员"sa"(super Administrator的简称),一般不要使用这个用户管理数据,也不能把这个用户的密码设置为空,随便把该用户操作、密码设置为空都将给数据库带来很大的安全隐患,所以一般在安装完毕并创建了其他登录名后,将sa账户进行禁用或删除。 | |||||||
系统数据库 | master、 model、 tempdb、 msdb | ||||||||
文件组成及类型 | 数据库由至少1个数据文件(.mdf/.ndf)和至少1个日志文件(.ldf)组成 | ||||||||
服务器角色 | 1、sysadmin:执行sql server中的任何动作 2、serveradmin:配置服务器设置 3、setupadmin:安装复制和管理拓展过程 4、securityadmin:管理登陆和create database的权限以及阅读审计 5、processadmin:管理sql server进程 6、dbcreator:创建和修改数据库 7、diskadmin:管理磁盘文件 | ||||||||
数据库角色 | 1、db_owner:可以执行数据库中技术所有动作的用户 2、db_accessadmin:可以添加、删除用户的用户 3、db_datareader:可以查看所有数据库中用户表内数据的用户 4、db_datawriter:可以添加、修改或删除所有数据库中用户表内的数据的用户 5、db_ddlaadmin:可以在数据库中执行所有DDL操作的用户 6、db_securityadmin:可以管理数据库中与安全权限有关的 7、db_backoperator:可以备份数据库的用户(并可以发布DBCC和CHECKPOINT语句,这两个语句一般在备份前都会被执行) 8、db_denydatareader:不能看到数据库中任务数据的用户 9、db_denydatawriter:不能修改数据库中任何数据的用户 | ||||||||
数据完整性 | 实体完整性约束 | 实体完整性要求表中的每一行数据都反映不同的实体,不能存在相同的数据行。通过索引、唯一约束、主键约束或标识列属性,可以实现表的实体完整性。 | |||||||
域完整性约束 | 域完整性指的是给定列输入的有效性。通过限制数据类型、检查约束、输入格式、外键约束、默认值、非空约束等多种方法,可以实现表的域完整性。 | ||||||||
引用完整性约束 | 在输入或删除数据行时,引用完整性约束用来保持表之间已定义的关系。子表不能添加主表中设置了外键约束的列没有关联的内容。主表不能修改设置了外键约束的列,当子表有与之匹配的相关信息时。主表不能删除设置了外键约束的列,当子表有与之匹配的相关信息时。引用完整性通过主键和外键之间的引用关系来实现。 | ||||||||
自定义完整性约束 | 用户自定义完整性用来定义特定的规则,通过数据库的规则,存储过程等方法来进行约束。 | ||||||||
主键和外键 | 主键 | 当某些信息不允许重复时,这就需要有一个列,这个列的值用来唯一标识表中每一行,用于强制表的实体完整性,这样的列定义为表的主键。一个表只能有一个主键,主键约束确保了表中的行是唯一,尽管有的表个允许没有主键,但是通常情况下应当为表设置一列为主键。如果两列或多列组合起来唯一地标识表中的每一行,则该主键也叫"复合主键"。当使用复合主键,数据输入时,必须跟所有设置了复合主键的列的数据都相同的情况才会被禁止输入。 | |||||||
主键选用原则 | 1、最少性是指列数最少的键,如果可以从单个主键和组合主键选择时,应该选择单个主键,这是因为操作一列比操作多列要快。当然该规则也有例外,例如,两个整数类型的列的组合比一个很大的字符类型的列要快。 2、稳定性是指列中数据的特征,由于主键通常用来在两个表之间建立联系,所以主键的数据不要经常更新,理想情况下,应该永远不改变。 | ||||||||
外键 | 当子表某列的信息必须在主表存在的情况才能输入,就应当建立一种"引用"的关系,确保"子表"中的某个数据项在"主表"中必须存在。"外键"就是用来达到这个目的的,它是相对于主键而言的,就是"子表"中对应于"主表"的列,在子表中称为外键或者引用键,它的值要求与主表的主键或唯一键相对应,外键用来强制引用完整性。一个表可以有多个外键。 | ||||||||
完善表的设计结构 | 空值 | 数据库的列是否允许为空也是一项约束,如果该列允许为空,则在输入数据行的时候,这一项可以不输入。 | |||||||
主键 | 设置了主键后,列不允许为空。 | ||||||||
默认值 | 表的默认值设置能够定义一个值,每当用户没有在某一列中输入值时,则将所定义的值复制给这一列。 | ||||||||
标识列 | 当我们找不到不重复的信息作为列的主键时使用标识列。标识列的实现方式如下 1、如果一列的数据属于数字类型(例如整数),则可以把该列定义为标识列。 2、定义成标识列之后,还需要指定"标识种子"和"标识增量",默认值都是1。 3、定义了标识列之后,在以后每次输入数据的时候,该列随数据行的增加而自动增加数值,并且不会重复,第一次的数字就是"标识种子"值,以后每次按照"标识递增量"增加数值,标识列通常也被定义为主键。 需要注意的是,标识列的值是自动生成的,不允许为标识列指定值。 | ||||||||
检查约束 | 检查约束也叫做check约束,用于定义列中可接受的数据值或格式。Check约束中可以使用像模糊查询和系统函数等格式。表达式如下: SEmail like '%@%' 表示输入的数据必须有"@"这个符号 len(SEmail) > 8 表示输入的数据长度必须大于8 | ||||||||
数据库数据类型 | 数据类型分类 | | |||||||
SQL的组成 | DML | DML(Data Manipulation Language,数据操作语言,也称数据操纵语言);用来插入修改和删除数据库中的数据,如INSERT、UPDATE、及DELETE等。 | |||||||
DDL | DDL(Data Definition Language,数据定义语言);用来建立数据库、数据库对象和定义其列,大部分是以CREATE开头的命令,如CREATE TABLE、CREATE VIEW及DROP TABLE等。 | ||||||||
DQL | DQL(Data Query Language);用来对数据库中的数据进行查询,如SELECT等。 | ||||||||
DCL | DCL(Data Control Language,数据控制语言);用来控制数据库组件的存取许可、存取权限等,如GRANT、REVOKE等 | ||||||||
SQL的运算符 | 算术运算符 | (+、-、*、/、%) 例子: 求商:1234 / 10 得 123 求余(取模): 1234 % 10 得 4 | |||||||
赋值运算符 | = | ||||||||
比较运算符 | 1、= 等于 2、> 大于 3、< 小于 4、<> 不等于 5、>= 大于等于 6、<= 小于等于 7、!= 不等于(非SQL-92标准) | ||||||||
逻辑运算符 | AND、OR、NOT | ||||||||
INSERT插入数据 | 单行插入数据 | INSERT [INTO] 表名 [(列名列表)] VALUES (值列表); 其中: [INTO]是可选的,也可以省略。 表名是必须的。 表的列名是可选的,如果省略,将依次插入所有列。 多个列名和多个值列表用逗号分隔。 分号(;)是T-SQL语句中支付,分号不是必需的。 例子: INSERT INTO Students VALUES ('张青裁','上海松江',6,'ZQC@sohu.com',0) | |||||||
多行插入INSERT SELECT | 通过INSERT SELECT语句将现有表中的数据添加到已存在的表中 INSERT INTO AddtrssList SELECT SName,SAddress,SEmail FROM Students 需要注意以下两点 查询得到的数据个数、顺序、数据类型等,必须与插入的项保持一致。 AddressList表必须预先创建好,并且具有SName,SAddress,SEmail三个列。 | ||||||||
多行插入 SELECT INTO | 通过SELECT INTO语句将现有表中的数据添加到新表中。 SELECT Students.SName,Students.SAddress,Students.SEmail INTO AddressList FROM Students 与INSERT INTO类似,SELECT INTO语句也是从一个表中选择一些数据插入到新表中,所不同的是,这个新表是执行查询语句的时候创建的,不能够预先存在。在以上语句中将创建表AddressList,把Students表中的SName、SAddress、SEmail作为AddressList表的新列,并且把查询到的数据全部插入到新表中。 如需在创建新表的同时创建标识列,语法如下。 SELECT IDENTITY(数据类型,标识种子,标识增长量)AS 列名 INTO 新表 FROM 原始表 | ||||||||
多行插入UNION | 通过UNION关键字合并数据进行插入 UNION语句用于将两个不同的数据或查询结果组合成一个新的结果集。当然,不同的数据或查询结果,也要求数据个数、顺序、数据类型都一致,因此,当向表中重复插入多次数据的时候,可以使用SELECT…UNION来简化操作。 INSERT STUDENTS(Sname,Sgread,SSex) SELECT '张可',7,1 UNION SELECT '李杨',4,0 这里要注意的是,插入语句的最后一行不需要写UNION。 | ||||||||
提示 | 1、每次插入一整行数据,不可能只插入半行或者几列数据,但允许某些列为空或使用默认值。如果违反列的非空约束,那么插入语句会检验失败,不能成功插入数据。 2、数据值的数目必须与列数相同,每个数据值的数据类型,精度和小数位数也必须与相应的匹配。 3、INSERT语句不能为标识列指定值,因为它的数字是自动增长的。 4、对于字符类型、日期类型的列,当插入数据的时候,用单引号(')将其引起来。 5、尽管可以不指定列名,但是最好明确指定插入的列和对应的值,以做到“心中有数”。 6、如果在设计表的时候指定某列不允许为空,则该列必须插入数据,否则将报告错误信息。 7、插入的数据项,要求符合数据完整性约束。 8、在设置了默认值的情况,可以使用DEFAULT(默认)关键字来代替插入的数值,示例代码如下。 INSERT INTO Student VALUES ('张青裁',DEFAULT,6,'ZQC@sohu.com',0) | ||||||||
UPDATE更新数据 | 语法 | UPDATE 表名 SET 列名 = 更新值[WHERE 更新条件] 其中: SET后面可以跟随多个数据列的更新值,不限一个,使用逗号分隔。 WHERE子句是可选的,用来限制更新数据的条件,如果不限制,则整个表的所有数据行将被更新。 提示:在更新数据的时候,一定要有条件限制,别忘了书写WHERE条件语句,否则将更新表中所有行的数据,这就可能导致有效数据的丢失。 | |||||||
DELETE删除数据 | 语法 | DELETE [FROM] 表名 [WHERE <删除条件>]; 其中: FROM关键字可以省略。 WHERE子句是可选的,用来限制删除数据的条件,如果不限制,则整个表的所有数据行将被删除。 提示:DELETE语句只要删除就是删除整条记录,不会只删除单个列,所以在DELETE后不能出现列名。还有一种情况是,如果要删除的行的主键值被其他表引用的时候,必须先删除子表相关的信息,才能删除主表的信息。 | |||||||
TRUNCATE TABLE 删除数据 | 语法 | TRUNCATE TABLE Students TRUNCATE TABLE用来删除表中的所有行,功能上它类似于没有WHERE字句的DELETE语句,但TRUNCATE TABLE比DELETE执行速度快,使用的系统资源和事务日志资源更少,并且删除数据后表的标识列会重新开始编号。 提示:TRUNCATE TABLE删除表中的所有行,但是表的结构、列、约束、索引等不会被改动。TRUNCATE TABLE不能用于有外键约束引用的表,这种情况下,需要使用DELETE语句。 | |||||||
SELECT查询数据 | 语法 | SELETE <列名> FROM <表名> [WHERE <查询条件表达式>] [ORDER BY <排序的列名> [ASC或DESC]] 其中,WHERE的条件是可选的,如果不限制,则查询返回所有行的数据项。OREDER BY 是用来排序的,也是可选的。 | |||||||
用法 | 1、查询所有的数据行和列
4、查询空值 在SQL语句中采用"IS NULL"或者"IS NOT NULL"来判断是否为空。示例代码如下。 SELECT Sname FROM Students WHERE Semail IS NULL或者 | ||||||||
查询中使用的函数 | 字符串函数 | | |||||||
日期函数 | | ||||||||
日期部分参数及其缩写 | 日期部分参数 缩写 year yy,yyyy quarter qq,q month mm,m dayofyear dy,y day dd,d week wk,ww weekday dw,w hour hh minute mi,n seceond ss,s millisecond ms | ||||||||
数学函数 | | ||||||||
系统函数 | | ||||||||
模糊查询 | 通配符 | ||||||||
LIKE | 使用LIKE进行模糊查询。 在数据更新、删除或查询的时候,依然可以使用LIKE关键字进行匹配查找,示例代码如下。 SELECT * FROM Students WHERE SName LIKE '张%' | ||||||||
BETWEEN | 使用BETWEEN在某个范围内进行查询 使用关键字BETWEEN可以查找那些介于两个已知值之间的一组为值。要实现这种查找,必须知道查找的初值和终值,并且初值小于等于终值,初值和终值用单词AND分开。示例代码如下 SELECT * FROM Score WHERE Score BETWEEN 60 AND 80 如果写成如下形式。 SELECT * FROM Score WHERE Score BETWEEN 80 AND 60 则不会报语法错,但也不会查询到任何信息。如果想取反查询可以使用NOT关键字,示例代码如下。 SELECT * FROM Score WHERE Score NOT BETWEEN '2010-1-1' AND '2010-8-1' 用BETWEEN查询在查询日期范围的应用也是非常常见的。 | ||||||||
IN | 使用IN在列举值内进行查询。 查询的值是指定的某些值之一,可以使用带列举值的IN关键字来进行查询。将列举值放在圆括号里,用逗号分开。 SELECT * FROM Students WHERE Saddress IN('北京','上海','广州') 提示:列举值类型必须与匹配的列具有相同的数据类型。模糊查询的关键字同样可以使用在CHECK约束中。 | ||||||||
T-SQL中的聚合函数 | SUM() | SUM()返回表达式中所有数值的总和。SUM()只能用于数字类型的列,不能够汇总字符、日期等其他数据类型。示例代码如下。 SELECTSUM(Score)AS 学号为23的学生总分 FROM Score WHERE StudentID = 23 | |||||||
AVG() | AVG()函数返回表达式中所有数值的平均值。AVG()函数也只能用于数字类型的列。示例代码如下。 SELECT AVG(Score) AS 平均成绩 FROM Score WHERE Score >= 60 | ||||||||
MAX()和MIN() | MAX()返回表达式中的最大值,MIN()返回表达式中的最小值,他们都可以使用于数字型、字符型以及日期/时间类型的列。示例代码如下。 SELECTAVG(Score)AS 平均成绩,MAX(Score)AS 最高分,MIN(Score)AS 最低分 FROM Score WHERE Score >= 60 | ||||||||
COUNT() | COUNT()返回提供的组或记录集中的计数。COUNT()可以用于数字和字符类型的列。另外,也可以使用星号(*)作为COUNT的表达式,使用星号可以不必指定特定的列而计算所有的行数。示例代码如下。 SELECTCOUNT(*)AS 及格人数 FROM Score WHERE Score>=60 | ||||||||
提示 | 1、聚合函数的查询只返回一个数值,因此,不能够直接与可能返回多行的列一起使用来进行查询,但是,一个查询中可以同时使用多个聚合函数。 2、使用聚合函数的时候,记得用AS关键字给列定一个别名,以方便查看。 | ||||||||
分组查询 | GROUP BY | 分组查询,就是把同样的值组合成一个组,然后使用聚合函数进行汇总和统计。分组查询有时候可能还要按照多个列来进行分组。示例代码如下。 SELECT COUNT(*) AS 人数, Sgrade AS 年级,Ssex AS 性别 FROM Students GROUP BY Sgrade,Ssex ORDER BY Sgrade 不难理解,使用GROUP BY关键字时,在SELECT列表可以指定的列是有限制的,仅允许以下几项。 1、被分组的列。 2、为每个分组返回一个值的表达式,例如聚合函数计算出的列。 | |||||||
HAVING | HAVING字句用来对分组后的数据进行筛选,将"组"看做"列"来限定条件。示例代码如下。 SELECT COUNT(*) AS 人数,Sgrade AS 年级 FROM Students GROUP BY Sgrade HAVING COUNT(*) > 15 | ||||||||
提示 | 在SELECT语句中,WHERE、GROUP BY、HAVING子句和聚合函数的执行次序如下:WHERE字句从数据源中去掉不符合其搜索条件的数据;GROUP BY子句搜集数据行到各个组中,统计函数为各个组计算统计值;HAVING字句去掉不符合其组搜索条件的各组数据行。整体结构如下。 SELECT COUNT(*) NAME FROM NAME WHERE NAME LIKE '张%' GROUP BY NAME HAVING COUNT(*) > 5 ORDER BY NAME DESC | ||||||||
查询排序 | ORDER BY | 如果需要按照一定顺序排列查询语句选中的行,则需要使用ORDER BY子句,并且排序可以是升序(ASC)或者降序(DESC)。如果不指定ASC或DESC,记录集按默认ASC升序排序。示例代码如下。 SELECT Score FROM Score ORDER BY Score | |||||||
多表连接查询 | 内联接查询 | 内联接是最典型,最常用的联接查询,它根据表中共同的列来进行匹配。特别是两个表存在主外键关系时通常会使用到内联接查询。内联接使用INNER JOIN…ON关键字或WHERE子句来进行表之间的关联。内联接查询可以通过两种方式实现。 1、在WHERE子句中指定联接条件。示例代码如下 2、在FROM子句中使用INNER JOIN…ON | |||||||
提示 | 有时候,一个表中的两个列同时引用同一个表的一个主键时,我们需要用如下代码进行查询。 SELECT C.CityName AS FirstCity,C1.CityName AS LastCity,T.Time AS FirstTime FROM CITY as C,CITY as C1,Time as T WHERE C.ID = T.FirstCityId and C1.Id = T.LastCityId | ||||||||
外联接查询 | 在外部联接中参与联接的表有主从之分,从主表的每行数据匹配从表的数据列,将符合联接条件的数据直接返回到结果集中;对那些不符合联接条件的列,将被填上NULL值后再返回到结果集中。目前学习了两个外联接方式。
| ||||||||
注释 | 单行注释-- 多行注释/**/ |