精妙的SQL和SQL SERVER 与ACCESS、EXCEL的数据导入导出转换

* 说明:复制表(只复制结构,源表名:a 新表名:b)

      select * into b from a where 1<>1

    * 说明:拷贝表(拷贝数据,源表名:a 目标表名:b)

      insert into b(a, b, c) select d,e,f from b;

    * 说明:显示文章、提交人和最后回复时间

      select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

    * 说明:外连接查询(表名1:a 表名2:b)

      select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    * 说明:日程安排提前五分钟提醒

      select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

    * 说明:两张关联表,删除主表中已经在副表中没有的信息

      delete from info where not exists ( select * from infobz where info.infid=infobz.infid )

    * 说明:--

SQL:

      Select A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE

      FROM TABLE1,

      (Select X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE

      FROM (Select NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND

      FROM TABLE2

      Where TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X,

      (Select NUM, UPD_DATE, STOCK_ONHAND

      FROM TABLE2

      Where TO_CHAR(UPD_DATE,'YYYY/MM') =

      TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') || '/01','YYYY/MM/DD') - 1, 'YYYY/MM') ) Y,

      Where X.NUM = Y.NUM (+)

      AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B

      Where A.NUM = B.NUM

    * 说明:--

      select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名称='"&strdepartmentname&"' and 专业名称='"&strprofessionname&"' order by 性别,生源地,高考总成绩

    * 从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源)

      Select a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear,

      SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN,

      SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI,

      SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR,

      SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR,

      SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY,

      SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE,

      SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL,

      SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU,

      SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP,

      SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT,

      SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV,

      SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC

      FROM (Select a.userper, a.tel, a.standfee, b.telfeedate, b.factration

      FROM TELFEESTAND a, TELFEE b

      Where a.tel = b.telfax) a

      GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy')

    * 说明:四表联查问题

      select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

    * 说明:得到表中最小的未使用的ID号

    * Select (CASE WHEN EXISTS(Select * FROM Handle b Where b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID  FROM Handle Where NOT HandleID IN (Select a.HandleID - 1 FROM Handle a)

    * 一个SQL语句的问题:行列转换

      select * from v_temp

      上面的视图结果如下:

      user_name role_name

      -------------------------

      系统管理员 管理员

      feng 管理员

      feng 一般用户

      test 一般用户

      想把结果变成这样:

      user_name role_name

      ---------------------------

      系统管理员 管理员

      feng 管理员,一般用户

      test 一般用户

      ===================

      create table a_test(name varchar(20),role2 varchar(20))

      insert into a_test values('李','管理员')

      insert into a_test values('张','管理员')

      insert into a_test values('张','一般用户')

      insert into a_test values('常','一般用户')

      create function join_str(@content varchar(100))

      returns varchar(2000)

      as

      begin

      declare @str varchar(2000)

      set @str=''

      select @str=@str+','+rtrim(role2) from a_test where [name]=@content

      select @str=right(@str,len(@str)-1)

      return @str

      end

      go

      --调用:

      select [name],dbo.join_str([name]) role2 from a_test group by [name]

      --select distinct name,dbo.uf_test(name) from a_test

* 快速比较结构相同的两表

      结构相同的两表,一表有记录3万条左右,一表有记录2万条左右,我怎样快速查找两表的不同记录?

      ============================

      给你一个测试方法,从northwind中的orders表取数据。

      select * into n1 from orders

      select * into n2 from orders

      select * from n1

      select * from n2

      --添加主键,然后修改n1中若干字段的若干条

      alter table n1 add constraint pk_n1_id primary key (OrderID)

      alter table n2 add constraint pk_n2_id primary key (OrderID)

      select OrderID from (select * from n1 union select * from n2) a group by OrderID having count(*) > 1

      应该可以,而且将不同的记录的ID显示出来。

      下面的适用于双方记录一样的情况,

      select * from n1 where orderid in (select OrderID from (select * from n1 union select * from n2) a group by OrderID having count(*) > 1)

      至于双方互不存在的记录是比较好处理的

      --删除n1,n2中若干条记录

      delete from n1 where orderID in ('10728','10730')

      delete from n2 where orderID in ('11000','11001')

      --*************************************************************

      -- 双方都有该记录却不完全相同

      select * from n1 where orderid in(select OrderID from (select * from n1 union select * from n2) a group by OrderID having count(*) > 1)

      union

      --n2中存在但在n1中不存的在10728,10730

      select * from n1 where OrderID not in (select OrderID from n2)

      union

      --n1中存在但在n2中不存的在11000,11001

      select * from n2 where OrderID not in (select OrderID from n1)

    * 四种方法取表里n到m条纪录:

      1.

      select top m * into 临时表(或表变量) from tablename order by columnname -- 将top m笔插入

      set rowcount n

      select * from 表变量 order by columnname desc

2.

      select top n * from (select top m * from tablename order by columnname) a order by columnname desc

3.如果tablename里没有其他identity列,那么:

      select identity(int) id0,* into #temp from tablename

      取n到m条的语句为:

      select * from #temp where id0 >=n and id0 <= m

      如果你在执行select identity(int) id0,* into #temp from tablename这条语句的时候报错,那是因为你的DB中间的select into/bulkcopy属性没有打开要先执行:

      exec sp_dboption 你的DB名字,'select into/bulkcopy',true

4.如果表里有identity属性,那么简单:

      select * from tablename where identitycol between n and m

    * 如何删除一个表中重复的记录?

      create table a_dist(id int,name varchar(20))

      insert into a_dist values(1,'abc')

      insert into a_dist values(1,'abc')

      insert into a_dist values(1,'abc')

      insert into a_dist values(1,'abc')

      exec up_distinct 'a_dist','id'

      select * from a_dist

      create procedure up_distinct(@t_name varchar(30),@f_key varchar(30))

      --f_key表示是分组字段﹐即主键字段

      as

      begin

      declare @max integer,@id varchar(30) ,@sql varchar(7999) ,@type integer

      select @sql = 'declare cur_rows cursor for select '+@f_key+' ,count(*) from ' +@t_name +' group by ' +@f_key +' having count(*) > 1'

      exec(@sql)

      open cur_rows

      fetch cur_rows into @id,@max

      while @@fetch_status=0

      begin

      select @max = @max -1

      set rowcount @max

      select @type = xtype from syscolumns where id=object_id(@t_name) and name=@f_key

      if @type=56

      select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+ @id

      if @type=167

      select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+''''+ @id +''''

      exec(@sql)

      fetch cur_rows into @id,@max

      end

      close cur_rows

      deallocate cur_rows

      set rowcount 0

      end

      select * from systypes

      select * from syscolumns where id = object_id('a_dist')

    * 查询数据的最大排序问题(只能用一条语句写)

      Create TABLE hard (qu char (11) ,co char (11) ,je numeric(3, 0))

      insert into hard values ('A','1',3)

      insert into hard values ('A','2',4)

      insert into hard values ('A','4',2)

      insert into hard values ('A','6',9)

      insert into hard values ('B','1',4)

      insert into hard values ('B','2',5)

      insert into hard values ('B','3',6)

      insert into hard values ('C','3',4)

      insert into hard values ('C','6',7)

      insert into hard values ('C','2',3) 

      要求查询出来的结果如下:

      qu co je

      ----------- ----------- -----

      A 6 9

      A 2 4

      B 3 6

      B 2 5

      C 6 7

      C 3 4 

      就是要按qu分组,每组中取je最大的前2位!!

      而且只能用一句sql语句!!!

      select * from hard a where je in (select top 2 je from hard b where a.qu=b.qu order by je)

    * 求删除重复记录的sql语句?

      怎样把具有相同字段的纪录删除,只留下一条。

      例如,表test里有id,name字段

      如果有name相同的记录 只留下一条,其余的删除。

      name的内容不定,相同的记录数不定。

      有没有这样的sql语句?

      ==============================

      A:一个完整的解决方案:

      将重复的记录记入temp1表:

      select [标志字段id],count(*) into temp1 from [表名]

      group by [标志字段id]

      having count(*)>1

      2、将不重复的记录记入temp1表:

      insert temp1 select [标志字段id],count(*) from [表名] group by [标志字段id] having count(*)=1

      3、作一个包含所有不重复记录的表:

      select * into temp2 from [表名] where 标志字段id in(select 标志字段id from temp1)

      4、删除重复表:

      delete [表名]

      5、恢复表:

      insert [表名] select * from temp2

      6、删除临时表:

      drop table temp1

      drop table temp2

      ================================

      B:

      create table a_dist(id int,name varchar(20))

      insert into a_dist values(1,'abc')

      insert into a_dist values(1,'abc')

      insert into a_dist values(1,'abc')

      insert into a_dist values(1,'abc')

      exec up_distinct 'a_dist','id'

      select * from a_dist

      create procedure up_distinct(@t_name varchar(30),@f_key varchar(30))

      --f_key表示是分组字段﹐即主键字段

      as

      begin

      declare @max integer,@id varchar(30) ,@sql varchar(7999) ,@type integer

      select @sql = 'declare cur_rows cursor for select '+@f_key+' ,count(*) from ' +@t_name +' group by ' +@f_key +' having count(*) > 1'

      exec(@sql)

      open cur_rows

      fetch cur_rows into @id,@max

      while @@fetch_status=0

      begin

      select @max = @max -1

      set rowcount @max

      select @type = xtype from syscolumns where id=object_id(@t_name) and name=@f_key

      if @type=56

      select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+ @id

      if @type=167

      select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+''''+ @id +''''

      exec(@sql)

      fetch cur_rows into @id,@max

      end

      close cur_rows

      deallocate cur_rows

      set rowcount 0

      end

      select * from systypes

      select * from syscolumns where id = object_id('a_dist')

    * 行列转换--普通

假设有张学生成绩表(CJ)如下

      Name Subject Result

      张三 语文 80

      张三 数学 90

      张三 物理 85

      李四 语文 85

      李四 数学 92

      李四 物理 82

      想变成

      姓名 语文 数学 物理

      张三 80 90 85

      李四 85 92 82

      declare @sql varchar(4000)

      set @sql = 'select Name'

      select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'

      from (select distinct Subject from CJ) as a

      select @sql = @sql+' from test group by name'

      exec(@sql)

      行列转换--合并

有表A,

      id pid

      1 1

      1 2

      1 3

      2 1

      2 2

      3 1

      如何化成表B:

      id pid

      1 1,2,3

      2 1,2

      3 1

      创建一个合并的函数

      create function fmerg(@id int)

      returns varchar(8000)

      as

      begin

      declare @str varchar(8000)

      set @str=''

      select @str=@str+','+cast(pid as varchar) from 表A where id=@id

      set @str=right(@str,len(@str)-1)

      return(@str)

      End

      go

      --调用自定义函数得到结果

      select distinct id,dbo.fmerg(id) from 表A

    * 如何取得一个数据表的所有列名

      方法如下:先从SYSTEMOBJECT系统表中取得数据表的SYSTEMID,然后再SYSCOLUMN表中取得该数据表的所有列名。

      SQL语句如下:

      declare @objid int,@objname char(40)

      set @objname = 'tablename'

      select @objid = id from sysobjects where id = object_id(@objname)

      select 'Column_name' = name from syscolumns where id = @objid order by colid

      或

      Select * FROM INFORMATION_SCHEMA.COLUMNS Where TABLE_NAME ='users'

    * 通过SQL语句来更改用户的密码

      修改别人的,需要sysadmin role

      EXEC sp_password NULL, 'newpassword', 'User'

      如果帐号为SA执行EXEC sp_password NULL, 'newpassword', sa

    * 怎么判断出一个表的哪些字段不允许为空?

      select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where IS_NULLABLE='NO' and TABLE_NAME=tablename

    * 如何在数据库里找到含有相同字段的表?

      a. 查已知列名的情况

      Select b.name as TableName,a.name as columnname

      From syscolumns a INNER JOIN sysobjects b

      ON a.id=b.id

      AND b.type='U'

      AND a.name='你的字段名字'

    * 未知列名查所有在不同表出现过的列名

      Select o.name As tablename,s1.name As columnname

      From syscolumns s1, sysobjects o

      Where s1.id = o.id

      And o.type = 'U'

      And Exists (

      Select 1 From syscolumns s2

      Where s1.name = s2.name

      And s1.id <> s2.id

      )

    * 查询第xxx行数据

      假设id是主键:

      select * from (select top xxx * from yourtable) aa where not exists(select 1 from (select top xxx-1 * from yourtable) bb where aa.id=bb.id)

      如果使用游标也是可以的

      fetch absolute [number] from [cursor_name]

      行数为绝对行数

    * SQL Server日期计算

      a. 一个月的第一天

      Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)

      b. 本周的星期一

      Select DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)

      c. 一年的第一天

      Select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)

      d. 季度的第一天

      Select DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)

      e. 上个月的最后一天

      Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))

      f. 去年的最后一天

      Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))

      g. 本月的最后一天

      Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))

      h. 本月的第一个星期一

      select DATEADD(wk, DATEDIFF(wk,0,

      dateadd(dd,6-datepart(day,getdate()),getdate())

      ), 0)

      i. 本年的最后一天

      Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))。

    * 获取表结构[把 'sysobjects' 替换 成 'tablename' 即可]

      Select CASE IsNull(I.name, '')

      When '' Then ''

      Else '*'

      End as IsPK,

      Object_Name(A.id) as t_name,

      A.name as c_name,

      IsNull(SubString(M.text, 1, 254), '') as pbc_init,

      T.name as F_DataType,

      CASE IsNull(TYPEPROPERTY(T.name, 'Scale'), '')

      WHEN '' Then Cast(A.prec as varchar)

      ELSE Cast(A.prec as varchar) + ',' + Cast(A.scale as varchar)

      END as F_Scale,

      A.isnullable as F_isNullAble

      FROM Syscolumns as A

      JOIN Systypes as T

      ON (A.xType = T.xUserType AND A.Id = Object_id('sysobjects') )

      LEFT&nb

