码迷,mamicode.com
首页 > 数据库 > 详细

SQL

时间:2020-02-14 16:26:16      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:硬件   过程   tun   交运算   convert   工程   恢复   name   typename   

一、数据库的创建

二、数据库的分离与附加

当需要把数据库从一个位置复制到另外的地点时,比如从学校的机房复制到寝室的个人电脑中,需要分离和附加数据库
 1 --创建数据库
 2 create database StudentDB_New
 3 on primary
 4 (
 5     name=StudentDB,
 6     filename=C:\Study File\DATA1\StudentDB.mdf,
 7     size=3mb,
 8     maxsize=unlimited,
 9     filegrowth=1mb
10 ),
11 (
12     name=StuDB1,
13     filename=C:\Study File\DATA2\StuDB1.ndf,
14     size=3mb,
15     maxsize=unlimited,
16     filegrowth=1mb
17 ),
18 (
19     name=StuDB2,
20     filename=C:\Study File\DATA2\StuDB2.ndf,
21     size=3mb,
22     maxsize=unlimited,
23     filegrowth=1mb
24 )
25 log on
26 (
27     name=StudentDB_log,
28     filename=C:\Study File\DATA1\StudentDB_log.ldf,
29     size=1mb,
30     maxsize=1gb,
31     filegrowth=10%
32 )
33 
34 --修改数据库
35 alter database StudentDB_New 
36 modify file
37 (
38     name=StudentDB,
39     size=5mb
40 )
41 
42 --修改数据库:添加一个辅助数据文件到新文件组,先创建文件组再创建文件
43 alter database StudentDB_New
44 add filegroup GData
45 go
46 alter database StudentDB_New
47 add file
48 (
49     name=StuDB3,
50     filename=C:\Study File\DATA2\StuDB3.ndf
51 )
52 to filegroup GData
53 
54 --删除数据库的辅助数据文件StuDB3
55 alter database StudentDB_New
56 remove file StuDB3
57 
58 --删除数据库
59 drop database ---
60 
61 --分离数据库,不分离的话无法复制转移
62 exec sp_detach_db StudentDB_New
63 
64 --附加数据库,地址可以写拷贝到的新的位置
65 create database StudentDB_New
66 on primary
67 (
68     name=StudentDB,
69     filename=C:\Study File\DATA1\StudentDB.mdf
70 )
71 for attach

数据库的分离和附加区别与数据库的删除:数据库的删除就是彻底把物理文件删除掉,像恢复都不可能,但数据库分离只是切掉了数据库和服务器的联系,还是可以再移植回去

三、创建架构

1. 架构的概念
  • 架构是指包含图表、视图、过程的容器
  • 位于数据库内部,而数据库位于服务器内部
  • 特定架构中的每个安全对象都必须有唯一的名称
  • 架构中安全对象的完全指定名称:server.database.schema.object (数据库服务器名.数据库名.架构名.对象名)
1 --创建架构
2 use StudentDB_New
3 go
4 create schema my
5 
6 --删除架构
7 drop schema my

四、创建及维护数据表、创建分区表与视图

1. 数据表的创建与维护
 1 use StudentDB_New
 2 --创建数据表
 3 create table Tb_Stu_Info
 4 (
 5     Stu_No varchar(20) primary key not null,
 6     Stu_Name nvarchar(10), 
 7     Stu_Sex nvarchar(6),
 8     Stu_Birthday date,
 9     Stu_Address nvarchar (200)
10 )
2. 数据表的修改
 1 --修改数表据Tb_Stu_Info, 增加名为STEST的列,数据类型为int,不为空
 2 alter table dbo.Tb_Stu_Info
 3 add stest int not null
 4 
 5 --修改STEST列的数据类型
 6 alter table tb_stu_info
 7 alter column stest varchar(20)
 8 
 9 --删除stest列
10 alter table dbo.Tb_Stu_Info
11 drop column stest
12 --删除多列
13 alter table dbo.Tb_Stu_Info
14 drop column Stu_Birthday, Stu_Address
15 
16 --新建列
17 alter table dbo.Tb_Stu_Info
18 add Stu_Birthday date,
19     Stu_Address nvarchar(200)
20 
21 --删掉数据表
22 drop table dbo.Tb_Stu_Info

五、创建分区表

1. 创建分区表的步骤
  • 创建分区函数:告诉SQL如何将数据进行分区
  • 创建分区方案:告诉SQL将已分区的数据放在哪个文件组中
  • 创建表
2. 创建分区表的意义
分区是要把一个表数据拆分为若干子集合,也就是把把一个数据文件拆分到多个数据文件中,然而这些文件的存放可以依托一个文件组或这多个文件组,由于多个文件组可以提高数据库的访问并发量,还可以把不同的分区配置到不同的磁盘中提高效率,所以创建时建议分区跟文件组个数相同。
分区表的表数据按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分成多个小的文件,还可以把这些小文件放在不同的磁盘下由多个cpu进行处理,这样文件的大小随着拆分而减小,还得到硬件系统的加强,自然对我们处理数据大大有利。所以大数据量的数据表,对分区的需要还是有必要的,因为它可以提高select效率,还可以对历史数据进行区分存档等.
3. 创建分区表
 1 --创建分区表
 2 /*在stuseldb中,依据表studentinfo的stdinfoyear列来创建分区函数YearOrderPartFunc,
 3 边界值为2007和2009.*/
 4 
 5 --首先创建分区函数,可以把as翻译成“依据,按照”
 6 create partition function YearOrderPartFunc1(int)
 7 as range left for values(2007, 2009)
 8 --其次创建分区方案
 9 create partition scheme YearOrderPartScheme
