SQL Server 2005基础知识详细整理

1. ACID:指数据库事务正确执行的四个基本要素缩写:
1.原子性2.一致性3.隔离性4.持久性


2.数据库对象:表(table) 视图(view) 存储过程(stored procedure) 函数(function)索引(index)


3.SQL Server 2005中包含master、model、msdb、tempdb四个系统数据库。


4.使用T-SQL语句创建数据库:
CREATE DATABASE [ApressFinacial] ON  PRIMARY
( NAME = N’ApressFinacial’, FILENAME = N’I:/Program Files/Microsoft SQL Server/MSSQL.1/MSSQL/DATA/ApressFinacial.mdf’ , SIZE = 3072KB , FILEGROWTH = 1024KB )
LOG ON
( NAME = N’ApressFinacial_log’, FILENAME = N’I:/Program Files/Microsoft SQL Server/MSSQL.1/MSSQL/DATA/ApressFinacial_log.ldf’ , SIZE = 1024KB , FILEGROWTH = 10%)


5.T-SQL语句删除数据库:drop database[数据库名]


6.常见的约束类型:主键约束、唯一约束、检查约束、默认约束、外键约束。


7.添加约束的语法:
         Alter table 表名
         Add  constraint  约束名 约束类型 具体的约束说明


8.删除约束:alter table 表名
            Drop constraint 约束名


9.授权语法:  grant 权限[on  表名] to 数据库用户
         例:grant  select  insert  update
              On students  to  zhangsan


10.T-SQL语句创建登录名:
           Create  login[yuan]
            With  password=’130125′
            Go


11.数据库完整性分为:实体完整性、域完整性、参照完整性、用户自定义完整性。


12.T-SQL 中的运算符:
运算符
 含义

=
 等于

>
 大于

<
 小于

>=
 大于等于

<=
 小于等于

<>
 不等于

!
 非

通配符
 解释
 示例

_
 一个字符
 A Like ‘C_’

%
 任意长度的字符
 B Like ‘CO_%’

[]
 括号中所指定范围内的一个字符
 C Like ‘9W0[1-2]’

[^]
 不在括号中所指定范围内的一个字符
 D Like ‘%[A-Z][^1-2]’

13.查询语句:select 列名  from 表名  where 条件   如:select*  from students  where       no=1


14.插入数据行:insert  [into]<表名> [列名]values<值列表>
       例:intset into students(name,address,grade,email,sex)
           Values(‘长青菜’,’上海松江’,5,’zqc@souhu.com’,’男’)
      注意:(不能为标识列指定值,因为它的数字是自动增长的)


15.更新数据行:update <表名> set<列名=更新值>    [where<更新条件>]
      例:update  students
          Set  address=’石家庄’
          Where   address=’保定’


16.删除数据行:  delete  from<表名>[where<删除条件>]
       例:delete from  studentinfo     where  no=’180108225′


17.问题:如果标识列A的初始值为1,增长量为2,则输入三行数据以后,再删除两行,下次再输入数据行的时候,标识值从多少开始?      (  7  )


18.删除列: alter  table  student     drop  column  address


19.Exists:     if  exists (select*from?where  name=’yuanDB’)  drop  database stuDB


20.变量:   局部变量(必须以标记@作为前缀)
            全局变量(必须以标记@@作为前缀)
       全局变量由系统定义和维护,我们只能读取,不能修改全局变量的值。


21.局部变量声明:  例:Decalre  @name  vachar(8)      decare @seat  int
   赋值:set @变量名=值或select@变量名=值  set @name=’张三’
           Select @name=sname  from  students  where  no=’1′


22.逻辑控制语句: IF-ELSE语句
            If(条件)
              Begin
              语句1
              语句2………..
              End
            Else
            Begin
            语句1
            语句2………
            End        注:else是可选的。


例: decalre @myavg float
     Select @myavg =AVG(course) from score
     Print’平均分’+convert(varchar(5),@myavg)
     If(@myavg>70)
     Begin
     Print ‘本班成绩优秀,前三名成绩为:’
      Select  top 3 * from  score  order  by score  desc
      End
      Else
        Begin
        Print  ‘本班成绩较差,后三名成绩为:’
        Select  top 3 *from  score  order  by  score
       End


23.while循环语句:   while(条件)
                     Begin
                     语句1
                     语句2……….
                     Break
                     End
       例:DECLARE @n int
           WHILE(1=1) –条件永远成立
           BEGIN
           SELECT @n=COUNT(*) FROM score
           WHERE score<60    –统计不及格人数
           IF (@n>0)
           UPDATE score     –每人加2分
            SET score=score+2
          ELSE
          BREAK    –退出循环
          END
          print ‘加分后的成绩如下:’
          SELECT * FROM score


