• 简单sql操作



    ----------------------------- 数据库的有关SQL语句 -------------------------
    1、数据库
    创建 create database data_name
    on primary
    (name= ,filename= ,size= ,maxsize= ,filegrowth=),
    filegroup [辅助文件组名]
    (name= ,filename= ,size= ,maxsize= ,filegrowth=)
    log on
          (name= ,filename= ,size= ,maxsize= ,filegrowth=)
    修改 alter database 原数据库名
    modify name=新名字
    删除 drop database data_name


    2、架构
    创建 create schema jiagou
    删除 drop schema jiagou


    3、辅助文件
    添加 alter database data_name
    add file(name=file1,filename='d:file1.ndf',size=10MB,filegrwth=10MB) to filegroup
    group1
    修改 alter database data_name
    modify file(name= ,filename= ,size= ,maxsize= ,filegrowth=)
    删除 alter database data_name
    remove file file_name


    4、日志文件(修改的时候,逻辑名称不能修改)
    添加 alter database data_name
    add log file (name= ,filename= ,size= ,maxsize= ,filegrowth=)
    修改 alter database data_name
    modify file(name= ,filename= ,size= ,maxsize= )


    5、文件组
    添加 alter database data_name
    add filegroup group_name
    修改 alter database data_name
    modify filegroup 原文件组名 name=新文件组名
    删除 alter database data_name
    remove filegroup 文件组名


    --------------------------------- 表的有关SQL语句 --------------------------------


    1、表
    创建:create table table_name
    (
    id int identity(1001,3) primary key not null,
    st_name nvarchar(10) null,
    sex nvarchar(4) default('男'),
    gongzi money,
    shijian datetime
    )
    修改表名:exec sp_rename 'table', 'table33' (注意:尽量不要改表名,容易引起其它对象的错误)
    删除:drop table table_name


    2、表的列(字段)的操作
    添加列:alter table table_name
    add 列名 列的数据类型 null / not null
    删除列:alter table table_name
    drop column 列名
    修改列的名称: exec sp_rename '表名.字段名', '新的字段名', 'column' (提示:尽量不要改列名,容易引起错误)
    修改列的数据类型: alter table table_name
    alter column 列名 列的数据类型
    3、对数据的操作
    插入: insert into table_name(字段1,字段2,字段3) values( 值, 值, 值,)
    删除:delete from where stu_name='王伟' and id=3
    修改:update table_name set 字段名=值 where id=4


    ------------------------------------ 主键、外建 (补充) -------------------------
    1、创建:

    create table class
    (
    cl_id int primary key,
    cl_name nvarchar(10) null
    )


    create table address
    (
    add_id int primary key,
    add_name nvarchar(10) null
    )


    create table student
    (
    stu_id int primary key,
    stu_name nvarchar(10) null,
    cl_id int foreign key references class(cl_id) null ,
    add_id int foreign key references address(add_id) null
    )


    意义:用于和加强表之间的联系,当在添加,修改和删除数据时,保持几张表中数据的一致性


    ------------------------------ SQL查询语句 --------------------------------


    1、排序
    select top(3) * from student order by cl_id desc


    2、分组
    select class_id ,sum(score) as chengji from student group by class_id
    having sum(score)>=250
    order by sum(score) desc
    提示:聚合函数不能在where中使用,所以才用到了having


    3、清空表
    truncate table table_name


    4、消除重复列
    select distinct 列名 from table_name (提示:只能显示出此列,其它列显示不出来)


    5、select * from table_name where name in ('张三','李四','王五')
    select * from table_name where score in (100,90,87,89,96)


    ------------------------------- 表联接 ---------------------------------

    1、内联接:select * from student as s inner join class
    as c on s.cl_id=c.cl_id where .....


    2、左外联接:返回第一个已命名的表中符合条件的所有行
    select * from student as s left join class as c on s.cl_id=c.cl_id
    where ....


    3、右外链接:返回第二个已命名的表中符合条件的所有行
    select * from student as s right join class as c on s.cl_id=c.cl_id
    where .....


    4、完全外联接:返回左表、右表中的所有值
    select * from student as s full join class as c on s.cl_id=c.cl_id


    5、交叉联接:将从被联接的表中返回所有可能的行组合(会生成一个笛卡尔积)
    select * from student as s cross join class as c
    where ....


    6、两个以上的表的联接:
    select * from student as s join class as c
    on s.cl_id=c.cl_id join address as a on s.add_id=a.add_id
    where s.name='张三'


    7、union 结合多个表的数据
    select stu_id as '学生编号' , stu_name as '名字' from student1
    union
    select id ,name from student2
    union
    select s_id , s_name from student3


    --------------------------- 子查询 ----------------------


    1、把子查询用作派生表

    可用子查询产生一个派生表,用于代替where、having、from子句中的表,注意要用别名来引用这个派生表

    select s.stu_name,s.cl_id from (select * from student where stu_id >2) as s
    where s.stu_name='王二'


    2、把子查询用作表达式

    在sql语句中,所有使用表达式的地方,都可以用子查询代替,此时子查询必须取值为单个列值的表,于是这个子查询可以代替where子句中包含in关键字的表达式

    select * from student where stu_id not in (select id from student where stu_id>2)

    3、使用子查询关联数据

    关联子查询可以作动态表达式,因为它随着外层查询的每一次变化而变化


    例1:
    select stu_id,stu_name,cl_id,(select count(stu_id) from student) as 记录条数 from student


    例2:
    select * from student as s join class as c on s.cl_id=c.cl_id
    where not exists(select * from class where c.cl_id>3)


    --------------------------- 变量、条件语句、循环语句 --------------------------


    1、变量


    (1)局部变量---可以select、set进行赋值

    例一:declare @i int
    select @i=count(*) from student
    print @i


    例二:declare @sname varchar(4)
    set @sname='张三'
    print @sname


    (2)全局变量---只能用系统提供的,用户不能定义,所以只了解一下书上70页的就可以


    2、条件语句

    (1) if...else...语句
    declare @sex_id int
    declare @sex_name nvarchar(4)
    select @sex_id=sex from student (where ...)
    if @sex_id=1
    begin
    set @sex_name='男'
    end
    else
    begin
    set @sex_name='女'
    end
    print @sex_name


    (2) case语句
    select stu_name as 姓名, (case cl_id
    when 1 then '一班'
    when 2 then '二班'
    when 3 then '三班'
    when 4 then '四班'
    else '暂无班级'
    end ) as 班级 from student

    3、循环语句

    while 语句:
    declare @i int
    declare @name nvarchar(10)
    set @i=1
    while @i<13
    begin
    select @name=stu_name from student where stu_id=@i
    print @name
    set @name=''
    set @i=@i+1
    end


    ------------------------------ 事务 ------------------------------


    1、事务的概念
    事务是一种机制、是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行。因此事务是一个不可分割的工作逻辑单元。这特别使用于多用户同时操作的数据通信系统:订票、银行、保险公司以及证券交易系统等。需要使用事务的SQL语句通常是更新和删除操作等。


    2、创建事务
    开始事务:begin transaction
    提交事务:commit transaction
    回滚事务:rollback transaction
    @@error全局变量显示错误号


    3、例题
    begin transaction /* 开始事务 */
    declare @error_sum int /* 错误数量 */
    declare @sum int /* 人数 */
    declare @a nvarchar(10) /* 转钱者 */
    declare @b nvarchar(10) /* 得钱者 */
    declare @x int /* 转账金额 */

    set @error_sum=0
    set @a='于聪'
    set @b='许'
    set @x=2000


    select @sum=count(*)from icbc where users=@a or users=@b
    if @sum = 2
    begin
    set @error_sum=@error_sum+0
    end
    else
    begin
    set @error_sum=@error_sum+1
    end


    update icbc set moneys=moneys-@x where users=@a
    set @error_sum=@error_sum + @@error
    update icbc set moneys=moneys+@x where users=@b
    set @error_sum=@error_sum + @@error


    if @error_sum > 0
    begin
    print '操作失败,执行回滚'
    rollback transaction /* 回滚事务 */
    end


    else
    begin
    print '操作成功'
    commit transaction /* 提交事务 */
    end


    ----------------------------- 视图 -------------------------------


    视图就是查询语句的别名,而这个别名就称为视图
    视图的分类:标准视图、索引视图、分区视图


    1、创建视图

    语法:create view 视图名称(列的别名)
    as (select 查询语句)


    create view v_student(sname,cname)
    as (select s.stu_name,c.cl_name from
    student as s join class as c on
    s.cl_id=c.cl_id)


    2、删除视图

    drop view 视图名称


    3、修改视图


    语法跟创建视图是一样的:alter view 视图名(别名1,别名2)
    as
    (select …………)


    4、获取视图的定义语句

    exec sp_helptext 视图名称


    5、查看视图的列的信息


    exec sp_help 视图名称


    6、查看视图的虚拟表


    select * from 视图名称


    7、更改视图内的数据

    update from 视图名 set ..... where ....


    ---------------------------- 存储过程 ----------------------------------


    1、创建无参数存储过程

    语法: create procedure 过程名
    as
    sql语句体


    例题:create procedure p_student
    as
    select * from student as s join class as c
    on s.cl_id=c.cl_id where s.stu_id>2


    2、创建带输入参数的存储过程

    语法:create procedure 过程名
    @参数1 数据类型(=默认值),
    @参数2 数据类型(=默认值)
    as
    select 语句体


    例题:create procedure p_student
    @name nvarchar(10)
    as
    select * from student as s join class as c
    on s.cl_id=c.cl_id where s.stu_name=@name


    3、创建带输入、输出参数的存储过程


    语法:create procedure 过程名
    @参数1 数据类型 output,
    @参数2 数据类型(=默认值)
    as
    sql 语句体
    return


    例题:create procedure p_stu_cla
    @cname nvarchar(10) output,
    @sname nvarchar(10)
    as
    select @cname=c.cl_name from student as s join class as c
    on s.cl_id=c.cl_id where s.stu_name=@sname
    return


    调用:declare @cname nvarchar(10)
    exec p_stu_cla @cname output , '王二'
    select @cname


    4、存储过程的管理

    查看存储过程的定义
    exec sp_helptext 过程名
    查看存储过程的信息
    exec sp_help 过程名
    删除存储过程
    drop procedure 过程名
    修改存储过程
    alter procedure 过程名
    @参数名 数据类型=默认值 output
    as
    sql 语句
    return


    ------------------------------------- 函数 --------------------------------------


    Sql server2005支持三种用户定义函数:标量函数、内嵌表值函数、多语句表值函数


    1、标量函数

    标量函数是根据输入参数值的不同来获得不同的函数值,标量函数可以有多个输入参数,但是只能有一个返回值;标量函数体包括一条或多条sql语句,由begin开始,以end 结束;用returns字句定义函数返回值的数据类型,并返回函数值


    语法: create function 函数名(标量参数 标量数据类型)
    returns 函数返回值的类型
    as
    begin
    函数体
    return 变量/标量表达式
    end


    例题: create function f_count( @sname nvarchar(10) )
    returns nvarchar(10)
    as
    begin
    declare @cname nvarchar(10)
    select @cname=cl_name from student as s jion class as c
    on s.cl_id=c.cl_id where s.stu_name=@sname
    return @cname
    end


    调用函数: declare @name nvarchar(10)
    select @name=架构名.f_count('王二')
    print @name


    2、内嵌表值函数

    内嵌表值型函数以返回的都不是一个标量数据,而是一个表,返回的表值函数还可以提供参数化视图功能。


    语法: create function 架构.函数名(标量参数 数据类型)
    returns table
    as
    return (select语句)


    调用函数:select * from 架构.函数名(参数)

  • 相关阅读:
    XidianOJ 1096 数的拆分
    XidianOJ 1183 Water Problem: Items divided
    XidianOJ 1182 Chinese Paladin – Qi’s troubles
    XidianOJ 1112 Too stupid
    XidianOJ 1120 Gold of Orz Pandas
    XidianOJ 1177 Counting Stars
    XidianOJ 1076 小W喜欢的数字
    XidianOJ 1095 派对
    XidianOJ 1055 如此遍历
    XidianOJ 1145 数学题
  • 原文地址:https://www.cnblogs.com/wysdddh/p/6260320.html
Copyright © 2020-2023  润新知