본문 바로가기

분류 전체보기

[SQL] SELECT INTO (임시 테이블 만들기) 사용법 사용법 SELECT * FROM tableName SELECT * INTO temp_tableName(새로만들 테이블) FROM tableName 위에 사용법으로 테이블을 만들게 되면 영구적으로 테이블이 생기게 된다. 물론 DROP 명령으로 지워주면 되긴 하지만 잠시만 쓰고 지울 것이라면 굳이 영구 테이블을 만들지 않고 임시테이블을 만들어 사용하면 된다. 임시 테이블은 전역임시 테이블, 세션 임시 테이블 두개로 나뉜다. 만드는방법사용할 수 있는 범위삭제되는 시기일반 테이블CREATE TABLE다른 세션에서도DROP TABLE세션 임시 테이블 #tablename 해당 세션에서만 세션이 끊어질 때 전역 임시 테이블 ##tablename 다른 세션에서도 세션이 끊어질 때 tempdb의 일반 테이블 CREATE.. 더보기
[SQL] 동적쿼리 금번 작업을 하면서 고민을 하게 만드는 요청을 받았다. 요청 사항을 정리하면 1. 정렬 DB에서 한다.1-1. 정렬할 대상(컬럼)은 서버로 부터 전달 받는다.1-2. 정렬할 대상(컬럼)에 대해서 오름/내림 차순에 대한 결정도 서버로 부터 받는다. 2. 일정 갯수만을 반환한다.2-1. 페이지 개념을 적용한다. 2-2. 정렬된 값에서 요청 받은 페이지의 약속된 열만큼을 반환해야 한다. ※ 이 글을 읽는 분들은 더 좋은 해답이 있다면 언제든 조언을 부탁드립니다. 일단 서버로 부터 받는 인자는 @정렬기준(대상컬럼) TINYINT, @정렬방법(오름/내림) TINYINT, @페이지크기 INT, @페이지넘버 INT를 받는다. 동적쿼리는 문자열을 만들어서 그것을 실행(EXEC) 하는 것이기 때문에 지역 변수들은 NVA.. 더보기
[SQL] IN구문 사용기 얼마전 어느 정도 분량의 데이터를 삽입해줘야 하는 상황이 발생했다.문제는.... 1. 대상 테이블이 IDENTITY가 걸려 있다. 2. 이미 기존에 들어가 있는 데이터가 존재한다. 3. 넣어야 할 데이터가 다른 DB(ORACLE)에 존재한다. 잠시 생각해 보니 DB가 오라클에서 MS로 변경된 걸 모르고 오라클에 신규 데이터를삽입한 사람의 멱을 잡을 수 없으니 일단 변경된 리스트를 받는 선에서 끝내기로 하고어떻게 손쉽게 할 수 있을까를 생각하니. 쓸만한 것이 IN 구문. ※ 더 손쉬운 방법이 있다면 이 글을 보시는 분이라면 누구든 알려주세요. IN 구문의 사용법은 간단하다 다음과 같은 문법을 가진다. SELECT * FROM 테이블명 WHERE 조건을 걸 대상 컬럼 IN ( '값1', '값2', '값3',.. 더보기
[SQL] DB복구후 DB와 사용자 매핑 1. 사용자 생성 Microsoft SQL Server Management Studio 실행> 데이터베이스 > 보안 > 로그인 (속성) > 새로그인 - 로그인이름 (계정)- 'SQL Server 인증' 의 암호- '암호정책 강제 적용' 체크 안함- '암호만료 강제 적용' 체크 안함- 기본데이터베이스 : 사용할 DB선택[확인] 선택 ※ 참고 : DB에 권한을 가진 사용자가 있습니다. > 데이터베이스 > [DB명] > 보안 > 사용자에서 확인이 가능하며 이 사용자명으로 생성하시면 됩니다. 만약 이곳에 사용자가 없을 경우 임의로 사용자를 아무거나 만듭니다. 사용자 이름 : neulwon // 접근 허용할 계정 로그인 이름 : neulwon // 접근 허용할 계정 기본 스키마 : dbo 이사용자가 선택한 스키마.. 더보기
[SQL] 날짜 변경 (DATEADD) 하루 지난 날짜 즉 어제 날짜를 가져와야 할 일이 생겨 찾아보니.DATEADD(대상, 가감, 날짜);이 함수를 사용해서 날짜를 변경해서 가져올 수 있다. 사용 예는 다음과 같다. DECLARE @yesterday char(10) = convert(varchar(10),dateadd(d,-1,GETDATE()),121);DECLARE @tomorrow char(10) = convert(varchar(10),dateadd(d,+1,GETDATE()),121); 더보기
[SQL] 컬럼 속성 변경 ms-sqlserver에서 table 또는 필드 속성변경은 alter문을 사용하여 합니다. alter table table명 alter column 필드명 datatype ex) test table의 fld필드를 varchar -> int로 변경 alter table test alter column fld int 참고) 실제 입력 되어있는 자료중 int형식으로 변경할 수 없는 경우 (''aaa''값과 같이)에는 sqlserver는 에러를 냅니다. alter table table명 add 필드명 datatype ex) test table의 fld1을 varchar 데이타타입 8자리로 추가하는 경우 alter table test add fl.. 더보기
[SQL] 트랜젝션 롤백 오류대응 방안 저장 프로시저를 작성하고 테스트 하던중 첫 에러가 발생하여 ROLLBACK이 일어나던 중 예정된 에러 메시지가 아니라. "EXECUTE 후 트랜잭션 개수는 COMMIT 또는 ROLLBACK TRANSACTION 문이 없음을 나타냅니다" 와 같은 문구가 나타났다. 해결 방법은 예외 상황에서 IF @@TRANCOUNT > 0 BEGIN ROLLBACK TRAN END 와 같이 ROLLBACK을 감싸 주면 해결된다. 더보기
[SQL] SET XACT_ABORT ON의 의미 Transact-SQL 문에서 런타임 오류가 발생할 경우 SQL Server에서 현재 트랜잭션을 자동으로 롤백할 것인지 여부를 지정 CREATE PROC [dbo].[SP_TEMP] @ID INTAS SET NOCOUNT ONSET LOCK_TIMEOUT 60000SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDSET XACT_ABORT ON -- 이런 식으로 추가됨. IF (@ID IS NULL ) RETURN -1 BEGIN TRY BEGIN TRAN .... 본문 생략.... 더보기
[Oracle Database] MSSQL 날짜 변환 오라클에서는 TO_CHAR()을 사용해서 문자열로 변환이 가능했다. 상당히 유용하며,날짜를 변환할때 많이 사용했었다. TO_CHAR(SYSDATE,'YYYY-MM-DD') -> 2013-01-14TO_CHAR(SYSDATE,'YYYY/MM/DD') -> 2013/01/14 TO_CHAR(SYSDATE,'YYYYMMDD') -> 20130114 MSSQL에서는 CONVERT(VARCHAR(10),GETDATE(),120) -> 2013-01-23 CONVERT(VARCHAR(10),GETDATE(),111) -> 2003/01/23 CONVERT(VARCHAR(8),GETDATE(),112) -> 20030123 와 같이 사용할 수 있다. 120, 111, 112은 날짜 표현으로 위와 같은 방식으로 날짜를.. 더보기
[SQL] ISNULL()함수 사용법 NULL을 지정된 값으로 변환한다. 지난 번에 Oracle에서 이와 같은 기능을 하는 NVL을설명한 적이 있는데, NVL과 동일한 기능을 수행하는 SQL 함수가 ISNULL 이다. SQL Server에서는 ISNULL ( check_expression , replacement_value ) Oracle에서는 NVL ( check_expression , replacement_value ) [출처] SQL 함수의 모든것 3- 변환 함수(ISNULL / NVL) |작성자 사랑지기 참고로 ISNULL도 뷰가 존재하지 않는 대상에 대해서는 0으로 값을 치환하지 못하기 때문에,ISNULL(MAX(컬럼), 0) 과 같이 집계함수를 같이 사용하면 없는 값에 대해서 뷰를 만들어 반환을가능하게 해준다. 집계함수의 사용은 .. 더보기
[Oracle Database] 날짜표현 방법 오라클에서는 다음과 같은 방법으로 날짜를 표현 할 수 있다. select to_char(add_months(sysdate,-1),'yyyy-mm-dd'),-- 한달전 오늘 to_char(add_months(sysdate,-12),'yyyy-mm'), to_char(add_months(sysdate,-12),'yyyy-mm-dd'), -- 1년전 오늘 to_char(add_months(sysdate,-12),'yyyy'), to_char(sysdate-1,'yyyy-mm-dd') -- 어제to_char(sysdate-1,'yyyymmdd') -- 어제 from dual 더보기
[SQL] DISTINCT와 PARTITION BY구문 사용법 흠... 예를 들어서 회원의 거주 지역 테이블이 있다고 가정해보면 다음과 같은 테이블이 존재 할 수 있다. 거주지-----서울경기경기서울경남전남경기 7개의 행이라면 지역을 파악하는데 어려움이 없지만, 기본적으로 DB에 저장되는 회원의수는 수 만이 넘어갈 것이기에 이 경우는 Order by 절을 사용한다고 해도 답이 안나온다. 이 경우 SELECT DISTINCT 거주지 FROM 테이블;과 같이 하면, 다음과 같은 결과를 얻을 수 있다. 거주지------서울경기경남전남 이와 같은 효과로 GROUP BY로 낼 수 있다.SELECT 거주지 FROM 테이블 GROUP BY 거주지;와 같이 한다면 말이다. 이 차이점은... 흠 좀 더 알아봐야 겠다. PARTITION BY는 DISTINCT를 무시한다.해서, 테이.. 더보기
[Oracle Database] 10g XE 설치후 리스너 설정 & tns설정 시스템 -> 시스템 보호-> 고급 -> 환경변수 -> 시스템 변수의 path 에C:\oraclexe\app\oracle\product\10.2.0\server\BIN; 추가 C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN C:\Documents and Settings\Administrator>cd\ C:\>sqlplus /nolog로그인없이 SQL*PLUS 접속 (접속은 하되 로그인은 하지 않는다 [/nolog]) SQL*Plus: Release 10.2.0.1.0 - Production on 화 11월 16 10:41:26 2010 Copyright (c) 1982, 2005, Oracle. All rights reserved. SQL> show.. 더보기
[Oracle Database] Decode함수 사용법 어느 정도 삽질을 하다가 살짝살짝 공부를 하고 있는 oracle의 세계는 참 신비롭다. 오라클에는 DECODE라는 기특한 녀석이 있다. 오라클에서만 된단다.용도는 SELECT 구문 내에서 비교 연산을 수행해 주는 함수 이다. DECODE( 컬럼1, '홍길동', 1, 0 ) AS 블라블라이런 방식인데 뜻은, 컬럼1이 홍길동과 같으면 1을 아니면 0의 값을 가진다. 또는 집계와 이중 사용도 가능하다. SUM(DECODE(컬럼1, '홍길동', 1, 0)) DECODE( 컬럼1, '홍길동', DECODE(컬럼2, '임꺽정', 1, 0), 3) 이런식이라고 할 수 있겠다. 2중 사용은 AND연산으로 수행된다는 거만 주의하면 된다. 더보기
[Oracle Database] 테이블 삭제 PURGE 라는 명령어를 찾다가 발견한 내용. DROP TABLE TABLE_NAME; 10G부터는....RECYCLEBIN으로 이동됨DROP TABLE TABLE_NAME PURGE;--RECYCLEBIN으로 까지 삭제 됨PURGE TABLE TABLE_NAME;//RECYCLEBIN 삭제됨 더보기
[SQL] between구문 사용법 작업을 하다가 생각나는 것을 바로바로 포스팅 하다 보니 참 두서가 없다. select 문을 사용하던 중, 일정 범위 내의 값을 가져와야 하는 상황이 있었다.그럴때 사용할 수 있는 문법이 between 이다. 예시) SELECT 컬럼1, 컬럼2 FROM TEST_TABLE WHERE ID = 1111 AND 컬럼1 BETWEEN 9 AND 13; 또는 SELECT 컬럼1, 컬럼2 FROM TEST_TABLE WHERE 컬럼1 BETWEEN 100 AND 300; 이런 식으로 사용할 수 있다. 더보기
[SQL] Group by 컬럼 사용 팁 쿼리를 작성하다가 다음 같은 오류를 만났다. SQL Error : ORA-00979 : GROUP BY 표현식이 아닙니다[출처] Group by 팁 - 에러 : SQL Error : ORA-00979 : GROUP BY 표현식이 아닙니다.|작성자 최환수 이 오류는 집계 함수를 사용할 때, 집계 함수에 쌓이지 않는 컬럼들은 전부 group by 리스트에있어야 하는데 ... 이 중에 빠진게 있다는 말이 되겠다. ( 집계 합수 : sum(), count()... 등등 ) 다음의 예를 들어 보면 쉽게 이해가 될 것이라 사료된다. SELECT a.ID, a.column1, sum(NVL(b.VALUE, 0))FROM TEST_TABLE a LEFT JOIN TEST_TABLE b ON ( a.ID= b.ID AN.. 더보기
[Oracle Database] MERGE INTO구문 사용법 하나의 저장 프로서지(SP)에서 UPDATE와 INSERT를 같이 사용해야 할 경우가 때때로 있다. 이 상황중에서 하나의 대상 테이블에서 해당 값이 row가 존재한다면 값을 UPDATE하고존재 하지 않는다면 INSERT를 진행해야 하는 경우에서 몇가지 방법이 있겠으나 편리한방법이 존재하기에 적어 두려고 한다. 기존에는 SELECT NVL(MAX(컬럼), 0) INTO 변수 FROM 테이블 WHERE 조건; IF 변수 0 THEN UPDATE 테이블 SET 대상 컬럼 = 적용 값 WHERE 조건ELSE INSERT INTO 테이블 (컬럼...) VALUES ( 적용 값...);END IF; 와 같은 방식을 사용했는데... 역시나 더 좋은 방법이 존재했었다.이 문법은 다음과 같다. MERGE INTO 테이블.. 더보기
[Oracle Database] 형변환(문자열->Number) ※ 기본적으로 개인적인 앎에 대한 메모를 위한 공간입니다. 일을 하다보면 컬럼을 문자열로 지정하고 값은 숫자로 넣을 때가 있다. 왜 그렇게 했는지는 모르겠다. 아마 어떤 거룩한 뜻이 있었던거 같기도 한데 머 일단 넘어가자. 예를 들어 TEMP라는 테이블에 CODE_INDEX 라는 컬럼이 있고, 이 컬럼은 VARCHAR2(2) 라고 하자, 그 컬럼에 값을 1,2,3...30 까지 순서대로 값을 넣었다고 한다면 일반적으로 우리가 SELECT CODE_INDEX FROM TEMP 라고 했을때 기대하는 결과물은 CODE_INDEX12...1011..30 이와 같은 결과물일 것이다. ORDER BY CODE_INDEX ASC 를 하던 말이다.하지만 문자열로 지정되어 있는 컬럼은 SELECT를 해보면 CODE_IN.. 더보기
[Oracle Database] Rownum구문 사용법 일을 하다가 최대 Row가 130인 컬럼에 100개만 반환해달라는 요청을 받았다. 즉, 일반적으로 SELECT를 하면 130개의 ROW가 결과로 반환되는데 그 중에서 100개만 전달해달라는 요청이었는데. 이와 같은 경우에 사용할 수 있는 유용한 명령어(?), 함수(?)가오라클에 있다. 다른 SQL에도 있을꺼 같은데. 일단 귀찮으니 패스. 나중에 꼭 찾아보자. ROWNUM 1. 오라클 에서만 사용가능.2. 조회된 Row의 number를 가지는 가상의 컬럼3. 주로 paging처리, N-Top 조회시 사용. 위의 요청의 경우는 SELECT * FROM 테이블 WHERE ROWNUM 더보기