24.case–end多分支语句
      语法:    case
                When  条件1  then  结果1
                When  条件2  then  结果2
                …………..
                 Else  其他结果
                 End
       例:print  ‘ABCDE五级显示成绩如下:’
           Select  studentID,
               成绩=case
                        When  score<60  then’E’
                        When   score  between  60  and  69  then ‘D’
                        When   score  between  70  and  79  then ‘C’
                         Else  ‘A’
                      End
                     From  score


25.批处理语句示例:
                   SELECT * FROM stuInfo
                   SELECT * FROM stuMarks
                   UPDATE stuMarks
                      SET writtenExam=writtenExam+2
                   GO


26.习题及答案:   
        习题内容:则根据如下规则对成绩进行反复加分,直到平均分超过85分为止。请编写T-SQL语句实现。
90分以上:   不加分
80-89分:   加1分
70-79分:   加2分
60-69分:   加3分
60分以下:   加5分
习题答案:
SELECT * FROM score –原始成绩
DECLARE @labAvg  int
WHILE(1=1)
 BEGIN
    UPDATE score
      SET score=
        CASE
            WHEN score<60 THEN score+5
            WHEN score between 60 AND 69 THEN score+3
            WHEN score between 70 AND 79 THEN score+2
            WHEN score between 80 AND 89 THEN score+1
            ELSE score
        END
     SELECT @labAvg=AVG(score) FROM score
       IF  @labAvg>=85
           BREAK
 END
SELECT * FROM score –加分后的成绩


27.把一个表中的数据复制到另一个表中:  insert  into <表名>(列名)
                                       Select  <列名>
                                       From <源表名>


28.把查询结果放在新表中同时插入新的标识列:
           Select  列名  identity(数据类型,标识种子,标识增长量)as
            列名  into  新表    from  原始表
  例:   select   students.sname, students.saddress,  students.semail,  identity(int,1,1) as  studentID    into  tongxunlu    from students


29.更新数据行: 
      语法:  update<表名>
              Set<列名=更新值>
              Where <更新条件>
       例: update  students
             Set   address=’软件学校’
              Where  address=’软件学院’


30.问题:按多列排序:例:select  no,name,address,grade
                   From   students
                   Where   sex  in(1,0)
                   Order by   no,grade


31.字符串函数:
      Replace:    select  replace(‘莫勒可切.杨可’,’可’,‘兰’)
          返回结果:莫勒兰切.杨兰
      Upper:    select  upper(‘sql server 课程’)
       返回结果:SQL SERVER 课程
      Getdate:   select  getdate()获取当前时间。
       Dateadd:   select  dateadd(mm,4,’01/01/2009’)
        返回结果:05/01/2009
      Datename:     select  datename(dw,’01/15/2000′)
       返回结果:   Saturday


32.聚合函数:
Max-min:     select  AVG(score) as  平均成绩,MAX(score) as 最高分,MIN(score) as最低分       from  score          where  score>=60
Count:    select  count(*)as  及格人数      from  score 
                      Where   score>=60


33. 分组查询:

复制代码 代码如下:

select  courseid,avg(score) as 课程平均成绩
                From  score
                Group  by  courseid


34.习题:  
假如成绩单中记录了学生的几次考试成绩,要查询每位学生的每门课的总成绩,怎么查?

复制代码 代码如下:

Select  courseid,studentid,sum(score) as 总成绩
                From  score
                Group  by  courseid,studentid


35.分组查询–HAVING
Having:指定了组或聚合的搜索条件,常常与group by子句一起使用。
例:

复制代码 代码如下:

select  studentid  as学员编号,avg(score)as 平均成绩
                  From   score
                  Group  by  studentid,couseid
                  Having  avg(score)>60


36.多表查询——内联结    
例:

复制代码 代码如下:

select  students.smame, score.courseid, score.score
                              From  students,score
                              Where  students.scode=score.studentid


37.多表联结——三表联结    
例:

复制代码 代码如下:

select  S.name  as姓名,CS.coursename as课程,C.score as 成绩                         from  students  As S
                                Inner Join score  as C  ON(S.scode=C.studentid)
                                Inner join  course  As CS  ON(CS.courseid=C.courseid)


38.多表联结查询——右外联结  
例:

复制代码 代码如下:

