数据库重要知识点总结

首先感谢博客园,创建了这个专属于开发者的知识共享平台,需要强调的是我并不是一个大牛级别的人物,只是一个初入园子还未见过世面的IT小菜鸟,本着一颗向园内大牛们学习的心,加入了这个圈子,借此机会,对自己日常所学进行实时整理,还望各位大神多多指教。

我的邮箱是:zhangshuang_0909@126.com

以下是近期对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 @i=@i-1

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 @i=@i-1

end

--print @sum

--return @sum

set @value=@sum

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#=@s#

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#=@s#new where s#=@s#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#+'---------'+@sname

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

以上是我认为初学数据库时应该会用到的一些知识点,仅供大家参考,如果有说的不对的地方,还望多多指教。

原文地址:https://www.cnblogs.com/zhangshuang0909/p/5159685.html