zoukankan      html  css  js  c++  java
  • 数据库重要知识点总结

    首先感谢博客园,创建了这个专属于开发者的知识共享平台,需要强调的是我并不是一个大牛级别的人物,只是一个初入园子还未见过世面的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

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

  • 相关阅读:
    架构师的成长之路初片~ntp时间同步
    架构师的成长之路初片~水晶头的颜色排序
    架构师的成长之路初片~Python-邮件(smtplib)、requests模块、API接口调用
    架构师成长之路之~调优思维
    架构师的成长之路初片~python~调整背景及滚轮+各种快捷键
    架构师成长之路之~Node.js安装篇
    微服务技术栈
    C#资源释放(托管资源、非托管资源)
    Beyond Compare 4 密匙
    MySql批量导入 .netcore命名空间完全相同问题
  • 原文地址:https://www.cnblogs.com/zhangshuang0909/p/5159685.html
Copyright © 2011-2022 走看看