注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

扶红星的博客

生活本无味,尝试的多了也便五味俱全了。

 
 
 

日志

 
 

程序开发中数据库常见操作问题汇总  

2013-07-03 12:10:51|  分类: 知识梳理 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
程序开发中运用的数据库知识无非也就是一些增删改查操作,这里着重分析一下Sql Server和MySQL数据库。
一、新增
方法1
Insert   into  表名(字段1,字段2,….)values(1,2,….) (值1,2,….) (1,2,….) (1,2,….) (1,2,….)
方法2Insert   into  表名select * from 1;(两表字段个数必须相等)
             Insert   into  
表名(字段1,字段2,….)select  字段a,字段b,…from ;
二、删除
1. 删除多条数据    Delete from 表名 where id in (1,2,…)
2.清空表内容  Delete from 表名
3.删除表中重复数据行,保留id最大的那条数据
Delete from 表名 where 重复列名 not in (select 重复列名 from 表名 group by 重复列名 having count(重复列名)>1  and    id not in (select max(id) from 表名 group by 重复列名 having count (重复列名)>1))
三、修改
update 表名 set 列名1=值1,列名2=值2,,,where 列名 = 值;
四、查询
1.单表查询  select 字段1,字段2,,,from 表名
2.多表关联查询
1)、内连接  Select a.字段名1,a.字段名2,b.字段名1 from 1 a inner join 2 b On a.字段名=b.字段名 where 条件;
2)、外连接 
         2.1)左外连接 
select a.字段名1,a.字段名2,b.字段名1 from 表名1 a left join 表名2 b on a.字段名=b.字段名 where 条件;
         2.2) 右外连接  select a.字段名1,a.字段名2,b.字段名1 from 表名1 a right join 表名2 b on a.字段名=b.字段名 where 条件;
3)、全连接 
       3.1)
Sqlserver中用法 Select a.字段名1,a.字段名2,b.字段名1 from 1 a full  join 2 b On 条件 where 条件;
       3.2)
Mysql中用法  Select a.字段名1,a.字段名2,b.字段名1 from 1 a left  join 2 b On 条件 where 条件 Union all          Select a.字段名1,a.字段名2,b.字段名1 from 1 a right  join 2 b On 条件 where 条件

3.一些特殊查询汇总

1)、分页查询
    1.1)、Sql Server中用法
select top 10 * from where id >select max( id) from where id in (select top 页码*10  id from ) )
    1.2)、MySql中用法
select * from limit 页码*10,(页码+1)*10;

2)、行列转换查询

方法1
select 姓名,max(case 课程when'语文'then 分数else 0 end)语文, max(case 课程when '数学'then 分数else 0 end)数学, max(case 课程when '物理' then 分数else 0 end)物理 from tb group by 姓名
 
方法2declare @sql varchar(500)set @sql='select 姓名' select @sql=@sql+',max(case 课程when '''+课程+''' then 分数else 0 end)['+课程+']' from (select distinct 课程from tb) a--from tb group by课程,默认按课程名排序 set @sql=@sql+'from tb group by 姓名' exec(@sql)
  
方法3
declare @sql varchar(8000) select @sql=isnull(@sql+',','')+' max(case 课程when '''+课程+''' then 分数else 0 end) ['+课程+']' from(select distinct 课程from tb)asa      set @sql='select 姓名,'+@sql+' from tb group by 姓名' exec(@sql)

方法4
select * from tb pivot(max(分数)for 课程in(语文,数学,物理))a

方法5
declare @sql varchar(8000)set @sql=''  --初始化变量@sql select @sql=@sql+','+ 课程from tb group by 课程--变量多值赋值 set @sql=stuff(@sql,1,1,'')--去掉首个','set @sql='select * from tb pivot (max(分数) for 课程in ('+@sql+'))a' exec(@sql)

方法6
declare @sql varchar(8000)select @sql=isnull(@sql+',','')+ 课程from tb group by 课程          set @sql='select * from tb pivot (max(分数) for 课程in ('+@sql+'))a' exec(@sql)


3)、相关函数运用
    3.1)、字符串拼接
           3.1.1)、Sql Server中使用的a+b+c的形式
           3.1.2)、MySql中使用的是concat(a,b,c)的形式
    3.2)、日期函数(Sql Server)
           3.2.1)、获取当前系统的日期时间 select getdate();
           3.2.2)、
在向指定日期加上一段时间的基础上,返回新的 datetime    select dateadd(day,2,’2004-10-15’)
                  3.2.3)、
返回跨两个指定日期的日期和时间边界数。select datediff(day,'2004-09-01','2004-09-18') ; --返回:17    
                  3.2.4)、
datepart 返回代表指定日期的指定日期部分的整数。SELECT DATEPART(month, '2004-10-15')      --返回 10

3.2.5)、    datename 返回代表指定日期的指定日期部分的字符串SELECT datename(weekday, '2004-10-15')  --返回:星期五

3.2.6)、    day(), month(),year() --可以与datepart对照一下

select 当前日期=convert(varchar(10),getdate(),120) ,当前时间=convert(varchar(8),getdate(),114) ;

select datename(dw,'2004-10-15')

select 本年第多少周=datename(week,'2004-10-15')

,今天是周几=datename(weekday,'2004-10-15')

补充实例查询语句

(Sql Server)1.select case 列名 when 值1 then 值2  when 值3 then 值4 else 值5 end from 表名;

//将表中的某一列按照预定值的形式输出,如这里的举例意为当当前列值为‘值1’的时候我就让他查出值2,当他为‘值3’的时候我就让他输出值4,否则就全部输出值5

2.select Convert(nvarchar(10),时间列名,120) days,Convert(varchar(7),cast(时间列名as datetime),120) month from 表名//将表中的datetime类型的时间列按照预定格式输出,如这里输出的分别就是年月日(yyyy-MM-dd)和年月(yyyy-MM)


             3.string sqlinsert = "insert into 表名 values('值1','值2'...)";

                string sqlupdate = "update 表名 set 列名1='值1',列名2='值2'... where 列名3 = '值3'";

                string sqlinsertorupdate = string.format("if not exists (select 列名1 from 表名 where 列名2 = '值2' and 列值           3='3' and ...)begin {0} end else begin {1} end", sqlinsert, sqlupdate);

                //往往在插入表字段的时候我们需要考虑数据重复插入和改变当前已有数据的某些状态问题,此时我们便可以按照 以上的方法,写出一条判断语句,当我们在表中查看到有我们想要的数据的时候我们就执行修改,否则我们便可以执行插入

(MySql)1.select group_concat(distinct case when 列名1=值1 then concat('*',列名2) else concat(列名2) end) as 新列名 from 表名 group by 列名3//针对表中的列名3对表进行分组,若列名1的值为‘值1’的时候就将当前列名2前面加上‘*’输出,否则就将列名2下对应的值以逗号的形式隔开处理作为一个新列即新列名的形式展出























  评论这张
 
阅读(177)| 评论(3)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017