sql server 笔记

 


   
     --1. 建立数据库 和表
  

       CREATE  database DaTaDB
       USE DaTaDB
       CREATE  TABLE USERS
(
ID INT IDENTITY(1,1), NAME NVARCHAR(10) , AGE INT , SEX INT, REGISTOR DATETIME DEFAULT(GETDATE()) )


    
     --2.循环插入数据

      DECLARE @i INT
      SET @i=0
      WHILE(@i<100)
      BEGIN 
      INSERT USERS VALUES('namespace',@i,1,default);
      SET @i=@i+1
      END
      --while中不加begin end 会一直循环


    
     --3.查询新增结果

      SELECT * FROM USERS 


    
     
      --4.将旧表数据添加入新表(新增的表名随意取这里去newtb) 注:新增的表newtb会保存到数据库中 相当于新建了一张表
      

 SELECT id,name INTO  newtb from USERS


     
      --5.查询刚才新建的表newtb 发现 表USERS中的id,name 被复制到新表newtb中
    

  SELECT * FROM newtb  


      
      --6.拷贝表数据 将表USERS的数据拷贝到表newtb中
        
         --6.1先清空表newtb

   

 DELETE FROM newtb

   
         --6.2拷贝表USERS数据至表newtb


        

     INSERT INTO newtb(id,name) SELECT id,name FROM USERS   

            --这时编译器报错提示:消息 544,级别 16,状态 1,第 1 行
              当IDENTITY_INSERT 设置为 OFF 时,不能为表 'newtb' 中的标识列插入显式值
              原因是新建表newtb的时候id为自动增长 设置表newtb的自动增长为on即可
             

         SET IDENTITY_INSERT newtb on--设置后可以手动为自增列赋值。现在再执行上面的insert into 语句就可以执行了


              
      --7 为表添加字段
               --新建的表newtb中只有id和name两个字段  现在为表newtb 添加 hobby,school,highschool三个字段 COLLATE 为sql排序规则Chinese_PRC_CI_AS 为具体排序规则
             

               ALTER TABLE newtb
               ADD  hobby NVARCHAR(100) COLLATE Chinese_PRC_CI_AS
               ALTER TABLE newtb
               ADD  school NVARCHAR(100)  
               ALTER TABLE newtb 
               ADD highschool NVARCHAR(100)


     --8 修改表字段数据类型  将nvarcahr(100) 修改为varcahr(100)
                                     nvarchar 可存储4000个字符不论中英文

                                     varchar  存储8000个英文,4000个中文 当数据字段中有使用到中文 建议使用nvarchar 避免出现乱码
               
             

               ALTER TABLE newtb
               ALTER COLUMN hobby VARCHAR(100) 


              
     --9 删除列  删除highschool列 删除的语法除了有特定的drop 还增加了column 未加column 会出现约束错误
             
               

             ALTER TABLE newtb
             DROP  COLUMN highschool


               
     --10 删除表  语法 drop table  表名
                  --新建临时表然后删除
                

                    CREATE TABLE temp
                   (id INT ) 
                   DROP  TABLE temp
                   --drop与 delete 区别在于drop是将表删除 delete是将表数据删除

 
     -- 11 查询语句
     
           --11.1 分组查询
                  
                 --由于之前插入的name值都一样需先修改name的值
                

   DECLARE @i INT,@name NVARCHAR(15)
                 SET @i=0;
                 WHILE(@i<17021)
                 BEGIN
                      IF(@i%2=0)
                      SET @name='我是超人'
                      IF(@i%3=0)
                      SET @name='我是鸟人'
                      IF(@i%5=0)
                      SET @name='我是贱人'
                     
                      UPDATE newtb SET NAME=@name WHERE ID=@I
                       SET @i=@i+1;
                  END
                  


                 --执行分组查询 得到统计结果
          

        SELECT NAME ,COUNT(*) FROM newtb GROUP BY NAME


                 


             --11.2 筛选查询 从表USERS中查询15条数据 再从15条数据中选5条数据 进行排序
               
         

       SELECT TOP 5 * FROM (SELECT TOP 10 * FROM USERS ORDER BY ID DESC)newtb order by id   desc


               
             --11.3 随机取出5条数据
             

       SELECT TOP 5 * FROM newtb ORDER BY newid()


               
             --11.4 从表newtb中查询出数据作为新表newtb2的自增长列
              

      SELECT IDENTITY(int,1,1) AS id INTO newtb2 FROM newtb

 
             --11.5 子查询 从表USERS 中查询出最前的5个ID 作为查询表newtb中字段name的条件
                  

      SELECT NAME FROM newtb WHERE ID IN(SELECT TOP 5 ID FROM USERS)

            
        
            --11.6  在线视图查询  

          SELECT * FROM (SELECT ID FROM USERS)newtb WHERE newtb.ID>10

   
            --11.6  between and  于 not between and
              

          SELECT  NAME FROM USERS WHERE ID  BETWEEN 1 AND  10
          SELECT NAME FROM USERS  WHERE ID NOT BETWEEN 1 AND 10


                 
            --11.7 IN 于NOT IN
                

           SELECT NAME FROM USERS WHERE ID IN (1,2,3)
           SELECT NAME FROM USERS WHERE ID NOT IN(1,2,3)


            --11.8 多表连接查询
               
                 --首先新建表newth3
             

         SELECT ID,name INTO newtb3 FROM USERS


           
                --执行多表连接查询
                

        SELECT * FROM USERS AS a  left  join newtb  AS b  ON a.ID=b.ID   right join newtb3 AS c ON a.ID=c.id

              
             
             --11.9查询表每组中id值相同且对应的id最大的记录的id、name信息    

      select ID,name from USERS a where id =(select MAX(id) from newtb2 b where a.ID=b.id)


          
                                        
        --12 聚合函数 

                --12.1  计算总数
                 SELECT COUNT(*) FROM newtb 
                 --12.2 求和
                 SELECT SUM(ID) FROM newtb
                 --12.3 平均数
                 SELECT AVG(ID) FROM newtb
                 --12.4 最大值
                 SELECT MAX(ID) FROM newtb
                 --12.5 最小值
                 SELECT MIN(ID) FROM newtb


        
         --13  删除表USERS中已经在表newtb中不存在的数据
             
                

                --先插入测试数据
                   INSERT USERS VALUES('我已经没有存在的意义',12,1,DEFAULT)
                 --对比表USERS newtb  根据表newtb中的数据 删除表USERS中 已经在表newtb中不存在的数据 
                   DELETE FROM USERS WHERE NOT EXISTS(SELECT name  FROM newtb WHERE USERS.ID=newtb.ID)

 
         --14 联合修改表 

                 UPDATE  a SET  a.name=b.name FROM USERS AS a ,newtb AS b WHERE a.ID=b.id 

  
         --15得到数据库中所有表名
        
       

      SELECT NAME FROM sysobjects WHERE TYPE='U' 

