数据库是MSSQL2005.

  第一部分主要的操作包含:数据库的创建、删除,表的增、删、改,表中数据的增、删、改、查,视图的操作。


-- 查询数据库是否存在

if 
    
  exists 
   (  
  select 
    
  * 
    
  from 
   sysdatabases  
  where 
    
  [ 
  name 
  ] 
  = 
  ' 
  TestDB 
  ' 
  )
 
  print 
    
  ' 
  Yes, the DB exists 
  ' 
  
 
  else 
  
 
  print 
    
  ' 
  No, need a new one? 
  ' 
  

 
  -- 
  新建一个数据库 
  
 
  create 
    
  database 
   TestDB  
  on 
  
 (
      name  
  = 
    
  ' 
  TestData 
  ' 
  ,
      filename  
  = 
    
  ' 
  G:\DBS\KeyTest.mdf 
  ' 
  ,
      size  
  = 
    
  3 
  ,
      filegrowth  
  = 
    
  2 
  
 )
 
  log 
    
  on 
  
 (
      name  
  = 
    
  ' 
  TestLog 
  ' 
  ,
      filename  
  = 
    
  ' 
  G:\DBS\KeyTest.ldf 
  ' 
  ,
      size  
  = 
    
  3 
  ,
      filegrowth  
  = 
    
  10 
  
 )

 
  -- 
  drop database TestDB 
  
 
  
 
  use 
   TestDB
 
  go 
  

 
  -- 
  新建一个表 
  
 
  create 
    
  table 
    
  [ 
  Scores 
  ] 
  
 (
       
  [ 
  ID 
  ] 
    
  int 
    
  identity 
  ( 
  1 
  , 
  1 
  )  
  primary 
    
  key 
  ,
       
  [ 
  Student 
  ] 
    
  varchar 
  ( 
  20 
  ) ,
       
  [ 
  Subject 
  ] 
    
  varchar 
  ( 
  30 
  ),
       
  [ 
  Score 
  ] 
    
  float 
  
 )

 
  -- 
  drop table [Scores] 
  
 
  
 
  -- 
  修改表中的一列 
  
 
  alter 
    
  table 
   Scores  
  alter 
    
  column 
    
  [ 
  Student 
  ] 
    
  varchar 
  ( 
  20 
  )  
  not 
    
  null 
  

 
  -- 
  新增一列 
  
 
  alter 
    
  table 
   Scores  
  add 
   Birthday  
  datetime 
   

 
  -- 
  删除一列 
  
 
  alter 
    
  table 
   Scores  
  drop 
    
  column 
   Birthday

 
  -- 
  往表中插入单条数据,方法1:带列名 
  
 
  insert 
    
  into 
   Scores(Student,Subject,Score)
 
  values 
  ( 
  ' 
  张三 
  ' 
  , 
  ' 
  语文 
  ' 
  , 
  ' 
  90 
  ' 
  )

 
  -- 
  往表中插入单条数据,方法2:不带列名,但要求值的类型要和列字段类型对应 
  
 
  insert 
    
  into 
   Scores
 
  values 
  ( 
  ' 
  张三 
  ' 
  , 
  ' 
  英语 
  ' 
  , 
  ' 
  95 
  ' 
  )

 
  -- 
  插入多条数据:用union或者union all 
  
 
  insert 
    
  into 
   Scores(Student,Subject,Score)
 
  select 
    
  ' 
  李四 
  ' 
  , 
  ' 
  语文 
  ' 
  , 
  ' 
  89 
  ' 
  
 
  union 
    
  all 
  
 
  select 
    
  ' 
  李四 
  ' 
  , 
  ' 
  英语 
  ' 
  , 
  ' 
  78 
  ' 
  

 
  -- 
  删除表中数据,没有条件时,删除所有 
  
 
  delete 
    
  from 
   Scores  
  where 
   ID  
  in 
  ( 
  7 
  , 
  8 
  )

 
  -- 
  修改表中数据 
  
 
  update 
   Scores 
 
  set 
   Student 
  = 
  ' 
  王五 
  ' 
  ,Score 
  = 
  ' 
  94 
  ' 
  
 
  where 
   ID 
  = 
  10 
  

 
  -- 
  查看数据 
  
 
  select 
    
  * 
    
  from 
   Scores

 
  -- 
  查看表中最大的identity值 
  
 
  select 
    
  @@identity 
  

 
  -- 
  或者利用dbcc命令查看表中最大的identity值 
  
 
  dbcc 
   checkident( 
  ' 
  Scores 
  ' 
  ,noreseed)

 
  -- 
  创建视图,全部省略视图的属性列名,由子查询目标列的字段组成 
  
 
  create 
    
  view 
   StudentView
 
  as 
  
 
  select 
   Student,Subject,Score
 
  from 
   Scores

 
  -- 
  加上with check option,以后对视图的操作(增,改,删,查)都会自动加上where ID>3 
  
 
  /* 
  
 create view StudentView
 as
 select Student,Subject,Score
 from Scores
 where ID>3
 with check option
 
  */ 
  

 
  -- 
  创建视图,全部定义属性列名,需要定义列名的情况: 
  
 
  -- 
  --某个目标列(子查询)不是单纯的属性列,而是聚集函数或列表达式 
  
 
  -- 
  --多表连接时选出了几个同名列 
  
 
  -- 
  --需要在视图中为某个列启用新的更合适的名字 
  
 
  create 
    
  view 
   IS_Student(Student,Subject,MaxScore)
 
  as 
  
 
  select 
   Student,Subject,Score
 
  from 
   Scores
 
  where 
   Score 
  = 
  ( 
  select 
    
  max 
  (Score)  
  from 
   Scores)


 
  -- 
  查询视图,和基本表完全样,只不过如果视图中有with check option,会自动加上那个条件 
  
 
  select 
    
  * 
   
 
  from 
   StudentView

 
  -- 
  查询自定义列名的视图 
  
 
  select 
    
  * 
   
 
  from 
   IS_Student

 
  -- 
  对视图的insert/delete/update,和对基本表的操作一样,并且最终都是用RDBMS自动转换为对基本表的更新 
  
 
  -- 
  并不是所有的视图都是可更新的,因为有些视图的更新不能有意义的转换成对相应基本表的更新 
  
 
  
 
  -- 
  删除视图 
  
 
  drop 
    
  view 
   StudentView 
  第二部分,这次练习的主题。
  【一】行转列
  1,查询原始的数据
 
