Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Ga0's

SQL 기본(2) 본문

Study IT/SQLD

SQL 기본(2)

Ga0Kwon 2024. 1. 13. 18:33

● 연산자의 종류

구분 연산자 연산자의 의미
비교연산자 = 같다
> 보다 크다
>= 보다 크거나 같다
< 보다 작다
<= 보다 작거나 같다
SQL 연산자 BETWEEN A AND B A와 B 사이에 있는 값
IN (list) list에 존재하는 값(하나라도 일치하면 OK)
LIKE '비교문자열' 비교문자열거ㅏ 형태 일치(&, _ 사용)
IS NULL NULL 값인 경우
논리 연산자 AND 앞에 오는 조건과 뒤에 오는 조건이 모두 TRUE여야 만족
OR 앞에 오는 조건이나 뒤에 오는 조건 중 하나만 TRUE면 만족
NOT 뒤에 오는 조건의 반대되는 결과
부정 비교 연산자 != 같지 않다.
^= 같지 않다.
<> 같지 않다.(모든 운영체제에서 사용 가능)
NOT 컬럼명 =  ~와 같지 않다
NOT 컬렴명 >  ~보다 크지 않다
부정 SQL 연산자 NOT BETWEEN A AND B A와 B의 값 사이에 있지 않음
NOT IN (list) list에 존재하지 않는 값
IS NOT NULL NULL값이 아님

 

● SQL 내장 함수 

  ○ 설명

    - 함수는 벤더에서 제공하는 함수인 내장함수사용자가 정의할 수 있는 함수로 나뉜다.

    - 함수의 입력 행수에 따라 단일행 함수다중행 함수로 구분된다.

    - 단일행 함수SELECT, WHERE, ORDER BY, UPDATE, SET절에 사용이 가능하다.

    - 다중행 함수SELECT, HAVING, GROUP BY절에 사용 가능하다.

    - 1:M관계의 두 테이블을 조인을 하더라도 M쪽에 출력된 행이 하나씩 단일행 함수의 입력값으로 사용하므로 사용할 수 있다.

    - 다중행 함수도 단일행 함수와 동일하게 단일 값만을 반환한다.

 

  ○ 단일행 함수

 

     1. 문자형 함수

LOWER(문자열) 문자열을 소문자로 변환
UPPER(문자열) 문자열을 대문자로 변환
INITCAP(문자열) 문자열의 첫 문자를 대문자로 변환
ASCII(문자) 문자를 아스키 코드로 변환
CHR(아스키 코드) 아스키 코드를 문자로 변환 (=> SQL Server에서는 CHAR()를 사용)
CONCAT(문자열1, 문자열2) 문자열1과 문자열2를 연결. '문자열1' | | '문자열2'와 같음.
SUBSTR(문자열, 시작위치[, 길이]) 문자열의 시작위치에서 길이만큼 반환하며, 길이를 생략하면 마지막 문자열까지 반환
시작위치를 음수로 입력하면 오른쪽 방향으로 계산하여 출력 (=>SQL Server에서는 SUBSTRING()을 사용)
LENGTH(문자열) 문자열의 길이를 출력. 바이트를 반환하려면 LENGTHB()를 사용하며, SQL Server에서는 LEN()을 사용
LTRIM(문자열[, 지정문자]) 문자열의 왼쪽에서 연속되는 지정문자를 제거하며, 지정문자가 생략되면 공백을 제거
RTRIM(문자열[, 지정문자]) 문자열의 오른쪽에서 연속되는 지정문자를 제거하며, 지정문자가 생략되면 공백을 제거
TRIM([LEADING | TRAILING | BOTH]
[지정문자 FROM] 문자열)
문자열의 머릿말, 꼬릿말 또는 양쪽에서 지정문자를 제거하며, 지정문자를 생략하면 공백을 제거
LPAD(문자열, 길이[, 채움문자]) 길이만큼 문자열의 왼쪽에 채움문자를 채우며, 채움문자를 생략하면 공백으로 채움
RPAD(문자열, 길이[, 채움문자]) 길이만큼 문자열의 오른쪽에 채움문자를 채우며, 채움문자를 생략하면 공백으로 채움
REPLACE(문자열, 지정문자열, 변환문자열) 문자열에서 지정문자열을 변환문자열로 변경
TRANSLATE(문자열, 지정문자열, 변환문자열) REPLACE와 유사하며, 지정문자열의 한글자씩 변환문자열에 매핑하여 문자열을 변경

 

     2. 숫자형 함수