10 as partition YearOrderPartFunc1
11 to([primary], fgroup2,fgroup3) 
12 --最后依据分区方案创建表
13 create table Tb_StudentInfo
14 (
15     StdInfoID int identity(1,1) not null,
16     StdName varchar(20) not null,
17     StdYear int not null
18 )
19 on YearOrderPartScheme(StdYear)
20 --int identity(1,1)表示从1开始递增,每次增加1
21 
22 --查看数据所在分区
23 select *, $partition.YearOrderPartFunc1(StdYear)
24 as 所属分区
25 from dbo.Tb_StudentInfo

六、创建视图

视图与表不同,视图是一个虚表,即视图所对应的数据不进行实际的存储,数据库中只存储视图的定义,对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表
 1 --创建视图,查询每门课程的授课老师
 2 create view View_TeacherCourse
 3 (课程名称,老师姓名)
 4 as 
 5 select CourseInfoName,TeachInfoName
 6 from dbo.CourseInfo a join dbo.TeachCourse b
 7 join dbo.TeachInfo c
 8 on b.TeachCourseID=c.TeachInfoID
 9 on a.CourseInfoID=b.CourseInfoID 
10 
11 select * from dbo.View_TeacherCourse
12 
13 --查看视图的定义
14 sp_helptext View_TeacherCourse
15 
16 --修改视图
17 alter view View_TeacherCourse
18 (课程名称,老师姓名,职称)
19 as 
20 select CourseInfoName,TeachInfoName,TeachInfoKnow1
21 from dbo.CourseInfo a join dbo.TeachCourse b
22 join dbo.TeachInfo c
23 on b.TeachCourseID=c.TeachInfoID
24 on a.CourseInfoID=b.CourseInfoID 
25 
26 --删除视图
27 drop view View_TeacherCourse

七、创建表的约束、创建索引

1. 约束
约束是SQL Sever提供的自动保持数据库完整性的一种方法。有五种约束类型
  • 主关键字约束(Primary Key Constraint)
  • 外关键字约束(Foreign Key Constraint)
  • 唯一性约束(Unique Constraint)
  • 检查约束(Check Constraint)
  • 默认约束(default Constraint)
 1 --Not NULL 约束
 2 create table StudentInfo
 3 (
 4     StuInfoID int identity(1,1) not null,
 5     StuName varchar(20) not null,
 6     StuAge int 
 7 )
 8 
 9 --default 约束
10 --创建班级信息表,系部默认为“软件学院”,班级人数默认“0”.
11 --创建表的时候来定义约束
12 create table ClassInfo
13 (
14     ClassInfoID int not null,
15     ClassInDep varchar(20) not null default(软件学院),
16     ClassInfoCount int not null default(0)
17 )
18 
19 --修改表的时候来定义约束:
20 --给班级编号增加默认值“1001”
21 alter table ClassInfo
22 add constraint df_classInfoID default(1001) for ClassInfoID
23 
24 --unique 约束
25 --字段值取值唯一,允许NULL值(只能出现一次)
26 create table StudentInfo2
27 (
28     StdID int not null,
29     StdInfoNum varchar(20) not null unique,
30     StdInfoCard varchar(18)
31 )
32 
33 alter table StudentInfo2
34 add constraint uq_card unique(StdInfoCard)
35 
36 --Check 约束 (score between 0 and 100)
37 create table StudentScore
38 (
39     StdID int not null,
40     CourseID int not null,
41     Score numeric check(Score>=0 and Score<=100),
42     CourseStartData date not null
43 )
44 
45 alter table StudentScore
46 add constraint ck_StartDate check(CourseStartDate>=2014-2-1and CourseStartDate<=2014-2-8)
47 
48 --parimary key 约束: 取值范围唯一且不允许NULL
49 create table StudentInfo3
50 (
51     StuInfoID int primary key not null,
52     StuName varchar(20) 
53 )
54 
55 alter table StudentInfo3
56 add constraint pk_ID primary key(StuInfoID)
57 
58 --复合主键
59 create table studentCourse
60 (
61     StdID int not null,
62     CourID int not null,
63     Score numeric not null,
64     constraint pk_StdID_CourID primary key(StdID,CourID)
65 )
66 
67 --foreign key 约束
68 create table studentInfo4
69 (
70     StdID int primary key not null,
71     StdName varchar(20) not null,
72     ClassInfoID int foreign key references ClassInfo(ClassInfoID)
73 )
74 
75 alter table studentInfo4
76 add constraint fk_ID foreign key(classInfoID) references ClassInfo(ClassInfoID)
外键约束:在新表的项里填的值一定要是在关联的表中的项里面有的值
1 --删除约束
2 alter table ClassInfo
3 drop constraint DF__ClassInfo__Class__4E88ABD4
2. 索引
创建主键约束的时候会自动创建聚集索引,创建聚集索引后,表里面的顺序会自动排列
 1 --创建索引,desc表示降序
 2 create clustered index pk_StuInfoID
 3 on StudentInfo(StuInfoID desc)
 4 
 5 --重新生成索引
 6 alter index pk_StuInfoID
 7 on StudentInfo rebuild
 8 
 9 --删除索引