SELECT DISTINCT table_name FROM INFORMATION_SCHEMA.TABLES

 
         --16得到表USERS中所有字段信息 

       SELECT * FROM syscolumns WHERE ID=OBJECT_ID('USERS') 或 SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='USERS'


            
         --17 case的使用
          
              --以name作为分组统计表USERS中 性别为女为男的人数
              

      SELECT name, SUM( CASE WHEN sex=1 THEN 1 ELSE 0 END ), SUM (CASE WHEN sex=0  THEN 1 ELSE 0 END ) FROM  USERS GROUP BY name

             
              --类似if...else 用法
            

   SELECT  CASE name WHEN '我是超人' THEN '超你妹' ELSE '其实我是蝙蝠侠' END FROM USERS


             
             
             
         --18 like 关键字 用法
             
                     _ 下划线:精确匹配一个字符
                    
                    [ ] 方括号:指定范围([a-f])或集合([abcdef]) 中的任何单个字符
                   
                    查询 % _ ^ 等符号需要在符号外加上方括号即: like 'abc[%]' 含义 abc%
                                                               like '[a-c]'  含义 a,b,c
                      
        -- 19 union 于union all
       
            --新建测试表
         

        CREATE TABLE  unionFirst(
             name NVARCHAR(50) ,
             rigistor DATETIME DEFAULT(getdate())
           )


          -- 插入数据
         

   INSERT unionFirst VALUES('人生在世',DEFAULT),
                            ('人生如梦',DEFAULT),
                            ('人生如梦',DEFAULT),
                            ('对酒当歌',DEFAULT)


        
           --将表unionFirst 复制给新表unionSecond
       

          SELECT *  INTO unionSecond  FROM unionFirst

 
            --union 消除重复行
    

         SELECT *FROM unionFirst
         UNION 
         SELECT *FROM unionSecond

       
            
            --union all 不消除重复行
     

         SELECT *FROM unionFirst
         UNION  all
         SELECT *FROM unionSecond

          
            
           
         --20 except 运算符 取出表unionFirst中不重复项
        
           --插入一条不重复数据
           INSERT unionFirst VALUES('你的不幸是我最大的福气',DEFAULT)
           
           --得到一条不重复数据的结果
         

   SELECT name FROM unionFirst 
   EXCEPT  SELECT name FROM unionSecond

 
         
          --21 INTERSECT
       

     INSERT unionSecond VALUES('活到老喝到老',DEFAULT)

  

      SELECT name FROM unionFirst 
      INTERSECT  SELECT name FROM unionSecond


          
          --22 except 于INTERSECT 区别
               EXCEPT    取出重复只对第一个表而言(查询结果只能显示表unionFirst中的不重复项)
               INTERSECT 针对两个表中不重复项(查询结果只能表unionFirst和表unionSecond中的不重复项)
              
          --23 外连接 含义及区别
         
               --23.1 左外连接 查询的结果包括匹配的数据外还包括了左表的所有行  
                

        SELECT * FROM  unionFirst a left   join  unionSecond b ON a.name=b.name

                
               
              --23.2 右外连接  查询的结果包括匹配的数据外还包括了右表的所有行   

        SELECT * FROM  unionFirst a right   join  unionSecond b ON a.name=b.name

               
            
              --23.3全外连接 查询的结果为两表的所有行
              
 

        SELECT * FROM  unionFirst a  FULL   join    unionSecond b ON a.name=b.name

             
           
        
        
           --24 函数
                
                  --24.1 取近似值函数
              
          

        -- CEILING ( numeric_expression ) 大于0的正数: 小数点后数值大于0 就进一  小于0的负数 :小数点后数值大于0 就退1
           SELECT CEILING (-23.1 ) SELECT CEILING (23.1 ) 
                

                 

             

       --FLOOR ( numeric_expression ) 正数:小数点后数值无论多少 只取整数值  负数:小数点后数值无论多少 进1
         SELECT  FLOOR(25.01)      SELECT  FLOOR(-25.01)

                 
               

           --ROUND ( numeric_expression , length [ ,function ] )
           --取左边参数小数点最后一位 即128.244865 中5 进行四舍五入
            --第二个参数5含义是去5为小数即到6为止 即取到1283.24486 最后根据6后的一位小数来四舍五入
             SELECT ROUND(128.244865,5)     

                      
          

        --24.2 ABS(numeric_expression)  取绝对值
               SELECT ABS(-100) 


                
                

  --24.3 SIGN(numeric_expression) 判断参数的正负值  无论参数大小值判断正负值 正输入1 负数输出-1
               SELECT   SIGN(152.258)  SELECT   SIGN(-152.258)

                 
                 
             

     --24.4  PI()返回值3.14159265358979
               SELECT PI()

 
                

      --24.5 RAND() 得到浮点型的随机数
                SELECT RAND() 

                     
                
                 

      --24.6 函数返回字符表达式最左端字符的ASCII 码值  最左端即下例子中123456的1  23456的2
                SELECT  ASCII('123456') SELECT  ASCII('23456') 


                 

      --24.7 LOWER(character_expression) 函数把字符串全部转换为小写 
                      SELECT LOWER('You Are My Pet !')


                 
                  

      --24.8 UPPER(character_expression) 函数把字符串全部转换为大写
                      SELECT UPPER('you too!')


                 
              

      --24.9 STR(character_expression)  函数把数值型数据转换为字符型数据 
                  SELECT STR(132) 

 
               

      --24.10 LTRIM(character_expression) 去除字符左空格
                SELECT LTRIM('   123    ')

                           
                  
                

     --24.11 RTRIM(character_expression) 去除字符右空格
                 SELECT RTRIM('         123   ')

                         
                   
          

         --24.12 LEFT()  取出左边的3个字符
                   SELECT LEFT('ABCDEFG',3)

                          
             

            --24.13 RIGHT() 取出右边的3个字符
                 SELECT RIGHT('ABCEDFG',3)

                           
                     
             

        --24.14  SUBSTRING()  取出字符中第一位开始的两个字符
                   SELECT SUBSTRING('ABCEDFG',1,2) 

                         
                     
  

                --24.15 CHARINDEX()搜索B 在 ABCDEFG 中出现的位置
                      SELECT CHARINDEX('B','ABCDEFG');

                       


                    
            

      --24.16 PATINDEX() 使用通配符搜索B 在 ABCDEFG 中出现的位置 
    
             SELECT PATINDEX('%B%','ABCDEFG');


                       
                 

 --24.17 QUOTENAME() 将参数的值以[@#$%^&*()]的形式输出
                      SELECT  QUOTENAME('@#$%^&*()')

                      
                 
           

       --24.18 REPLICATE() 第一个参数为定义的字符 第二参数为第一参数指定需要重复的次数 即4个ABC
                      SELECT REPLICATE('ABA',4)


                     
                

              --24.19 REVERSE()  返回字符的逆向值 即将字符前后颠倒显示
                   SELECT   REVERSE('FEWFA')
                      

                           
      

            --24.20 REPLACE() 第一个参数待搜索的字符   第二参数要查找的字符 第三参数替换后的字符
                       SELECT  REPLACE('你特么的,是特么的!','特么','和谐')

                        
                      
         

         --24.21 SPACE()   函数返回一个有指定长度的空白字符串   
                       SELECT SPACE('   ') 


                      
              

    --24.22 STUFF() --函数用另一子串替换字符串指定位置长度的子串   
                       --第一参数为待处理字符  第二参数为待处理文字的索引位置 从1开始索引 第三参数为需要
                       --删除的文字的长度 第四参数为在原删除位置重新插入的新字符
                       SELECT STUFF('你老子的',2,2,'和谐')

                          
                      
                      
                      数据类型转换函数-
                     
                 

    --24.23   CAST() 将字符’123‘ 转换为INT 类型
                SELECT CAST('123' AS INT)


                  
             

     --24.24 CONVERT() 将当前日期作为类型varchar 输出
                       SELECT CONVERT(VARCHAR(20),GETDATE(),100)
                     
-- 第三个参数值可以为
/*100 或者 0 mon dd yyyy hh:miAM (或者 PM)
101 mm/dd/yy
102 yy.mm.dd
103 dd/mm/yy
104 dd.mm.yy
105 dd-mm-yy
106 dd mon yy
107 Mon dd, yy
108 hh:mm:ss
109 或者 9 mon dd yyyy hh:mi:ss:mmmAM(或者 PM)
110 mm-dd-yy
111 yy/mm/dd
112 yymmdd
113 或者 13 dd mon yyyy hh:mm:ss:mmm(24h)
114 hh:mi:ss:mmm(24h)
120 或者 20 yyyy-mm-dd hh:mi:ss(24h)
121 或者 21 yyyy-mm-dd hh:mi:ss.mmm(24h)
126 yyyy-mm-ddThh:mm:ss.mmm(没有空格)
130 dd mon yyyy hh:mi:ss:mmmAM
131 dd/mm/yy hh:mi:ss:mmmAM*/

            

     --24.25 DAY()函数返回日期值  
                  SELECT DAY(GETDATE())
                         


                 

      --24.26 MONTH() 函数返回月份值 
                   SELECT MONTH(GETDATE())


                        
              

   --24.27 YEAR()函数返回年份值       
                  SELECT YEAR(GETDATE()) 


                
                

 --24.28 DATEADD(<datepart> ,<number> ,<date>) --函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期 
                         SELECT DATEADD(d,5,GETDATE())

                       当前的日期                                          执行dateadd函数后得到的日期

                              

                      结果:时间加了五天
                      
               

  -            -24.29 DATEDIFF(<datepart> ,<number> ,<date>) --获取时间间隔    
                         SELECT DATEDIFF(d,'2013-10-01',GETDATE())

                          

   
                 
               

     --24.30 DATENAME(<datepart> , <date>) --函数以字符串的形式返回日期的指定部分         
                         SELECT DATENAME(YYYY,GETDATE())--获取年份
                         SELECT DATENAME(MM,GETDATE())--获取月份
                         SELECT DATENAME(DD,GETDATE())--获取日期
                          SELECT DATENAME(DD,GETDATE())--获取日期
                         -- YYYY 年 MM 月 DD日  HH小时 mm分钟 ss秒钟


               
         

        --24.31 DATEPART(<datepart> , <date>) --函数以整数值的形式返回日期的指定部分 
                         SELECT DATEPART(YY,GETDATE()) --参数同DATENAME函数


                        
                        
                          --系统函数
                        
         

        --24.32 APP_NAME() --函数返回当前执行的应用程序的名称 
                         SELECT  APP_NAME()   

                    
                

                 --24.33 COALESCE() --函数返回众多表达式中第一个非NULL 表达式的值  
                         SELECT  COALESCE('ABC',NULL,'FFF',NULL)
                 

                  
       

          --24.34 COL_LENGTH(<'table_name'>, <'column_name'>) --函数返回表中指定字段的长度值 
                         SELECT   COL_LENGTH('USERS','name')     

  
                        
     

            --24.35 DATALENGTH() --函数返回数据表达式的数据的实际长度 
                         SELECT DATALENGTH('1AADWDWFEFEWFEW')

                       


                 
           

                   --24.36 DB_ID(['database_name']) --函数返回数据库的编号
                         SELECT DB_ID('DaTaDB') 


                

  
                 --24.37 DB_NAME(database_id) --函数返回数据库的名称 
                         SELECT DB_NAME(12)   --参数中的12 是从DB_ID('DaTaDB') 中读取出来的    DB_NAME于DB_ID 相关联        


                
                 

               --24.38 HOST_ID() --函数返回服务器端计算机的编号 
                         SELECT HOST_ID() 
                      


              

   -      -24.39 HOST_NAME() --函数返回服务器端计算机的名称 
                         SELECT HOST_NAME()   


                 
               

          --24.40 ISDATE() --函数判断所给定的表达式是否为合理日期   
                         SELECT ISDATE(GETDATE())  --正确日期   
                         SELECT ISDATE('2013.1.0') --错误日期


                      
     

            --24.41 ISNULL(<check_expression>, <replacement_value>) --函数将表达式中的NULL 值用指定值替换 
                         SELECT ISNULL(NULL,'ABC')                 
                  


              

   --24.42 ISNUMERIC() --函数判断所给定的表达式是否为合理的数值 
                         SELECT ISNUMERIC(125)


                
               

  --24.43 NEWID() --函数返回一个UNIQUEIDENTIFIER 类型的数值 
                         SELECT NEWID()

                 


               
      

           --24.44 NULLIF(<expression1>, <expression2>)  函数在expression1 与expression2 相等时返回NULL 值若不相等时则返回expression1 的值
                         SELECT NULLIF('ABC','ABCDE') --不相等返回ABC
                         SELECT NULLIF('ABC','ABC')   --相等返回NULL








ok 休息了!

posted @ 2013-10-19 23:18  FunLin  阅读(320)  评论(0编辑  收藏  举报