select  titles.title_id,Titles.title,publishers.pub_name
               From  titles
               Right outer  join  publishers
               On  titles.pub_id=publishers.pub_id


39.银行案例——多表联结——左外联结:
 例:
 

复制代码 代码如下:

  intsert  into  account(account.Cardid,account.score)
                Select  users.cardid,2
                From users
                Left  Join account  ON(account.cardid=users.cardid)
                Where  account.cardid  is NULL
 


40.子查询: 
例:

复制代码 代码如下:

select * from  students
                 Where  scode>(select  scode  from  students  where  Sname=’张扬’) 
                 GO


41.例:内联结(等值联结)

复制代码 代码如下:

select  sname  from  students
                           Inner  Join  score
                           ON  students.scode=score.studentid
                           Where  score=60
      GO


42.局部变量:
例:将姓名为里斯的学生的学号,出生日期和平均成绩分别赋给局部变量
@no_str @birthday_str @avgrade_num  (用select语句来实现)

复制代码 代码如下:

             Select  @no_str=s_no,@birthday_str=s_birthday,@avgrade_num=s_avgrade
              From student          where  s_name=’里斯’


43.自连接查询:    
例:(注:student2为不存在,是创建的)

复制代码 代码如下:

               Select  student2.sno学号,student2.sname姓名,student2.ssex性别,student2.sspeciality专业,student2.savgrade平均成绩
               From student,student2
               Where  student.sname=’李好’ and student.sspeciality=student2.sspeciality


44.声明局部变量:declare  @变量名  数据类型


45.if语句 例:查询学号为457865的学生,如果成绩及格,则打印其姓名和成绩。

复制代码 代码如下:

         Declare @no,char(8),@name char(8),@avgrade numeric(3,1)
         Set @no=’457865′
         Select @name=sname,@avgrade=savgrade
         From student
         Where sno=@no;
         If @avgrade>60.0
         Begin
         Print @name
         Print @avgrade
         End
         Go


46.if-else语句:对于给定学号的查询,如果平均成绩不及格则打印姓名和平均成绩,否则打印学号。

复制代码 代码如下:

          Declare @no char(8),@name char(8),@avgrade numeric(3,1);
          Set @no=’567′;
          Select @name=sname,@avgrade=savgrade
          From student
          Where  sno=@no;
          If @avgrade<60.0
          Begin
          Print @name
          Print @avgrade
          End
          Else
          Print @no
          Go


47.多分支的if语句查询并实现分等级打印学生成绩

复制代码 代码如下:

          Declare @no char(8),@name char(8),@avgrade numeric(3,1);
          Set @no=’567′;
          Select @name=sname,@avgrade=savgrade
          From student
          Where  sno=@no;
          If @avgrade>=90.0
          Print ‘优秀’
          Else if @avgrade>=80.0
          …………….
          Else print ‘不及格’
          Go


48.case 语句   使用select语句查询学生的学号,然后用case函数对学生的姓名和爱好进行简要说明。    Select  学号=sno,姓名及爱好=
              Case sno
              When ‘123′ then ‘李好,游泳’
              。。。。。。。
              Else ‘没有这人’
              End
              From  student


49.while语句
      (如果学生平均成绩低于85分,则循环执行对每位学生成绩加0.5%,在循环过程中,如果最高成绩超过95分则退出循环;在加分过程中,当成绩的平均成绩大于或等于80分时打印出当前成绩的平均成绩)

复制代码 代码如下:

     Declare @avgrade numeric(3,1);
            Set @avgrade=(select  avg(savgrade) from student)
            While @avgrade<85
             Begin
                      Update student
                        Set savgrade=savgrade+savgrade*0.005
                      Set @avgrade=(select avg(savgrade) from student)
                      If @avgrade>95
                         Break                            –退出循环
                      if@avgrade<80
                      continue                             –结束本次循环
                      print @avgrade
                      End


50.子查询:查询成绩刚好通过60分的学生
              Select sname from students
                  Inner  Join  score                —内连接
                   ON students.scode=score.studentid
                   Where  score=60
                    Go


51.事务的特性:原子性、一致性、隔离性、永久性。
  事务分类:显示事务、隐性事务、自动提交事务。


52.系统存储过程的名称都以“sp_”开头或“xp_”开头。
        EXEC sp_databases     列出当前系统的数据库
        EXEC sp_help students  查看表students的信息