时间: 2024-07-31 06:40:12

精妙的SQL和SQL SERVER 与ACCESS、EXCEL的数据导入导出转换的相关文章

精妙的SQL和SQL SERVER 与ACCESS、EXCEL的数据导入导出转换_MsSql

* 说明:复制表(只复制结构,源表名:a 新表名:b)       select * into b from a where 1<>1     * 说明:拷贝表(拷贝数据,源表名:a 目标表名:b)       insert into b(a, b, c) select d,e,f from b;     * 说明:显示文章.提交人和最后回复时间       select a.title,a.username,b.adddate from table a,(select max(adddate

为什么这个SQL SERVER 2005 management studio 没有数据导入导出的功能

问题描述 为什么这个SQL SERVER 2005 management studio 没有数据导入导出的功能 解决方案 导出导入的功能在你选择数据库服务器根节点的菜单上. 解决方案二: SQL Server 2005 没有SQL Server Management Studio[已解决]SQL Server 2005 企业版没有 Management Studio管理工具Sql Server2005导入导出表数据

SQL Server数据导入导出技术概述与比较

当我们建立一个数据库时,并且想将分散在各处的不同类型的数据库分类汇总在这个新建的数据库中时,尤其是在进行数据检验.净化和转换时,将会面临很大的挑战.幸好SQL Server为我们提供了强大.丰富的数据导入导出功能,并且在导入导出的同时可以对数据进行灵活的处理. 在SQL Server中主要有三种方式导入导出数据:使用Transact-SQL对数据进行处理:调用命令行工具bcp处理数据:使用数据转换服务(DTS)对数据进行处理.这三种方法各有其特点,下面就它们的主要特点进行比较. 一.使用方式的比

MySQL数据导入导出方法与工具介绍(2-import from sql files)

mysql|数据    MySQL数据导入导出方法与工具介绍(2-import from sql files)          批处理导入文件,从sql文件导入数据到数据库中 翻译声明:    本文内容来自Sam's Teach Yourself MySQL in 21 Days一书的部分内容,by Mark Maslakowski    英文原文版权属原作者所有,中文的部分翻译有略有增删;原书讲的过于清楚的地方有删,讲的不清楚的地方有增:如果有翻译的不妥或者不正确的地方,请指正. 翻译者:D

关于 Oracle 的数据导入导出及 Sql Loader (sqlldr) 的用法

在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法: 1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中2. 建立数据库间的 dblink,然后用 create table B as select * from A@dblink where ...,或 insert into B select * from A@dblink where ...3. exp A 表,再 imp 到 B 表,exp 时可加查询条件4. 程序

求完整的JSP页面上传excel 将数据导入SQL数据库的代码

问题描述 求完整的JSP页面上传excel 将数据导入SQL数据库的代码 已下载好jxl包,不知道怎么和jsp一起使用,哪位大神帮忙给下完整代码,谢谢啦. 解决方案 demo 解决方案二: http://download.csdn.net/detail/bj20140820/8339055 里面有完整代码及其解释 解决方案三: 参考这个 http://ask.csdn.net/questions/164454

将Access数据库中数据导入到SQL Server中的详细方法实例_实用技巧

Default.aspx 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="AccessToSQL.aspx.cs" Inherits="AccessToSQL" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "

SQL Server数据导入导出工具BCP使用详解

BCP是SQL Server中负责导入导出数据的一个命令行工具,它是基于DB-Library的,并且能以并行的方式高效地导入导出大批量的数据.本文介绍如何利用BCP导入导出数据. BCP是SQL Server中负责导入导出数据的一个命令行工具,它是基于DB-Library的,并且能以并行的方式高效地导入导出大批量的数据.BCP可以将数据库的表或视图直接导出,也能通过SELECT FROM语句对表或视图进行过滤后导出.在导入导出数据时,可以使用默认值或是使用一个格式文件将文件中的数据导入到数据库或

SQL server 数据导入导出BCP工具使用详解

    数据的导入导出是数据库管理员常见的工作任务之一,尤其是平面文件的导入导出.BCP 工具则为这些任务提供了强有力的支持,它是基于DB-Library,尤其是在生产环境中,从本地传送数据到服务器或从服务器传送数据到本地,因它无需提供图形界面,减少网络带宽,提高了传输速率.BCP的全称是BULK COPY PROGRAM,它是一个命令行程序,可以完全脱离SQL server进程来实现.     常用的导入方式:bcp, BULK INSERT,OPENROWSET,or SSIS.