정확히는 SQL Server 긴 한데... Windows 환경에서 했으니 아무튼 Windows다.
DML(Data Manipulation Language : 데이터 조작 언어)
-> 데이터 자체를 조작하는 용도(INSERT, SELECT, UPDATE, DELETE 등).
-> Transaction 발생(SELECT 제외) = 원자성 적용됨
DDL(Data Definition Language : 데이터 정의 언어)
-> DB 개체를 정의하는 용도(CREATE, DROP, ALTER 등). Transaction 발생하지 않음
DCL(Data Control Language : 데이터 제어 언어)
-> 권한 관련 용도(GRANT, REVOKE, DENY 등)
- HAVING 구문
WHERE처럼 조건문을 의미하지만, 집계 함수가 사용된 조건문을 대입한다.
예시) 구매 총액이 1000원 이상인 사람만 출력하려면?
-> 대충 생각하면 WHERE SUM(구매 총액) > 1000; 쓰면 끝이라고 생각할 수 있지만,
-> 에러 발생. 집계 함수가 들어간 조건문은 HAVING 절을 사용해서 작성해야 한다.
-> HAVING SUM(구매 총액) > 1000;
- WITH 구문
이전 글에서 SELECT문에 쓸 수 있는 모든 구문을 작성했었는데, 이때 SELECT 앞에 있던 구문이다.
-> [ WITH <common_table_expression>] AS (SQL Query1) [SQL Query2]
-> CTE(Common Table Expression)는 VIEW, 파생 테이블, 임시 테이블을 대신할 수 있으며, 더 간결하게 표현된다.
* CTE
- 비 재귀적 CTE : Query1과 WITH CTE로 새로운 테이블을 만들고, Query2로 그 테이블에서 데이터를 출력
- 재귀적 CTE : 자기 자신을 반복적으로 호출
저번부터 여기까지가 대충 기본 SELECT 구문
- VIEW
실제 테이블은 없지만, 논리적 테이블을 만들어 확인할 수 있게 하는 것.
- IDENTITY와 DEFAULT
테이블 생성 시, 특정 속성을 IDENTITY로 지정하면 입력값을 생략 시 DEFAULT 값이 들어간다.
-> id INT IDENTITY : 이렇게 하면 id값을 입력하지 않는 이상 1부터 입력될 것이다.
-> IDENTITY값을 지정하려면 INSERT 앞에 SET IDENTITY_INSERT [TableName] ON을 붙여주고 INSERT문에서 작성하면 된다.
-> INSERT INTO [TableName] 다음에 ( )로 속성들을 명시해줘야 한다.
-> nation NCHAR(3) DEFAULT '대한민국' : nation을 DEFAULT로 입력하면 '대한민국'이 입력된다.
SEQUENCE는 넘어감
* 테이블의 상세 정보를 보려면 : EXECUTE sp_help [TableName];
① INSERT INTO [TableName1]
SELECT [속성 1], [속성 2]...
FROM [TableName2];
-> TableName2에서 속성들을 뽑아 바로 TableName1에 삽입
-> 테이블을 만드는 과정이 선행되어야 한다.
② SELECT [속성 1], [속성 2]...
INTO [TableName1]
FROM [TableName2];
-> 위 구문처럼 TableName2에서 속성들을 뽑아 TableName1에 삽입
-> 테이블 만드는 선행과정 없이 바로 삽입 가능.
UPDATE, DELETE 구문은 간단히 하고 넘어갔다.
- MERGE : 조건부 데이터 변경
-> 직접적으로 기존 테이블에 조작을 가하면 안 될 경우
-> 데이터의 변동이 생긴다면 변경 테이블에 INSERT 구문으로 변경 사항을 입력
-> 변경 테이블에 쌓인 내용을 MERGE 구문을 사용해서 기존 테이블에 병합
구문 예시)
MERGE memberTBL AS M
USING changeTBL AS C
ON M.userID = C.userID
WHEN NOT MATCHED AND changeType = '신규가입' THEN
INSERT (userID, name, addr)
VALUES(C.userID, C.name, C.addr)
WHEN MATCHED AND changeType = '주소변경' THEN
UPDATE SET M.addr = C.addr
WHEN MATCHED AND changeType = '회원 탈퇴' THEN
DELETE ;
* SQL 실행 도중 입력한 한글이???로 나오는 경우가 있었는데, 앞에 N을 붙으면 해결된다.
-> 예시 : INSERT INTO changeTBL VALUES (N'신규가입', 'CHO', N'초아', N'미국');
-> Windows SQL Server 실습 도중 좀 오락가락했다. 원래는 없어도 괜찮다는데, 가끔 한글이???로 뜨더라.
영문자 1바이트, 한글 2바이트
형 변환 함수 : CAST(), CONVERT() 등
명시적 형 변환 : 형 변환 함수(CAST/CONVERT)를 사용해서 형을 변환하는 것.
암시적 형 변환 : 형 변환 함수를 사용하지 않고 내부에서 자동으로 형이 변환되는 것
-> '100'를 변수에 담아서 '200' / 200 / 200.0과 더해보면 암시적 형 변환을 볼 수 있다.
-> 의도치 않은 엉뚱한 결과가 나올 수 있으니 주의
영어 외의 다른 문자들은 유니코드 데이터 : NCHAR, NVARCHAR, NTEXT 등의 데이터 형식 사용.
-> 입력 시에는 N'문자열' 형식으로 사용하는 것을 권장.
테이블에서 뽑은 데이터를 사용하려면 변수에 담아서 사용해야 한다.
-> DECLARE @[변수명] [데이터 형식] : 변수 선언
-> SET @[변수명] = 변수 값 : 변수에 값 대입
-> SQL문 실행 후 변수는 사라진다. 쓸 때마다 선언해줘야 함.
SQL Sever에서 기본 제공되는 함수
-> 행 집합 함수, 집계 함수, 순위 함수, 스칼라 함수로 분류
-> 기억할만한 함수는 * 표시
- 구성 함수
@@LANGID
@@LANGUAGE
@@SEVERNAME
@@SEVICENAME
@@VERSION
- 날짜 및 시간 함수
*SYSDATETIME()
*GETDATE()
DATEADD(day,100, '2019/12/02')
DATEDIFF(day, GETDATE(), '2020/03/11')
DATENAME(weekday, '2027/10/19');
DAY('2022/10/19')
MONTH('2022/10/19')
YEAR('2022/10/19')
- 논리 함수
CHOOSE() : 여러 값 중에서 지정된 위치의 값을 반환
-> SELECT CHOOSE(2, 'SQL', 'Sever', '2016', 'DVD');
IIF() : 수식이 참일 때, 거짓일 때 사용
-> SELECT IIF( 100 > 200, '맞다', '틀리다');
- 수치 연산 함수
ABS() : 수식의 절댓값 반환
-> SELECT ABS(-100) ;
ROUND() : 자릿을 올려서 반환
-> SELECT ROUND(1234.5678, 2);
*RAND() : 0~1까지의 임의의 숫자를 반환
SQRT() : 제곱근 값을 반환
-> SELECT SQRT(10) ;
POWER() : 거듭제곱 값을 반환
-> SELECT POWER(3,2);
- 문자열 함수
ASCII('A') : '문자'를 코드 변환
CHAR(65) : 코드를 '문자'로 변환
CONCAT() : 둘 이상의 문자열을 연결
-> SELECT CONCAT('SQL', 'Server', '2016');
-> SELECT 'SQL' + 'Sever' + '2016' ;
CHARINEDX() : 문자열의 시작 위치를 반환
-> SELECT CHARINDEX('Server', 'SQL Server 2016')
LEFT() : 왼쪽으로 지정한 수만큼을 반환
RIGHT() : 오른쪽으로 지정한 수만큼을 반환
-> SELECT LEFT('SQL Server 2016', 3);
-> SELECT RIGHT('SQL Server 2016', 4);
*SUBSTRING() : 지정한 위치부터 지정한 개수의 문자를 반환
-> SELECT SUBSTRING(N'대한민국 만세', 3,2);
*LEN() : 문자열의 길이를 반환
-> SELECT LEN('SQL Server 2016');
*LOWER() : 대문자를 소문자로 변환
-> SELECT LOWER('abcdEFGH');
*UPPER() : 소문자를 대문자로 변환
-> SELECT UPPER('abcdEFGH');
*LTRIM() : 왼쪽 공백 문자 제거
-> SELECT LTRIM(' 공백 앞뒤 두 개 ');
*RTRIM() : 오른쪽 공백 문자 제거
-> SELECT RTRIM(' 공백 앞뒤 두 개 ');
*REPLACE() : 문자열의 내용을 지정한 것으로 찾아서 바꿈.
-> SELECT REPLACE ('SQL Server 2016', 'Server', '서버');
*REPLICATE() : 문자열을 지정한 수만큼 반복
-> SELECT REPLICATE('SQL',5);
*REVERSE() : 문자열의 순서를 거꾸로 만든다.
-> SELECT REVERSE('SQL Server 2016') l
*STUFF() : 문자를 지정한 위치의 개수만큼 삭제한 후에 새로운 문자를 끼워 넣는다.
-> SELECT STUFF('SQL Server 2016', 5, 6, '서버');
- 순위 함수
RANK()
NTILE()
DENSE_RANK()
ROW_NUMBER()
[순위 함수 이름]() OVER ( [PARTITION BY <PARTITION_LIST>] ORDER BY <order_by_list>)
- JOIN : 2개 이상의 테이블을 서로 묶어서 하나의 결과 집합으로 만들어 내는 것.
① INNER JOIN
-> 기본적인 조인. 기준 테이블과 조인 테이블 모두 데이터가 존재해야 조회된다.
-> 예시
SELECT <열 목록>
FROM <첫 번째 테이블>
INNER JOIN <두 번째 테이블>
ON <조인될 조건>
[WHERE 검색조건]
② OUTER JOIN
-> 기준 테이블에만 데이터가 있어도 조회 가능
-> 예시
SELECT <열 목록>
FROM [TableName1]
[LEFT | RIGHT | FULL] OUTER JOIN [TableName2]
ON <조인될 조건>
[WHERE 검색조건]
-> LEFT/RIGHT는 기준 테이블을 가리킨다. LEFT면 좌측에 있는 TableName1이 기준 테이블이고, RIGHT면 반대.
-> FULL은 전부 다 표시
1. (SELECT 구문 1) UNION [ALL] (SQL 구문 2)
-> 우선 구문 1, 2의 결과로 반환되는 열의 수가 같아야 한다.
-> 두 쿼리의 결과를 행으로 합친다. ALL을 작성하면 중복을 허용한다. 기본값이 DISTINCT인 것.
2. (SELECT 구문 1) EXCEPT (SQL 구문 2)
-> 구문 1의 결과에서 구문 2의 결과를 제외하고 반환
3. (SELECT 구문 1) INTERSECT (SQL 구문 2)
-> 구문 2의 결과에서 구문 1의 결과를 제외하고 반환
쓸 일이 있을지는 모르겠지만, 재귀적 CTE는 다시 봐야겠다.
4교시 후반 데이터 형식 설명 다시 듣기
SQL 남은 내용은 대략 수요일 오전까지 끝낼 예정. 프로그래밍 부분은 넘어간다.
수요일(18일) 오후부터 그다음 월요일(23일)까지 AD(Active Directory) 진도를 나갈 예정.
9월 중순까지 리눅스를 끝내고, 그 이후에는 Ansible 진도를 나가고 그다음은 파이썬, 그다음은 VPC.
'교육' 카테고리의 다른 글
[20일 차] 21.08.17 : Windows Server 9 (0) | 2021.08.17 |
---|---|
[복습] 3~4주차 복습 (0) | 2021.08.16 |
[18일 차] 21.08.12 : Windows Server 7 (0) | 2021.08.12 |
[17일 차] 21.08.11 : Windows Server 6 (0) | 2021.08.11 |
[16일 차] 21.08.10 : Windows Server 5 (0) | 2021.08.10 |
댓글