Search
Duplicate
💽

자주 쓰는 SQL명령어 정리

Created time
2023/05/18 01:40
Last edited time
2023/07/11 02:39
Status
Done
tag

들어가기에 앞서

참고한 자료를 바탕으로 비전문가가 정리한 글이므로 오류가 있을 수 있습니다.
오류에 대한 지적 사항은 언제든지 환영합니다. 부디 댓글로 알려주시길 바랍니다. 감사합니다.

SQL과 관계형 데이터베이스

SQL(Structured Query Language)은 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 조작, 쿼리, 정의하기 위해 사용되는 표준화된 프로그래밍 언어이다. SQL은 데이터베이스에 접근하고 조작하는 데 사용되는 명령어와 구문으로 구성된다. 주요 SQL 명령어에는 SELECT, INSERT, UPDATE, DELETE 등이 있으며, 이러한 명령어를 사용하여 데이터의 삽입, 갱신, 삭제, 검색 등을 수행할 수 있다.
관계형 데이터베이스는 테이블 형태로 데이터를 구성하며, 여러 테이블 간의 관계를 설정하여 데이터를 조작한다. 각 테이블은 행(row)과 열(column)로 구성되며, 행은 개별 데이터 레코드를 나타내고, 열은 데이터의 속성을 나타냅니다. 테이블 간의 관계는 기본 키(primary key)와 외래 키(foreign key)를 사용하여 정의됩니다. 기본 키는 각 행을 고유하게 식별하는 열이며, 외래 키는 다른 테이블의 기본 키와 관련된 열이다. 이러한 특징 때문에, 데이터 구조가 어떻게 관련되어 있는지 쉽게 파악하고 이해할 수 있다.

JOIN ON

두 테이블의 칼럼이 기본키 및 외래키 설정되어 있을 때 JOIN키워드 사용가능
외부 조인과 내부 조인이 있음
SELECT A.FLAVOR FROM FIRST_HALF A JOIN ICECREAM_INFO B ON A.FLAVOR = B.FLAVOR WHERE TOTAL_ORDER > 3000 AND INGREDIENT_TYPE = 'fruit_ba // SELECT A.FLAVOR 가 아니라 그냥 FLAVOR를 입력하면 오류발생
SQL
복사

소수점 처리 함수 ROUND,TRUNCATE,FLOOR

ROUND(컬럼): 소수점 첫째 자리에서 반올림 113.6 → 114
ROUND(컬럼,1): 출력할 소수점 자리에서 반올림 123.57→ 123.6
TRUNCATE(컬럼, 1): 출력할 소수점 자리에서 버림 123.57 → 123.5
FLOOR(컬럼): 소수점 아래 버림

CASE WHEN THEN ELSE END

MySQL에서 특정 검색 값을 변경해서 출력하고 싶을 때 사용하는 표현식
표현식은 하나이상의 값과 연산자, 함수들이 결합된 식
CASE case_value WHEN when_value THEN statement_list [WHEN when_value THEN statement_list] ... [ELSE statement_list] END CASE SELECT BOARD_ID,WRITER_ID,TITLE,PRICE, CASE WHEN STATUS='SALE' THEN '판매중' WHEN STATUS='RESERVED' THEN '예약중' WHEN STATUS='DONE' THEN '거래완료' END STATUS FROM USED_GOODS_BOARD WHERE CREATED_DATE = '2022-10-05' ORDER BY BOARD_ID DESC
SQL
복사

WHERE 조건문

WHERE 조건에는 최대한 구체적으로 작성해야 함
SELECT NAME FROM ANIMAL WHERE MAX(DATETIME) // 옳지 않은 문법 SELECT NAME FROM ANIMAL WHERE DATETIME = (SELECT MAX(DATETIME) FROM ANIMAL)
SQL
복사
IS NULL, IS NOT NULL
SELECT NAME FROM DOG WHERE IS NOT NULL // NULL 값이 아닌 개의 이름 검색 *참고* IFNULL을 이용하면 NULL값을 원하는 값으로 치환 가능하다 SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, IFNULL(FREEZER_YN,'N') AS FREEZER_YN FROM FOOD_WAREHOUSE WHERE WAREHOUSE_NAME LIKE "창고_경기%" ORDER BY WAREHOUSE_ID
SQL
복사
BETWEEN A AND B
SELECT MONEY FROM ACCOUNT WHERE MONEY BETWEEN 1000 AND 15000 // 1000<= MONEY <=15000과 동일
SQL
복사

