SQL 문법 요약 및 작성 특징
SELECT     [DISTINCT] 열 이름 [or 별칭(alias)]
FROM       테이블 이름
[WHERE     조건식]
[ORDER BY  열 이름 [ASC or DESC]];
-- GROUP BY와 HAVING에 대해서는 다음에 설명하도록 하겠습니다.
-- 이런게 있구나 정도로만 보시면 됩니다.
SELECT 그룹화할 열 이름1, 집계 함수
FROM 테이블명
WHERE 조건절
GROUP BY 열 이름1
HAVING 집계 함수 조건
ORDER BY 열 이름;※참고
- SQL은 소문자와 대문자를 구분하지 않는다.
 SELECT를 select라고 입력해도 결과값은 차이가 없다. 하지만 복잡한 SQL문장을 작성할 때 보기 쉽게 표현하기 위해 SELECT같은 키워드,명령어는 대문자로 입력하고 열 이름 혹은 테이블은 소문자로 입력하기도 한다.
- SQL은 공백을 무시한다.
 SQL문장은 한 줄로 길게 작성할 수도 여러 줄로 나눠서 작성할 수도 있다. 복잡한 SQL 문장을 작성할 경우에는 여러 줄로 나눠서 쿼리문을 작성한다.
- SQL의 키워드를 열 이름으로 바로 사용하면 에러가 발생한다.
 SQL언어의 예를 들어 SELECT나 FROM같은 키워드를 열 이름으로 바로 사용하면 에러가 발생한다. 물론 키워드를 열 이름으로 사용하는 것이 물리적으로 불가능한 것은 아니지만, 키워드를 열 이름으로 지정하는 것은 좋은 방법이 아니다.
- SQL 문장은 세미콜론(;)을 사용하여 종결한다.
 대다수 DBMS에서 세미콜론을 사용하여 문장의 끝을 표현한다.