10 drop index pk_StuInfoID
11 on StudentInfo

八、利用T-SQL语句插入、更新、删除记录

1. insert语句的使用
A. 插入多条语句
1 --insert语句,可以一次插入多条语句
2 insert dbo.ClassInfo
3 values(1,A,10),
4 (2,B,12),
5 (3,C,14)
6 
7 insert dbo.ClassInfo(ClassInfoID,ClassInfoCount)
8 values(18,17)
B. 插入其他表的数据,将A表中所有女同学的学号、姓名、性别、身份证号码、家庭地址及联系电话插入到新创建的B表中
 1 --插入其他表的数据
 2 create table StudentInfo1
 3 (
 4 StdInfoNum varchar(20) not null,
 5 StdInfoName varchar(20) not null,
 6 StdInFoSex varchar(2) not null,
 7 StdInfoCard varchar(20) not null,
 8 StdInfoAddress varchar(60) not null,
 9 StdInfoTel varchar(30) null
10 )
11 
12 insert into dbo.StudentInfo1
13 select StdInfoNum,StdInfoName,StdInFoSex,StdInfoCard,
14 StdInfoAddress,StdInfoTel
15 from dbo.StudentInfo
16 where StdInfoSex=
2. update语句的使用
1 --update语句,一定要带上where语句,不然会对所有数据进行修改
2 update dbo.StudentInfo
3 set StdInfoName=LK,
4     StdInfoTel=18824260208,
5     StdInfoEmail=jld@gmail.com
6 where StdInfoname=蓝贝斯
  • 简单的数据修改
  • 根据其他表的数据进行修改
 1 use StudentDB
 2 go
 3 update dbo.ClassInfo
 4 set ClassInfoCount=100
 5 where ClassInDep=音乐系
 6 
 7 --修改TeachInfo表的备注列TeachInfoRMK,为所有的兼职教师设置为每周上课不超过10课时
 8 use StuSe1DB
 9 go
10 update dbo.TeachInfo
11 set TeachInfoRMK=每周上课不超过10节
12 from dbo.TeachInfo a join dbo.TeachType b
13 on a.TeachTypeID=b.TeachTypeID
14 where TeachTypeName=兼职
1 --将‘网页设计’课程考试成绩不及格的在原分数基础上加5分
2 update dbo.StudentCourse
3 set StudCourseExamGrd +=5
4 select TeachCourseID from dbo.TeachCourse
5 where CourseInfoID=(select CourseInfoID from dbo.CourseInfo
6                     where courseInfoName=网页设计)
7 )
 3. delete语句的使用
  • 简单的数据修改
  • 根据其他表的数据进行修改
  • 基于TRUNCATETABLE命令删除表数据
 1 --简单的删除行:放弃选修的朱老师的《网页设计》课程,改成李竞老师的《广告设计课程》
 2 --delete语句
 3 delete dbo.StudentCourse
 4 where StdInfoID=50 and TeachCourseID=4
 5 
 6 --删除StudentCourse表中,刘立同学的选课信息
 7 delete dbo.StudentCourse
 8 from dbo.StudentCourse a join dbo.StudentInfo b
 9 on a.StdInfoID=b.StdInfoID
10 where StdInfoName=刘立
11 
12 --删除表中所有数据
13 use StudentDB_New
14 go 
15 alter table dbo.studentInfo4
16 drop constraint fk_ID
17 go
18 delete dbo.ClassInfo
19 
20 --truncate删除效率更高
21 truncate table dbo.StudentInfo

九、查询表单数据

1. 选择列
  • 查询所有的列
  • 选择指定的列
  • 计算列值
 1 use StudentDB_New
 2 --1.查询院系信息表的所有信息
 3 select * from dbo.DepInfo
 4 
 5 --2.查询教师信息表中的教师的姓名、专业和职称
 6 select TeachInfoName, TeachInfoSpec, TeachInfoTilte
 7 from dbo.TeachInfo
 8 
 9 --3.查询所有老师从事的专业