ORDER BY(ORACLE)

다중 정렬을 할 때, 왼쪽에서 부터 순차적으로 조건을 확인하며 정렬
만약 가장 왼쪽 기준의 정렬이 완료 됐을 때 값이 같은 경우, 그 다음 정렬 기준으로 정렬함
SELECT PT_NAME,PT_NO,GEND_CD,AGE,IFNULL(TLNO,'NONE') FROM PATIENT WHERE GEND_CD = 'W' AND AGE<=12 ORDER BY AGE DESC, PT_NAME // 나이가 같은 경우 PT_NAME 칼럼을 기준으로 오름차순 정렬
SQL
복사

ORDER BY (MySQL)

정렬하고자 하는 기준 컬럼의 이름을 써도 되지만, SELECT에서의 인덱스로도 가능하다
SELECT ANIMAL_ID, NAME, DATETIME FROM ANIMAL_INS ORDER BY 2,3 DESC --ORDER BY NAME,DATETIME DESC 와 동일
SQL
복사
LIMIT을 이용해서 가장 최근이나 최초의 값 조회 가능
--가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성 SELECT DATETIME FROM ANIMAL_INS ORDER BY DATETIME DESC LIMIT 1; --LIMIT은 말 그대로 제한을 둠. LIMIT 3 이면 3개의 데이터 보여줌 SELECT DATETIME FROM ANIMAL_INS ORDER BY DATETIME DESC FETCH FIRST 1 ROWS ONLY; --Oracle 에서의 동일한 문장
SQL
복사

COUNT

조건에 맞는 튜플의 개수를 구할 때 쓰는 함수
COUNT(*) -- 조회된 전체행 건수를 반환한다 COUNT(컬럼) -- 컬럼의 값이 NULL인 행은 카운트 하지 않는다 COUNT(DISTINCT 컬럼) -- 컬럼 값을 중복제거하고, 컬럼의 값 건수를 반환한다 SELECT COUNT(USER_ID) AS USERS FROM USER_INFO WHERE AGE IS NULL --이 경우에는 0을 반환함. 카운트함수는 NULL인 행은 카운트하지 않기때문
SQL
복사

LIKE 연산자

SQL 부분문자열 검색 LIKE
2021년에 가입한 회원을 조회할 때 SELECT * FROM USER_INFO WHERE JOINED LIKE '2021%' 으로 작성하면 안 되는 이유
LIKE 연산자는 조건에 맞는 ‘문자열’을 검색하므로 DATE 타입의 레코드는 조회 못 함
MySQL은 DATE_FORMAT, ORACLE은 TO_CHAR을 이용해 특정 날짜 레코드 값 조회
--MySQL SELECT COUNT(USER_ID) AS USERS FROM USER_INFO WHERE (19<AGE AND AGE <30) AND DATE_FORMAT(JOINED,'%Y') = '2021'; --Oracle SELECT COUNT(*) AS USERS FROM USER_INFO WHERE (AGE BETWEEN 20 AND 29) AND TO_CHAR(JOINED,'YYYY') = '2021'
SQL
복사

IFNULL 과 NVL

MySQL에서는 IFNULL함수로 NULL값을 특정 값으로 변환 가능
Oracle에서는 NVL(NULL VALUE) 함수로 NULL값을 특정 값으로 변환 가능
--MySQL SELECT PT_NAME,PT_NO,GEND_CD,AGE,IFNULL(TLNO,'NONE') FROM PATIENT WHERE GEND_CD = 'W' AND AGE<=12 ORDER BY AGE DESC, PT_NAME --Oracle SELECT PT_NAME, PT_NO, GEND_CD, AGE, NVL(TLNO,'NONE') AS TLMNO FROM PATIENT WHERE AGE <=12 AND GEND_CD = 'W' ORDER BY AGE DESC, PT_NAME
SQL
복사

MySQL - HOUR() 함수

HOUR(DATETIME) - HOUR 함수에 날짜를 입력하면 해당 날짜의 시간만 반환
select hour('10:05:03'); => 10
SQL
복사

참고