2023年6月21日发(作者:)
SQLServer2012案例教程(贾祥素)——学习笔记第2章 SQL Server 2012概述1、SQL(Structed Query Language),结构化查询语⾔。2、SSMS(SQL Server Mangement Studio),SQL Server 2012的操作环境。3、连接SQL Server之前应先启动SQL Server服务,即SQL Server(MSSQLSERVER): ⽅法1 开始--所有程序--Microsoft SQL Server 2012--配置⼯具--SQL Server配置管理器。 ⽅法2 控制⾯板--系统和安全--管理⼯具--服务。【 √ 】4、登录账户: (1) 创建:“Windows⾝份验证”登录--对象资源管理器--安全性--右击登录名--新建登录名 (2) 修改密码:“Windows⾝份验证”登录--对象资源管理器--安全性--打开登录名--双击⾃定义的登录名 (3) 赋予权限:双击⾃定义的登录名--属性--服务器⾓⾊ / ⽤户映射 (4) 删除:右击⾃定义的登录名--删除第3章 数据库的创建与管理1、数据库按照⽤途分类:系统数据库和⽤户数据库。 系统数据库: (1) master:核⼼,⽤户不能直接修改,损坏则SQL Server服务器不能⼯作,需定期备份。 (2) model:模板,⽤模板中的默认值创建新的空⽩数据库。修改model将影响所有使⽤模板创建的数据库。 (3) msdb:代理服务数据库,供SQL Server代理程序调度警报、作业及记录操作。 (4) tempdb:临时数据库,所有建⽴的临时表和临时存储过程,启动时重建,关闭时清空。 ⽤户数据库:由⽤户⾃⾏创建的数据库。2、⽂件 (1) 数据库⽂件:存放数据库数据和数据库对象,可有多个数据库⽂件。 类型:a. 主数据⽂件:“. mdf ”,有且只有⼀个,存储数据库启动信息数据,是数据库的起点。 b. 次要数据库:“. ndf ”,可以有0或多个,除主数据⽂件外其余的都是次要数据⽂件。 (2) 事务⽇志⽂件:“. ldf ”,⾄少有⼀个,记录数据库增删改及故障记录,可分析故障原因并恢复数据。3、创建数据库 «CREATE DATABASE 数据库名[ ON [ PRIMARY ][ <数据⽂件参数>[ , ... n ][ , <⽂件组参数>[ , ... n ]][ LOG ON { <⽇志⽂件参数>[ , ... n ] } ]
<⽂件参数> :: ={
( [ NAME = 逻辑⽂件名, ] FILENAME = 物理⽂件名 [ , SIZE = ⼤⼩ [ , MAXSIZE = { 最⼤容量 | UNLIMITED }]CREATE DATABASE mytest ON PRIMARY(NAME = ‘ mytest_data1 ’,FILENAME = ‘ d : db mytest_data1 . mdf ’,SIZE = 6MB ,MAXSIZE = 30MB ,FILEGROWTH = 15 %) ,(NAME = ‘ mytest_data2 ’,FILENAME = ‘ d : db mytest_data2 . mdf ’,SIZE = 4MB ,MAXSIZE = 30MB ,FILEGROWTH = 15 %)
LOG ON(NAME = ‘ mytest_log1 ’, [ , FILEGROWTH = 增长量 [ KB|MB|GB|TB|% ]FILENAME = ‘ d : db mytest_log1 . ldf ’, [ , FILEGROWTH = 增长量 [ KB|MB|GB|TB|% ]FILENAME = ‘ d : db mytest_log1 . ldf ’, ] )
[ , ... n ]
}<⽂件组参数> :: ={ FILEGROUP ⽂件组名 [ DEFAULT ] <⽂件参数>[ , ... n ]}SIZE = 1MB ,MAXSIZE = 20MB ,FILEGROWTH = 5 %) ,(NAME = ‘ mytest_log2 ’,FILENAME = ‘ d : db mytest_log2 . ldf ’,SIZE = 1MB ,MAXSIZE = 20MB ,FILEGROWTH = 5 %)
GO● ON:指定⽤来存储数据库中数据部分的磁盘⽂件——数据⽂件。● PRIMARY:指定关联数据⽂件的主⽂件组。若未指定PRIMARY,则CREATE的第⼀个⽂件为主数据⽂件。● LOG ON:指定⽤来存储数据库中⽇志部分的磁盘⽂件——⽇志⽂件。如果没有LOG ON系统将⾃⼰创建。● ⽂件参数:定义⽂件属性。 NAME:指定⽂件逻辑名称,是数据库在SQL Server中的标识符。 FILENAME:指定数据库所在⽂件的操作系统⽂件名称和路径,要确保路径已经存在。 SIZE:指定⽂件初始⼤⼩,应不⼩于model数据库的主数据⽂件的⼤⼩。若未指定则使⽤model数据库主数据⽂件的⼤⼩。 次要数据⽂件未指定⼤⼩,则以1MB作为该⽂件的⼤⼩。 MAXSIZE:指定操作系统⽂件可增长到的最⼤尺⼨。若未指定则⽆限⼤(UNLIMITED),直到磁盘被占满。 FILEGROWTH:指定⽂件的⾃动增量。MB或者%,若为0则不允许⽂件增长。● ⽂件组参数:控制⽂件组属性。 FILEGROUP:⽂件组逻辑名称,须唯⼀且符合标识符规则。 DEFAULT:指定该⽂件组为数据库中默认的⽂家组。4、数据库管理 (1) 查看及修改:右键--属性 (2) 更名:⽅法1 使⽤SSMS图形界⾯ ⽅法2 使⽤T-SQL语句:ALTER DATABASE mytest MODIFY NAME = db_mytest (3) 删除:⽅法1 使⽤SSMS图形界⾯ ⽅法2 使⽤T-SQL语句:DROP DATABASE mytest5、数据库的分离,即只将⽤户数据库从SSMS中删除,对应的物理⽂件.mdf和.ldf不删除。 (1) 分离:⽤户数据库--右键--任务--分离 (2) 附加:数据库--右键--附加--添加 (3) 移动:分离--剪切.mdf和.ldf--附加 (4) 复制:(⽤户数据库--右键--任务--脱机)--复制.mdl和.ldf --(右键--联机)第4章 数据表的创建与管理1、数据表的创建 (2) 使⽤T-SQL语句创建数据表 CREATE TABLE 表名USE TestStudentdb ——说明对哪⼀个数据库进⾏操作 CREATE TABLE 表名 (USE TestStudentdb ——说明对哪⼀个数据库进⾏操作GO 列名1 数据类型 列的特征,CREATE TABLE TestScore 列名2 数据类型 列的特征,( ... ... 列名n 数据类型 列的特征 )testsco_id INT IDENTITY(1 , 1) , ——标识列(int),从1开始递增testsco_stuno VARCHAR(10) NOT NULL , ——⾮空testsco_overall FLOAT ——未说明,可为空)GO ——怎么设置主键?CREAT TABLE [ DataBaseName.[ SchemaName ].] TableName /*创建表的数据库名*/ /*创建表的架构名*/ /*创建表的名称*/(column_name data_type [NOT NULL]|[DEFAULT[expression]]|{PRIMARY KEY|UNIQUE}[CLUSTERED|NONCLUSTERED][ASC|DESC])[, ...n] /*各列名称*//*数据类型*//*列值⾮空*/ /* 指定列的默认值 */ /* 主码 */ /*标识列*//*聚集索引*/ /* ⾮聚集索 *//*默认*//*降*/
2、数据表的管理 (1) 使⽤SSMS图形界⾯管理数据表 (2) 使⽤T-SQL管理数据表:(单击“新建查询”打开空⽩.sql--输⼊T-SQL语句--单击V检查--单击!执⾏--检查表中数据) a. 添加字段:SSMS数据表--右键--设计 表右键语法ALTER TABLE 表名ADD 字段名 字段类型 列的特征 修改字段类型:SSMS数据表--右键--设计 表右键语法ALTER TABLE 表名ALTER COLUMN 字段名 字段类型 列的特征 删除字段:SSMS数据表--右键--设计 表右键语法ALTER TABLE 表名DROP COLUMN 字段名 b. 添加约束CONSTRAINT: ALTER TABLE 表名 ADD CONSTRAINT 约束名 约束类型 具体的约束说明 主键约束 PRIMARY KEY:SSMS举例设计--列名--右键--设置主键 列名右键ALTER TABLE StudentTest /* 表级约束只要这部分 */ADD CONSTRAINT PK_stutestno PRIMARY KEY (stutest_no)GO <约束名> <列名> [, ... n] 注:每个表只能有⼀个主键约束,且其约束的列值不能重复或空。 外键约束FOREIGN KEY(关系): 设计右击空⽩--关系--添加--常规·表达式--选择对应 空⽩右键举ALTER TABLE ScoreTest /* 表级约束不省略这部分 */例ADD CONSTRAINT FK_scoteststuno FOREIGN KEY(scotest_stuno) REFERENCES StudentTest (stutest_no)GO <约束名> <列名> <外表名> <列名>
注:外键所引⽤的列必须是主键约束的列或标识列; ⽤户数据库--数据库关系图--新建--全选--添加--保存--刷新。 唯⼀约束UNIQUE(标识列):SSMS设计--列属性--(是标识)--“是” 列属性举例ALTER TABLE StudentTest举例ALTER TABLE StudentTestADD CONSTRAINT UQ_stutestname UNIQUE (stutest_name) 注:可在⼀表中定义多个UNIQUE,也可在多个列上定义⼀个UNIQUE,其组合不重复即可。 表设计--右击空⽩--索引/键--查看唯⼀键。 默认约束DEFAULT:SSMS设计--列属性--默认值或绑定--输⼊内容 列属性举例ALTER TABLE StudentTestADD CONSTRAINT DF_stutestnative DEFAULT(‘吉林’) FOR stutest_native 检查约束CHECK:SSMS设计右击空⽩--CHECK--添加--常规·表达式--输⼊ 空⽩右键举例ALTER TABLE StudentTestADD CONSTRAINT CK_stutestemail CHECK(stutest_email like ‘%@%.%’) 例:stu_email like (注:%表⽰任意多个字符) 删除约束: ALTER TABLE 表名 DROP CONSTRAINT 约束名(如CK_stutestemail)3、数据表的删除
(1) 使⽤SSMS图形界⾯删除数据表 (2) 使⽤T-SQL删除数据表:DROP TABLE 表名第5章 数据管理(增、删、改、导⼊导出)1、使⽤SSMS图形管理界⾯ (1) 添加数据:右击表--编辑前200⾏--增加字段的值 (2) 修改数据:右击表--编辑前200⾏--修改字段的值 (3) 删除数据:右击表--编辑前200⾏--右击选中⼀条记录--删除2、使⽤T-SQL (单击“新建查询”打开空⽩.sql--输⼊T-SQL语句--单击V检查--单击!执⾏--检查表中数据) (1) 插⼊单⾏数据: 语法:INSERT [ INTO ] <表名> [列名列表] VALUES <值列表> INTO:“[]”表⽰可选部分,增强可读性。 表名:指定向哪个表插⼊数据。 列名:若有多列可⽤逗号隔开,若省略列名则按数据表定义的顺序依次插⼊数据。 值列表:插⼊各列对应的数值,逗号隔开,值与列对应,字符串⽤单引号。 注:不要向标识列中插⼊数据值。 (注:红⾊为常见易错处) 在插⼊数据时注意不要违反CHECK约束。 若字段不允许为空,且未设置默认值,则必须给该字段设置数据值。 可以使⽤关键字DEFAULT代替插⼊的数值,这样可以改具有默认值的列插⼊数据。
(2) 插⼊多⾏数据: ● 从⼀个表中查询出来部分信息,将这些信息插⼊到另外⼀个表中: INSERT INTO Contact (con_name, con_email, con_phone) SELECT stu_name, stu_email, stu_phone FROM Student ● 通过Union关键字合并数据进⾏插⼊: INSERT INTO Contact (con_name, con_email, con_phone) SELECT ‘黄飞’, ‘huangfei@’, ‘’ UNION SELECT ‘徐强’, ‘xuqiang@’, ‘’ UNION SELECT ‘段悦’, ‘duanyue@’, ‘’ 注:UNION关键字将两个不同的数据或查询结果组合成⼀个新的结果集,注意个数、顺序、类型。 ● 通过VALUE⽅式⼀次插⼊多条记录: INSERT INTO Contact (con_name, con_email, con_phone) VALUES (‘胡康’, ‘hukang@’, ‘’) , (‘周星’, ‘zhouxing@’, ‘’) , (‘李刚’, ‘ligang@’, ‘’)
(3) 更新数据:UPDATE <表名> SET <列名=更新值> [WHERE<条件>] SET指定更新的列和值,多个“列名=更新值”⽤逗号隔开,最后⼀个“列名=更新值”不加逗号 WHERE⼦句是可选的,若省略则对表中所有记录进⾏更新。 ● 更新单⾏:UPDATE Contact SET con_email = ‘ww@’, con_phone = ‘’
WHERE con_id=1 ● 更新多⾏:UPDATE Contact SET con_email = ‘zjff@’ WHERE con_email = NULL ● 更新所有:UPDATE Contact SET con_phone = ‘ ’ (4) 删除数据:DELETE FROM <表名> [WHERE<条件>] ● 删除单⾏:DELETE FROM Contact WHERE con_id = 0 注:在删除主表中某条数据信息时,若该信息在⼦表中以外键形式存在,则禁⽌删除主表中该信息。
办法是将主表中要删除的信息先在⼦表中全部删除。简便的⽅法是触发器。 ● 删除多⾏:DELETE FROM Contact WHERE con_class = ‘12⾃动化’ ● 删除所有:DELETE FROM Contact 扩展:TRUNCATE TABLE <表名> TRUNCATE TABLE⽤来删除表中所有⾏,但表的结构、列、约束、索引等不会被改动, ⽐DELETE执⾏速度快,且占⽤资源和⽇志少,该操作不能⽤于有外键约束引⽤的表。3、导⼊/导出数据 (1) ⽂本⽂件·导⼊·数据库数据 右击数据库--任务--导⼊数据--打开“SQL Server导⼊导出向导”窗⼝--下⼀步 打开“选择数据源”窗⼝--“数据源”选“平⾯⽂件源”--单击“浏览”选择导⼊的⽂件路径--取消“在第⼀个数据中显⽰列名称”框 下⼀步--下⼀步--选择要导⼊的数据库--下⼀步--选择要导⼊的数据表 下⼀步--保持默认--下⼀步--选中“⽴即运⾏”复选框--下⼀步--完成--单击关闭按钮即可查看导⼊的数据。 (2) 表格⽂件·导⼊·数据库数据 右击数据库--任务--导⼊数据--打开“SQL Server导⼊导出向导”窗⼝--下⼀步 “选择数据源”窗⼝--“数据源”选“Microsoft Excel”--单击“浏览”选择导⼊的Excel路径--取消“⾸⾏包含列名称”复选框 下⼀步--选择要导⼊的数据库--下⼀步--选中“复制⼀个或多个表或视图的数据”单选按钮 下⼀步--选中Sheet$选项--在⽬标处选择要导⼊的数据表 下⼀步--保持默认--下⼀步--选中“⽴即运⾏”复选框--下⼀步--完成--单击关闭按钮即可查看导⼊的数据。 (3) 数据库数据·导出·⽂本⽂件 右击数据库--任务--导出数据--打开“SQL Server导⼊导出向导”窗⼝ 下⼀步--打开“选择数据资源”窗⼝--选择要导出的数据库 下⼀步-打开“选择⽬标”窗⼝ “⽬标”选择“平⾯⽂件⽬标”并选择⽂件路径及要保存的⽂件名 下⼀步--打开“指定表复制或查询”窗⼝--保持默认 下⼀步--打开“配置平⾯⽂件⽬标”窗⼝并在“源表或源视图”选择要导出的数据表 下⼀步--打开“保存并运⾏”窗⼝--保持默认 下⼀步--打开“完成该向导”窗⼝--单击完成打开“执⾏成功”窗⼝--单击关闭按钮即可查看导出的⽂件。 (4) 数据库数据·导出·表格⽂件 右击数据库--任务--导出数据--打开“SQL Server导⼊导出向导”窗⼝ 下⼀步--打开“选择数据资源”窗⼝--选择要导出的数据库 下⼀步-打开“选择⽬标”窗⼝ “⽬标”选择“Microsoft Excel”并选择⽂件路径及要保存⽂件名 下⼀步--打开“指定表复制或查询”窗⼝--保持默认 下⼀步--打开“选择源表或源视图”窗⼝并选择要导出的数据表 下⼀步--打开“查看数据类型映射”窗⼝ 下⼀步--打开“保存并运⾏包”窗⼝ 下⼀步--打开“完成该向导”窗⼝--单击完成打开“执⾏成功”窗⼝--单击关闭按钮即可查看导出的⽂件。第6章 数据查询(T-SQL语句)1、SELECT语句 SELECT [ ALL | DISTINCT ] [ TOP n[ PRECENT ] [ WITH TIES ] ] { * | <字段列表> } FROM 表名 | 视图名 [ WHERE <检索条件表达式> ] [ GROUP BY <分组依据列> ] [ HAVING <组提取条件表达式> ] [ ORDER BY <排序依据列> ] [ ASC | DESC ] 注:ALL:默认,查询出的结果可以包含重复⾏。 DISTINCT:查询的结果如果有值相同的⾏,则只显⽰其中⼀⾏。 TOP n[ PRECENT ]:返回查询结果的前n⾏,或前百分之n⾏。 { * | <字段列表> }:“*”表⽰查询所有字段;<字段列表>表⽰查询指定的字段,多个字段逗号隔开。2、查询列 ● 查询全部列:SELECT * FROM <表名> ● 查询指定列:SELECT <列名1> [ , ...n ] FROM <表名> ● 查询计算后的列:SELECT 2016-brthday AS age FROM <表名> (注:在查询中使⽤常量列同理,包括‘字符串’) ● 改变查询结果的列名:SELECT <列名> AS <新名> FROM <表名> (注:使⽤* 不可指定列别名,多列逗号隔开) ● TOP关键字限制返回⾏数:SELECT TOP n <列名> [, ...n][WITH TIES] FROM <表名> 注:TIES可并列 ● 消除重复的数据⾏:SELECT DISTINCT <列名> FROM <表名>3、查询⾏(条件查询) ● ⽐较判断符:SELECT * FROM Student WHERE stu_sex = ‘男’ =、>、>=、<、<=、!=
● 逻辑运算符:SELECT * FROM Student WHERE stu_sex = ‘男’ AND stu_age = ‘16’ AND、OR、NOT
● 空值判断符:SELECT stu_name FROM Student WHERE stu_native IS [NOT] NULL ● 范围运算符:SELECT * FROM Student WHERE stu_age [NOT] BETWEEN 13 AND 16 ● 列表运算符:SELECT * FROM Student WHERE stu_native [NOT] IN (‘北京’, ‘上海’) ● 模式匹配符:SELECT stu_name, stu_sex FROM Student WHERE stu_sex [NOT] LIKE ‘李%’ _:任何单个字符%:任意多个字符,包括0个[ ]:指定范围内的单个字符,如[abf-z]表⽰除‘c’ ‘d’ ‘e’以外任意⼀个字符[^]:不在指定范围内的单个字符,如[abf-z]表⽰‘c’ ‘d’ ‘e’之内任意⼀个字符LIKE ‘ab%’LIKE ‘%ab’LIKE ‘%ab%’LIKE ‘_ab’LIKE ‘_[abc]’LIKE ‘[abc]%’返回以‘ab’开头的任意字符串返回以‘ab’结尾的任意字符串返回包含‘ab’的任意字符串返回以‘ab’结尾的包含三个字符的任意字符串返回第⼆个字符是的任意字符串返回以‘a’ ‘b’或‘c’开头的任意字符串4、查询排序 ● 对⼀列排序:SELECT * FROM Student ORDER BY stu_id ASC (注:可省略ASC,默认升序) ● 对多列排序:SELECT * FROM Score ORDER BY sco_overall DESC, sco_usual DESC (⽭盾处如何取舍?)5、聚合函数 ● SELECT SUM(sco_overall) AS ‘总评成绩总分’, AVG(sco_overall) AS ‘总评成绩平均分’ FROM Score 注:SUM()和AVG()——所包含的列必须是数值型 ● SELECT MAX(sco_overall) AS ‘总评成绩最⾼分’, MIN(sco_overall) AS ‘总评成绩最低分’ FROM Score ● SELECT COUNT(*) AS ‘及格数’, FROM Score WHERE sco_overall >= 60 (注:COUNT(*)——包括空值⾏) SELECT COUNT(stu_phone) AS ‘有⼿机号码的⼈数’ FROM Student (注:COUNT(字段名)——不包括空值⾏)6、分组查询 ● GROUP BY分组: 例:SELECT Cno AS ‘课程号’ COUNT(Sno) AS ‘选课⼈数’ FROM SC WHERE Sdept = ‘信息’ GROUP BY Cno /*先执⾏WHERE选出信息系学⽣,再执⾏GROUP BY对SC表按Cno分组(同Cno⼀组),最后执⾏COUNT求每组⼈数*/注:GROUP BY后不能⽤AS指定的别名,如‘课程号’;GROUP BY分组依据列不能是text、ntext、image和bit类型的列。 ● HAVING分组 说明:WHERE筛选FROM指定的表,GROUP BY对筛选结果进⾏分组,HAVING在对分组进⾏⼆次筛选) WHERE和HAVING的区别: ● WHERE中使⽤的条件在HAVING中同样适⽤; ● WHERE中不可以包含聚合函数,HAVING可以; ● WHERE的条件在分组之前应⽤,HAVING在之后。 例:SELECT Sno, COUNT(*) AS ‘选课门数’ FROM SC WHERE Sdept = ‘信息’ GROUP BY Sno HAVING COUNT(*)>3 /*先执⾏WHERE选出信息系学⽣,再执⾏GROUP BY将学⽣按学号Sno分组,再执⾏HAVING将COUNT(*)>3的选出*/ 辩:SELECT Sdept, COUNT(*) FROM Student WHERE Sdept IN(‘计算机’, ‘信息’) GROUP BY Sdept 【 √ 】 ... ... ... ... ... ... ... ... ... ... ... ... ... .... GROUP BY Sdept HAVING Sdept IN(‘计算机’, ‘信息’) 【 √ 】 SELECT Sdept, COUNT(*) FROM Student WHERE Sage<=20 GROUP BY Sdept 【 √ 】 ... ... ... ... ... ... ... ... ... ... ... ... ... ... GROUP BY Sdept HAVING Sage<=20 【 × 】 注:GROUP BY后结果中只含分组依据列Sdept和五个聚合函数,即执⾏到HAVING时已没有Sage列 ! ! !
即,HAVING中只能包含聚合函数和分组依据列 !
7、多表连接查询 (1) 内连接 语法:SELECT 列表.列名 FROM 列表1 [INNER] JOIN 列表2 ON 连接条件表达式 ● 等值连接:连接条件表达式使⽤“=”,查询结果中列出被连接表中的所有列,包括重复列。 SELECT * FROM Student INNER JOIN Class ON _classid=_id (注:*指Student的所有列) ● ⾃然连接:连接条件表达式使⽤“=”,查询结果中列出被连接表中的所有列,删除重复列。 (注:语法上与上区别?) SELECT Student.*, _name FROM Student INNER JOIN Class ON _classid=_id
● 使⽤表别名:原名 [AS] 别名 (注:后⾯改的名字,前⾯已经可以使⽤了?) SELECT _name, _name FROM Teacher AS t INNER JOIN Department AS d ON _depid=_id● 多表内连接:每增加⼀张表,就增加⼀个[INNER] JOIN ... ON⼦句。 SELECT _name, _name, _overall FROM Score INNER JOIN Student ON _stuno=_no INNER JOIN Student ON _courseid=_id (2) 外连接● 左外连接LEFT [OUTER] JOIN:结果不仅包括连接列所匹配的⾏,还包括LEFT [OUTER] JOIN指定的左表的所有⾏, 若左表某⾏在右表没有匹配⾏,则结果集中右表的所有选择列均为空值。 语法:SELECT 列表.列名 FROM 表1 LEFT [OUTER] JOIN 表2 ON 连接条件表达式● 右外连接RIGHT [OUTER] JOIN:同理。 语法:SELECT 列表.列名 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 连接条件表达式● 全外连接FULL [OUTER] JOIN:同理。 语法:SELECT 列表.列名 FROM 表1 FULL [OUTER] JOIN 表2 ON 连接条件表达式 (3) 交叉连接 含义:将连接的两个表的所有⾏进⾏组合形成⼀个结果集,相当于两个表的“乘积”。 语法:SELECT 列表.列名 FROM 表1 CROSS 表2第7章 T-SQL语句1、语⾔分类 ● 数据操作语⾔DML:INSERT、DELETE、UPDATE、SELECT ● 数据控制语⾔DCL:GRANT、DENY、REVOKE ● 数据定义语⾔DDL:CREATE/DROP/ALTER TABLE/VIEW/INDEX/PROCEDURE/TRIGGER ● 附加语⾔元素:SET/BEGIN TRANSACTION/COMMIT、OPEN、CLOSE、DECLARE、ROLLBACK、FETCH、EXECUTE ● 注释:单⾏注释( “ -- ” ); 多⾏注释( “ /* ... */ ” )2、变量 (1) 局部变量(前缀@) ● 声明:DECLARE @变量名 数据类型 ● 赋值:⽅法1:SET @变量名=值 ⽅法2:SELECT @变量名=值 (注:要确保查询的记录不多于⼀条,否则把最后⼀条查询记录的值赋给变量) ● 例:DECLARE @name VARCHAR(10) DECLARE @classid VARCHAR(10) SET @name = ‘王濛’ --为@name赋值 SELECT @classid = stu_classid FROM Student WHERE stu_name = @name --为@classid赋值 SELECT * FROM Student WHERE stu_classid = @classid (2) 全局变量(前缀@@)全局变量@@CONNECTIONS@@ERROR@@IDENTITY@@LANGUAGE说明返回⾃上次启动SQL Server以来连接或试图连接的次数。返回最后⼀个T-SQL错误的错误号,没有错误返回0。返回最后插⼊⾏的标识列的列值。返回当前使⽤语⾔的名称。@@MAX_CONNECTIONS返回SQL Server实⼒允许同时进⾏的最⼤⽤户数。@@REMSERVER@@ROWCOUNT@@SERVERNAME@@SERVICENAME@@TRANSCOUNT返回登录记录中记载的远程SQL Server服务器的名称。返回收上⼀个SQL语句影响的⾏数。返回本地服务器名称。返回该计算机上的SQL服务的名称,若当前实⼒为默认实例,则返回MSSQLSERVER。@@VERSION返回当前连接的活动事务数。返回SQL Server的版本信息。例:SELECT @@LANGUAGE AS ‘使⽤语⾔’, @@SERVICENAME AS ‘SQL服务名称’3、输出语句⽅法1:SELECT 变量 AS ⾃定义列名0 例:SELECT @@LANGUAGE AS ‘当前使⽤的语⾔’ (注:输出结果以表格⽅式显⽰)⽅法2:PRINT 变量或字符串
例:PRINT ‘当前使⽤的语⾔是:’ + @@LANGUAGE (注:输出结果以⽂本⽅式显⽰) 例:PRINT ‘当前错误号是:’ + @@ERROR (注:⽂本类型 + 整数类型 = 出错) 改:PRINT ‘当前错误号是:’ + CONVERT(VARCHAR(10), @@ERROR)4、流程控制语句 技巧:将表格数据和⽂本消息输出在同⼀窗⼝——⼯具--选项--查询结果--将查询结果的默认⽅式改为:以⽂本格式显⽰结果!WHILE、END、IF...ELSE语句DECLARE @num intWHILE(1=1)BEGINCASE语句CASE 表达式WHEN 值/表达式 THEN 结果... ... SELECT @num = COUNT(*) FROM Score WHERE sco_overall <= 50[ELSE 其他结果] IF(@num>0) UPDATE Score SET sco_overall = sco_overall + 1 ELSE BREAKEND5、批处理语句批处理是⼀条或多条T-SQL语句集合,这些语句为完成⼀个整体的⽬标⽽同时执⾏,GO是结束标志。 SQL Server规定,创建库、创建表、创建存储过程、创建视图等,都必须在结尾加上“GO”批处理标志。第8章 数据查询进阶--⼦查询 若⼀个SELECT嵌套在INSERT、DELETE、UPDATESELECT中,则称为嵌套查询。外层是主查询;内层是⼦查询,⼦查询⽤括号括起来,先执⾏,但⼦查询的SELECT语句中不能使⽤ORDER BY⼦句(ORDER BY只能对最终查询结果进⾏排序)。1、使⽤⽐较运算符的(不相关)⼦查询:语法:WHERE 表达式 ⽐较运算符 (⼦查询)例:SELECT stu_name FROM Student WHERE stu_sex = (SELECT stu_sex FROM Student WHERE stu_name = ‘王濛’)2、使⽤[NOT] IN的(不相关)⼦查询:语法:WHERE 表达式 [NOT] IN (⼦查询)例:查询选修VB课程的学⽣的学号和姓名。⽅法1:SELECT Sno, Smane FROM Student S ON = JOIN Course C = WHERE Cname =‘VB’⽅法2:SELECT Sno, Sname FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno IN (SELECT Cno FROM Course WHERE Cname = ‘VB’))3、使⽤[NOT] EXISTS的(相关)⼦查询:语法:WHERE 表达式 [NOT] EXISTS (⼦查询)说明:系统对EXISTS后⾯的⼦查询进⾏运算判断它是否返回⾏,若⾄少返回⼀⾏,则EXISTS的结果为TRUE,否则为FALSE, 外层查询在EXISTS为TRUE时才执⾏。由于EXISTS只返回真假,在⼦查询中指定列名没有意义,因此列名通常⽤“*”。例:查询没有选修“c01”课程的学⽣的姓名。法1:SELECT DISTINCT Sname FROM Student S JOIN SC ON = WHERE Cno != ‘c01’ 【×】END 法2:SELECT Sname FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno != ‘c01’) 【×】 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... [NOT] IN (SELECT Sno FROM SC WHERE Cno = ‘c01’) 【√】法3:SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno= AND Cno != ‘c01’)【×】 ... ... ... ... ... ... ... ... ... ... ... ... [NOT] EXISTS (SELECT * FROM SC WHERE Sno= AND Cno = ‘c01’)【√】注:三种错误的原因相同,在查询时是组⾏判断的,⽽这三种情况下只要满⾜Cno != ‘c01’就作为结果,使得结果中既包含没有c01的学⽣,也包括选c01的同时也选了其他课程的学⽣。第9章 索引、视图、事务、存储过程、触发、游标(并发控制、函数)第1章 下载及安装
2023年6月21日发(作者:)
SQLServer2012案例教程(贾祥素)——学习笔记第2章 SQL Server 2012概述1、SQL(Structed Query Language),结构化查询语⾔。2、SSMS(SQL Server Mangement Studio),SQL Server 2012的操作环境。3、连接SQL Server之前应先启动SQL Server服务,即SQL Server(MSSQLSERVER): ⽅法1 开始--所有程序--Microsoft SQL Server 2012--配置⼯具--SQL Server配置管理器。 ⽅法2 控制⾯板--系统和安全--管理⼯具--服务。【 √ 】4、登录账户: (1) 创建:“Windows⾝份验证”登录--对象资源管理器--安全性--右击登录名--新建登录名 (2) 修改密码:“Windows⾝份验证”登录--对象资源管理器--安全性--打开登录名--双击⾃定义的登录名 (3) 赋予权限:双击⾃定义的登录名--属性--服务器⾓⾊ / ⽤户映射 (4) 删除:右击⾃定义的登录名--删除第3章 数据库的创建与管理1、数据库按照⽤途分类:系统数据库和⽤户数据库。 系统数据库: (1) master:核⼼,⽤户不能直接修改,损坏则SQL Server服务器不能⼯作,需定期备份。 (2) model:模板,⽤模板中的默认值创建新的空⽩数据库。修改model将影响所有使⽤模板创建的数据库。 (3) msdb:代理服务数据库,供SQL Server代理程序调度警报、作业及记录操作。 (4) tempdb:临时数据库,所有建⽴的临时表和临时存储过程,启动时重建,关闭时清空。 ⽤户数据库:由⽤户⾃⾏创建的数据库。2、⽂件 (1) 数据库⽂件:存放数据库数据和数据库对象,可有多个数据库⽂件。 类型:a. 主数据⽂件:“. mdf ”,有且只有⼀个,存储数据库启动信息数据,是数据库的起点。 b. 次要数据库:“. ndf ”,可以有0或多个,除主数据⽂件外其余的都是次要数据⽂件。 (2) 事务⽇志⽂件:“. ldf ”,⾄少有⼀个,记录数据库增删改及故障记录,可分析故障原因并恢复数据。3、创建数据库 «CREATE DATABASE 数据库名[ ON [ PRIMARY ][ <数据⽂件参数>[ , ... n ][ , <⽂件组参数>[ , ... n ]][ LOG ON { <⽇志⽂件参数>[ , ... n ] } ]
<⽂件参数> :: ={
( [ NAME = 逻辑⽂件名, ] FILENAME = 物理⽂件名 [ , SIZE = ⼤⼩ [ , MAXSIZE = { 最⼤容量 | UNLIMITED }]CREATE DATABASE mytest ON PRIMARY(NAME = ‘ mytest_data1 ’,FILENAME = ‘ d : db mytest_data1 . mdf ’,SIZE = 6MB ,MAXSIZE = 30MB ,FILEGROWTH = 15 %) ,(NAME = ‘ mytest_data2 ’,FILENAME = ‘ d : db mytest_data2 . mdf ’,SIZE = 4MB ,MAXSIZE = 30MB ,FILEGROWTH = 15 %)
LOG ON(NAME = ‘ mytest_log1 ’, [ , FILEGROWTH = 增长量 [ KB|MB|GB|TB|% ]FILENAME = ‘ d : db mytest_log1 . ldf ’, [ , FILEGROWTH = 增长量 [ KB|MB|GB|TB|% ]FILENAME = ‘ d : db mytest_log1 . ldf ’, ] )
[ , ... n ]
}<⽂件组参数> :: ={ FILEGROUP ⽂件组名 [ DEFAULT ] <⽂件参数>[ , ... n ]}SIZE = 1MB ,MAXSIZE = 20MB ,FILEGROWTH = 5 %) ,(NAME = ‘ mytest_log2 ’,FILENAME = ‘ d : db mytest_log2 . ldf ’,SIZE = 1MB ,MAXSIZE = 20MB ,FILEGROWTH = 5 %)
GO● ON:指定⽤来存储数据库中数据部分的磁盘⽂件——数据⽂件。● PRIMARY:指定关联数据⽂件的主⽂件组。若未指定PRIMARY,则CREATE的第⼀个⽂件为主数据⽂件。● LOG ON:指定⽤来存储数据库中⽇志部分的磁盘⽂件——⽇志⽂件。如果没有LOG ON系统将⾃⼰创建。● ⽂件参数:定义⽂件属性。 NAME:指定⽂件逻辑名称,是数据库在SQL Server中的标识符。 FILENAME:指定数据库所在⽂件的操作系统⽂件名称和路径,要确保路径已经存在。 SIZE:指定⽂件初始⼤⼩,应不⼩于model数据库的主数据⽂件的⼤⼩。若未指定则使⽤model数据库主数据⽂件的⼤⼩。 次要数据⽂件未指定⼤⼩,则以1MB作为该⽂件的⼤⼩。 MAXSIZE:指定操作系统⽂件可增长到的最⼤尺⼨。若未指定则⽆限⼤(UNLIMITED),直到磁盘被占满。 FILEGROWTH:指定⽂件的⾃动增量。MB或者%,若为0则不允许⽂件增长。● ⽂件组参数:控制⽂件组属性。 FILEGROUP:⽂件组逻辑名称,须唯⼀且符合标识符规则。 DEFAULT:指定该⽂件组为数据库中默认的⽂家组。4、数据库管理 (1) 查看及修改:右键--属性 (2) 更名:⽅法1 使⽤SSMS图形界⾯ ⽅法2 使⽤T-SQL语句:ALTER DATABASE mytest MODIFY NAME = db_mytest (3) 删除:⽅法1 使⽤SSMS图形界⾯ ⽅法2 使⽤T-SQL语句:DROP DATABASE mytest5、数据库的分离,即只将⽤户数据库从SSMS中删除,对应的物理⽂件.mdf和.ldf不删除。 (1) 分离:⽤户数据库--右键--任务--分离 (2) 附加:数据库--右键--附加--添加 (3) 移动:分离--剪切.mdf和.ldf--附加 (4) 复制:(⽤户数据库--右键--任务--脱机)--复制.mdl和.ldf --(右键--联机)第4章 数据表的创建与管理1、数据表的创建 (2) 使⽤T-SQL语句创建数据表 CREATE TABLE 表名USE TestStudentdb ——说明对哪⼀个数据库进⾏操作 CREATE TABLE 表名 (USE TestStudentdb ——说明对哪⼀个数据库进⾏操作GO 列名1 数据类型 列的特征,CREATE TABLE TestScore 列名2 数据类型 列的特征,( ... ... 列名n 数据类型 列的特征 )testsco_id INT IDENTITY(1 , 1) , ——标识列(int),从1开始递增testsco_stuno VARCHAR(10) NOT NULL , ——⾮空testsco_overall FLOAT ——未说明,可为空)GO ——怎么设置主键?CREAT TABLE [ DataBaseName.[ SchemaName ].] TableName /*创建表的数据库名*/ /*创建表的架构名*/ /*创建表的名称*/(column_name data_type [NOT NULL]|[DEFAULT[expression]]|{PRIMARY KEY|UNIQUE}[CLUSTERED|NONCLUSTERED][ASC|DESC])[, ...n] /*各列名称*//*数据类型*//*列值⾮空*/ /* 指定列的默认值 */ /* 主码 */ /*标识列*//*聚集索引*/ /* ⾮聚集索 *//*默认*//*降*/
2、数据表的管理 (1) 使⽤SSMS图形界⾯管理数据表 (2) 使⽤T-SQL管理数据表:(单击“新建查询”打开空⽩.sql--输⼊T-SQL语句--单击V检查--单击!执⾏--检查表中数据) a. 添加字段:SSMS数据表--右键--设计 表右键语法ALTER TABLE 表名ADD 字段名 字段类型 列的特征 修改字段类型:SSMS数据表--右键--设计 表右键语法ALTER TABLE 表名ALTER COLUMN 字段名 字段类型 列的特征 删除字段:SSMS数据表--右键--设计 表右键语法ALTER TABLE 表名DROP COLUMN 字段名 b. 添加约束CONSTRAINT: ALTER TABLE 表名 ADD CONSTRAINT 约束名 约束类型 具体的约束说明 主键约束 PRIMARY KEY:SSMS举例设计--列名--右键--设置主键 列名右键ALTER TABLE StudentTest /* 表级约束只要这部分 */ADD CONSTRAINT PK_stutestno PRIMARY KEY (stutest_no)GO <约束名> <列名> [, ... n] 注:每个表只能有⼀个主键约束,且其约束的列值不能重复或空。 外键约束FOREIGN KEY(关系): 设计右击空⽩--关系--添加--常规·表达式--选择对应 空⽩右键举ALTER TABLE ScoreTest /* 表级约束不省略这部分 */例ADD CONSTRAINT FK_scoteststuno FOREIGN KEY(scotest_stuno) REFERENCES StudentTest (stutest_no)GO <约束名> <列名> <外表名> <列名>
注:外键所引⽤的列必须是主键约束的列或标识列; ⽤户数据库--数据库关系图--新建--全选--添加--保存--刷新。 唯⼀约束UNIQUE(标识列):SSMS设计--列属性--(是标识)--“是” 列属性举例ALTER TABLE StudentTest举例ALTER TABLE StudentTestADD CONSTRAINT UQ_stutestname UNIQUE (stutest_name) 注:可在⼀表中定义多个UNIQUE,也可在多个列上定义⼀个UNIQUE,其组合不重复即可。 表设计--右击空⽩--索引/键--查看唯⼀键。 默认约束DEFAULT:SSMS设计--列属性--默认值或绑定--输⼊内容 列属性举例ALTER TABLE StudentTestADD CONSTRAINT DF_stutestnative DEFAULT(‘吉林’) FOR stutest_native 检查约束CHECK:SSMS设计右击空⽩--CHECK--添加--常规·表达式--输⼊ 空⽩右键举例ALTER TABLE StudentTestADD CONSTRAINT CK_stutestemail CHECK(stutest_email like ‘%@%.%’) 例:stu_email like (注:%表⽰任意多个字符) 删除约束: ALTER TABLE 表名 DROP CONSTRAINT 约束名(如CK_stutestemail)3、数据表的删除
(1) 使⽤SSMS图形界⾯删除数据表 (2) 使⽤T-SQL删除数据表:DROP TABLE 表名第5章 数据管理(增、删、改、导⼊导出)1、使⽤SSMS图形管理界⾯ (1) 添加数据:右击表--编辑前200⾏--增加字段的值 (2) 修改数据:右击表--编辑前200⾏--修改字段的值 (3) 删除数据:右击表--编辑前200⾏--右击选中⼀条记录--删除2、使⽤T-SQL (单击“新建查询”打开空⽩.sql--输⼊T-SQL语句--单击V检查--单击!执⾏--检查表中数据) (1) 插⼊单⾏数据: 语法:INSERT [ INTO ] <表名> [列名列表] VALUES <值列表> INTO:“[]”表⽰可选部分,增强可读性。 表名:指定向哪个表插⼊数据。 列名:若有多列可⽤逗号隔开,若省略列名则按数据表定义的顺序依次插⼊数据。 值列表:插⼊各列对应的数值,逗号隔开,值与列对应,字符串⽤单引号。 注:不要向标识列中插⼊数据值。 (注:红⾊为常见易错处) 在插⼊数据时注意不要违反CHECK约束。 若字段不允许为空,且未设置默认值,则必须给该字段设置数据值。 可以使⽤关键字DEFAULT代替插⼊的数值,这样可以改具有默认值的列插⼊数据。
(2) 插⼊多⾏数据: ● 从⼀个表中查询出来部分信息,将这些信息插⼊到另外⼀个表中: INSERT INTO Contact (con_name, con_email, con_phone) SELECT stu_name, stu_email, stu_phone FROM Student ● 通过Union关键字合并数据进⾏插⼊: INSERT INTO Contact (con_name, con_email, con_phone) SELECT ‘黄飞’, ‘huangfei@’, ‘’ UNION SELECT ‘徐强’, ‘xuqiang@’, ‘’ UNION SELECT ‘段悦’, ‘duanyue@’, ‘’ 注:UNION关键字将两个不同的数据或查询结果组合成⼀个新的结果集,注意个数、顺序、类型。 ● 通过VALUE⽅式⼀次插⼊多条记录: INSERT INTO Contact (con_name, con_email, con_phone) VALUES (‘胡康’, ‘hukang@’, ‘’) , (‘周星’, ‘zhouxing@’, ‘’) , (‘李刚’, ‘ligang@’, ‘’)
(3) 更新数据:UPDATE <表名> SET <列名=更新值> [WHERE<条件>] SET指定更新的列和值,多个“列名=更新值”⽤逗号隔开,最后⼀个“列名=更新值”不加逗号 WHERE⼦句是可选的,若省略则对表中所有记录进⾏更新。 ● 更新单⾏:UPDATE Contact SET con_email = ‘ww@’, con_phone = ‘’
WHERE con_id=1 ● 更新多⾏:UPDATE Contact SET con_email = ‘zjff@’ WHERE con_email = NULL ● 更新所有:UPDATE Contact SET con_phone = ‘ ’ (4) 删除数据:DELETE FROM <表名> [WHERE<条件>] ● 删除单⾏:DELETE FROM Contact WHERE con_id = 0 注:在删除主表中某条数据信息时,若该信息在⼦表中以外键形式存在,则禁⽌删除主表中该信息。
办法是将主表中要删除的信息先在⼦表中全部删除。简便的⽅法是触发器。 ● 删除多⾏:DELETE FROM Contact WHERE con_class = ‘12⾃动化’ ● 删除所有:DELETE FROM Contact 扩展:TRUNCATE TABLE <表名> TRUNCATE TABLE⽤来删除表中所有⾏,但表的结构、列、约束、索引等不会被改动, ⽐DELETE执⾏速度快,且占⽤资源和⽇志少,该操作不能⽤于有外键约束引⽤的表。3、导⼊/导出数据 (1) ⽂本⽂件·导⼊·数据库数据 右击数据库--任务--导⼊数据--打开“SQL Server导⼊导出向导”窗⼝--下⼀步 打开“选择数据源”窗⼝--“数据源”选“平⾯⽂件源”--单击“浏览”选择导⼊的⽂件路径--取消“在第⼀个数据中显⽰列名称”框 下⼀步--下⼀步--选择要导⼊的数据库--下⼀步--选择要导⼊的数据表 下⼀步--保持默认--下⼀步--选中“⽴即运⾏”复选框--下⼀步--完成--单击关闭按钮即可查看导⼊的数据。 (2) 表格⽂件·导⼊·数据库数据 右击数据库--任务--导⼊数据--打开“SQL Server导⼊导出向导”窗⼝--下⼀步 “选择数据源”窗⼝--“数据源”选“Microsoft Excel”--单击“浏览”选择导⼊的Excel路径--取消“⾸⾏包含列名称”复选框 下⼀步--选择要导⼊的数据库--下⼀步--选中“复制⼀个或多个表或视图的数据”单选按钮 下⼀步--选中Sheet$选项--在⽬标处选择要导⼊的数据表 下⼀步--保持默认--下⼀步--选中“⽴即运⾏”复选框--下⼀步--完成--单击关闭按钮即可查看导⼊的数据。 (3) 数据库数据·导出·⽂本⽂件 右击数据库--任务--导出数据--打开“SQL Server导⼊导出向导”窗⼝ 下⼀步--打开“选择数据资源”窗⼝--选择要导出的数据库 下⼀步-打开“选择⽬标”窗⼝ “⽬标”选择“平⾯⽂件⽬标”并选择⽂件路径及要保存的⽂件名 下⼀步--打开“指定表复制或查询”窗⼝--保持默认 下⼀步--打开“配置平⾯⽂件⽬标”窗⼝并在“源表或源视图”选择要导出的数据表 下⼀步--打开“保存并运⾏”窗⼝--保持默认 下⼀步--打开“完成该向导”窗⼝--单击完成打开“执⾏成功”窗⼝--单击关闭按钮即可查看导出的⽂件。 (4) 数据库数据·导出·表格⽂件 右击数据库--任务--导出数据--打开“SQL Server导⼊导出向导”窗⼝ 下⼀步--打开“选择数据资源”窗⼝--选择要导出的数据库 下⼀步-打开“选择⽬标”窗⼝ “⽬标”选择“Microsoft Excel”并选择⽂件路径及要保存⽂件名 下⼀步--打开“指定表复制或查询”窗⼝--保持默认 下⼀步--打开“选择源表或源视图”窗⼝并选择要导出的数据表 下⼀步--打开“查看数据类型映射”窗⼝ 下⼀步--打开“保存并运⾏包”窗⼝ 下⼀步--打开“完成该向导”窗⼝--单击完成打开“执⾏成功”窗⼝--单击关闭按钮即可查看导出的⽂件。第6章 数据查询(T-SQL语句)1、SELECT语句 SELECT [ ALL | DISTINCT ] [ TOP n[ PRECENT ] [ WITH TIES ] ] { * | <字段列表> } FROM 表名 | 视图名 [ WHERE <检索条件表达式> ] [ GROUP BY <分组依据列> ] [ HAVING <组提取条件表达式> ] [ ORDER BY <排序依据列> ] [ ASC | DESC ] 注:ALL:默认,查询出的结果可以包含重复⾏。 DISTINCT:查询的结果如果有值相同的⾏,则只显⽰其中⼀⾏。 TOP n[ PRECENT ]:返回查询结果的前n⾏,或前百分之n⾏。 { * | <字段列表> }:“*”表⽰查询所有字段;<字段列表>表⽰查询指定的字段,多个字段逗号隔开。2、查询列 ● 查询全部列:SELECT * FROM <表名> ● 查询指定列:SELECT <列名1> [ , ...n ] FROM <表名> ● 查询计算后的列:SELECT 2016-brthday AS age FROM <表名> (注:在查询中使⽤常量列同理,包括‘字符串’) ● 改变查询结果的列名:SELECT <列名> AS <新名> FROM <表名> (注:使⽤* 不可指定列别名,多列逗号隔开) ● TOP关键字限制返回⾏数:SELECT TOP n <列名> [, ...n][WITH TIES] FROM <表名> 注:TIES可并列 ● 消除重复的数据⾏:SELECT DISTINCT <列名> FROM <表名>3、查询⾏(条件查询) ● ⽐较判断符:SELECT * FROM Student WHERE stu_sex = ‘男’ =、>、>=、<、<=、!=
● 逻辑运算符:SELECT * FROM Student WHERE stu_sex = ‘男’ AND stu_age = ‘16’ AND、OR、NOT
● 空值判断符:SELECT stu_name FROM Student WHERE stu_native IS [NOT] NULL ● 范围运算符:SELECT * FROM Student WHERE stu_age [NOT] BETWEEN 13 AND 16 ● 列表运算符:SELECT * FROM Student WHERE stu_native [NOT] IN (‘北京’, ‘上海’) ● 模式匹配符:SELECT stu_name, stu_sex FROM Student WHERE stu_sex [NOT] LIKE ‘李%’ _:任何单个字符%:任意多个字符,包括0个[ ]:指定范围内的单个字符,如[abf-z]表⽰除‘c’ ‘d’ ‘e’以外任意⼀个字符[^]:不在指定范围内的单个字符,如[abf-z]表⽰‘c’ ‘d’ ‘e’之内任意⼀个字符LIKE ‘ab%’LIKE ‘%ab’LIKE ‘%ab%’LIKE ‘_ab’LIKE ‘_[abc]’LIKE ‘[abc]%’返回以‘ab’开头的任意字符串返回以‘ab’结尾的任意字符串返回包含‘ab’的任意字符串返回以‘ab’结尾的包含三个字符的任意字符串返回第⼆个字符是的任意字符串返回以‘a’ ‘b’或‘c’开头的任意字符串4、查询排序 ● 对⼀列排序:SELECT * FROM Student ORDER BY stu_id ASC (注:可省略ASC,默认升序) ● 对多列排序:SELECT * FROM Score ORDER BY sco_overall DESC, sco_usual DESC (⽭盾处如何取舍?)5、聚合函数 ● SELECT SUM(sco_overall) AS ‘总评成绩总分’, AVG(sco_overall) AS ‘总评成绩平均分’ FROM Score 注:SUM()和AVG()——所包含的列必须是数值型 ● SELECT MAX(sco_overall) AS ‘总评成绩最⾼分’, MIN(sco_overall) AS ‘总评成绩最低分’ FROM Score ● SELECT COUNT(*) AS ‘及格数’, FROM Score WHERE sco_overall >= 60 (注:COUNT(*)——包括空值⾏) SELECT COUNT(stu_phone) AS ‘有⼿机号码的⼈数’ FROM Student (注:COUNT(字段名)——不包括空值⾏)6、分组查询 ● GROUP BY分组: 例:SELECT Cno AS ‘课程号’ COUNT(Sno) AS ‘选课⼈数’ FROM SC WHERE Sdept = ‘信息’ GROUP BY Cno /*先执⾏WHERE选出信息系学⽣,再执⾏GROUP BY对SC表按Cno分组(同Cno⼀组),最后执⾏COUNT求每组⼈数*/注:GROUP BY后不能⽤AS指定的别名,如‘课程号’;GROUP BY分组依据列不能是text、ntext、image和bit类型的列。 ● HAVING分组 说明:WHERE筛选FROM指定的表,GROUP BY对筛选结果进⾏分组,HAVING在对分组进⾏⼆次筛选) WHERE和HAVING的区别: ● WHERE中使⽤的条件在HAVING中同样适⽤; ● WHERE中不可以包含聚合函数,HAVING可以; ● WHERE的条件在分组之前应⽤,HAVING在之后。 例:SELECT Sno, COUNT(*) AS ‘选课门数’ FROM SC WHERE Sdept = ‘信息’ GROUP BY Sno HAVING COUNT(*)>3 /*先执⾏WHERE选出信息系学⽣,再执⾏GROUP BY将学⽣按学号Sno分组,再执⾏HAVING将COUNT(*)>3的选出*/ 辩:SELECT Sdept, COUNT(*) FROM Student WHERE Sdept IN(‘计算机’, ‘信息’) GROUP BY Sdept 【 √ 】 ... ... ... ... ... ... ... ... ... ... ... ... ... .... GROUP BY Sdept HAVING Sdept IN(‘计算机’, ‘信息’) 【 √ 】 SELECT Sdept, COUNT(*) FROM Student WHERE Sage<=20 GROUP BY Sdept 【 √ 】 ... ... ... ... ... ... ... ... ... ... ... ... ... ... GROUP BY Sdept HAVING Sage<=20 【 × 】 注:GROUP BY后结果中只含分组依据列Sdept和五个聚合函数,即执⾏到HAVING时已没有Sage列 ! ! !
即,HAVING中只能包含聚合函数和分组依据列 !
7、多表连接查询 (1) 内连接 语法:SELECT 列表.列名 FROM 列表1 [INNER] JOIN 列表2 ON 连接条件表达式 ● 等值连接:连接条件表达式使⽤“=”,查询结果中列出被连接表中的所有列,包括重复列。 SELECT * FROM Student INNER JOIN Class ON _classid=_id (注:*指Student的所有列) ● ⾃然连接:连接条件表达式使⽤“=”,查询结果中列出被连接表中的所有列,删除重复列。 (注:语法上与上区别?) SELECT Student.*, _name FROM Student INNER JOIN Class ON _classid=_id
● 使⽤表别名:原名 [AS] 别名 (注:后⾯改的名字,前⾯已经可以使⽤了?) SELECT _name, _name FROM Teacher AS t INNER JOIN Department AS d ON _depid=_id● 多表内连接:每增加⼀张表,就增加⼀个[INNER] JOIN ... ON⼦句。 SELECT _name, _name, _overall FROM Score INNER JOIN Student ON _stuno=_no INNER JOIN Student ON _courseid=_id (2) 外连接● 左外连接LEFT [OUTER] JOIN:结果不仅包括连接列所匹配的⾏,还包括LEFT [OUTER] JOIN指定的左表的所有⾏, 若左表某⾏在右表没有匹配⾏,则结果集中右表的所有选择列均为空值。 语法:SELECT 列表.列名 FROM 表1 LEFT [OUTER] JOIN 表2 ON 连接条件表达式● 右外连接RIGHT [OUTER] JOIN:同理。 语法:SELECT 列表.列名 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 连接条件表达式● 全外连接FULL [OUTER] JOIN:同理。 语法:SELECT 列表.列名 FROM 表1 FULL [OUTER] JOIN 表2 ON 连接条件表达式 (3) 交叉连接 含义:将连接的两个表的所有⾏进⾏组合形成⼀个结果集,相当于两个表的“乘积”。 语法:SELECT 列表.列名 FROM 表1 CROSS 表2第7章 T-SQL语句1、语⾔分类 ● 数据操作语⾔DML:INSERT、DELETE、UPDATE、SELECT ● 数据控制语⾔DCL:GRANT、DENY、REVOKE ● 数据定义语⾔DDL:CREATE/DROP/ALTER TABLE/VIEW/INDEX/PROCEDURE/TRIGGER ● 附加语⾔元素:SET/BEGIN TRANSACTION/COMMIT、OPEN、CLOSE、DECLARE、ROLLBACK、FETCH、EXECUTE ● 注释:单⾏注释( “ -- ” ); 多⾏注释( “ /* ... */ ” )2、变量 (1) 局部变量(前缀@) ● 声明:DECLARE @变量名 数据类型 ● 赋值:⽅法1:SET @变量名=值 ⽅法2:SELECT @变量名=值 (注:要确保查询的记录不多于⼀条,否则把最后⼀条查询记录的值赋给变量) ● 例:DECLARE @name VARCHAR(10) DECLARE @classid VARCHAR(10) SET @name = ‘王濛’ --为@name赋值 SELECT @classid = stu_classid FROM Student WHERE stu_name = @name --为@classid赋值 SELECT * FROM Student WHERE stu_classid = @classid (2) 全局变量(前缀@@)全局变量@@CONNECTIONS@@ERROR@@IDENTITY@@LANGUAGE说明返回⾃上次启动SQL Server以来连接或试图连接的次数。返回最后⼀个T-SQL错误的错误号,没有错误返回0。返回最后插⼊⾏的标识列的列值。返回当前使⽤语⾔的名称。@@MAX_CONNECTIONS返回SQL Server实⼒允许同时进⾏的最⼤⽤户数。@@REMSERVER@@ROWCOUNT@@SERVERNAME@@SERVICENAME@@TRANSCOUNT返回登录记录中记载的远程SQL Server服务器的名称。返回收上⼀个SQL语句影响的⾏数。返回本地服务器名称。返回该计算机上的SQL服务的名称,若当前实⼒为默认实例,则返回MSSQLSERVER。@@VERSION返回当前连接的活动事务数。返回SQL Server的版本信息。例:SELECT @@LANGUAGE AS ‘使⽤语⾔’, @@SERVICENAME AS ‘SQL服务名称’3、输出语句⽅法1:SELECT 变量 AS ⾃定义列名0 例:SELECT @@LANGUAGE AS ‘当前使⽤的语⾔’ (注:输出结果以表格⽅式显⽰)⽅法2:PRINT 变量或字符串
例:PRINT ‘当前使⽤的语⾔是:’ + @@LANGUAGE (注:输出结果以⽂本⽅式显⽰) 例:PRINT ‘当前错误号是:’ + @@ERROR (注:⽂本类型 + 整数类型 = 出错) 改:PRINT ‘当前错误号是:’ + CONVERT(VARCHAR(10), @@ERROR)4、流程控制语句 技巧:将表格数据和⽂本消息输出在同⼀窗⼝——⼯具--选项--查询结果--将查询结果的默认⽅式改为:以⽂本格式显⽰结果!WHILE、END、IF...ELSE语句DECLARE @num intWHILE(1=1)BEGINCASE语句CASE 表达式WHEN 值/表达式 THEN 结果... ... SELECT @num = COUNT(*) FROM Score WHERE sco_overall <= 50[ELSE 其他结果] IF(@num>0) UPDATE Score SET sco_overall = sco_overall + 1 ELSE BREAKEND5、批处理语句批处理是⼀条或多条T-SQL语句集合,这些语句为完成⼀个整体的⽬标⽽同时执⾏,GO是结束标志。 SQL Server规定,创建库、创建表、创建存储过程、创建视图等,都必须在结尾加上“GO”批处理标志。第8章 数据查询进阶--⼦查询 若⼀个SELECT嵌套在INSERT、DELETE、UPDATESELECT中,则称为嵌套查询。外层是主查询;内层是⼦查询,⼦查询⽤括号括起来,先执⾏,但⼦查询的SELECT语句中不能使⽤ORDER BY⼦句(ORDER BY只能对最终查询结果进⾏排序)。1、使⽤⽐较运算符的(不相关)⼦查询:语法:WHERE 表达式 ⽐较运算符 (⼦查询)例:SELECT stu_name FROM Student WHERE stu_sex = (SELECT stu_sex FROM Student WHERE stu_name = ‘王濛’)2、使⽤[NOT] IN的(不相关)⼦查询:语法:WHERE 表达式 [NOT] IN (⼦查询)例:查询选修VB课程的学⽣的学号和姓名。⽅法1:SELECT Sno, Smane FROM Student S ON = JOIN Course C = WHERE Cname =‘VB’⽅法2:SELECT Sno, Sname FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno IN (SELECT Cno FROM Course WHERE Cname = ‘VB’))3、使⽤[NOT] EXISTS的(相关)⼦查询:语法:WHERE 表达式 [NOT] EXISTS (⼦查询)说明:系统对EXISTS后⾯的⼦查询进⾏运算判断它是否返回⾏,若⾄少返回⼀⾏,则EXISTS的结果为TRUE,否则为FALSE, 外层查询在EXISTS为TRUE时才执⾏。由于EXISTS只返回真假,在⼦查询中指定列名没有意义,因此列名通常⽤“*”。例:查询没有选修“c01”课程的学⽣的姓名。法1:SELECT DISTINCT Sname FROM Student S JOIN SC ON = WHERE Cno != ‘c01’ 【×】END 法2:SELECT Sname FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno != ‘c01’) 【×】 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... [NOT] IN (SELECT Sno FROM SC WHERE Cno = ‘c01’) 【√】法3:SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno= AND Cno != ‘c01’)【×】 ... ... ... ... ... ... ... ... ... ... ... ... [NOT] EXISTS (SELECT * FROM SC WHERE Sno= AND Cno = ‘c01’)【√】注:三种错误的原因相同,在查询时是组⾏判断的,⽽这三种情况下只要满⾜Cno != ‘c01’就作为结果,使得结果中既包含没有c01的学⽣,也包括选c01的同时也选了其他课程的学⽣。第9章 索引、视图、事务、存储过程、触发、游标(并发控制、函数)第1章 下载及安装
发布评论