zoukankan      html  css  js  c++  java
  • SqlServer基础汇总

    一、sql语句的执行顺序

      查询时数据库中使用最多的操作,一条sql语句的查询顺序是

        1、from Tb1 [ join on ]   得到查询的数据源

        2、where         对数据过滤(单条数据上过滤)

        3、group by                    对数据分组

        4、having        筛选分组(在组别上进行过滤)

        5、select distinct     获取结果集

        6、order by      对结果集排序

    二、常用的基础知识

    1.创建表和查看表结构

    --exec sp_help cities  可以用来查看一张表的详细信息
    --
    创建省份表 CREATE TABLE [dbo].[Provices] ( [Id] INT IDENTITY (1, 1) NOT NULL, [Name] NVARCHAR (50) NOT NULL, CONSTRAINT [PK_Provices] PRIMARY KEY CLUSTERED ([Id] ASC) ); --创建城市表 CREATE TABLE [dbo].[Cities] ( [Id] INT IDENTITY (1, 1) NOT NULL, [ProviceId] INT NOT NULL DEFAULT 0, [Name] NVARCHAR (MAX) NOT NULL, CONSTRAINT [PK_Cities] PRIMARY KEY CLUSTERED ([Id] ASC), CONSTRAINT [FK_Cities_Provices_ProviceId] FOREIGN KEY ([ProviceId]) REFERENCES [dbo].[Provices] ([Id]) ON DELETE CASCADE, );

      查看表结构(原文地址

    SELECT 
        表名       = case when a.colorder=1 then d.name else '' end,
        表说明     = case when a.colorder=1 then isnull(f.value,'') else '' end,
        字段序号   = a.colorder,
        字段名     = a.name,
        标识       = case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then ''else '' end,
        主键       = case when exists(SELECT 1 FROM sysobjects where xtype='PK' and parent_obj=a.id and name in (
                         SELECT name FROM sysindexes WHERE indid in( SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid))) then '' else '' end,
        类型       = b.name,
        占用字节数 = a.length,
        长度       = COLUMNPROPERTY(a.id,a.name,'PRECISION'),
        小数位数   = isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),
        允许空     = case when a.isnullable=1 then ''else '' end,
        默认值     = isnull(e.text,''),
        字段说明   = isnull(g.[value],'')
    FROM syscolumns a
      left join systypes b on a.xusertype=b.xusertype
      inner join sysobjects d on a.id=d.id  and d.xtype='U' and  d.name<>'dtproperties'
      left join syscomments e on a.cdefault=e.id
      left join sys.extended_properties   g on a.id=G.major_id and a.colid=g.minor_id  
      left join sys.extended_properties f on d.id=f.major_id and f.minor_id=0
    where d.name='LogInfo'    --如果只查询指定表,加上此条件
    order by 
        a.id,a.colorder

    2.列的管理

      对字段进行修改和删除的时候要首先删除和字段相关的约束,否则无法修改/删除成功

    ----1.添加字段 
    ALTER TABLE Student ADD TESTCOL NVARCHAR(20) DEFAULT 'HELLOWORLD' NOT NULL; 
    
    
    ----2.修改字段长度 
    ALTER TABLE Student DROP CONSTRAINT DF__CITIES__TESTCOL; 
    ALTER TABLE Student ALTER COLUMN TESTCOL VARCHAR(100) NOT NULL; 
    ALTER TABLE Student ADD DEFAULT ('HELLOWORLD1') FOR TESTCOL WITH VALUES 
    
    
    ----3.删除字段 
    ALTER TABLE Student DROP CONSTRAINT DF__CITIES__TESTCOL;
    ALTER TABLE Student DROP COLUMN TESTCOL;

    3.约束管理


    --
    主键约束 ALTER TABLE Student ADD CONSTRAINT PK_StuNo PRIMARY KEY (StudentNo) --唯一约束 ALTER TABLE Student ADD CONSTRAINT UQ_stuID UNIQUE (IdentityCard) --默认约束(地址不详) ALTER TABLE Student ADD CONSTRAINT DF_stuAddress DEFAULT ('地址不详') FOR Address --检查约束(出生日期是自1980年1月1日以后) ALTER TABLE Student ADD CONSTRAINT CK_stuBornDate CHECK(BornDate>='1980-1-1') --添加外键约束 ALTER TABLE Student ADD CONSTRAINT FK_Student_Grade_GradID FOREIGN KEY(GradeID) REFERENCES Grade(GradeID) go ----查看和修改约束 exec sp_helpconstraint 'Student' --查看Student表的约束 alter table Student drop constraint FK_Student_Grade_GradID--删除约束

    4.控制语句和TryCatch

    ----------IF ELSE栗子
    declare @score int; SET @score=44;
    if (@score>=90)     begin print '优秀'; end
    else if(@score>=60) begin print '及格'; end
    else                begin print '不及格'; end
    ----output:不及格
    
    ----------WHILE栗子
    declare @i int; declare @sum int;
    set @i=1; set @sum=0; 
    while(@i<=100) 
    begin
        SET @sum=@sum+@i ;SET @i+=1;
    end
    print @sum 
    ----output:5050
    
    
    ----------CASE栗子
    declare @sex int; SET @sex=1; 
    -----写法1
    select
    CASE
        WHEN @sex=0 THEN 'female'
        WHEN @sex=1 THEN 'male'
        ELSE 'unknown'
    END 
    -----写法2
    select
    CASE @sex
        WHEN 0 THEN 'female'
        WHEN 1 THEN 'male'
        ELSE 'unknown' 
    END
    ----output:male
    
    -----------TryCatch栗子
    declare @result int
    begin try
        set @result=5/0
    end try
    begin catch
        set @result=0
        PRINT ERROR_MESSAGE() 
    end catch
    print @result
    ----output:遇到以零作除数错误。 0
    View Code

     一个小案例,当平均成绩小于60的时候进行加分来降低不及格率,90分以上的不加分,80分以上的加1分,其他的加3分

    declare @avgscore int;
    select @avgscore=avg(score) from stuScore
    while(@avgscore<60)
    begin 
     update stuScore set score+=
       case 
         when score>=90 then 0
         when score>=80 then 1
         else 3
       end
     select @avgscore=avg(score) from stuScore;
    end

    5.常用的全局变量

    select @@ERROR as 最后一个sql错误的错误码,如果没有错误返回0,
    select @@IDENTITY as 最后一次插入的记录的IDselect @@MAX_CONNECTIONS as 可用的最大连接数
    select @@ROWCOUNT as 最后一句sql语句的影响行数
    select @@SERVERNAME as 本地服务器名称
    select @@TRANCOUNT as 当前打开的事务数
    select @@VERSION as sqlserver版本

     6.常用的函数

    字符串函数

      函数 说明 sample output
    string

    lower()

    upper()

    转小写

    转大写

    select(lower('abcDEF'))

    select(upper('abcDEF'))

    abcdef

    ABCDEF

    charindex()

    patindex()

    特定字符出现的索引,patindex()支持匹配符

    select charindex('el','hello,world!')
    select patindex('%e_%','hello,world!')

    2

    2

    replace

    stuff()

    replace全局替换,stuff精确替换

    select replace('hello,tom!hello,jerry!','hello','hi')

    select stuff('hello,tom!hello,jerry!',11,5,'hi')--替换第11个字符的后5位(第二个hello)

    hi,tom!hi,jerry!

    hello,tom!hi,jerry!

    concat() 拼接多个字符串 select(concat('aa','123','bb')) aa123bb
    substring() 指定位置截取指定长度 select(substring('abcdef',2,3)) bcd

    left()

    right()

    从左边截取n个字符

    从右边截取n个字符

    select(left('abcdef',2))

    select(right('abcdef',2))

    ab

    ef

    len() 获取长度 select(len('abcdef')) 6
    reverse() 反转 select(reverse('abcdef')) fedcba

    datetime

    declare @datex datetime ;  select @datex='2008-6-12 07:30:45'

    year,month,day 获取年月日 select year(@datex) 2008
    datepart()

    获取时间组成

    select datepart(weekday,@datex)

    select datepart(weekday, @datex)--这里按默认@@datefirst=7

    2008

    5(周四)

    datediff()

    获取时间差

    select datediff(year,'1949-10-1',@datex) 59
    dateadd() 时间滑动 select dateadd(day,1,'2008-6-12 07:30:45:111')--一天后 2008-06-13 07:30:45.110
    eomonth() 获取所在月的最后一天 select eomonth('2008-6-12 07:30:45:111') 2008-06-30
      时间戳、时间互转

    select datediff(second,'1970-01-01 00:00:00',getutcdate())--获取时间戳

    select dateadd(second,1591872696,'1970-1-1 08:00:00')--时间戳转为北京时间

     
    math  ceiling()/floor() 向上/下函数

    select ceiling(3.1415)
    select floor(3.1415)

    4

    3

     round() 四舍五入 

    select round(3.1415,2)              --保留2位小数

    select ceiling(round(3.1415,0))  --四舍五入取整

    3.1400

    3

     rand() 获取0-1的随机数

    select rand()

    select floor(rand()*100)       --0-99的随机整数

    select ceiling(rand()*100)    --1-100的随机整数

    0.256880502233242

    85

    32

    数据/格式转换   cast()/convert()/parse()

    类型转换 ,parse()从字符串解析为其他类型,语法和cast一样;

    try_cast(),try_convert(),try_parse()在转换不成功的时候,

    不抛异常而是返回null

    select cast('123' as int)

    select cast('123.167' as int)

    select cast('123.167' as decimal(10,4))

    select cast('123.167' as decimal(10,2))--自动四舍五入

    select convert(int ,'123')

    123

    报错

    123.1670

    123.17

    123

    str()

    数值类型转字符串,

    第二个参数为字符串总长度(包含小数点),位数不够的时候在整数部分前补空格;

    第三个参数是小数位数,可自动四舍五入或补零

    select str('123.167',8,2)
    select str('123.167',10,4)

    '  123.17'
    '  123.1670'

    format()

    从其他数据格式转换为字符串,格式化利器

    select format(getdate(),'yyyy-MM-dd HH:mm:ss')

    select format(getdate(),'yyyyMMdd')

    select format(getdate(),'HH:mm:ss')

    select format(123.167,'0.0000')

    select format(123.167,'0.00')  --自动四舍五入

    2020-06-12 16:40:13

    20200612

    16:40:13

    123.1670

    123.17

    其他

    isdate()

    isnumeric()

    可解析为datetime/number类型返回1,否则返回0

    select isdate('2008-6-12 07:30:45')

    select isnumeric('123.167')

    1

    1

    isnull(exp,default) exp为null返回default select isnull(null,'defaultVal') defaultVal
    iif(exp,val1,val2) 三元运算 iif(1=1,'good','bad') good

    补充内容:

    1.datepart种类

    datapart有year/quarter/month/dayofyear/day/week/weekday/hour/minute/second/millisecond等,datediff(weekday/dayofyear,@startdate,@enddate)相当于datediff(day,@startdate,@enddate);

    2.@@datefrist和weekday

    weekday表示一周的第几天,和语言相关,select @@lauguage。

    中文环境下默认@@datefirst=7,即一周的第一天是星期日。我们可以修改@@datefirst把一周的第一天改成周一,即@@datafirst=1

    select @@datefirst as  默认datefirst --7
    select datepart(weekday ,'2008-6-12 07:30:45:111') --5
    set datefirst 1
    select @@datefirst as  修改后的datefrist --1
    select datepart(weekday ,'2008-6-12 07:30:45:111') --4
  • 相关阅读:
    Linq To Object
    笔试算法
    给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线
    vue3.0中setup的参数
    力扣算法题
    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组
    vif 与 vfor优先级
    给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 /返回这三个数的和。
    /给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[
    vue3+canvas随机生成4位验证码
  • 原文地址:https://www.cnblogs.com/wyy1234/p/9047125.html
Copyright © 2011-2022 走看看