SQL Server总结(基础版)

 

 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的组成DMLDML(Data Manipulation Language,数据操作语言,也称数据操纵语言);用来插入修改和删除数据库中的数据,如INSERT、UPDATE、及DELETE等。
DDLDDL(Data Definition Language,数据定义语言);用来建立数据库、数据库对象和定义其列,大部分是以CREATE开头的命令,如CREATE TABLE、CREATE VIEW及DROP TABLE等。
DQLDQL(Data Query Language);用来对数据库中的数据进行查询,如SELECT等。
DCLDCL(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、查询所有的数据行和列
使用"*"表示所有的列,语法如下。
SELECT * FROM Students


2、查询部分行或列
查询部分列需要列举不同的列名,而查询部分行需要使用WHERE字句进行条件限制,例如:
SELECT Scode,Sname,Saddress
FROM Students
WHERE Saddress = '河南新乡'


3、在查询中使用列的别名
AS子句可以用来改变改变结果集列的名称,也可以为组合或者计算出的列指定名称,还有一种情况是让标题列的信息更易懂。
在T-SQL中重新命名列名可以使用AS字句,例如:
SELECT SCode AS 学生编号,SName AS 学生姓名,SAddress AS 学生地址
FROM Studenets
WHERE SAddress <> '河南新乡'


还有一种情况,注意:
1. + 连接的数据类型必须兼容
2. 如果 + 连接字符型数据,结果为字符串数据的连接
3. 如果 + 连接数值型数据,结果为数值的和
示例代码如下。
SELECT FirstName+LastName AS 姓名
FROM Employees
重新命名列名还有一种方法,就是采用"="来命名,示例代码如下。
SELECT 姓名 = FirstName+LastName
FROM Employees

4、查询空值

在SQL语句中采用"IS NULL"或者"IS NOT NULL"来判断是否为空。示例代码如下。

SELECT Sname FROM Students WHERE Semail IS NULL或者
SELECT Sname FROM Students WHERE Semail = ""
两段代码都可以判断是否为空,它们的区别在于NULL判断的是从来没有输入过值 的列,而""判断的是以前输入过值,但在使用的过程中删除了的列。
5、在查询中使用常量列
有时候,需要将一些常量的默认信息添加到查询输出中,以方便统计或计算。示例代码如下。
SELECT 姓名=SName,地址=SAddress,'北京新兴桥' AS 学校名称
FROM Students
在这段代码中,查询输出多了一列"学校名称",该列所有数据都是"北京新兴桥"
6、查询返回限制的行数
一些查询需要返回先知的行数,例如在测试的时候,没有必须查询输出全部的数据,以提高查询速度,这时候就要用到先知返回行数的查询。
在T-SQL中,限制行数使用TOP关键字来约束。示例代码如下。
SELETE TOP 5 SName,SAddress
FROM Students WHERE Ssex = 0
还有一种情况是需要从表中按一定的百分比提取记录,这时候还需要用到PERCENT关键字来先知。示例代码如下。
SELETE TOP 20 PERCENT SName,SAddress
FROM Students WHERE SSex = 0
提示:与提取固定的数据行相比,提取固定百分比数据还能得到总数据行数等信息。

查询中使用的函数字符串函数
日期函数
日期部分参数及其缩写日期部分参数        缩写
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、为每个分组返回一个值的表达式,例如聚合函数计算出的列。
HAVINGHAVING字句用来对分组后的数据进行筛选,将"组"看做"列"来限定条件。示例代码如下。
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子句中指定联接条件。示例代码如下
SELECT S.Sname,C.Score
FROM Students AS S,Score AS C
WHERE S.Scode = C.Scode

2、在FROM子句中使用INNER JOIN…ON
SELECT S.Sname,C.Score
FROM Students AS S
INNER JOIN Score AS C ON(S.Scode = C.Scode)
在上面的内联接查询中:
INNER JOIN 用来联接两个表。
INNER 可以省略
ON 用来设置条件。
AS 指定表的"别名"。如果查询的列名在用到的两个或多个表中不重复,则对这一列的引用不必用表名来限定。
在内联接中,参与联接表的地位是平等,在where或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值后再返回到结果集中。目前学习了两个外联接方式。


1、左外联接查询
左外联接的结果集包括LEFT JOIN 子句中指定的左表中匹配的行,和右表中的所有行,如果左表的某行在右表中没有匹配行,则在相关联的结果集行中左表的所有选择列均为NULL
左外联使用LEFT JOIN…ON或LEFT OUTER JOIN…ON关键字来进行表之间的关联。示例代码如下。
SELECT S.SName,C.Course,C.Score
FROM Students AS S
LEFT JOIN Score AS C ON S.SCode = C.StudentID


2、右外联接
右外联接的结果集包括RIGHT JOIN 子句中指定的右表中所有的行,和左表中的匹配行,如果左表的某行在右表中没有匹配行,则在相关联的结果集行中左表的所有选择列均为NULL
左外联使用RIGHT JOIN…ON或RIGHT OUTER JOIN…ON关键字来进行表之间的关联。示例代码如下。
SELECT S.SName,C.Course,C.Score
FROM Score AS S
RIGHT JOIN Students AS C ON S.SCode = C.StudentID

 注释单行注释--
多行注释/**/

转载于:https://www.cnblogs.com/fengweicong/archive/2012/12/09/2810166.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值