10 select TeachInfoSpec from dbo.TeachInfo
11 
12 --4.查询所有老师从事的专业,消除重复
13 select distinct TeachInfoSpec from dbo.TeachInfo
14 
15 --5.查询班级信息表中的前8条记录的班级代号,班级名称
16 select top 8 ClassInfoCode,ClassInfoName from dbo.ClassInfo
17 
18 --6.查询班级信息表中的前百分之二十的记录的班级代号和班级名称
19 select top 20 percent ClassInfoCode, ClassInfoName 
20 from dbo.ClassInfo
21 
22 --7.查询课程信息表中课程名称,理论学时,实践学时
23 select CourseInfoName, CourseInfoRstPer,CourseInfoPraper
24 from dbo.CourseInfo
25 
26 --8.查询课程信息表中课程名称,理论学时,实践学时,总学时(计算列值)
27 select CourseInfoName, CourseInfoRstPer,CourseInfoPraper,
28        CourseInfoRstPer+CourseInfoPraper
29 from dbo.CourseInfo
30 
31 --9.查询课程信息表中课程名称,理论学时,实践学时,总学时(计算列值),
32 --给每一列起一个中文别名
33 select CourseInfoName as 课程名称, 
34        CourseInfoRstPer as 理论学时,
35        CourseInfoPraper as 实践学时,
36        CourseInfoRstPer+CourseInfoPraper as 总学时
37 from dbo.CourseInfo
38 
39 --10.以另外的方式取别名
40 select 课程名称=CourseInfoName,
41        理论学时=CourseInfoRstPer,
42        实践学时=CourseInfoPraper,
43        总学时=CourseInfoRstPer+CourseInfoPraper
44 from dbo.CourseInfo
 2. 过滤查询结果集
3.选择行
  • 使用比较运算符
  • 使用逻辑运算符
  • 使用LIKE运算符
  • 使用BETWEEN AND运算符
  • 使用IS NULL运算符
  • 使用IN运算符
 1 --12.查询某年以后出生的学生学号姓名、性别和出生日期,
 2 --结果按照年龄从小到大排序
 3 --排序默认升序ASC,降序是DESC
 4 select stdinfonum,stdinfoname,stdinfobirthd
 5 from dbo.studentinfo
 6 where stdinfobirthd >= 1990-1-1
 7 order by stdinfobirthd desc
 8 
 9 --查询出生日期在1990-1-1之后的女生。
10 select * from studentinfo
11 where stdinfobirthd >1990-1-1 and stdinfosex=
12 
13 --查询所有姓张的学生的信息
14 --like可以做模糊查询
15 select * from studentinfo
16 where stdinfoname like 张%
17 
18 --查询入学年份在2007到2009之间的学生信息。
19 select * from studnetinfo
20 where stdinfoyear between 2007 and 2009
21 --或者写
22 where stdinfoyear in (2007,2008,2009)
23 
24 -12. 查询某年以后出生的学生的学号姓名、性别和出生日期,结果按照年龄排序
25 --当年龄相同时,按先女生后男生排序
26 select stdinfonum,stdinfoname,stdinfobirthd
27 from dbo.studentinfo
28 where stdinfobirthd >= 1990-1-1
29 order by stdinfobirthd desc, stdinfosex desc
30 
31 --13. 聚合函数
32 --查询班级信息表的所有信息
33 --统计学生,教师的总人数
34 --统计系部教学编制的总数、最大、最小及平均值
35 select count(*) from studentinfo
36 select count(*) from teacherinfo
37 select sum(depinpreoftech) as 总数,
38        max(depinpreoftech) as 最大值,
39        min(depinpreoftech) as 最小值,
40        avg(depinpreoftech) as 平均值
41 from depinfo
42 
43 --14. 查询教师表中有各种学历的人数
44 select teachinfoknowl,count(teachinfoknowl) as 数量
45 from teachoinfo
46 group by teachinfoknowl
47 --以上这一步很重要,使用聚合函数的时候一定要select后面全是聚合函数
48 --不能既有字段又有聚合函数,如果一定有,后面一定要接上group by
49 
50 --15. 统计1990年以后出生的男女学生各有多少人
51 select teachinfosex, count(*)
52 from studentinfo
53 where stdinfobirthd>1990-1-1
54 group by stdinfosex

 4. 数据排序、数据分组与汇总

 1 --16.显示所有学生的相关信息,并汇总学生总人数
 2 select stdinfoname,stdinfosex,stdinfonatns
 3 from studentinfo
 4 compute count(stdinfoname)
 5 
 6 --17.显示所有学生的相关信息,并按照学生所属民族分类汇总
 7 select stdinfoname,stdinfosex,stdinfonatns
 8 from studentinfo
 9 order by stdinfonatns
10 compute count(stdinfonatns) by stdinfonatns

5. INTO子句

十、连接查询多表数据

1. 内连接和外连接
  • 内连接:使用比较运算符比较两个表共有的字段列,返回满足条件的记录行
  • 左外连接:包括左表中不满足条件的行(null值也返回,左表中所有的信息返回)
  • 右外连接:包括右表红不满足条件的行
  • 完全外连接:包括左表和右表中不满足条件的行
 1 --1.查看每个教师的基本信息及教师类别(内连接)
 2 select teachinfoname,teachinfosex,teachtypetilte 
 3        teachtypename
 4        from teachinfo a inner join teachtype b
 5        on a.teachtypeid=b.teachtypeid
 6 
 7 --查看每位教师的授课情况,不管教师有没有授课都要包括其情况(左外连接)
 8 select teachinfonum,teachinfosex,teachtypetilte,courseinfoid
 9        from teachinfo a left join teachcourse b