ABS(숫자) 숫자의 절대값을 반환
SIGN(숫자) 숫자가 양수이면 1, 음수이면 -1, 0이면 0을 반환
MOD(숫자1, 숫자2) 숫자1을 숫자2로 나눈 나머지를 반환
CEIL(숫자) 숫자의 올림값을 반환
FLOOR(숫자) 숫자의 내림값을 반환
ROUND(숫자[, 소수점자리수]) 숫자를 소수점 자릿수에서 반올림
소수점자리수를 생략하면 기본값으로 0이 적용
TRUNC(숫자[, 소수점자리수]) 숫자의 소수점 자릿수 뒷자리를 버림

   

     3. 날짜형 함수

SYSDATE 현재 날짜와 시간을 반환(=> SQL Server에서는 GETDATE()를 사용)
EXTRACT
(YEAR | MONTH | DAY FROM 날짜)
날짜에서 년(YEAR), 월(MONTH), 일(DAY)을 추출
SQL Server에서는 DATEPART()를 사용

   

     4. 형변환 함수 

TO_NUMBER(문자열) 문자열을 숫자로 변환
TO_CHAR(숫자 | 날짜[, 포맷]) 숫자 또는 날짜를 포맷에 맞는 문자열로 변환
TO_DATE(문자열[, 포맷]) 문자열을 포맷에 맞는 날짜 타입으로 변환

     

     5. NULL 관련 함수

NVL(표현식1, 표현식2) 표현식1이 NULL이면 표현식2를 반환
SQL Server에서는 ISNULL()을 사용
NVL2(표현식1, 표현식2, 표현식3) 표현식1이 NULL이 아니면 표현식2를, NULL이면 표현식3을 반환
IFNULL(표현식1, 표현식2) 표현식1과 표현식2가 같으면 NULL을, 같지않으면 표현식1을 반환
COALESE(표현식1, 표현식2, …) 표현식 중 NULL이 아닌 첫번째 값을 반환

 

 ○ 다중행 함수

COUNT(*) 값을 포함한 컬럼 전체 행의 수를 반환
COUNT(컬럼 | 표현식) 값을 제외한 컬럼이나 표현식에 해당하는 행의 수를 반환
SUM(컬럼 | 표현식) 컬럼이나 표현식에 해당하는 값의 합계를 반환
AVG(컬럼 | 표현식) 컬럼이나 표현식에 해당하는 값의 평균을 반환
MAX(컬럼 | 표현식) 컬럼이나 표현식에 해당하는 값 중 최대값을 반환
MIN(컬럼 | 표현식) 컬럼이나 표현식에 해당하는 값 중 최소값을 반환
STDDEV(컬럼 | 표현식) 컬럼이나 표현식에 해당하는 값들의 표준편차를 반환
VARIANCE(컬럼 | 표현식) 컬럼이나 표현식에 해당하는 값들의 분산을 반환

 

● 문제 풀이 (SQL 내장 함수에 대하여)

  ○ 아래 TAB1 테이블 

ROWNUM C1
1 A
A
2 B
B
B
SELECT SUM(CC)
 FROM (
 	SELECT(LENGTH(C1) - LENGTH(REPLACE(C1, CHR(10))) + 1) CC
 )
 FROM TAB1
 
 
 /*
 - 문제 풀이
 LENGTH(C1) : C1문자열의 길이를 구하세요. 
 	ROWNUM이 1인 C1문자열의 길이는 3 (줄바꿈도 문자 1개로 침)
 	ROWNUM이 2인 C1문자열의 길이는 5
 CHR(10) : 아스키코드 값으로 줄바꿈을 의미
 REPLACE(C1, CHR(10)) : C1의 줄바꿈을 뭐로 바꾸라는 말이 없으므로 ''으로 바꾼다.
    ROWNUM이 1인 C1문자열의 길이는 A  -> AA  : 길이 2
    						  A
 	ROWNUM이 2인 C1문자열의 길이는 B
    						  B  -> BBB : 길이 3
                              B
                              
(LENGTH(C1) - LENGTH(REPLACE(C1, CHR(10)) + 1
	ROWNUM이 1인 C1문자열의 길이는 3 - 2 = 1 + 1 = 2
 	ROWNUM이 2인 C1문자열의 길이는 5 - 3 = 1 + 1 = 3
    
    2 + 3 = 5 가 답이 된다.
 */

 

