SqlServer和Oracle中一些常用的sql语句1

insert into city 
--找出Hotel表中不存在于city表中的城市名
select DISTINCT rtrim(ltrim(cityname)) from Hotel e WHERE not EXISTS 
(SELECT * FROM city eb WHERE eb.cityname=e.cityname)

 

  --------------------------------Insert---------------------------------
	-- 多条数据一次insert插入
	INSERT INTO table1
		SELECT '张三1','aaa','90' union all
		SELECT '张三2','aaa','90' union all
		SELECT '张三3','aaa','90' 	
	
	/*
	INSERT INTO SELECT语句 
	语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from Table1
	要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。示例如下:
	INSERT INTO SELECT语句复制表数据
	*/
	--1.创建测试表
    create TABLE Table1
    (
        a varchar(10),
        b varchar(10),
        c varchar(10),
        CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
        (
            a ASC
        )
    ) ON [PRIMARY]

    create TABLE Table2
    (
        a varchar(10),
        c varchar(10),
        d int,
        CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED
        (
            a ASC
        )
    ) ON [PRIMARY]
    GO
    --2.创建测试数据
    Insert into Table1 values('赵','asds','90')
    Insert into Table1 values('钱','asds','100')
    Insert into Table1 values('孙','asds','80')
    Insert into Table1 values('李','asds',null)
    GO
    select * from Table2

    --3.INSERT INTO SELECT语句复制表数据
    Insert into Table2(a, c, d) select a,c,5 from Table1
    GO

    --4.显示更新后的结果
    select * from Table2
    GO
    /* 结果
        a   c       d
		李	NULL	5
		钱	100		5
		孙	80		5
		赵	90		5     
    */
    --5.删除测试表
    drop TABLE Table1
    drop TABLE Table2
    
	/*    
	SELECT INTO FROM语句
	语句形式为:SELECT vale1, value2 into Table2 from Table1
	要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。示例如下:
	SELECT INTO FROM创建表并复制表数据
	*/
    --1.创建测试表
    create TABLE Table1
    (
        a varchar(10),
        b varchar(10),
        c varchar(10),
        CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
        (
            a ASC
        )
    ) ON [PRIMARY]
    GO

    --2.创建测试数据
    Insert into Table1 values('赵','asds','90')
    Insert into Table1 values('钱','asds','100')
    Insert into Table1 values('孙','asds','80')
    Insert into Table1 values('李','asds',null)
    GO

    --3.SELECT INTO FROM语句创建表Table2并复制数据
    select a,c INTO Table2 from Table1
    GO

    --4.显示更新后的结果
    select * from Table2
    GO
    /*
        a   c
		李	NULL
		钱	100
		孙	80
		赵	90    
    */
    --5.删除测试表
    drop TABLE Table1
    drop TABLE Table2

 

-- 根据表Adjustment中的记录删除Emp_Bak中对应的数据
DELETE Emp_Bak E
WHERE EXISTS
    (
    SELECT 'X'
    FROM Adjustment A 
    WHERE E.Emp_Id = A.Emp_Id
    )

DELETE Emp_Bak E
WHERE Emp_Id IN
      (
      SELECT A.Emp_Id
      FROM Adjustment A 
      WHERE E.Emp_Id = A.Emp_Id
       )
  

--103, ORACLE 中删除表Emp_Bak中重复数据
--JOIN
DELETE Emp_Bak D
WHERE ROWID >
      (
      SELECT MIN(ROWID)
      FROM Emp_Bak R
      WHERE D.Emp_Id = R.Emp_Id
      )
      
--NOT IN
DELETE Emp_Bak D
WHERE ROWID NOT IN
      (
      SELECT MIN(ROWID)
      FROM Emp_Bak R
      GROUP BY R.Emp_Id
      )
   
--104, SQL SERVER 删除重复数据 分三步 首先将非重复数据存储到临时表,然后清空原数据表,最后将临时表数据存回原数据表
--STEP01
SELECT DISTINCT Emp_id, Emp_Name
       ,Dept_id, Mobile, Ext
       ,Salary, Email, Date_Update 
       INTO #Emp_Bak
FROM Emp_Bak
   
--STEP02
TRUNCATE TABLE Emp_Bak