10        on a.teachinfoid=b.teachinfoid  
11        
12 --查询所有老师授课课程的选课情况(右外连接)     
13 select studcourseid,stdinfoid,teachinfoid,courseinfoid
14 from studentcourse a right join teachcourse b
15 on a.teachcourseid=b.teachcourseid    
16 
17  --使用完全外连接查看stuseldb数据库中每位老师的授课情况
18  select a,b,c
19  from teachcourse a full join teachinfo b
20  on a.teachinfoid=b.teachinfoid
21  
22  --5.查询所有女生的班级信息
23  select name,sex,class
24  from classinfo a join studentinfo b
25  on a.classinfoid=b.classinfoid
26  where stdinfosex=
27  
28  --6.查询学生所属的班级信息和专业信息(三表关联)
29  select a,b,c
30  from studentinfo a join classinfo b
31  on a.classinfoid=b.classinfoid
32  join specilinfo c
33  on b.spilinfoid=c.spilinfoid
3. 查询结果的并、交、差运算
 1 --7.查询选课程最多的学生由高到低排序
 2  select stdinfoname,count(b.stdinfoid) 课程门数
 3  from studentinfo a join studentcourse b
 4  on a.stdinfoid=b.stdinfoid
 5  group by stdinfoname
 6  order by 课程门数 desc
 7  
 8  --查看计算机工程系的老师授课的选修情况(4表)
 9  select teachinfoname, depinfoname,count(stdinfoid)
10  from depinfo a join teachinfo b
11  on a.depinfoid=b.depinfoid
12  join teachcourse c
13  on b.teachinfoid=c.teachinfoid
14  join studentcourse d
15  on c.teachcourseid=d.teachcourseid
16  where depinfoname=计算机工程系
17  group by teachinfoname depinfoname
18  
19  --10.利用并运算查询学生和老师的姓名
20  select teachinfoname from teachinfo
21  union
22  select stdinfoname from studentinfo
23  
24  --11.利用交运算查询彭欢老师和朱志奇老师教授的同一门课程
25  --列出课程名称
26  select courseinfoname
27  from courseinfo a join teachcourse b
28  on a.courseinfoid=b.courseinfoid
29  join teachinfo c
30  on b.teachinfoid=c.teachinfoid
31  where teachinfoname=彭欢
32  intersect
33  select courseinfoname
34  from courseinfo a join teachcourse b
35  on a.courseinfoid=b.courseinfoid
36  join teachinfo c
37  on b.teachinfoid=c.teachinfoid
38  where teachinfoname=朱志气
39  
40  --12. 利用差运算查询由彭欢老师授课而没有由朱志奇老师教授的课程
41  --列出课程名称
42  select courseinfoname
43  from courseinfo a join teachcourse b
44  on a.courseinfoid=b.courseinfoid
45  join teachinfo c
46  on b.teachinfoid=c.teachinfoid
47  where teachinfoname=彭欢
48  except
49  select courseinfoname
50  from courseinfo a join teachcourse b
51  on a.courseinfoid=b.courseinfoid
52  join teachinfo c
53  on b.teachinfoid=c.teachinfoid
54  where teachinfoname=

十一、子查询,其他的一些查询功能

1. 子查询
a. 子查询用作派生表
b. 子查询用作表达式
使用比较运算符的子查询
使用ALL\SOME或ANY的子查询
使用IN或NOT IN的子查询
使用EXISTS和NOT EXISTS的子查询
 1 --子查询用作派生表
 2 --1.查找比所有课程类别ID为1的 课程总学时都要高的课程
 3 select courseinfoname.coursetypeid
 4 from courseinfo
 5 where courseinfohothrs > all
 6     (select courseinfohothrs from courseinfo
 7     where coursetypeid=1)
 8 --2.查询stuseldb数据库中所有已获副教授职称的女教师的姓名、性别、学历、专业和职称。
 9 select * from (
10     select teachinfoname,teachinfosex,teachinfoknowl,teachinfotilte
11     from teachinfo
12     where teachinfotilte=副教授
13 ) as t
14 where t.teachinfosex=
15 
16 --子查询用作表达式
17 --3.查找开设了课程ID为7的课程的教师的相关信息
18 --首先查询课程id为7的课程由那些教师授课
19 select teachinfoid from teachcourse
20 where courseinfoid=7
21 --其次查询上一个步骤里老师的信息
22 select teachinfoid,teachinfoname,teachinfosex,teachinfoknowl,teachinfospec
23 from teachinfo
24 where teachinfoid in (select teachinfoid from teachcourse
25 where courseinfoid=7)
26 
27 --4.查找数据库库中选修了7号课程的学生学号、姓名和联系电话。
28 --子查询的select语句只能来自一个表,和连接查询区别一下
29 select stdinfonum,stdinfoname,stdinfotel
30 from studentinfo
31 where exists(
32     select * from studentcourse
33     where stdinfoid=studentinfo.stdinfoid
34     and exists (
35         select * from teachcourse
36         where courseinfoid=7 and 
37         teachcourseid=studentcourse.teachcourseid
38     )
39 )
40 
41 --查询图像0801班的学生信息
42 select * from studentinfo
43 where classinfoid=(select classinfoid from classinfo
44 where classinfoname=图像0801)
45 --都可以实现,但推荐用子查询,连接查询的代价更高
46 select * from studentinfo a
47 join classinfo b
48 on a.classinfoid=b.classinfoid
49 where classinfoname=图像0801
50 
51 --7.查询课程考试不及格的学生的姓名和课程名(来自多表)
52 select 姓名=(select stdinfoname from studentinfo
53             where stdinfoid=a.stdinfoid),
54             课程名=(select courseinfoname from courseinfo
55             where courseinfoid in (
56             select courseinfoid from teachcourse
57             where teachcourseid=a.teachcourseid))
58 from studentcourse a 
59 where studcourseusugrd<60
2. 开窗函数及公用表表达式