53.定义存储过程的语法:  
             Create  proc[edure]  存储过程名
              @参数1  数据类型=默认值 output,
               ……………….
              @参数n  数据类型=默认值 output
              As
              SQL语句
              Go (注:参数可选,参数分输入参数、输出参数,输入参数允许有默认值)


54.创建不带参数的存储过程:    
例:

复制代码 代码如下:

           Creat  procedure  pro_stu
           As
           Declare  @myAvg float
           Select  @myAvg=AVG(score)
           From score
           Print ‘平均分:’+convert(varchar(5),@myAvg)
           If(@myAvg>70)
              Print ‘本班考试成绩:优秀’
            Else
               Print ‘本班考试成绩:较差’
            Print ‘———————————————————–‘
            Print ‘参加本次考试没有通过的学员:’
               Select  name,scode,score
                   From students inner Join score  on
                   Students.scode=score.studentid     where  score<60
     GO


55.调用存储过程:   语法:   EXEC  过程名[参数]    例:EXEC proc_stu 


56.输入参数的默认值:    
例:

复制代码 代码如下:

         Create procedure  proc_stuMn
            @scorePass  int=60        —及格线默认为60分
         As
            Print ‘及格线:’ +convert(varchar(5),@scorePass)
            Print ‘参加本次考试没有通过的学员:’
          Select  name,scode,score
                From students
                Inner Join score
                On students.scode=score.studentid
                 Where score<@scorePass
         Go


57.调用带参数默认值的存储过程: 
             EXEC proc_stu    ——-采用默认值
             EXEC proc_stu 55    ——不采用默认值
             EXEC proc_stu  @scorePass=55


58.带输出参数的存储过程:

复制代码 代码如下:

        Create procedure proc_stuM
        @notpassSum  int  output,
        @scorePass  int=60
        As 
           Print’及格线:’+convert(varchar(5),@scorePass)
           Print ‘参加本次考试没有通过的学员:’
        Select  name,scode,score      from  students
              Inner Join score  On   students.scode=score.studentid
                   Where  score<@scorePass
         Select @notpassSum=count(studentid)
               From score where score<@scorePass
         GO


59.调用带输出参数的存储过程:(注:调用时必须带output关键字,返回结果将存放在变量@sum 中)

复制代码 代码如下:

    Declare @sum int
           EXEC proc_stuM @sum output,60
           Print ‘————————————————–‘
           If @sum>=3
                 Print ‘未通过人数:’+convert(varchar(5),@sum )+’人,超过60%,及格分数线还应下调’
           Else
                  Print ‘未通过人数:’+convert(varchar(5),@sum )+’人,已控制在60%以下,及格分数线适中’          
           GO


60.错误处理:  
使用Raiserror语句:

复制代码 代码如下:

           Create  procedure  pro_stuM
                  @notpassSum  int output,
                  @scorePass  int=60
            As
               If(not  @scorePass  between 0 and 100)
                   Begin
                   Raiserror(’及格线错误,请指定0—100之间的分数,统计中断退出’,16,1) ——–引发系统错误,指定错误的严重级别16,调用状态为1(默认),并影响@@ERROR 系统变量的值
                   Return   ——–立即返回,退出存储过程
             End
               ……………其他语句同上例
             Go


61.使用raiserror语句

复制代码 代码如下:

          Declare  @sum int,@t int
          EXEC proc_stum @sum  output, 604   —-笔试及格线误输入604分
          Set @t=@@error
          Print ‘错误号:’+convert(varchar(5),@t )
          If @t<>o
          Return   ——退出批处理,后续语句不再执行
          Print ‘———————————–‘      —–如果执行了raiseerror语句,系统全局@@error 将不等于0,表示出现了错误.
           If @sum>=3
             Print ‘未通过人数:’+convert(varchar(5),@sum)+’人,超过了60%,及格分数线还应下调’
           Else   print ‘未通过人数:’+convert(varchar(5),@sum)+’人,已控制在60%以下,及格分数线适中’              GO


62.调用存储过程:         
例:

复制代码 代码如下:

               Declare  @s  int
               Exec proc_stuinfo  ‘张三’ ,@s , 30    ———错误!应为(exec proc_stuinfo ‘张三’,@s  output,30)
                Exec proc_stuinfo ‘张三’ ,@s     ————错误!应为(exec proc_stuinfo ‘张三’,@s output)
                Exec proc_stuinfo  @sAge=22,@stuName=’李四’,@m=@s output(正确!)


原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/database/236289.html

(0)
上一篇 2022年1月24日 21:25
下一篇 2022年1月24日 21:25

相关推荐

发表回复

登录后才能评论