데이터 조회: SELECT
1.지정한 열이 한 개일 경우
SELECT   열이름   FROM   테이블명;
2.지정한 열이 두 개 이상일 경우
SELECT   열이름1, 열이름2, 열이름3   FROM   테이블명;3.모든 열 가져오기
SELECT   *   FROM   테이블명;
데이터 정렬: ORDER BY
- 특정 테이블에서 특정 열을 기준으로 정렬할 때는 ORDER BY절을 이용합니다.
- ORDER BY는 기본적으로 오름차순(ASC)으로 정렬됩니다. 때문에 아래처럼 ASC를 명시하지 않아도 자동으로 오름차순으로 정렬됩니다.
SELECT 열이름1, 열이름2 FROM 테이블명 ORDER BY 열이름1내림차순 정렬
내림차순으로 정렬하기 위해선 ORDER BY에 지정된 열이름 뒤에 `DESC`를 작성하면 됩니다.
SELECT 열이름1, 열이름2 FROM 테이블명 ORDER BY 열이름1 DESC다중 조건 정렬
만약 특정한 열은 오름차순으로 정렬하고 다른 열을 내림차순으로 정렬하고 싶다면 `우선순위`를 고려하여 높은 순대로 앞에 지정해주면 됩니다.
SELECT 열이름1, 열이름2, 열이름3 FROM customer ORDER BY 열이름1 DESC, 열이름2;
-- 또는
SELECT 열이름1, 열이름2, 열이름3 FROM customer ORDER BY 열이름1 DESC, 열이름2 ASC;열 위치로 정렬하기
SELECT 열이름1, 열이름2, 열이름3 FROM 테이블명 ORDER BY 열위치;열위치 부분에 숫자를 입력하면 `SELECT 뒤에 지정한 열`들 가운데 해당 위치에 해당하는 열을 기준으로 정렬할 수 있습니다.
SELECT 추가 개념 (DISTINCT, ALLIAS)
만약 데이터를 분석할때 중복되는 동일한 아이디가 여러 개 있다거나 데이터를 가져올 때 특정한 데이터들에게 이름을 주어 표시를 하고 싶거나 해야할 때가 있을 것이다. 이럴 때 쓰는 문법들이 바로 DINSTINCT 와 AS(ALLIAS) 라는 키워드 이다.
1. DISTINCT 키워드 (중복 제거)
1) DISTINCT 뒤에 지정한 열이 한 개일 경우
SELECT    DISTINCT    열이름    FROM    테이블명;2) DISTINCT 뒤에 지정한 열이 여러 개일 경우
SELECT   DISTINCT   열이름1,열이름2    FROM   테이블명;여러 개의 열 이름 앞에 DISTINCT를 적으면 하나의 집합으로 생각하여 이 집합의 중복을 제거한다.
DISTINCT키워드는 집계 함수와 하부 쿼리에서 많이 사용된다.
집계 함수 중 COUNT라는 함수가 있다. COUNT(*)는 NULL값을 포함한 모든 행을 카운트하라는 의미이고, 'COUNT(DISTINCT POSITION)'는 중복을 허용하지 말고 몇 개의 직급이 있는지 카운트하라는 의미이다.
다음은 EMP 테이블에서 직급 부분만 나타냈다고 할때 예시이다.
| POSITION | 
| 대리 | 
| 과장 | 
| 차장 | 
| 차장 | 
| 부장 | 
| 대리 | 
| 과장 | 
--EX1) 결과 값: 7
SELECT COUNT(POSITION) FROM EMP;
--EX2) 결과 값: 4
SELECT COUNT(DISTINCT POSITION) FROM EMP;
2. AS(ALLIAS, 별칭)
별칭을 사용하면 쿼리를 작성할 때 해당 별칭을 활용할 수도 있지만, 데이터 결과가 추출될 때도 지정한 별칭으로 열 이름이 출력됩니다.
1) AS 사용하기
- 지정할 별칭은 무조건 한 단어로 적어야합니다.
- 이때 AS는 생략 가능합니다.
SELECT   열이름   AS   새로운 열 이름   FROM   테이블명;2) 인용부호(" ") 사용하기
- 지정할 별칭은 대소문자, 공백, 한글, 특수문자 등의 별칭을 허용합니다.
SELECT   열이름   "새로운 열 이름 "   FROM   테이블명;EX) CUSTOM_INFO 테이블에서 고객이 지불한 값(CUS_PAY)의 10퍼센트가 순이익이라고 하고 이 때 이를 INCOME_AMT라고 한다면 고객별 순이익을 구해보아라.
SELECT ID, CUS_PAY * 0.1 AS INCOME_AMT FROM CUSTOM_INFO;
WHERE 조건절
숫자 데이터 조건
SELECT    열이름1,열이름2    FROM    테이블명     WHERE    비교할 열 이름=숫자;문자/날짜 데이터 조건
SELECT    열이름1,열이름2    FROM    테이블명     WHERE    비교할 열 이름='문자';--날짜 '2013-055-31' 고객을 추출
SELECT * FROM  CUSTOM_INFO WHERE CUS_DT='20130531';
--지불한 금액이 1000000 이상인 고객 정보
SELECT * FROM CUSTOM_INFO WHERE CUS_PAY>=1000000;
--가입 날짜 2018년 5월 1일 이후인 고객의 아이디와 이름을 추출하고 고객번호는 오름차순으로 정렬
SELECT ID, NAME FROM CUSTOM_INFO WHERE CUS_DT>='20180501' ORDER BY ID;
비교/논리 연산자