十二、SQL编程-存储过程

1. 创建存储过程
1.T-AQL程序的流程控制
条件分支语句:if...else
if exists
case
循环语句:while
返回语句:return
 1 --查询stdinfoid为6的学生的姓名和已选课程门数,当选课程门数在3门以上
 2 --输出“xx,已完成选课”,否则输出“cxx,还需选课”
 3 declare @sname varchar(50),@num int
 4 select @sname=stdinfoname from studentinfo
 5 where stdinfoid=6
 6 print @sname
 7 set @num=(select count(*) from studentcourse
 8     group by stdinfoid
 9     having stdinfoid=6)
10 if @num>=3
11     begin
12         print @sname+,你已经完成了选课
13     end    
14 else 
15         print @sname+,你还需继续选课    
16 
17 -- 简单CASE结构:查询studentinfo表中学生的性别
18 --若是女生显示female,否则显示male      
19 select stdinfoname,stdinfosex,性别=case
20                         when stdinfosex= then male
21                         when stdinfosex= then female
22                         end
23    from studentinfo             
24    
25 --3.循环结构:计算1-100内能被3整除的最大数
26 declare @x int=100
27 while(@x>=1)
28     begin
29         if(@x % 3=0)
30         break
31         set @x-=1
32     end
33 print @x    
34 
35 --创建和执行存储过程    
36 --定义一个存储过程,用于查询stuseldb数据库中所有教师的
37 --姓名、性别、学历、职称和所授课的课程名称
38 create procedure showteacourse
39 as
40 select teachinfoname
41 from teachinfo a join teachcourse b
42 on a.teachinfoid=b.teachinfoid
43 --执行存储过程,直接选择程序名字
44 execute showteacourse   
2. 参数化存储过程
  1. 带输入参数的存储过程
  2. 带输出参数的存储过程
  3. 带return返回数据
 1 --带参数的存储过程:
 2 --定义一个存储过程,用于查询数据库中某一位老师的姓名、性别、学历和课
 3 --的课程名称
 4 --输入参数
 5 create proc showteainfobyname
 6 @teachername varchar(30)
 7 as
 8 select teachinfoname,teachinfosex,teachinfoknowl
 9 from teachinfo a join teachcourse b
10 on  a.teachinfoid=b.teachinfoid
11 where teachinfoname=@teachername
12 
13 
14 --执行带输入参数的存储过程
15 showteainfobyname 李静
16 
17 --9.定义一个存储过程在教师授课表中增加教师开设课程的记录
18 /*如李范老师(教师ID为16)开设C语言课程(26)的记录*/
19 --输出参数
20 create proc addteacourse
21 @teainfoid int, @courseinfoid int,
22 @teacourseid int output
23 as
24 insert teachcourse
25 values(@teainfoid,@courseinfoid)
26 --设置输出参数,用来存储自动增长的编号
27 Set @teacourseid=scope_identity()
28 
29 --执行
30 declare @teacourid int
31 exec addteacourse 17,26,@teacourid output
32 select @teacourid
33 
34 select * from teachcourse where teachinfoid=17
35 and courseinfoid=26
3. 修改和删除存储过程
1 --修改存储过程
2 /*6.修改存储过程,用于查询数据库中所有副教授职称的教师的
3 姓名、性别、学历、职称和所授课的课程名称*/
4 alter procedure showteacourse
5 as
6 
7 --7.删除存储过程
8 drop procedure showteacourse

十三、SQL编程-触发器

1. DML触发器
1. after触发器:执行insert、update、delete之后触发
2. instead of 触发器:不执行insert、update、delete,而是执行触发器本身定义的操作
 1 /*DML触发器
 2 1.创建insert触发器,如果向教师信息表teachinfo中插入记录时,检查该记录的院系编号在
 3 院系信息表depinfo中是否存在,如果不存在,则不允许插入*/ 
 4 --inserted,逻辑表,存放插入之后的记录
 5 create trigger trig_insertteachinfo
 6 on teachinfo
 7 after insert
 8 as
 9 begin transaction
