程序开发中运用的数据库知识无非也就是一些增删改查操作,这里着重分析一下Sql Server和MySQL数据库。一、新增
方法1:Insert into 表名(字段1,字段2,….)values(值1,值2,….) (值1,值2,….) (值1,值2,….) (值1,值2,….) (值1,值2,….)方法2:Insert 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 姓名
方法2:declare @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下对应的值以逗号的形式隔开处理作为一个新列即新列名的形式展出
评论