SQL

SQL 명령어 2

retill28 2024. 8. 8. 22:02

1. IF

- 조건식에 따라 참인 경우 A, 거짓인 경우 B를 출력하는 명령어 . 

- 형식 : IF (조건식, 참일 때의 값, 거짓일 때 값)

- SELECT 절에 사용한다. 

-- speed가 60 이상인 경우 fast, 미만인 경우 slow 
SELECT name, IF(speed >= 60, ‘fast’, ‘slow’) 
FROM carInfo;

 

 

2. IFNULL 

- 데이터가 NULL일 때 새로운 값을 반환하는 함수 

- 형식 : IFNULL ( 컬럼명 , NULL 일 때 값 ) 

- 주로 SELECT 절에서 사용한다. 

 SELECT name, IFNULL(speed, ‘unknown’)
 FROM carInfo;

 

 

3. CASE 

- 조건을 여러개 만들 때 사용하는 명령어 

- 주로 SELECT 절에서 사용한다. 

- ELSE 문장을 생략하면 NULL 값을 반환한다. 

- 형식 :

  1. CASE 컬럼명
  2.         WHEN 조건식 1 THEN 결과값1 
  3.         WHEN 조건식 2 THEN 결과값2
  4.         ELSE 결과값 3 
  5. END 
 SELECT name,
 CASE
 	WHEN speed >= 100 THEN ‘very fast’
 	WHEN speed >= 60 THEN ‘fast’
	ELSE ‘slow’
 END AS speed_class
 FROM carInfo;

 

 

4. 함수 만들기 

- 원하는 기능을 하는 함수를 직접 만들 수 있다. 

- 형식 (함수 만들기)

CREATE FUNCTION
	함수이름 ( 입력값이름 데이터타입, 입력값이름2 데이터타입2, ...)	-- 입력 변수 지정  
RETURNS
 	결과값 데이터타입	--출력 변수 지정 
BEGIN
	DECLARE 임시값이름 데이터타입;  -- 함수 내에서 쓸 임시 변수 선언 
	SET 임시값이름 = 입력값이름; 	 -- 선언한 변수에 입력변수 지정  
	쿼리;					-- 실제 함수 기능
	RETURN 결과값			-- 출력값 리턴, 여기는 S를 붙이지 않는다. 
END

 

- 형식 ( 함수 지우기) 

DROP FUNCTION 함수이름;

 

- MySQL Workbench에서 함수 생성하기 

SET GLOBAL log_bin_trust_function_creators = 1;		-- 함수 만들기 권한 설정
DELIMITER		-- 함수 시작부분 지정 
 (함수 만들기 코드)
DELIMITER ;		-- 함수 끝 부분 지정, 반드시 R과 ; 사이 한칸 띄우기

 

 

 

 


 

 

 

 

내가 원하는 데이터가 서로 다른 테이블에 있다면?

그 테이블들을 엮어 하나로 합쳐서 조회한다. 

테이블을 합칠 때엔 두개의 테이블의 컬럼중 같은 의미의 값을 가지는 컬럼이 있어야 한다. 

같은 의미의 값을 가지는 컬럼을 기준으로 테이블을 합친다. 

합칠 때 사용하는 명령어는 JOIN 이다. 

JOIN의 종류는 다음과 같다 

 

 

1. INNER JOIN 

- 두 테이블 모두에 있는 값만 합친다. 

- JOIN의 기본값이 INNER이므로 그냥 JOIN만 써도 상관없다.

- 형식 

SELECT * FROM carInfo C
INNER JOIN abilityInfo A
ON A.car_id = C.car_id;

 

 

2. RIGHT, LEFT

- 두 테이블 중 한쪽값을 기준으로 테이블을 합체 

- RIGHT는 오른쪽 테이블의 기준값을 중심으로 왼쪽 테이블에 존재하는 로우들만 가지고 온다. 

- 예를 들어 id가 5인 로우가 오른쪽 테이블에 있고 왼쪽 테이블에는 없다면, 왼쪽 테이블에서 가져올 값들이 없으므로 합체로 인해 새로 늘어난 칼럼들은 NULL로 채운다. 