● ORCALE 날짜 연산

1/24 1시간
1/24/60 1분
1/24/30 2분
1/24/12 5분
1/24/6 10분
1/24/(60/10) 10분

 

● Simple Expression과 SearchedExpression

/* SEARCHED_CASE_EXPRESSION */
SELECT LOC,
  CASE WEHN LOC = 'NEW YORK' TEHN 'EAST'
  ELSE 'ETC'
  END as AREA
 FROM DEPT;
 
 
/* SIMPLE_CASE_EXPRESSION */
SELECT LOC,
  CASE LOC WHEN 'NEW YORK' TEHN 'EAST' -- 상태를 앞으로 가져와 WHEN 뒤의 단어에 비교할 대상의 값을 넣는다.
  ELSE 'ETC'
  END as AREA
 FROM DEPT;

 

● SELECT 문장의 실행 순서

  FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

 

● TOP() 함수 

/* 성적이 상위 5위까지의 학생 출력 */
SELECT TOP(5) WHITH TIES STUDENT, SCORE -- 기준이 되는 값과 순위를 매길 수 있는 값
 FROM SCHOOL_STUDENT
 ORDER BY SOCRE DESC;

 

● 테이블 조인과 관련해서

 - 여러 테이블(N)로부터 원하는 데이터를 조회하기 위해서는 전체 테이블 개수에서 최소 N-1개 만큼의 조인 조건이 필요하다.

 

● 조인(Join)에 대한 설명

  - 일반적으로 Join은 PK와 FK 값의 연관성에 의해 성립 (-> 드시 PK ↔ FK의 관계로만 EQUI JOIN이 성립하는 것 X)

  - DBMS 옵티마이저는 FROM 절에 나열된 테이블이 아무리 많아도 항상 2개의 테이블씩 짝을 이뤄 Join을 수행

  - EQUI Join은 Join에 관여하는 테이블 간의 컬럼 값들이 정확하게 일치하는 경우에 사용되는 방법

  - EQUI Join은 '=' 연산자에 위해서만 수행되면, 그 외의 비교 연산자를 사용하는 경우에는 모두 Non EQUI Join

  - 대부분 Non EQUI Join을 수행할 수 있지만, 때로는 설계상의 이유로 수행이 불가능한 경우도 존재

 

● EQUI Join

   - EQUI Join은 동등 조인, Inner Join의 한 종류

   - 이 조인은 두 테이블 간의 열(Column) 간의 동등한 값에 기반

   - 일반적으로 등호(=)를 사용하여 조인 조건을 표현

   - 결과는 두 테이블 간에 일치하는 값만 반환

SELECT employees.employee_id, employees.employee_name, departments.department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id;

 

NON-EQUI Join

   - NON-EQUI Join은 동등하지 않은 값을 기반으로 두 테이블을 조인, Inner Join의 한 종류

   - 일반적으로 등호(=)가 아닌 비교 연산자(>, <, >=, <=) 등을 사용하여 조인 조건을 정의

   - 이 유형의 조인은 일반적으로 범위나 부등호 기반의 비교를 수행할 때 사용

SELECT orders.order_id, orders.order_date, products.product_name
FROM orders
INNER JOIN products ON orders.product_id > products.product_id;

'Study IT > SQLD' 카테고리의 다른 글

SQL 기본(3)  (0) 2024.01.27
SQL 기본(1)  (3) 2024.01.06
데이터 모델과 성능  (2) 2024.01.04
데이터 모델링의 이해  (1) 2024.01.02
SQLD_분산 데이터베이스와 성능  (0) 2023.05.03