zoukankan      html  css  js  c++  java
  • SQL基础

    @check约束

    例:创建Users,要求电子邮件必须包括“@”

         解:create table users

             (uid int primary key ,uname char(32),ueamil char(32)

    Usex bit ,check (ueamil char(32) like ‘%@%’))

    @默认约束

    例:要求性别默认为1 ,性别不能为空

        解:create table users

            (uid int primary key ,uname char(32),ueamil char(32)

    Usex bit default ‘1’not null ,check (ueamil char(32) like ‘%@%’))

    @表中字段的增加、修改、删除

    例:创建一个数据库student,并建表course在表中加一个meno字段,删除credit字段,并修改c_name字段类型。

       解:create database student

           Create table course

           (c_number char(10) not null,

    C_name char(30) ,hours int, credit real)

    Alter table course add meno char(10)

    Alter table course drop column credit

    Alter table course alter column c_name char(32)

    @创建索引

    例:为表users创建唯一索引,字段为uname,索引名为i_name

           解:create unique index i_name

               On users (uname)

    例:为表users创建聚集索引,字段为name,索引茗为s_name

           解:create clustered index s_name

                On users(name)

    例:为表users创建非聚集索引,字段为name,索引名n_name

            解:create nonclustered index n_name

                On users(name)

    例:为表users创建一个复合索引,字段为uname和usex,索引名为i_name_sex

            解:create index i_name_sex

                On users(uname,usex)

    例:删除索引n_name

            解:drop index.n_name

    一、(建表)使用Transdct-SQL语句创建表

    语法:creat table [表名]

          (字段1 pximary key,字段2,

    …字段n)

    例:在数据库factory中建立部门表depart,字段部门号,类型int;部门名,类型char,长度为10。部门号为主键。

               解:ues factory

                   go

                   create table depart

                  (部门号.int pximary key,

    部门名.char10))

    二(查询)使用select语句查询数据库

    all 指查询所有结果

    distinct 指在查询结果中不显示重复值

    top n 指在结果中显示前n个值

    top n﹪指在结果中显示前n﹪个值

    * 指结果中显示所有值

      常用函数:sum([distinct∣all]<列名>)计算某列的和

                avg([distinct∣all]<列名>)计算某列的平均值

                count([distinct∣all]<列名>)计算某列值的个数

                count([distinct∣all]<*>)计算记录的个数

                max([distinct∣all]<列名>)计算某列的最大值

                min([distinct∣all]<列名>)计算某列的最小值

    例1 查寻表select中所有记录

                select * from select

      2 查询表select前2条记录

                解:select top 2 *from select

      3 查询所有版块中名称、点击率、帖子数

                解:select 名称,点击率,帖子数from section

       4 查询所有版块帖子数,不含重复值

                解:select distinct 帖子数 from section

       5统计所有版块中帖子总数

                解:select sum(帖子数)from section

    三.关键字where的用法

           比较运算符号: 等于=    大于>  小于<    大于等于>=      小于等于<=

                         不等于<>    不大于!>      不小于!<       不等于!=

    例:查询表section中点击率不低于100,并且帖子数不为0的版块。

             select * from section

                 where 点击率>=100

                 and 点击率<>0

    四、关键字between的用法

         例:查询表section中点击率在50到100之间的版块

                 解:select * from section

                     where 点击率 between 50 and 100

    五、关键字in的用法

           例:从users表中查询生日在3月,5月,7月出生的信息

                   解:select * from users

                       where month(出生日期)in357

    六、关键字like的用法

     表示任何类型字符    如刘% 指姓刘的人

     表示任何单个字符      如刘_ 指单名刘姓的人

    [] 指定范围或集合的任何单个字符

    [^] 不属指定范围或集合的任何单字符

         例:查找author表中区号为415的电话

               解:select photo from authors

                   where photo like ‘415%’

    七、关键字null的用法  【null表示未知】

             例:在表title中查出预付款少于5000或预付款未知的书

                    解:select 书号,预付款 from title

                        where 预付款<5000 or 预付款 is null

    八、(分组)关键字group by 的用法   【group by 指分组】

             例:统计users表中男女人数,并按性别分组。

                     解:select 性别,count*from users

                          group by 性别

    九、关键字having的用法。  【通常与group by连用】

             例:在表title中查询截止目前销售超过40000的出版商。

                     select 出版商,sum(销售额) from title

                         group by 出版商

                         having sum(出版额)>40000

    十、(排序)关键字order by的用法。  【order by指排序】

            asc  指升序

            desc 指降序

          例:将发帖表中topic记录按点击率由低到高排序。

                    解: select *from topic

                         order by 点击率 asc

    十一、关键字compute的用法    【用于生成统计结果】

            例:查询section表中所有版块点击率及平均点击率。

                     解:select 版号,版名,点击率 from section

                         compute avg(点击率)

    十二、连接查询        【交叉连接cross join   内连接inner join  外连接outer join】

             例1:【内连接inner join】显示所有职工的职工号、姓名、部门名和工资,并按部门名顺序排列

                    解:select worker.职工号,worker.姓名,部门名,工资

    from worker join depart

    on worker.部门号=depart.部门号

    join salary on worker.职工号=salary. 职工号

    order by 部门名

              例2:【左外连接lift outer join】采用左向外联接。查找200001班所有学生的

    学号、姓名及他们选修课程号,同时也列出该班没选课的学生的学号、姓名。

                   解:select student_info.学号, 姓名,result_info.课程号

    from  student_info 

    left outer join result_info

                       on student_info.学号= result_info.学号

    where 班级号='200001'

                例3:【右外连接right outer join】采用右向外联接。查找所有学生的学号,姓名及他们选修课程号,同时也列出没选课的学生的学号、姓名。

                     解:select student_info.学号, 姓名, result_info.课程号

                         from result_info 

    right outer join student_info

    on student_info.学号= result_info.学号

                例4:【交叉查询cross join】列出学生所有可能的选课情况。

                      解:select学号,姓名,课程号,课程名

    from student_info

    cross join course_info

    十三、联合查询       【union的用法】

    十四、嵌套查询【子查询】

                例1:【一般子查询】使用子查询来查询孙华所在的部门。

     

                       解:select 部门名 from depart

    where 部门号=

    (select部门号from worker

    where姓名=‘孙华’)

                 例2:【in或not in的子查询】查找选修了课程号为13的课程的学生情况

                        解select * from student_info

    where student_id

    inselect student_id from result_info

    where课程号=13)

                  例3:【比较运算的子查询all】查询年龄最小的论坛用户的用户的编号、昵称、出生日期和电子邮箱。

                      解:select 编号, 昵称, 出生日期, 电子邮箱l

    from Users

    where 出生日期 >= all (select出生日期fromUsers )

                  例4:【比较运算子查询any】查询除年龄最小的论坛用户外的所有用户的编号、昵称、出生日期和电子邮箱。

                     解:select编号, 昵称,出生日期, 电子邮箱

    from Users

    where 出生日期 > any(select 出生日期 from Users )

    十五【插入数据】、使用insert语句插入数据  【into】

                  例:将一行添加到 Pubs数据库的titles 表中,以指定书名BU9876、类型Creating Web Pages、出版商business及价格29.99的值:

                  解:insert into titles(书名,类型, 出版商, 价格)

    values ('BU9876', 'Creating Web Pages', 'business', '29.99')

    十六【更新数据】、使用update更新数据    【set】(where为条件若没有则全部更新)

                  例:修改Pubs数据库的titles 表中书号为'BU9876'的书名为“网页制作”。

                      解:update titels

    set title=’网页制作

    where书号=’BU9876’

    十七【删除数据】、使用delete语句删除数据(where为条件若没有则全部删除)

                  例:删除pubs数据库titles表中书号为'BU9876'的记录。

                       解:delete from titles

    where 书号=’BU9876’

    视图应用(课件

    十八【创建视图】、使用create view创建视图      【as】

                  例:利用表user创建一个新的视图,命名为v-user。要求显示级别大于3的用户昵称、性别、登记和备注信息。

                        :create view v-uesr

                          as

                          select 昵称,性别,登记,备注信息,作者编号

                          from user

                          where 作者编号>=3

    十九【查看视图】、使用系统储存过程查看视图信息。  

                 sp_help      显示视图所有者和创建时间

                 sp_helptext   显示视图的源代码

                 sp_depends   显示视图引用的对象清单

             例:查看视图v_uerr的源代码。

                     解:sp_helptext v_uesr

    二十【修改视图】、使用alter修改视图。

           例:修改toptopic。要求显示点击率大于1000的信息。

                    解:alter view toptopic

                        as

                        select section.板块,user.作者,topic.点击率

                        from sectiontopicuser

                        where topic.tuid=user.tuid and topic.tsid=section.tsid

                        and topic.点击率>1000

    二十一【重命名视图】、使用sp_rename重命名视图。

             例:将视图toptopic重命名为hoptopic。

                    解:sp_rename’toptopic’,’ hoptopic’

    二十二【插入视图数据】、使用insert向视图插入数据。

    二十三【更新视图数据】、使用update更新视图数据。

    二十四【删除视图数据】、使用delete删除视图数据。

    二十五【删除视图】、使用drop删除视图。

             例:删除视图section

                     解:drop view section

    数据库管理(课件)

    二十六【创建备份设备】、使用sp_addumpdevice创建备份设备。   【后缀.bak】

               例:在c盘上创建永久备份文件mybackupfile。

                   解:exec sp_addumpdevice disk‘,’mybackupfile ‘,c\mybackupfile.bak

          【注:c:\mybackupfile.bak提前建立】

    二十七【备份】、使用backup备份数据库或文件。 

               例1【整个备份】:将数据库bbDB整个备份到myback中。

                     解:backup database bbDB to myback

               例2【差异备份】:对数据库bbDB进行差异备份,新备份集追加到设备myback。

                       解:backup database bbDB tomybackwith differential noinit

               例3【文件备份】备份数据库bbDB中文件bbDB_data

                        解:backup database bbDB

    file=bbDB_datato myback with noinit

               例4【事务日志备份】备份数据库中bbDB的事物日志到myback。

                        解:backup log bbDB to myback

    二十八【恢复数据库】、使用restore恢复数据库。

                例1【恢复整个数据库】从myback中对数据库bbDB第一个完全备份中恢复。

                        解:restore database bbDB

    from myback

    with file=1norecovery

                 例2【恢复差异备份】还原差异备份。

                        解:restore database bbDB

     from myback

    with file=2norecovery

                  例3【恢复数据文件】还原数据库bbDB数据库中文件bbDB_date。

                          解:restore database bbDB

                              file=bbDB_date

                              from myback

                              with noreconery

                  例4【恢复事物日志】还原数据库bbDB中的事务日志。

                           解:restore log bbDB from myback

                               with recovery 

     

    transact_SQL程序设计(课件

    二十九、全局变量

             @@connections:返回自上次启动SQL Server 以来连接或试图连接的次数。

    @@langid:返回当前所使用语言的本地语言标识符(ID)。

    @@max_connections:返回SQL Server 上允许的同时用户连接的最大数。

    @@servername:返回运行SQL Server 的本地服务器名称。

    @@version:返回SQL Server当前安装的日期、版本和处理器类型。

              例1显示到当前日期和时间为止试图登录SQL的次数。

                      解:select getdate()as ‘当前登录日期和时间’

                          @@connections as ‘企图登录次数’

               例2、显示SQL server 安装的日期、版本和处理类型。

                      解:select @@version as SQL server基本信息’

    三十、局部变量   【declare命令 set和select赋值】

           语法:--定义局部变量@xm和@bmh------ declare @xm char(8),@bmh int

                 给 @ xm和@ bmh赋值----------- set @xm = ‘孙华'

    select@ bmh = 部门号  

    from  worker

                                              where 姓名= @xm

                     显示@bmh的值---------------- select @bmh as 部门号

                例1:创建一个局部变量,统计pubs表中jobs的记录个数。

                                解:declare @count int

                                    select @count=count*

                                    from jobs

                                    select @count asjobs表的记录个数’

               例2:创建局部变量,求出jobs表中最低日工资的最小值和最高日工资的最大值。

                       解:declare @max real@min real

                           select @max=max(最高日工资),@min(最低日工资)

                           from jobs

                          select @max as‘最高日工资’,@min as‘最低日工资’   

    三十一、运算符  

              语法1【算术运算符】【ExpResult】【+(加)、-(减)、*(乘)、/(除)和%(模)】

              --定义局部变量-----------------declare @ExpResult real

              --赋值局部变量-----------------set @ExpResult=1+3*7%2

              --显示局部变量赋值结果-----select '表达式计算结果'= @ExpResult

              语法2【赋值运算符】

              语法3【位运算符】

      --定义局部变量------declare @ExpResult1 int, @ExpResult2 int, @ExpResult3 int

     --赋值局部变量------ select  @ExpResult1=17&11,

                              @ExpResult2=17|11,

                              @ExpResult3=17^11

       --显示局部变量赋值结果-- select @ExpResult1  AS '按位与运算的结果',

                                   @ExpResult2   AS '按位或运算的结果',

                                   @ExpResult3   AS '按位异或运算的结果'

               语法3【比较运算符】

               语法4【逻辑运算符】【AND(与)、OR(或)、NOT(非)】

               语法5【字符串运算符】

         --定义局部变量----------------------declary @Course char(50)

     利用字符串连接符号给局部变量赋值set @Course=‘SQL Server’+‘ 2000’

     -显示局部变量赋值结果-----------------select @Course AS '字符串连接运算结果'

                语法6【理解运算符】

    三十二、内置函数

        【字符串函数】

    ASCII:返回字符表达式最左端字符的 ASCII代码值。

    CHAR:返回相同ASCII代码值的字符。

    LEFT:返回从字符串左边开始指定个数的字符。

    RIGHT:返回字符串中从右边开始指定个数的字符。

    STUFF:删除指定长度的字符并在指定的起始点插入另一组字符。

    SUBSTRING:返回指定表达式的一部分。

    UPPER:返回将小写字符数据转换为大写的字符表达式。

    例1:利用字符串函数对于“   GOOD  MORNING  ”进行处理。

               解:--利用RTRIMLTRIM去掉左右两端的空格

                  declare  @S char(20)

    Set @S=rtrim(ltrim(“   GOOD  MORNING  ”))

    select ‘==‘@S +‘==‘

                  --利用SUBSTRING求得GOOD

                 select substring(@S ,1,4) 

    例2:显示字符A的ASCII码。

               解:select ASCII(‘A’) as AASCII码’

    【时间和日期函数】

    day:返回指定日期的天数。

    getdate ( ):返回当前日期和时间。

    month:返回指定日期的月份。

    year:返回指定日期的年份。

    datediff:日期之差。

        例1:返回系统当前日期,以及当前的年份,月份和天数

              解:select getdate() as '当前日期 ',

                  year(getdate()) as '当前年份',

                  month (getdate()) as '当前月份',

                 day(getdate()) as '当前天数

        例2:显示今天距2003年1月21日相隔的天数。

               解:select datediffday,‘2003-1-21’,getdate())as ‘相隔天数’

    【数学函数】

    sqrt :返回给定表达式的平方根。

    ceiling :返回大于或等于所给数字表达式的最小整数。

    floor  : 返回小于或等于所给数字表达式的最大整数。

    round : 返回数字表达式并四舍五入为指定的长度或精度。

              例:找出大于等于36.89的最小整数和小于等于36.89的最大整数和四舍五入36.89到一位小数。

                     解:select ceiling36.89asceiling36.89)的值’

                              floor36.89asfloor36.89)的值’

                              round36.891asround36.891)的值’

                     <结果 37     36      36.9>

    【转换函数】【cast   convert】

    三十三、自定义函数  【create function】

            语法1【标量函数】

               例:编写一个函数,输入职工号后得到该职工的姓名,职工号作为函数的输入参数。

                  解:<定义函数>create function fn_zgxm(@zgh int)

    returns  char(8)

    as

                                begin

                                declare  @Name char(8)

                                set @Name=(select 姓名from worker

                                            where 职工号= @zgh )

                               return @Name

    end

                 查出职工号为1的职工姓名

                   <调用函数>exec dbo.fn_zgxm(1)

          语法2【内嵌表函数】

               例:编写一个函数,根据部门号,得到部门职工的情况。

                     解:<定义函数>create function fn_zg (@bmh int)

    returns table

    as

    return

    select *from worker

    where 部门号= @bmh

                  --返回职工号为1的职工的情况

    <调用函数>Select * from fn_zg(1)

    三十四、使用if …else语句。

          例:编写程序,判断孙华的工资是否大于等于2000元,如果是 ,显示“工资高”;否则显示“工资低”。

              解:declare @GZ decimal(6,1)

    Select @GZ=工资

    from salary

    where 姓名='孙华'

    if @GZ>=2000

    print '工资高'

    else

    print '工资低'

    三十五、使用case语句。

           例1:将factory库的worker表中的孙华的部门号转换为相应的部门名。规则:1-财务处,2-人事处,3-市场部。

                 解:select 职工号,姓名,

    case 部门号

                    when 1 then '财务处'

                    when 2 then '人事处'

                    when 3 then '市场部'

                    end

                    from worker

    where  姓名='孙华'

            例2:编写程序查询学号为20000101的各学生各门课程的成绩,并将成绩 转换为不同的等级。

                  解:select course_no, result,

    case

                     when result>89 then '优秀'

                     when result>79 then '良好'

                     when result>69 then'中等'

                     when result>59 then '及格'

                     else '不及格'

    end

         from result_info

    where  student_ID=20000101

    三十六、使用while…continue…break语句。

          例1:使用WHILE语句求1+2+3……+100的和。

       解:【设变量@S存放和,初始值为0;@i初始值为1

    1 判断@i的值是否大于100,如果大于则直接转到5,否则执行2;

    2将@i的值加到@S中,即 @S的值为@S+@i;

    3 @i加1;

    4 转到1继续执行;

    5 输出@S】

           declare @S int, @i  int

    select @S=0,@i=1

    while @i<=100

    begin

           set@S=@S+@i

         set @i=@i+1

     end

    print@S

       例2:使用while语句求10的阶乘。

           解: 设@S为10的阶乘存放,初始值为1;@M为变量,初始值为10。

                declare @S int@M int

                select @S=1@M=10

                while @M>0

                begin

                set @S=@S*@M

                set @M=@M1

                end

                print @S

    储存过程(课件

    三十七、创建储存过程      【create proc】

          例1:创建一个存储过程用于查找factory库Worker表中职工的职工号,姓名,出生日期信息。

                解:【创建】create proc p_zg

     as

     select 职工号,姓名,出生日期 FROM WORKER

    go

                   【执行】exec p_zg

          例2:【含参数】创建一个存储过程,用于向DEPART表中插入记录。

               解【创建】create proc p_bm

     @bmh int,@bmm char(10)

    as

    insert into depart

    values(@bmh, @bmm)

                 【执行】exec p_bm 4,’后勤部’  或者 exec p_bm @bmh=4,@bmm=‘后勤部

         例3:【使用 output 参数创建带有输出参数的存储过程】下面的存储过程根据职工号返回两个参数@xm和@sr,分别代表职工的姓名和出生日期。

             解:create proc P_XS

    ( @zgh int,@xm char(8) output,

    @sr datetime  output)

    as

    select @xm=姓名, @sr =出生日期

    from worker

    where 职工号=@zgh

            执行该存储过程,查询职工号为5的职工姓名和出生日期。

                  declare @zgxm char(8)

    declare @csrq datetime

    exec P_XS 5,@zgxmoutput,@csrq output

    select '姓名'=@zgxm,'出生日期'=@csrq

          例4:【输入默认值】创建一个向worker插入记录的存储过程,其中性别的默认值为’男’。

              解:create proc P_W

    (@ZGH int,@XM char(8),@XB char(2)='')

    as

    insert into worker

    (职工号,姓名,性别)

    values(@ZGH,@XM,@XB)

       执行插入职工号为20姓名为张三:  

     exec p_w 20,'张三'

    三十八、查看存储过程

            sp_help  procedure_name :  显示存储过程的所有者和创建时间

            sp_helptext  procedure_name:显示存储过程的源代码

      sp_depends  procedure_name:显示该存储过程引用的对象清单

    三十九、修改存储过程

               sp_rename 旧名称, 新名称

    四十、删除存储过程

               drop proc 名称

    触发器(课件

    四十一、insert触发器

            例:当发帖时,假设我们有这样的业务规则:如果用户未录入帖子标题,则该帖不能发表。

              解:create trigger tr_topic_insert2

    on topic

    for insert

    as

    declare @topic char(255)

    select @topic =TTOPIC

    from inserted

    if @topic =' '

    begin

                  raiserror ('请录入帖子标题', 16, 1)

                  rollback transaction

    end

    go

             执行insert into TOPIC(TSID, Ttopic, Tcontents, Ttime, TUID)

    values(2,' ', '【计划路线】 山场---大镜山水库左侧--凤凰山', getdate(), 3)

    四十二、delete触发器

          例:建立一个触发器,当用户删除某张帖子时,自动将版块表section中相关版块的帖子总数减一。

              解:create trigger tr_topic_delete1

    on topic

    for delete

    as

    declare @N int

    section @N=tisid from deleted

    update section

    set STopicCount = StopicCount-1

    where sid=@N

    go

          执行  delete topic

    where tid=5

       例:在表worker上创建一个触发器,当删除职工记录时同时删除salary表中对应职工的工资记录。

             解:create trigger tr_zg

    on worker

    for delete

    as

                 declare @N int

                 select @N=职工号 from deleted

                 delete salary

                where 职工号=@N

          执行  delete from worker

    where 职工号=15

    四十三、update触发器   instead of 触发器

    四十四、查看触发器

    sp_help  trigger_name :  显示触发器的所有者和创建时间

    sp_helptext  trigger_name:显示触发器的源代码

    sp_helptrigger  table_name:显示某个表定义的触发器清单

    sp_depends  trigger_name:显示该触发器引用的对象清单

    四十五、修改触发器

        【重命名】sp_rename old_trigger_name, new_trigger_name

    四十五、删除触发器

         drop trigger trigger_name

    SQL数据库查询练习

    一、单表查询

    1、显示所有职工的基本信息。

          select * from worker

    2、查询所有职工所属部门的部门号,不显示重复的部门号。

           select distinct (部门号)from worker

    3、求出所有职工的人数。

           select count(*)from worker

    4、列出最高工和最低工资。

           select max(工资),min(工资)from salary

    5、列出职工的平均工资和总工资。

           select avg(工资),sum(工资)from salary

    6、创建一个只有职工号、姓名和参加工作的新表,名为工作日期表。

           select 职工号,姓名,参加工作

           into 工作日期表 from worker

    7、显示所有女职工的年龄

           select 职工号,姓名,year(getdate())-year(出生日期)from worker

           where 性别=‘女’

    8、列出所有姓刘的职工的职工号、姓名和出生日期。

           select 职工号,姓名,出生日期from worker

           where 姓名 like ‘刘%’

    9、列出1960年以前出生的职工的姓名、参加工作日期。

            select 姓名,参加工作from worker

            where 出生日期<1960

    10、列出工资在1000-2000之间的所有职工姓名。

            select 姓名 from salary

            where 工资 between 1000 and 2000

    11、列出所有陈姓和李姓的职工姓名。

             select 姓名 from worker

             where 姓名 like‘[陈,李]%’

    12、列出所有部门号为2和3的职工号、姓名、党员否。

             select 职工号,姓名,党员否from worker

             where 部门号 in (2,3)

    13、将职工表worker中的职工按出生的先后顺序排序。

             select * from worker

             order by 出生日期 asc

    14、显示工资最高的前3名职工的职工号和姓名。

             select top 3职工号,姓名from salary

             order by 工资 desc

    15、求出各部门党员的人数。

           select count (*)from worker

            where 党员否='1'

    16、统计各部门的工资和平均工资

            select 工资 from salary compute avg(工资)

    17、列出总人数大于4的部门号和总人数。

            select 部门号,ount(*)from worker

            group by 部门号

            having count(*)>4

    二、多表查询

    1、列出每名职工的职工号、姓名和部门名。

           select worker.姓名,worker.职工号,depart.部门名

           from worker,depart

           where worker.部门号=depart.部门号

    2、列出市场部的所有女职工的姓名和党员否。

           select worker.姓名,worker.党员否,depart.部门名

           from worker,depart

           where worker.部门号=depart.部门号

           and 性别=‘女’and 部门名=‘市场部’

    3、显示所有职工的姓名、部门名和工资数。

            select worker.姓名,depart,部门名,salary.工资

            from worker,depart,salary

            where worker.部门号 =depart.部门号,

            and worker.姓名=salary.姓名

    4、*显示所有职工的职工号、姓名、部门名和工资,并按部门名顺序排列。

             select worker.职工号,worker.姓名,depart.部门名,salary.工资

             from worker ,depart,salary

             where worker.部门号=depart.部门号

             and worker.姓名=salary.姓名

             order by 部门名

    5、*显示各部门名和该部门的所有职工平均工资。

             select depart.部门名,avg(工资)

             from depart,salary,worker

             where depart.部门号=worker.部门号

             and worker.姓名=salary.姓名

             group by 部门名

    6、*显示所有平均工资高于1200的部门名和对应的平均工资。

             select depart.部门名,avg(工资)

             from depart,salary

             group by 部门名

             having avg(工资)>1200

    *1、查询刘欣所在的部门。

            select 部门名 from worker,depart

           where worker.部门号=depart.部门号

          and姓名=‘刘欣’

       或者

         select 部门名 from depart

         where 部门号=(select 部门号 from worker where 姓 名='刘欣')

    *2、查询部门名为财务处的职工的情况。

              select *

             from worker,depart

             where worker.部门号=depart.部门号

             and 部门名='财务处'

       或者

            select * from worker

            where 部门号=(select 部门号

            from depart where 部门名=‘财务处’)

       T-SQL程序设计练习

    一、变量的使用

    1.执行下列语句,记录SQL Server 安装的日期、版本和处理器类型。

    select @@version

    2.定义两个变量分别存放salary表中的职工最高工资和最低工资。最后显示这两个变量的值。

    解:declare @max real,@min real

    select @max=max(工资),@min=min(工资)

    from salary

    select @max as '最高工资',

    @min as '最低工资'

    1. 执行下列语句,记录服务器端计算机名称、数据库用户名

    解:select HOST_NAME(),USER_NAME()

    2. 记录下列语句的运行结果

    解:select substring('GOOD MORNING',6,4)  

    3. 记录下列语句的运行结果

    解:select round(123.456,2)

    4.显示字符C的ASCII码

    select ascii('a') as 'cascii'

    5.显示ASCII码为99的字符

    解:select char(99) as 'ascii对应的字符'

    6.显示当前系统日期的年份、月份和天数

    解:select getdate() as '当前日期',

    year(getdate()) as '当前年份',

    month(getdate()) as '当前月份',

    day(getdate()) as '当前天数'

    三、用户自定义函数使用

    1.编写一个函数,输入职工号,得到职工的出生日期。(查职工号为1的出生日期)

     解:(编写函数)create function fn_csrq(@zgh int)

    returns datetime

    as

     begin

    declare @csrq datetime

    set @csrq=(select 出生日期 from worker

    where 职工号=@zgh)

    return @csrq

    end

    (调用函数)select dbo.fn_csrq(1)

    2.*编写一个函数,根据部门号,得到该部门职工的职工号和姓名。

     解:create function fn_zg(@bmh int)

    returns table

    as return

    select * from worker

    where 部门号=@bmh

    执行  select * from fn_zg(2)

    四、流程控制语句的使用

    1查询worker表中职工的职工号,姓名,性别,当性别为男,输出’Male’,当性别为女,输出’Female’。

     解:select 职工号,姓名,性别,

    case 性别

    when ''then 'Male'

    when ''then 'Female'

    end as '性别'

    from worker

    2.查询salary表中职工的工资情况,当工资高于2000时,输出“高”;当工资在1000-2000之间时,输出“中等”;当工资低于1000时,输出“低”

    解:select 职工号,姓名,

    case

    when 工资>2000 then ''

    when 工资>1000 then '中等'

    else ''

    end as '工资等级'

    from salary

    3.用while语句计算1+1/2+1/3+......+1/10的值。

                      解:declare @S float@M float

                          select @S=0@M=1

                          while @M<=10

                          begin

                          set @S=@S+1/@M

                          set @M=@M+1

                          end

                          print @S

    4.统计男、女职工的人数,若男职工人数高于女职工,则显示“男职工多”,否则显示“女职工多”。

     解:declare @N1 int,@N2 int

    select @N1=count(*)

    from worker

    where 性别=''

    select @N2=count(*)

    from worker

    where 性别=''

    if @N1>@N2

    print '男职工多'

    else

    if @N1<@N2

    print'女职工多'

    存储过程

    1、创建一个为worker表添加职工记录的存储过程addworker。然后执行该存储过程,向worker表中添加一条记录。

    解:create proc adworker

    (@zgh int,@xm char(8),@xb char(2))

    as

    insert into worker

    (职工号,姓名,性别)

    values

    (@zgh,@xm,@xb)

             添加职工号为20,姓名为呈西,性别为女的记录

                    exec adworker 20,'呈西','女'

    2、创建一个存储过程dworker删除worker表中指定职工号的记录。然后执行该存储过程,删除职工号为15的记录。

    :create proc dworker

    (@zgh int)

    as

    delete from worker

    where 职工号=@zgh

            删除职工号为15的记录

                   exec dworker 15

    3.创建一个存储过程SWorker,根据职工的姓名查询对应的性别,部门名。

     解:create proc SWorker

    (@xm char(8))

    as

    select worker.姓名,worker.性别,depart.部门名

    from worker,depart

    where worker.部门号=depart.部门号

    go

    查找孙华的性别及所在的部门名

            exec SWorker '孙华'

    4、显示存储过程delworker。

               解:sp_help delworker

    5、删除存储过程delworker。

               解:drop proc delworker

    6、在表depart上创建一个触发器depart_insert,如果插入的记录的部门名为空时,则该记录不能插入。然后插入一条部门名为空的记录进行验证。

     解: create trigger depart_insert

    on depart

    for insert

    as

    declare @bmn char(10)

    select @bmn=部门名 from depart

    if @bmn=''

    begin

    raiserror ('请输入部门名',16,1)

    rollback transaction

    end

    go

           执行  insert into depart(部门号,部门名) values(9,'')

    7、在表worker上创建一个触发器worker_delete,当删除职工记录时同时删除salary表中对应职工的工资记录。然在表worker中插入一条记录进行验证。

     解:create trigger worker_delete

    on worker

    for delete

    as

    declare @zgh int

    select @zgh=职工号 from worker

    delete salary

    where 职工号=@zgh

            执行  delete from worker

    where 职工号=15

    8、删除6题中创建的触发器。

    解:drop trigger depart_insert

  • 相关阅读:
    codeforces
    codeforces
    HDU
    poj
    poj
    HDU Problem
    HDU 3555 Bomb 【数位dp】
    POJ 1942 Paths on a Grid【组合数学】
    杭电 Problem 2089 不要62 【数位dp】
    codeforces 486c-Palindrome Transformation【贪心】
  • 原文地址:https://www.cnblogs.com/soundcode/p/2556448.html
Copyright © 2011-2022 走看看