/* 
  **这次练习的主题,行转列,列转行** 
  */ 
  
 
  select 
    
  * 
    
  from 
   Scores

sql server 一行字符转成多列_SQL

  2,得到姓名,通过group by


select 
   Student  
  as 
    
  ' 
  姓名 
  ' 
  
 
  from 
   Scores
 
  group 
    
  by 
   Student
 
  order 
    
  by 
   Student 
 
  3,再加上max, case……when
 
select 
   Student  
  as 
    
  ' 
  姓名 
  ' 
  ,
 
  max 
  ( 
  case 
   Subject  
  when 
    
  ' 
  语文 
  ' 
    
  then 
   Score  
  else 
    
  0 
    
  end 
  )  
  as 
    
  ' 
  语文 
  ' 
   , 
  -- 
  如果这个行是“语文”,就选此行作为列 
  
 
  max 
  ( 
  case 
   Subject  
  when 
    
  ' 
  英语 
  ' 
    
  then 
   Score  
  else 
    
  0 
    
  end 
   )  
  as 
    
  ' 
  英语 
  ' 
  
 
  from 
   Scores
 
  group 
    
  by 
   Student
 
  order 
    
  by 
   Student


 

sql server 一行字符转成多列_sql server 一行字符转成多列_02

  查看其它资料时,看到另外一种方法,用pivot

--
   
   group by, avg/max, pivot。这里用max和avg,结果都一样,有什么区别吗?有点不明白
   
   
--
   
   参考网上的资料,用法如下
   
   
/*
   
   
pivot(
  聚合函数(要转成列值的列名)
  for 要转换的列
  in(目标列名)
  )

   
   */
   
   

   
   select
   
    Student 
   
   as
   
    
   
   '
   
   姓名
   
   '
   
   ,

   
   avg
   
   (语文) 
   
   as
   
    
   
   '
   
   语文
   
   '
   
   ,
   
   avg
   
   (英语) 
   
   as
   
    
   
   '
   
   英语
   
   '
   
   from
   
    Scorespivot(    
   
   avg
   
   (Score) 
   
   for
   
    Subject     
   
   in
   
    (语文,英语)    )
   
   as
   
    NewScoresgroup 
   
   by
   
    Studentorder 
   
   by
   
    Student 
   
   asc