首先感谢博客园,创建了这个专属于开发者的知识共享平台,需要强调的是我并不是一个大牛级别的人物,只是一个初入园子还未见过世面的IT小菜鸟,本着一颗向园内大牛们学习的心,加入了这个圈子,借此机会,对自己日常所学进行实时整理,还望各位大神多多指教。
我的邮箱是:[email protected]
以下是近期对SQL Server数据库所学知识的相关总结,希望可以在一些地方帮助初入门者,对于相关的基础名词我就不一一介绍了,就从SQL语言操作说起吧。
1.数据库入门之SQL语句总结
首先先对几个数据库中的数据类型进行下了解:
nchar ----------------存储数据类型为宽字节字符数组,最多4000字节
nvarchar-------------存储数据类型为宽字节字符串,最多4000字节
char------------------存储数据类型为多字节字符数组,最多8000字节
varchar--------------存储数据类型为多字节字符串,最多8000字节
举个例子:
用char(10)和varchar(10)分别对”hello”字符串进行存储,char(10)中该字符串所占字节数为10个,varchar(10)中所占字节数为6个。
如果有超大文本存储,此时选用text,ntext类型
1.1SQL语句之定义功能
此项包括对基本表、索引和视图的定义和撤销。针对于表,我们可以对其进行创建、删除以及修改,而针对于视图、索引,我们可以创建和删除。
1.1.1创建、修改、删除表
创建:
create table 表名
{
<列名> <数据类型> <约束条件>
}
如:
create table studentinfo
(
number int primary key, --主键,唯一标识,不许重不许空
name varchar(10) unique, --唯一约束,除主键外唯一标识,可重可空
sex varchar(5) check(sex=‘男‘ or sex=‘女‘),--检查约束,保证值在一定范围内
age int default(18) --默认约束
)
create table studentcourse
(
number int foreign key references studentinfo(number),--外键
course varchar(20)
)
修改:
如:
alter table 表名
{
add <新列名> <数据类型> <约束条件>
drop<约束条件>
alter column <列名> <数据类型>
}
删除:
drop table 表名
如:
drop table studentinfo
1.1.2创建、删除视图
创建:
Create view 视图名 as
(语句块)
删除:
Drop view 视图名
需要注意的是视图是由一个或多个表导出的虚拟的表
基于一个表:
如:
create view myview as
(select * from student)
select * from myview
update myview set ssex=‘女‘ where s#=‘01‘
insert into myview values(‘09‘,‘aa‘,‘1994-07-09‘,‘男‘)
delete from myview where s#=‘09‘
update myview set ssex=‘男‘ where s#=‘01‘
基于多个表:
如:
create view view1 as
select s.*,sc.score,sc.c# from student s inner join
sc on s.s#=sc.s#
select * from view1
注意:这里值得说明的是不论针对一个表还是多表,只要加了聚合函数的视图将不能增删改,只有针对原表的视图才可以进行增删改。
1.1.2创建、删除索引
一般情况下超大型数据库会选择为数据库添加索引,分为聚集索引和非聚集索引。
创建:
Create index 索引名 on 表名(列名)
删除:
Drop index 索引名
1.2SQL语句之查询功能
语句格式(包括语句顺序):
Select [all | distinct] 列名
From 表名/视图名
[where 条件表达式]
[group by 列名][having 条件表达式]
[order by 列名][asc | desc]
1.2.1单表查询
(1)查询列
Select 列名(多列用“,”隔开,所有列用“*”) from 表名
(2)查询行
A.消除重复行
Select distinct 列名 from 表名
B.比较大小:=,>,>=,!=,!>,!<等
Select sname from student where cname=’english’
C.确定范围:between…and…,not between…and…
Select sname,sage from student where sage between 20 and 23
D.确定集合:in,not in
Select sname from student where sdept in (‘IS’,’MA’,’CS’)
E.模糊查询:like
Select s#,sname from student where sname like ‘刘%’
注意:若为’%刘%’,则查询名字中有刘这个字的
F.涉及空值的:isnull
Select *,isnull(ssex,’未知’) from student
注:ssex项若为空,则将其置为“未知”
G.多重条件查询:and,or
Select sname,sage from student where sage >= 20 and ssex=’男’
H.聚合函数:count,sum,max,min,avg等
Select avg(score) from sc where c#=’01’
I.查询表中前几条:top
Select top 2 * from student
J.条件:
select 列名 case when 条件
then 语句块
when条件
then语句块
else语句块
end
from 表名
如:
按照出生日期来算,当前月日< 出生年月的月日则,年龄减一
select *,datediff(yy,birth,getdate()),
case when month(getdate())<month(birth)
then datediff(yy,birth,getdate())-1
when day(getdate())<day(birth)
then datediff(yy,birth,getdate())-1
else datediff(yy,birth,getdate())
end
from teacherinfo
K.类型转换
Select cast()
Select cast(‘12’ as int) +1
Select convert(int, ‘12’)+1 //convert类型转换有风格选项
1.2.2多表查询
多表查询中,有以下5种查询方式:内连,左连,右连,笛卡尔积,嵌套
A.取两表的交集,内连 inner join
select * from student inner join SC on student.S#=sc.s#
B.以左表为主,左连 left join
select * from student left join SC on student.S#=sc.s#
C.以右表为主,右连 right join
select * from student right join SC on student.S#=sc.s#
D.将两表行乘积,即笛卡尔积
select * from student,sc where student.S#=sc.s#
E.嵌套查询
如:查询"01"课程比"02"课程成绩高的学生的信息及课程分数
select * from
(select *,(select score from sc where c#=‘01‘ and student.s#=sc.s#) sc01,
(select score from sc where c#=‘02‘ and student.s#=sc.s#) sc02 from student) a
where sc01>sc02
嵌套查询中有带in谓词的子查询,比较运算符的子查询,带有any或or的谓词子查询,exists谓词子查询,还有集合查询的union,这里就不一一举例了。
1.3SQL语句之操作功能
此项内容主要包括数据的插入、修改及删除。
插入:
Insert into 表名 values(值,值)
如:
insert into studentinfo values(5,‘ee‘,‘男‘,35)
insert into studentinfo(number, age) values(6,60)
修改:
Update 表名 set 列名= 值
如:
update studentinfo set age=60 where number=6
update studentinfo set name=‘gg‘,sex=‘女‘ where number=6
删除:
Delete from 表名
delete from studentinfo where number=6;
2.数据库入门之建表规范
若表与表的关系为n:n时,创建的第三个表的主键为两个表的组合主键;若关系为1:n时,则把1的主键放到n里
第一范式:
表的任一属性不可拆分,也就是说每一个表中的一列属性下不允许再分出几个属性
第二范式:
候选键(非主键)对组合主键部分依赖不允许
如:(学号,课程号)[组合主键](成绩,学生姓名)
成绩依赖于组合主键,而学生姓名只依赖于学号,产生了部分依赖,不符合第二范式
第三范式:
不允许有传递依赖。
举个例子:
(学号)((姓名,年龄,学校,学校地址)
学生姓名,年龄,在哪一所学校都依赖于学号,而学校地址是不依赖于学生的学号的,无论学生学号是多少,学校就在那里,而学校地址依赖于学校是哪所,产生了传递依赖,所以不符合第三范式。
2.数据库入门之存储过程
说道存储过程,我认为可以这样去理解,在SQL语句中,为了避免多次进行相同的操作,将这样相同操作的语句进行一次封装的过程,相当于函数的作用吧。
那么在说存储过程前,就先来看一些语法规则吧:
定义变量:(局部变量用1个@,全局变量用2个@)
Declare @变量名 变量的类型,@变量名 变量的类型
如:
declare @sum int,@i int
变量赋值:
Set:只能给一个变量进行赋值;select:可以给多个变量进行赋值
如:
select @sum=1,@i=9
打印变量:
Print @变量名
条件:
If 条件
Begin 语句块
End
Else
Begin 语句块
End
如:
declare @number int,@size int
select @number=100,@size=200
if @number<50
begin
print @number
end
else
begin
print @size
end
循环:(循环语句中只有while,死循环即为while 1=1)
While 条件
Begin 语句块
End
如:
declare @sum int ,@i int
select @sum=1,@i=9
while @i>0
begin
set @sum=(@sum+1)*2
set @[email protected]
end
print @sum
下面我们就来看看存储过程吧
创建存储过程:
Create procedure 存储过程名 @变量名 变量类型,@变量名 变量类型
As
Begin
语句块
End
如:
alter procedure monkey @sum int , @i int , @value int output
as
begin
--declare @sum int,@i int
--select @sum=1,@i=9
while @i>0
begin
set @sum=(@sum+1)*2
set @[email protected]
end
--print @sum
--return @sum
set @[email protected]
end
--print的
execute monkey 1,9 //执行存储过程的语句
--return的
declare @sum int
execute @sum=monkey 1,9 //执行存储过程的语句
print @sum
--output的
declare @sum int
execute monkey 1,9,@sum output //执行存储过程的语句
print @sum
删除存储过程:
Drop procedure 存储过程名
3.数据库入门之触发器,游标,临时表,复制表
3.1触发器
触发器是一种特殊的存储过程,当指定的事件发生时,自动调用,用白话的理解就是比如说有学生表还有选课表,那么学号为一号的同学删除时,选课表中还存有一号同学的选课信息等需要一同删除,而触发器则能完成这一功能。
触发器的种类有3种:插入、修改、删除触发器。在创建触发器时同时会创建两个表,inserted和deleted表
删除:
Create trigger 触发器名
On 表名
After delete
As
Begin
语句块
End
如:
create trigger mytrigger
on student
after delete
as
begin
declare @s# varchar(3)
set @s#=(select s# from deleted)
delete from sc where s#[email protected]#
end
delete from student where s#=‘01‘
插入:
Create trigger 触发器名
On 表名
After insert
As
Begin
语句块
End
如:
create trigger myinsert
on student
after insert
as
begin
declare @s# varchar(3)
set @s#=(select s# from inserted)
insert into SC values(@s# , ‘01‘ , 80)
insert into SC values(@s# , ‘02‘ , 90)
insert into SC values(@s# , ‘03‘ , 99)
end
insert into student values(‘01‘ , ‘赵雷‘ , ‘1990-01-01‘ , ‘男‘)
修改:
Create trigger 触发器名
On 表名
After update
As
Begin
语句块
End
如:
create trigger myupdate
on student
after update
as
begin
declare @s#old varchar(3),@s#new varchar(3)
select @s#old=s# from deleted
select @s#new=s# from inserted
update sc set s#[email protected]#new where s#[email protected]#old
end
update student set s#=‘01‘ where s#=‘11‘
3.2游标
游标即为处理数据的一种方法,对结果集进行一行或多行的浏览,可以把它想象成为指针来用。
游标的创建需要经历5个步骤:定义游标,打开游标,遍历数据,关闭游标,释放内存。
如:
--定义游标,打开游标,遍历游标,关闭游标,释放内存
declare @s# varchar(10),@sname varchar(50)
--定义游标
declare mycursor cursor for
select s#,sname from student
--打开游标
open mycursor
--遍历游标
fetch next from mycursor into @s#,@sname
while @@FETCH_STATUS=0 //fetch函数的返回值,为0时有值
begin
print @s#+‘---------‘[email protected]
fetch next from mycursor into @s#,@sname
end
--关闭游标
close mycursor
--释放内存
deallocate mycursor
3.3创建临时表
Create table #临时表名---------------创建
Drop table #临时表名---------------删除
3.4复制表
不存在的表:
Select * into 新起的一个不存在的表名 from 已有的表名
如:
Select * into aaa from student
存在的表:
Insert into 表名(存在的表名) 内容
如:
Insert into aaa select * from student
以上是我认为初学数据库时应该会用到的一些知识点,仅供大家参考,如果有说的不对的地方,还望多多指教。