1. T-SQL의 분류
- DML ( Data Manipulation Language : 데이터 조작 언어 )
- 데이터를 조작(선택, 삽입, 수정, 삭제)하는 데 사용되는 구문
-> SELECT, INSERT, UPDATE, DELETE
-> Transaction : Yes
# Transaction 이란 ?
- 테이블의 데이터를 변경(입력/수정/삭제)할 때 실제 테이블에 완전히 적용하지 않고, 임시로 적용시키는 것을 말함.
- DDL ( Data Definition Language : 데이터 정의 언어 )
- 데이터베이스, 테이블, 뷰, 인덱스 등의 데이터베이스 개체를 생성/삭제/변경하는 역할을 함.
-> CREATE, DROP, ALTER
-> Transaction : No
-> DDL문은 실행 즉시 SQL Server에 적용된다.
- DCL ( Data Control Language : 데이터 제어 언어 )
- 사용자에게 어떤 권한을 부여하거나 빼앗을 때 주로 사용하는 구문
-> GRANT, REVOKE, DENY 등
2. INSERT
- 구문 형식 : INSERT [INTO] <테이블> [ (열1, 열2, ...)] VALUES ( 값1, 값2 ... )
- 테이블 속성이 IDENDTITY로 지정되어 있다면, INSERT에서는 해당 열이 없다고 생각하고 입력
예 :
CREATE TABLE testTbl2 ( id int IDENTITY, userName nchar(3), age int, nation nchar(4) DEFAULT '대한민국' );
GO
INSERT INTO testTbl2 VALUES ( '구엘루', 30, DEFAULT )
#IDENTITY_INSERT를 ON으로 변경한 테이블은 꼭 입력할 열을 명시적으로 지정해줘야함.
-> SET IDENTITY_INSERT testTbl2 on
# 열의 목록 및 기타 정보를 출력
-> EXEC sp_help testTbl2
# 특정 테이블의 현재의 IDENTITY 값 확인
-> SELECT IDENT_CURRENT('testTbl2')
# 다른 테이블의 대량의 데이터를 입력
USE sqlDB
CREATE TABLE testTbl3 ( id nchar(8), Fname nvarchar(10), Fbirthyear int, Faddr nchar(4), Fmobile1 nchar(3), Fmobile2 nchar(8), Fheight smallint )
GO
INSERT INTO testTbl3
SELECT userID, name, birthYear, addr, mobile1, mobile2, height
FROM userTbl
3. UPDATE
- 기존 데이터의 수정
- [구문 형식]
UPDATE 테이블 이름
SET 열1=값1, 열2=값2 ...
WHERE 조건
- 예 :
SELECT * FROM testTbl3
GO
UPDATE testTbl3
SET Fmobile1 = '111'
WHERE id = 'BAY'
GO
SELECT * FROM testTbl3
# WHERE 빼먹다간 전체 데이터가 다 바뀔 수 있으니 주의
4. DELETE
- 행 단위로 삭제
- [구문 형식]
DELETE 테이블 이름 조건
- 비슷한 걸로 DROP, Truncate가 있다.
차이 :
- DELETE : 트랜젝션 로그 기록
- DROP : 테이블 자체를 삭제 , 트랜젝션 X
- TRUNCATE : DELETE와 동일하지만 트랜젝션 로그 기록 X ( 테이블의 구조를 남겨 놓고 싶을 때 사용 )
5. 변수의 사용
- 변수의 선언 : DECLARE @변수이름 데이터형식
- 변수에 값 대입 : SET @변수이름 = 변수의 값
- 변수의 값 출력 : SELECT @변수이름
USE sqlDB
DECLARE @myVar1 INT
DECLARE @myVar2 SMALLINT, @myVar3 DECIMAL(5,2)
DECLARE @myVar4 NCHAR(20)
SET @myVar1 = 5
SET @myVar2 = 3
SET @myVar3 = 4.25
SET @myVar4 = '축구선수 이름==>'
SELECT @myVar1
SELECT @myVar2 + @myVar3
SELECT @myVar4, Name FROM userTbl WHERE height > 160
6. 데이터형 변환 함수
1) CAST
- [구문 형식] CAST ( expression AS 데이터형식 [ (길이) ]
2) CONVERT
- [구문 형식] CONVERT ( 데이터형식 [ (길이) ] , expression [ , 스타일] )
USE sqlDB
SELECT * FROM buyTbl
GO
SELECT AVG( CAST( amount AS FLOAT ) ) AS [평균구매개수] FROM buyTbl
GO
SELECT AVG( CONVERT( FLOAT, amount ) ) AS [평균구매개수] FROM buyTbl
7. 스칼라 함수
예 :
USE sqlDB
CREATE TABLE maxTbl
( col1 VARCHAR(MAX), col2 NVARCHAR(max) )
INSERT INTO maxTbl VALUES ( REPLICATE( 'A', 1000000 ), REPLICATE ('가', 1000000) )
SELECT LEN(col1) AS [ VARCHAR(MAX) ], LEN(col2) AS [NVARCHAR(MAX)] FROM maxTbl
DELETE FROM maxTbl
INSERT INTO maxTbl VALUES (
REPLICATE( CAST('A' AS VARCHAR(MAX) ), 1000000 ),
REPLICATE( CONVERT( VARCHAR(MAX), '가' ) , 1000000 ) )
SELECT LEN(col1) AS [ VARCHAR(MAX) ], LEN(col2) AS [NVARCHAR(MAX)] FROM maxTbl
UPDATE maxTbl SET col1 = REPLACE( ( SELECT col1 FROM maxTbl ), 'A', 'B' ), col2 = REPLACE( ( SELECT col2 FROM maxTbl ), '가', '나' )
SELECT REVERSE ( ( SELECT col1 FROM maxTbl ) )
SELECT SUBSTRING ( ( SELECT col2 FROM maxTbl ), 999991, 10 )
UPDATE maxTbl SET
col1 = STUFF ( ( SELECT col1 FROM maxTbl ), 999991, 10, REPLICATE ( 'C', 10 ) ),
col2 = STUFF ( ( SELECT col2 FROM maxTbl ), 999991, 10, REPLICATE ( '다', 10 ) )
SELECT REVERSE( ( SELECT col1 FROM maxTbl ) )
SELECT REVERSE( ( SELECT col2 FROM maxTbl ) )
8. 순위 함수
- 결과에 순번 또는 순위(등수)를 매기는 역할을 하는 함수
- RANK(), NTILE(), DENSE_RANK(), ROW_NUMBER()
- [구문 형식]
< 순위 함수 이름 > () OVER (
[ PARTITION BY < partition_by_list > ]
ORDER BY < order_by_list >
USE sqlDB
-- 조건에 대한 순위 ROW_NUMBER
SELECT ROW_NUMBER() OVER ( ORDER BY height DESC, name ASC )[ 키큰 순위 ], name, addr, height
FROM userTbl
ORDER BY height DESC
GO
-- group 조건 PARTITION BY
SELECT addr, ROW_NUMBER() OVER ( PARTITION BY addr ORDER BY height DESC)[ 키큰 순위 ], name, height
FROM userTbl
ORDER BY height DESC
GO
-- 동일 조건 DENSE_RANK()
SELECT DENSE_RANK() OVER ( ORDER BY height DESC)[ 키큰 순위 ], name, addr, height
FROM userTbl
ORDER BY height DESC
GO
-- 중복 등수 뛰어넘기 RANK()
SELECT RANK() OVER ( ORDER BY height DESC)[ 키큰 순위 ], name, addr, height
FROM userTbl
ORDER BY height DESC
GO
-- 나열 후 쪼개기 NTILE(N)
SELECT NTILE(2) OVER ( ORDER BY height DESC )[ 반번호 ], name, addr, height
FROM userTbl
ORDER BY height DESC
GO