![sshhhh](https://t1.daumcdn.net/tistory_admin/static/manage/images/r3/default_L.png)
--테이블 데이터 값
🍩INSERT
INSERT INTO TBL_SH (EMP_NO, AGE, IUSER, IDATE) VALUES ('20', 20, 'TEST', GETDATE());
🍩UPDATE
UPDATE TBL_SH SET IUSER = 'TEST5' WHERE IUSER = 'TEST'
🍩DELETE
DELETE FROM TBL_SH WHERE EMP_NO = '';
🍩ALTER 열 추가
ALTER TABLE TBL_SH ADD CO INT DEFAULT 0;
🍩GROUP BY
/*
AGE를 기준으로 SEQNO의 값을 집계한다
*/
SELECT AGE, AVG(SEQNO) AS AVERAGE_SCORE, MAX(SEQNO) AS MAX_SCORE, MIN(SEQNO) AS MIN_SCORE
FROM TBL_SH
GROUP BY AGE
HAVING MAX(SEQNO) >5 --별칭사용불가
🍩EXISTS : 데이터 존재유무판단
/*
EXISTS 이하의 서브쿼리를 실행하고 서브쿼리에 대한 결과가 '존재하는지'를 확인
(참 또는 거짓을 반환)
따라서 모든 레코드 출력
*/
🍩IN
SELECT * FROM TBL_SH
WHERE EMP_NM IN ('테스트1','테스트2')
🍩INNER JOIN
WHERE 조건 만족하는 행들만 테이블 A,B 모두 붙여서 출력
SELECT * FROM TBL_SH A
INNER JOIN TBL_SH2 B
ON A.EMP_NM = B.NAME
🍩LEFT JOIN
--왼쪽 테이블(A)의 모든 행과 오른쪽 테이블(B)에서 일치하는 행을 반환,
B에서 ON 조건 일치하지 않는 행은 NULL 값으로 표시
SELECT *
FROM TBL_SH A
LEFT JOIN TBL_SH2 B
ON A.EMP_NM = B.NAME
ORDER BY SEQNO
🍩RIGHT JOIN
🍩FULL JOIN
--A,B 모든 행 반환, 일치하는 행 없을 경우 NULL로 표시
SELECT * FROM TBL_SH A
FULL JOIN TBL_SH2 B
ON A.EMP_NM = B.NAME
🍩CROSS JOIN
--A,B 모든 조합 반환
SELECT * FROM TBL_SH A
CROSS JOIN TBL_SH2 B
🍩UNION
/*
EMP_NM, NAME 열을 합쳐 한 열로 만든다.(중복 데이터는 제거한채)
ABC,ADDR 도 같음
-첫 번째 SELECT 문의 컬럼으로만 열이 만들어짐
*/
SELECT * FROM
(
SELECT EMP_NM AS U_T, ABC AS ABC FROM TBL_SH
UNION
SELECT NAME, ADDR FROM TBL_SH2
)A
ORDER BY A.U_T DESC
🍩UNION ALL : 중복 제거 X
SELECT ABC AS UA_T FROM TBL_SH
UNION ALL
SELECT COMP FROM TBL_SH2
🍩CASE
SELECT
CASE
WHEN AGE > 5 THEN '5이상'
ELSE '미만'
END AS 컬럼이름
FROM TBL_SH
🍩CONVER
원하는 데이터 형식으로 변환
SELECT CONVERT(INT, '12345') AS ConvertedNumber;
--현재날짜
SELECT CONVERT(NVARCHAR(10), GETDATE(), 101) AS ConvertedDate;
--현재시간
SELECT CONVERT(NVARCHAR(8), GETDATE(), 108) AS ConvertedTime;
🍩여러 테이블 JOIN
-- Employees 테이블과 EmployeeDetails 서브쿼리를 INNER JOIN으로 결합한 결과와
AssignmentDetails 서브쿼리와 LEFT OUTER JOIN을 사용하여 결합
-- 결과적으로, Employees와 EmployeeDetails INNER JOIN으로 결합된 레코드와
AssignmentDetails LEFT OUTER JOIN으로 결합된 레코드들이 함께 있는 최종 결과가 반환
SELECT TOP 5 * FROM Employees Emp
INNER JOIN
(
-- 해당 서브쿼리의 결과는 EmployeeDetails 테이블로 사용됩니다.
SELECT Department, Company
FROM EmployeeDetails
WHERE Department = @SelectedDepartment
AND Company = @SelectedCompany
) EmpDetails ON Emp.Department = EmpDetails.Department
LEFT OUTER JOIN
(
-- 해당 서브쿼리의 결과는 AssignmentDetails 테이블로 사용됩니다.
SELECT A.Department, A.Company, A.EmployeeID
FROM Assignments A
WHERE A.Department = @SelectedDepartment
AND A.Company = @SelectedCompany
GROUP BY A.Department, A.Company, A.EmployeeID
) AssignmentDetails ON Emp.Department = AssignmentDetails.Department
WHERE Emp.Department = @SelectedDepartment
즉 테이블 모두 JOIN으로 합쳐짐
🍩ISNULL
SELECT TOP 5 U11 , * FROM T36
--UNTAX_R11가 NULL 일경우 1 반환
SELECT TOP 5 ISNULL(U11,1)UNTAX_R11 , * FROM T36
🍩<>
<>는 두 값이 서로 다를 때 참(true)을 반환하는 비교 연산자
다른 데이터베이스 시스템에서는 != 연산자도 같은 역할
예를 들어, a <> b는 값 a와 값 b가 서로 다를 때 참을 반환
SELECT *
FROM products
WHERE price <> 50;
이 쿼리는 "products" 테이블에서 price가 50이 아닌 모든 행을 선택. 즉, price가 50이 아닌 제품들의 정보를 반환
🍩CHARINDEX
문자열에서 지정한 문자 또는 문자열을 찾는 데 사용
SELECT CHARINDEX('world', 'Hello, world!') AS Position;
'Hello, world!' 문자열에서 'world'를 찾고 그 위치를 반환
실행 결과
| Position |
|----------|
| 7 |
'world'는 문자열의 7번째 위치에 있음
🍩CASE WHEN THEN
테이블: products
product_name price
Apple | 100 |
Banana | 50 |
Orange | 30 |
Grapes | 70 |
Pear | 40 |
price 값에 따라 product_name을 변환하는 예제
SELECT product_name,
CASE price
WHEN 100 THEN 'Expensive'
WHEN 50 THEN 'Moderate'
ELSE 'Cheap'
END AS price_category
FROM products;
실행 결과:
product_name price_category
Apple | Expensive |
Banana | Moderate |
Orange | Cheap |
Grapes | Cheap |
Pear | Cheap |
위의 쿼리에서는 price 값이 100인 경우 "Expensive", 50인 경우 "Moderate", 그 외의 경우 "Cheap"으로 변환
결과적으로 price_category 열이 생성되고, 해당하는 변환 결과가 저장
🍩CURSOR
커서(Cursor)는 데이터베이스에서 데이터를 행 단위로 처리하기 위한 개념
일반적으로 쿼리의 결과 집합을 커서로 가져와 한 번에 하나씩 처리
🍩SUBSTRING
SUBSTRING(문자열,시작자리번호,자를문자수)
🍩임시테이블
- 로컬 임시 테이블 (#):
- 현재 연결된 세션 내에서만 사용 가능.
- 각 세션은 자체 로컬 임시 테이블을 가짐.
- 세션 종료 시 자동으로 삭제.
- 전역 임시 테이블 (##):
- 모든 사용자가 접근 가능.
- 모든 사용자의 참조가 끝난 후 자동 삭제.
- 데이터를 공유하기 위한 목적으로 거의 사용되지 않음.
- 프로시저내에서의 사용:
- 중간 결과 저장: 프로시저에서 중간 계산 결과나 데이터를 임시로 저장하여 복잡한 계산 과정 처리
- 복잡한 쿼리: 프로시저에서 복잡한 쿼리를 수행할 때 일부 쿼리 결과를 임시 테이블에 저장하고 활용하여 쿼리를 작성하거나 데이터를 처리
-- 임시 테이블 생성
CREATE TABLE #TempTable (
ID INT PRIMARY KEY,
Name NVARCHAR(50)
)
-- 데이터 삽입
INSERT INTO #TempTable (ID, Name)
VALUES (1, 'John'), (2, 'Alice'), (3, 'Bob')
-- 데이터 조회
SELECT * FROM #TempTable
-- 임시 테이블 삭제 (선택 사항)
DROP TABLE #TempTable
🍩 MERGE
두 개 이상의 테이블 간에 데이터를 비교하고 필요한 경우 업데이트, 삽입 또는 삭제를 수행하는 데 사용
MERGE INTO target_table AS target
USING source_table AS source
ON target_condition
WHEN MATCHED THEN
-- 일치하는 경우 수행할 작업
UPDATE SET target_column1 = source_column1, target_column2 = source_column2, ...
WHEN NOT MATCHED BY TARGET THEN
-- 대상에만 있는 경우 수행할 작업
INSERT (target_column1, target_column2, ...)
VALUES (source_column1, source_column2, ...)
WHEN NOT MATCHED BY SOURCE THEN
-- 원본에만 있는 경우 수행할 작업 (선택 사항)
DELETE;
🍩 >뜻
-- <if test=''BYN != null and BYN != ""''>
IF ISNULL(@BYN,'') > ''