10 if exist (select * from inserted a
11 where a.depinfoid not in(select depinfo from depinfo))
12 begin
13     raiserror(数据一致性验证!191)
14     rollback transaction
15 end
16 else
17     commit transaction    
18 
19 /*2.创建update触发器,当班级信息表classinfo中的主键classinfoid进行
20 修改时,必须对学生表中相应的classinfoid也进行修改*/
21 --更新分成2步骤:先删除原数据,再插入新数据
22 --deleted,逻辑表,存放删除之后的记录(原表)   
23 create trigger trig_updateclass
24 on classinfo
25 after update
26 as
27 if update(classinfoid)
28 begin
29     update studentinfo
30     set classinfoid=(select classinfoid from inserted)
31     where classinfoid=(select classinfoid from deleted)
32 end   
33 
34 --测试
35 update classinfo
36 set classinfoid=444 where classinfoid=4   
37 
38 /*3.创建delete触发器,当删除学生信息表studentinfo中已退学的学生资料
39 时,自动删除学生选课表studentcourse中此学生相应的所有信息*/
40 create studentinfo
41 after delete
42 as
43 begin
44     declare @stdinfoid int
45     select @stdinfoid=deleted.stdinfoid from deleted
46     deleted studentcourse
47     where stdinfoid =@stdinfoid
48 end 
49 
50 --测试
51 delete studentinfo
52 where stdinfoid=2
53 
54 /*4.创建instead of触发器,限制不允许删除院系信息表depinfo中已存在
55 的院系记录*/
56 create trigger trig_deletedep
57 on depinfo
58 instead of delete
59 as
60 begin
61     declare @delcount int
62     select @delcount=count(*) from deleted
63     if @delcount>0
64     begin
65         raiserror(不能删除院系表中的任何记录!101)
66         rollback transaction
67     end
68 end
69 --测试
70 delete depinfo
71 
72 --5.修改及删除触发器
73 drop trigger name
74 
75 alter trigger name   
2. DDL触发器
1.DDL触发器在create、alter、drop及其它DDL语句上操作
2.DDL触发器不能作为instead of触发器使用
 1 --DDL触发器
 2 /*7. 定义DDL触发器来防止数据库stuseldb中的任一
 3 表被修改或删除*/
 4 create trigger trig_studeldbsafe
 5 on database
 6 for drop_table, alter_table
 7 as
 8 print 你不能删除或修改studeldb中任何对象
 9 rollback
10 
11 --8.删除DDL触发器
12 drop trigger trig_stuseldbsafe
13 on database 
14 
15 /*6.创建触发器,当在学生信息表中插入或删除记录时,班级
16 信息表classinfo中的班级人数进行实时更新*/
17 create trigger trig_sudinfoclassnum
18 on studentinfo
19 after insert,delete
20 as
21 if(exists (select * from inserted))
22 begin
23     update classinfo
24     set classinfosum+=1
25     where classinfoid=(select classinfoid from inserted)
26 end
27 if (exists (select * from deleted))
28 begin
29     update classinfo
30     set classinfosum-=1
31     where classinfoid in (select classinfoid from deleted)
32 end

十四、SQL编程-用户定义函数与游标

1. 系统内置函数
1.转换函数
2.数学函数
3.字符串函数:使 用字符串函数查询学神信息表姓王的学生的学号、姓名和性别
4.日期时间函数:查询信息表中年龄在20-25岁的学生学号姓名性别和年龄
 1 --转换函数
 2 select cast(11.43 as float),
 3        convert(varchar(20),getdate(),112) 
 4 --数学函数
 5 select geiling(5.6),floor(5.6) 
 6 select abs(-30)
 7 
 8 --字符串函数
 9 --学生信息表王的学生的学号姓名性别
10 select stdinfonum,stdinfoname,stdinfosex
11 from studentinfo
12 where substring(stdinfoname,1,1)=
13 --也可以用模糊搜索where stdinfoname like ‘王%‘ 
14 
15 --日期函数:查询学生信息表中年龄在20-25岁的学生学号等 
16 select * from(
17 select stdinfonum,stdinfoname,stdinfosex,
18 datediff(year,stdinfobirthd,getdate()) age
19 from studentinfo) as temp
20 where age between 20 and 25 
2.自定义用户函数
1.创建和调用标量函数:返回一个值
 1 --用户自定义函数
 2 --2.创建标量函数ftitlesum,统计指定院系的教师人数
 3 create function ftitlesum(@depname varchar(20))
 4 returns int
 5 as
 6 begin
 7     declare @num int
 8     select @num=count(*) from teachinfo
 9     where depinfoid=(select depinfoid from
10     depinfo where 
11     depinfoname=@depname)
12     return @num
13 end
14 
15 --调用
16 declare @name varchar(20)=信息工程系
17 select ftitlesum(@name)
2.创建和调用表值函数:返回一个表
3.内联表值函数和多语句表值函数的区别:  
  • 内联表值函数,RETURNS 子句只包含关键字 table。不必定义返回变量的格式,因为它由 RETURN 子句中的 SELECT 语句 的结果集的格式设置。
  • 内联表值函数的 函数体 不用 BEGIN 和 END 分隔。
  • 内联表值函数的 RETURN 子句在括号中包含单个 SELECT 语句。SELECT 语句的结果集构成函数所返回的表。其使用的SELECT 语句与视图中使用的 SELECT 语句受到相同的限制。
 1 --3. 创建内联表值函数fselteach,用来查询指定院系的教师信息
 2 select * from teachinfo
 3 where depinfoid=(select depinfo from
 4                 depinfo where
 5                 Depinfoname=信息工程系)
 6 
 7 create function fselteach(@depname varchar(20))
 8 returns table
 9 as