--STEP03
INSERT INTO Emp_Bak
SELECT Emp_id, Emp_Name
       ,Dept_id ,Mobile, Ext
       ,Salary, Email 
       , GETDATE() Date_Create --
FROM #Emp_Bak

------------------------------4.5------------------------------------
--105, ORACLE, 删除大量数据时 可能导致数据库事务日志文件急剧扩展,甚至无法继续进行事务处理等问题,可用分批删除数据方法
DECLARE 
  n NUMBER;
BEGIN
  LOOP
    EXIT WHEN n=0;
    DELETE EMP_BAK
    WHERE ROWNUM<=5 
       AND Dept_Id Like 'I%'; 
    n :=SQL%ROWCOUNT;
    DBMS_OUTPUT.PUT_LINE( n );
    COMMIT;
  END LOOP; 
END;

--105, SQL SERVER, 
WHILE (@@ROWCOUNT>0)
BEGIN
  DELETE TOP(5) 
  FROM Emp_Bak
  WHERE Dept_Id Like 'I%'
END

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


------------------------------5.1------------------------------------
--117
SELECT 
  TO_CHAR(DATE'-4712-01-01', 'J')  "JDay(Base)"
  , TO_CHAR(DATE'2010-01-01', 'J') "JDay"
  , (TO_CHAR(DATE'2010-01-01', 'J')
  -TO_CHAR(DATE'-4712-01-01', 'J'))/365.25 Diff
FROM DUAL

--117
SELECT DATE'2010-03-17' Today
   , TIMESTAMP '2010-3-17 8:28:40' Now
FROM DUAL

------------------------------5.4------------------------------------
--124, ORACLE
SELECT 
     NVL(A, '新值')        "test1.A"
     , COALESCE(A, '新值')"test1.B"
     , COALESCE(A, B, C)  "test2.A"
     , NVL(A, NVL(B, C))  "test2.B"
FROM 
    (
    SELECT NULL A
           , NULL B
           , '非NULL' C
    FROM DUAL
    )

--124, SQL SERVER
SELECT 
    ISNULL(A, '新值')          "test1.A"
    , COALESCE(A, '新值')      "test1.B"
    , COALESCE(A, B, C)        "test2.A"
    , ISNULL(A, ISNULL(B, C))  "test2.B"
FROM 
    (
       SELECT NULL A
             , NULL B
             , '非NULL' C
    ) A

--125

--SQL SERVER
SELECT VAL
   , NULLIF(VAL, 0) "NULLIF(VAL, 0)"
FROM 
    (
    SELECT 0 VAL
    --FROM DUAL
    UNION ALL
    SELECT 20 VAL
    --FROM DUAL
    ) A

--ORACLE
SELECT VAL
   , NULLIF(VAL, 0) "NULLIF(VAL, 0)"
FROM 
    (
    SELECT 0 VAL
    FROM DUAL
    UNION ALL
    SELECT 20 VAL
    FROM DUAL
    ) A
--mssql去空格
SELECT REPLACE(REPLACE(REPLACE(REPLACE(CAST('abc def ghi cd e' AS VARCHAR),CHAR(13) + CHAR(10),''),CHAR(13),''),CHAR(10),''),' ','')
-- 查询table1中 city相同数目大于1的 且text字段为空
select  * from table1 where city in
(select city  from table1  group by city having count(*)>1)
and text is null
--SQL:删除重复数据,只保留一条  
--在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢
--1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断
select * from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)

--2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
delete from people
where   peopleName in (select peopleName    from people group by peopleName      having count(peopleName) > 1)
and   peopleId not in (select min(peopleId) from people group by peopleName     having count(peopleName)>1)

--3、查找表中多余的重复记录(多个字段)
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)

--4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录
delete from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

--5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)   

--6.消除一个字段的左边的第一位:

update tableName set [Title]=Right([Title],(len([Title])-1)) where Title like '村%'

--7.消除一个字段的右边的第一位:

update tableName set [Title]=left([Title],(len([Title])-1)) where Title like '%村'

--8.假删除表中多余的重复记录(多个字段),不包含rowid最小的记录
update vitae set ispass=-1
where peopleId in (select peopleId from vitae group by peopleId,seq having count(*) > 1) and seq in (select seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

posted @ 2013-06-06 16:44  深南大道  阅读(158)  评论(0编辑  收藏  举报