CategoryTips/DB, SQL Tips (10)

[SQL] UPDATE문에서의 FROM, 별칭 사용

Update에 From을 써서 별칭 사용하기기본적인 것이지만 갑자기 가물가물 함에 한번 정리해 봅니다.최근에 관련 쿼리를 짜는데 업데이트에 별칭을 어떻게 쓰더라..? 하고 멍해있었습니다.또 까먹기 전에 바로 정리를 해봅니다.UPDATE TEMP_USET IsDelete = 'True'FROM tblUser AS TEMP_UWHERE CreateDate >= '2015-01-01'tblUser라는 테이블의 별칭을 TEMP_U로 주고 Update문에서 별칭으로 지정해서 업데이트를 할 수 있습니다.좀더 응용해서 아래와 같이 사용 할 수도 있습니다.UPDATE TEMP_USET IsDelete = 'True'FROM tblUser AS TEMP_U, tblUserCategory AS TEMP_UCWHERE TE..

[MS-SQL] DB 백업과 복원 (DB BackUp, DB Restore - DB Copy)

데이터베이스 복원(카피) 유지보수중인 서비스의 요청사항이 들어왔습니다.서비스의 장기 미 접속 유저에 대한 잠금설정 기능추가가 필요하다는 겁니다.일사천리로 진행되나 싶더니.. 작업 중.. 손가락이 미끄러져서 잠금값을 바꾼다는게 그만 삭제값을 True로 바꿔버렸습니다!! 히힛!뭐 일반 유저 데이터면 큰 문제일테지만 장기 미 접속 유저 아니겠습니까?매일 데이터를 백업하고 있었기 때문에 백업한 DB를 다른 이름으로 복구해서 해당 값들을 원상복구하면 되겠구나~ 하는 가벼운 생각으로 복구 작업을 시작했습니다. MSSQL을 사용하기 때문에 GUI에서 작업하는 경우가 많아서 SQL Server Management Studio에서 복원을 시작했는데 복구가 잘 되지 않습니다! 정상적인 .BAK파일 일텐데? 오류 번호 : ..

[MS-SQL] 변수 및 테이블 변수 생성 및 사용

변수변수란 값을 담아두는 것이라고 모두 알고 있으실 겁니다.우선 간단하게 변수를 생성하고 설정하는 방법을 알아보겠습니다.--변수 생성 --declare 변수명 타입 DECLARE @name varchar(20) --변수에 값 할당 SET @name = 'Kendrick' --혹은 --userid가 sonim1일 때 이름이 Kendrick일 경우 SELECT @name = P.name FROM tblPerson P WHERE userid = 'sonim1' SET을 하던 SELECT를 하던 동일한 값이 @name 변수에 할당되는 쿼리입니다.아래는 @name 변수를 이용해서 이어서 해당 user의 가입일을 알아보겠습니다.SELECT CreateDate -- 생성일 필드 FROM tblPerson P WHER..

[MS-SQL] 커서(Cursor) 사용하기