10 return (select teachinfonum,teachinfoname,teachinfoknowl
11 from teachinfo
12 where depinfoid=(select depinfoid from depinfo
13                 where depinfoname=@depname))
14 
15 --调用
16 declare @d varachar(20)=信息工程系
17 select * from fselteach(@d)                              
18 
19 --4.创建多语句表值函数fselcourse,用来查询指定教师任
20 --教的课程名称、实践课时、理论课时和总课时                                                                                             
21 create function fselcourse(@teachname varchar(20))
22 returns @teach_course table
23 (
24 课程名称 varchar(80),
25 理论学时 int,
26 实践学时 int,
27 总学时 int
28 )
29 as
30 begin
31     insert into @teach_course
32     select courseinfoname,courseinforstper,courseinfopraper
33     courseinforstper+courseinfopraper
34 from courseinfo c join teachinfo a 
35 join teachcourse b
36 on a.teachinfoid=b.courseinfoid
37 on c.teachinfoname=@teachname
38 return     
39 end  
40 
41 --调用
42 select * from fselcourse(朱志奇)
3.游标
  • 声明游标
  • 打开游标
  • 提取数据
  • 关闭游标
  • 释放游标
 1 /*5.游标的使用
 2 对studentinfo表,定义一个查询汉族,性别男生的学生姓名、性别
 3 民族的游标,并输出游标结果*/
 4 --申明相关变量
 5 declare @sname varchar(20),
 6         @ssex varchar(5),
 7         @snatuns varchar(5)
 8 --申明游标        
 9 declare student_cursor cursor for
10 select stdinfoname,stdinfosex,stdinfonatns
11 from studentinfo
12 where stdinfonatns= and stdinfosex= 
13 --打开游标
14 open student_cursor
15 --提取数据
16 fetch next from student_cursor into @sname,@ssex,@snatuns
17 --用来判断游标提取状态的全局变量@@fetch_status
18 while @@fetch_status=0
19 begin
20     print 学生姓名+@sanme+性别+@ssex+民族+@snatns
21     fetch next from student_cursor into @sname,@ssex,@snatns
22 end  
23 --关闭游标
24 close student_cursor
25 --释放游标
26 deallocate student_cursor 

十五、安全管理、数据库的备份和恢复

1.数据库的安全管理
  • 登录管理
  • 用户权限管理
  • 角色管理
 1 --1.将windows账户中的用户‘teacher’添加到SQL sever登录中
 2 --默认数据为master
 3 create login moon-PC\Teacher
 4 from windows
 5 with default_database=[master]
 6 
 7 --2.创建名为teachers的SQL登录,密码为sq1@123%
 8 --默认数据库为master,强制实施密码策略
 9 create login teachers
10 with password=sq1@123%
11 with default_database=[master],
12 check__expiration=on
13 check_policy=on
14 
15 --3.修改SQL登录teachers,密码改为‘123’
16 alter login teachers
17 with password=123
18 old_password=sq1@123%
19 
20 --4.禁用teachers登录
21 --启用
22 alter login teachers enable
23 --禁用
24 alter login teachers disable
25 
26 --5.删除teachers登录名
27 drop login teachers
28 
29 --用户管理
30 --6.创建名为teachuser的登录名,在数据库中,创建用户teach1与teachuser
31 --登录名对应
32 create login teachuser
33 with password=123,
34 default_database=[master]
35 go
36 use stuseldb
37 go
38 create user teach1
39 for login teachuser
40 
41 --7.修改在数据库中创建的用户teach1
42 --将其名称改为teach2
43 alter user teach1
44 with name=teach2
45 
46 --8.删除stuseldb数据库中用户teach2
47 drop user teach2
48 
49 --用户权限管理
50 --9.在数据库库中,创建用户teacher,其对应登录名为teachers
51 --并将表teachinfo的select权限授予teacher
52 create login teachers
53 with password=sq1@123%
54 with default_database=[master],
55 check__expiration=on
56 check_policy=on
57 
58 create user teacher
59 for login teachers
60 grant select on teachinfo to teacher
61 
62 --10. 拒绝用户teacher查看adminuser表的权限
63 deny select on adminuser to teacher
64 --11.撤销用户teacher对表techinfo的select权限
65 revoke select on techinfo to teacher
66 
67 --角色管理
68 --12.将SQL登录名teacher添加到sysadmin固定服务器角色中
69 --使其可以在数据库服务器上执行任何操作
70 exec sp_addsrvrolemember teachers,sysadmin
71 exec sp_dropsrvrolemember teachers,sysadmin
2.数据库的备份与恢复

SQL

标签:硬件   过程   tun   交运算   convert   工程   恢复   name   typename   

原文地址:https://www.cnblogs.com/lockegogo/p/12307603.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!