- 이를 통해 왼쪽이나 오른쪽 테이블 둘중 한군데에만 존재하는 로우가 몇개인지 구할 수 있다. 

SELECT * FROM carInfo C
RIGHT JOIN abilityInfo A
ON A.car_id = C.car_id;

SELECT * FROM carInfo C
LEFT JOIN abilityInfo A
ON A.car_id = C.car_id;

 

 

3. OUTER JOIN 

- 두 테이블에 있는 모든 값을 합친다. 

- LEFT와 RIGHT의 집합 결과는 UNION 하여 중복을 제외하고 합쳐서 보여준다. 

- MySQL에 없는 키워드이므로 아래와 같이 수동적으로 설정한다. 

SELECT * FROM carInfo C
RIGHT JOIN abilityInfo A
ON A.car_id = C.car_id;
UNION
SELECT * FROM carInfo C
LEFT JOIN abilityInfo A
ON A.car_id = C.car_id;

 

 

4. CROSS JOIN 

두 테이블에 있는 모든 값을 각각 합친다. 

왼쪽 테이블 각 로우에 대하여 오른쪽 테이블 모든 로우를 합친다. 

 

 

5. SELF JOIN 

한 테이블을 JOIN 하는 것 

number, name, model 세 컬럼으로 이루어진 carInfo를 SELF JOIN 한다면 

number, name, model, number, name, model 로 이루어진 테이블을 출력한다. 

 

 

 

 


 

 

 

 

join 명령어를 사용하는 외에도 데이터를 합치는 방식이 있다. 

집합의 형식으로, 두개의 쿼리 결과를 합집합, 교집합, 차집합한 결과를 뽑을 수 있다. 

join은 두 테이블을 컬럼을 기준으로 합체하는 것이고,

아래에 서술할 명령어들은 로우를 기준으로 결합한다.

예를 들어, UNION은 같은 합집합 명령어지만, 여러 쿼리 결과를 수직적으로 이어붙인다. 

 

즉 join은 데이터가 여러 테이블에 걸쳐있고, 이 테이블들을 연결하여 관련 데이터를 함께 조회할때, 

union은 동일한 구조의 데이터를 가진 여러 테이블이나 쿼리 결과를 하나의 결과 집합으로 모을 때 사용한다. 

 

 

1. UNION, UNION ALL (합집합)
- 쿼리 A와 쿼리 B의 결과를 합쳐서 보여준다. 

- UNION은 중복을 제외하고, UNION ALL은 중복을 포함해서 보여준다. 

 SELECT name
 FROM myCar
 UNION ALL
 SELECT name
 FROM friendcar;

 

 

2. INTERSECT (교집합)

- MySQL에는 INTERSECT라는 표현이 존재하지 않는다. 

- JOIN을 사용하여 표현한다. 

 SELECT A.name
 FROM mycar AS A
 INNER JOIN friendcar AS B
 ON 
 	A.number = B.number 
    AND A.name = B.name 
    AND A.type = B.type 
    AND A.attack = B.attack 
    AND A.defense = B.defense
    
-- 교집합을 확인하려는 컬럼을 전부 ON뒤의 기준으로 두고 합친다. 
-- 쿼리 결과 중 교집합 부분만 확인할 수 있다.

 

3. MINUS (차집합)

- MySQL에는 INTERSECT라는 표현이 존재하지 않는다. 

- RIGHT, LEFT JOIN을 사용하여 표현한다. 

 SELECT A.name
 FROM mycar AS A
 LEFT JOIN friendcar AS B
 ON 
 	A.number = B.number 
    AND A.name = B.name 
    AND A.type = B.type 
    AND A.attack = B.attack 
    AND A.defense = B.defense
WHERE B.name IS NULL;  -- A에는 있지만 B에는 없는걸로 집합 

-- 차집합을 확인하고 싶은 컬럼을 전부 ON 뒤의 기준으로 두고 합친다.

 

 

 

'SQL' 카테고리의 다른 글

SQL 윈도우 함수  (0) 2024.08.15
SQL 서브쿼리  (0) 2024.08.08
SQL 함수  (0) 2024.08.01
SQL 쿼리 문법  (0) 2024.08.01
SQL 명령어의 종류  (1) 2024.08.01