커서(Cursor)란?행 단위 작업을 추가로 제어해야 할 경우 사용되는 기능입니다.행 단위 작업이란 예를들면 특정 테이블에서 SELECT한 Email 별로 작업을 해야 하는 경우를 말합니다.즉 Email 별로 특정 값을 변경 시킬 때, 반복으로 노가다 할 필요 없이 한번에 처리하는 쿼리를 만들 수 있습니다. 커서를 이용해서 말이죠커서 선언--커서 생성 DECLARE CursorEmail CURSOR FOR SELECT Email from tblUserTable where IsDelete = 'False' 커서 열기--커서 열기 Open CursorEmail; 불러온 데이터를 이용한 작업-- 맨처음 결과 데이터로 이동 Fetch Next From CursorEmail Into @email WHILE(@@F..

[MSSQL] 테이블 복사

테이블 복사테이블 생성, 데이터 복사SELECT * INTO NEW_TABLE FROM OLD_TABLE 테이블 구조 복사SELECT * INTO NEW_TABLE FROM OLD_TABLE WHERE 1 = 2 데이터만 복사INSERT INTO TEMP_TABLE SELECT * FROM OLD_TABLE WHERE 검색조건 위 예제의 경우 원본 테이블과 대상 테이블의 구조가 같아야 합니다.만약 구조가 다를 경우 직접 컬럼 값을 지정해주시면 됩니다.INSERT INTO TEMP_TABLE ( column1, column2, ... ) SELECT col1, col2, ... FROM OLD_TABLE 참고MS-SQL 테이블 복사 - IberisStackOverflow

[MSSQL] 저장 프로시저(Stored Procedure) 내용 검색하기

저장 프로시저 내용 검색하기가끔 저장 프로시저 이름이 안떠오르거나 다수의 SP의 내용을 일괄적으로 바꾸거나 할 필요가 있을 경우가 있습니다. 저장 프로시저를 일일이 열어봐서 찾으려고 하니 숨이 턱막힙니다.그럴 때 유용한 저장프로시저 내용 검색쿼리를 소개합니다.잘못된 방식SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LIKE '%찾을 내용%' AND ROUTINE_TYPE='PROCEDURE' …포스트 작성하기 전까지는 위 쿼리를 사용했었습니다만 찾다보니 문제를 발견하였습니다.ROUTINE_DEFINITION이 nvarchar(4000)으로 문자열을 변환하여 내려주기 때문에 매우 긴 내용의 경우 검색에 문제가 있다고 합니다.다음 스크..

[MSSQL] JOIN의 방식 - Nested loop Join / Merge Join / Hash Join

Join의 방식에 관하여Join의 종류는 5가지가 있습니다.INNER JoinOUTER JoinCROSS JoinFULL OUTER JoinSELF JoinJoin의 방식은 3가지가 있습니다.Nested Loop Join - 중첩반복Merge Join - 정렬병합Hash Join - 해시매치Join의 종류는 논리적 Join이라고 합니다.Join의 방식은 물리적 Join이라고 합니다.이 포스트에서는 JOIN의 방식에 대해서 알아보겠습니다.중첩반복(Nested Loops) 조인바깥 테이블의 처리 범위를 하나씩 액세스하면서 그 추출된 값으로 안쪽 테이블을 조인하는 방식순차적으로 처리된다.바깥 테이블과 일치하는 값을 안쪽 테이블에서 찾아야 하므로 안쪽 테이블의 해당 열에 인덱스가 필요하다.메모리 사용량은 가장 ..

[MSSQL] 여러 ROW를 하나의 ROW로 합치기

MSSQL Tips여러가지 ROW를 하나의 ROW로 만들기IDTitle1가1나1다1라2마2바2사2아3자위와같은 테이블이 있습니다.ID를 기준으로 Title의 텍스트를 comma(,)로 구분지어서 하나의 ROW로 합치고 싶을때 아래 쿼리를 사용합니다.SELECT DISTINCT ID, STUFF(( SELECT ',' + Title FROM TB_Data b WHERE b.ID = a.ID FOR XML PATH('') ),1,1,'') AS NAME FROM TB_Data a 아래와 같은 결과가 출력됩니다.IDTitle1가,나,다,라2마,바,사,아,자STUFF?? FOR XML PATH??STUFF함수SUTFF함수는 문자열에서 특정 시작위치에서 지정된 길이만큼 문자를 바꿔줍니다.SELECT STUFF('..

[MySQL] RowNum 만들기

MySql에는 rownum이 없습니다.그렇기 때문에 따로 만들어 주어야 하는데요. 아래 소스가 만드는 예제입니다.ex1) SELECT @RNUM := @RNUM + 1 AS ROWNUM FROM ( SELECT @RNUM := 0 ) R ex2) SELECT @RNUM := @RNUM + 1 AS ROWNUM, t.* FROM ( SELECT * FROM table ORDER BY column1 ) t, ( SELECT @RNUM := 0 ) R ex2) 처럼 구현하게 되면 ordering 된 상태에서 rownum이 0부터 순서대로 부여됩니다.[출처] [MySQL] rownum 구현하cnf기|작성자 카퍼

[Oracle] RowNum 만들기

오라클에서 rowNum을 사용할 경우 select * from table where rownum = 3; 위 쿼리를 실행해도 rownum 3번째 값이 나오지 않고 아무것도 없다고 뜰것이다 하지만 rownum = 1은 된다. rownum 이라는 것은 Select된 Row가 나오고..그 row의 번호를 의미하기 때문이다. rownum=3이라는 것이 안나오는 이유는 where조건에 걸러진 조건중에서 아직 row 1,2가 없기 때문이다.rownum <3은 1,2가 나오지만은 1,2를 아직 select 하지도 않은 상태에서 3을 가져올 수 없다. 보통 3번째것을 가져오고 싶으면 SELECT * FROM ( SELECT rownum rnum,emp_name, emp_jik, emp_age FROM t_insa WH..