반응형
여승철
INTP 개발자
여승철
  • 분류 전체보기 (376)
    • CS (16)
      • 면접 준비 (7)
      • 운영체제 (0)
      • 네트워크 (2)
      • HTTP (6)
      • 스프링(Spring) IoC 컨테이너 (0)
      • 알고리즘 (1)
    • Web (13)
    • AWS (6)
    • Java (43)
    • JSP & Servlet (65)
      • 개념 (42)
      • 실습 (23)
    • Spring Framework (33)
    • Spring Boot (10)
    • Spring Data (22)
      • JPA (14)
      • Query DSL (7)
      • Redis (1)
    • Spring Security (9)
    • Spring Batch (4)
    • MyBatis (10)
    • Front-End (51)
      • JS (27)
      • Vue.js (17)
      • React (5)
      • JQuery (0)
      • d3.js (2)
    • DBMS (24)
      • SQL, RDBMS (16)
      • MongoDB (5)
      • Redis (3)
    • Kafka (3)
    • 리눅스 (Linux) (4)
    • 디자인 패턴 (3)
    • VCS (8)
    • API (0)
    • TOOL (3)
    • Reading Book (28)
      • 이펙티브 자바 (11)
      • Clean Code (10)
      • 1분 설명력 (4)
      • HOW TO 맥킨지 문제해결의 기술 (3)
    • C# (4)
    • NSIS (6)
    • ETC (11)

블로그 메뉴

  • 홈
  • 태그

인기 글

태그

  • 회원 관리
  • 스트림
  • jsp
  • 게시판
  • JSTL
  • 로그인
  • Spring Batch
  • mybatis
  • 디자인 패턴
  • HTTP
  • EC2
  • ubuntu
  • querydsl
  • Dao
  • servlet
  • JDBC
  • 이펙티브 자바
  • 맥킨지
  • controller
  • 환경 세팅

최근 댓글

최근 글

hELLO· Designed By 정상우.
여승철

INTP 개발자

SQL SELECT, WHERE, ORDER BY, IN, LIKE, TRIM
DBMS/SQL, RDBMS

SQL SELECT, WHERE, ORDER BY, IN, LIKE, TRIM

2021. 8. 9. 18:30
반응형

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 열 이름;

※참고

  1. SQL은 소문자와 대문자를 구분하지 않는다.
    SELECT를 select라고 입력해도 결과값은 차이가 없다. 하지만 복잡한 SQL문장을 작성할 때 보기 쉽게 표현하기 위해 SELECT같은 키워드,명령어는 대문자로 입력하고 열 이름 혹은 테이블은 소문자로 입력하기도 한다.
  2. SQL은 공백을 무시한다.
    SQL문장은 한 줄로 길게 작성할 수도 여러 줄로 나눠서 작성할 수도 있다. 복잡한 SQL 문장을 작성할 경우에는 여러 줄로 나눠서 쿼리문을 작성한다.
  3. SQL의 키워드를 열 이름으로 바로 사용하면 에러가 발생한다.
    SQL언어의 예를 들어 SELECT나 FROM같은 키워드를 열 이름으로 바로 사용하면 에러가 발생한다. 물론 키워드를 열 이름으로 사용하는 것이 물리적으로 불가능한 것은 아니지만, 키워드를 열 이름으로 지정하는 것은 좋은 방법이 아니다.
  4. 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 

 

[SQL]문자, 숫자, 날짜, COUNT, CASE WHEN, 데이터의 그룹화

SELECT 그룹화할 열 이름1, 집계 함수 FROM 테이블명 WHERE 조건절 GROUP BY 열 이름1 HAVING 집계 함수 조건 ORDER BY 열 이름; -- '특정한 테이블에서 특정한 조건을 만족하는 데이터를 추출한 후 특정한 조

yeo-computerclass.tistory.com

 

반응형

'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
    여승철
    여승철

    티스토리툴바