IN 연산자
SELECT 열이름 FROM 테이블명 WHERE 비교할열이름 IN (조건1, 조건2);IN연산자는 여러 번 사용하는 OR연산자를 하나로 묶은 것이라고 생각하면 이해하기 쉽다.
또 추가로 리스트 형식이라 생각해도 이해하기 쉽다.
SELECT * FROM CUSTOM_INFO WHERE CUS_NO='789' OR CUST_NO='614';
SELECT * FROM CUSTOM_INFO WHERE CUS_NO IN ('789', '614');
IN 연산자는 OR연산자보다 처리 속도가 빠르다.
IN 연산자 안에 다른 SELECT 문장을 사용할 수 있다.
NOT IN 연산자
SELECT 열이름 FROM 테이블명 WHERE 비교할열이름 NOT IN (조건1, 조건2);NOT IN 연산자는 특정 테이블로부터 특정한 조건들 안에 속하지 않는 모든 데이터를 추출하여 나타내라는 뜻이다.
그냥 IN연산자를 부정하는 계산이라 생각하면 쉽다.
-- CUSTOM_INFO 테이블에서 지불액이 50만원이상 100만원 이하인 고객의 ID
SELECT ID FROM CUSTOM_INFO WHERE 500000 < = CUS_PAY <= 1000000;
SELECT ID FROM CUSTOM_INFO WHERE CUS_PAY BETWEEN 500000 AND 1000000;
SELECT ID FROM CUSTOM_INFO WHERE 500000 <= CUS_PAY AND CUS_PAY <= 1000000;
-- 학생 테이블에서 취미가 없는 학생들의 학번과 이름을 추출
SELECT ID, NAME FROM STUDENT_INFO WHERE HOBBY IS NULL;해지일이 없으면 계약이 아직 유효하다 볼 수 있기 때문에 CNCL_DT가 NULL인 조건식을 달면 된다.
이때, NULL 값인 행을 찾을 때 IS NULL을 사용해야지 = NULL 이렇게 사용하면 에러가 발생한다.
산술 연산자
SELECT문에서 사용
SELECT 열이름1,열이름2   산술연산자   열이름3   AS   새로운이름   FROM   테이블명;
SELECT snack, fruit + meat AS meal FROM MARKETWHERE조건절에서 사용
SELECT   열이름   FROM   테이블명   WHERE   (열이름1   산술연산자   열이름2)   비교연산자   비교할대상;
SELECT * FROM SCHOOL_INFO WHERE (male + teacher) < femaleNULL값의 처리
COALESCE (EXPRESSION 1, EXPRESSION 2, ... , EXPRESIION N)NULL값을 다른 값으로 치환할 때 COALESCE 함수가 많이 사용된다.
이 함수는 문법에서 정의된 열 중 NULL이 아닌 첫 번째 값을 화면에 출력하는 역할을 한다.
이 함수는 NULL값을 제외한 가장 왼쪽에 남는 값이라고 생각하면 이해하기 쉽다.
COALESCE('A' , 'B' )   ->   'A'
COALESCE(NULL , 'B' , 'C')  ->  'B'
COALESCE(NULL , NULL , 'C')  ->  'C'
COALESCE(NULL, 'B' , NULL)  ->  'B'
DBMS마다 지원 여부의 차이가 있지만 NULL값을 처리할 수 있는 함수는 다음과 같다.
| ZEROIFNULL(열 이름) | 해당 여러 NULL값이 포함되면 숫자 0으로 바꾸는 함수이다. | 
| NVL2(열 이름, 표현식1, 표현식2) | 해당 열이 NULL이면 '표현식 2'의 값을 나타내고, NULL이 아니면 '표현식 1'의 값을 나타낸다. | 
ex) 테이블을 보고 총 카드사용금액을 나타내시오. 단, 금액이 큰 순서대로 나타내시오.
| ID | PARTY_NAME | SEG (등급) | PIF_AMT(일시불) | INST_AMT(할부) | OVRS_AMT(해외) | CASH_AMT(현금) | 
| 2356 | 이선우 | PB | 1,234,041 | 1,301,710 | ||
| 4570 | 홍지은 | MASS | 524,560 | |||
| 4536 | 윤일상 | MASS | 213,570 | 3,700,000 | 
위 테이블은 CARD_TRAN이라 하며 기본 키는 ID 이다.
SELECT ID, PART_NAME,
          (COALESCE(PIF_AMT, 0) + (COALESCE(INST_AMT, 0) +
          (COALESCE(OVRS_AMT,0) + (COALESCE(CASH_AMT, 0) AS TOTAL_AMT
FROM CARD_TRAN
ORDER BY 3 DESC;
NULL은 '숫자 0'이나 '공백'과는 다른 개념이다. NULL갑을 포함한 사칙연산은 NULL값만 반환되기 때문에 COALESCE를 사용하여 NULL값을 처리한다.
※ORACLE인 경우
ORACLE에서 NVL 과 NVL2
NVL (열 이름, 치환 값) // 열 이름1의 데이터 값이 NULL이면 치환 값으로 치환한다.
//열 이름: NULL이 포함된 열이나 표현값 //치환 값: NULL에서 변환하고자 하는 값
NVL2 (열 이름1, 열 이름2, 열 이름3) // 열 이름1이 NULL이 아니면 열 이름2를 출력
// 열 이름1이 NULL이면 열 이름3을 출력
문자열 검색: `LIKE`와 `언더스코어( _ )`
-- 찾고싶은문자로 시작하는 경우
SELECT    열이름    FROM    테이블명    WHERE    열이름    LIKE    '찾고싶은문자%';
-- 찾고싶은문자로 끝나는 경우
SELECT    열이름    FROM    테이블명    WHERE    열이름    LIKE    '%찾고싶은문자';
-- 찾고싶은 문자가 포함된 경우
SELECT    열이름    FROM    테이블명    WHERE    열이름    LIKE    '%찾고싶은문자%';
-- 글자 수 지정
SELECT    열이름    FROM    테이블명    WHERE    열이름    LIKE    '찾고싶은문자_';
SELECT    열이름    FROM    테이블명    WHERE    열이름    LIKE    '_찾고싶은문자';
SELECT    열이름    FROM    테이블명    WHERE    열이름    LIKE    '_찾고_싶은__문자___';
-- 시작과 끝 문자만 아는 경우
SELECT    열이름    FROM    테이블명    WHERE    열이름    LIKE    '첫 글자%마지막 글자';
-- 특정 단어를 원하지 않는 경우
SELECT    열이름    FROM    테이블명    WHERE    열이름    NOT    LIKE    '%찾고싶지않은문자%';필드 결합하기: 연결 연산자 ||
여러 열을 결합해서 하나의 열에 표현하고 싶을 때 결합 연산자 '||'를 사용한다.
1.여러 열을 하나로 결합
SELECT    열이름1   ||   열이름2     FROM    테이블명;
2.문자 삽입하기
열과 열을 결합할 때 문구를 추가하고 싶다면 작은 따옴표를 사용하면 된다.
SELECT    열이름1   ||'삽입하고 싶은 문자열'||    열이름2     FROM    테이블명;
※`SELECT문`에 결합연산자 '||' 또는 '+'가 사용, DBMS마다 지원되는 기호가 다르지만 보통 '||'를 사용
-- CUSTOMERS 테이블을 사용하여 도시(나라)로 표현되도록 필드를 결합하고 ADDR이라는 별칭을 주시오
SELECT ID, NAME, CITY||'('||COUNTRY||')' AS ADDR FROM CUSTOMERS;
SELECT ID, NAME, CITY+'('+COUNTRY+')' AS ADDR FROM CUSTOMERS;공백 제거하기
- 오른쪽 공백 제거하기: RTRIM
- 왼쪽 공백 제거하기: LTRIM
- 모든 공백 제거하기: TRIM
-- CUSTOMERS 테이블을 사용하여 도시(나라)로 표현되도록 필드를 결합하고 ADDR이라는 별칭 주기
-- 단, 나라에 공백이 없도록 표현하자
SELECT ID,NAME,CITY||'('||TRIM(COUNTRY)||')' AS ADDR FROM CUSTOMERS
다음은 문자, 숫자, 날짜, COUNT, CASE WHEN, 데이터의 그룹화에 대한 설명을 하도록 하겠습니다. 다음 포스팅은 아래를 따라가시면 됩니다.
https://yeo-computerclass.tistory.com/40?category=1221897
[SQL]문자, 숫자, 날짜, COUNT, CASE WHEN, 데이터의 그룹화
SELECT 그룹화할 열 이름1, 집계 함수 FROM 테이블명 WHERE 조건절 GROUP BY 열 이름1 HAVING 집계 함수 조건 ORDER BY 열 이름; -- '특정한 테이블에서 특정한 조건을 만족하는 데이터를 추출한 후 특정한 조
yeo-computerclass.tistory.com
 
				