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 MARKET
WHERE조건절에서 사용
SELECT 열이름 FROM 테이블명 WHERE (열이름1 산술연산자 열이름2) 비교연산자 비교할대상;
SELECT * FROM SCHOOL_INFO WHERE (male + teacher) < female
NULL값의 처리
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
'DBMS > SQL, RDBMS' 카테고리의 다른 글
[SQL]DML(데이터 삽입 & 수정 & 삭제) (0) | 2021.08.11 |
---|---|
SQL 하위 쿼리(Sub-query) (0) | 2021.08.10 |
SQL 테이블 합치기 (조인과 집합) (0) | 2021.08.10 |
SQL 문자, 숫자, 날짜, COUNT, CASE WHEN, 데이터의 그룹화 (0) | 2021.08.10 |
SQL 데이터베이스(DB), SQL이란? (0) | 2021.08.09 |