SELECT NAME
     , OCCUPATION
  FROM OCCUPATIONS

SELECT NAME
     , OCCUPATION
     , ROW_NUMBER() OVER (ORDER BY NAME)
  FROM OCCUPATIONS

SELECT NAME
     , OCCUPATION
     , ROW_NUMBER() OVER (PARTITION BY OCCUPATION ORDER BY NAME)
  FROM OCCUPATIONS

ANIMAL_INS 테이블의 데이터 중 NAME 컬럼 값이 대소문자 구분 없이

'el'을 포함하면서 ANIMAL_TYPE이 'Dog'인 데이터의 ANIMAL_ID와 NAME을 오름차순으로 정렬

 

<MySQL>

UPPER(NAME) : NAME 컬럼 값의 대문자

LOWER(NAME) : NAME 컬럼 값의 소문자

LIKE : 같은지 비교

CONCAT('A', 'B', 'C') : 'A'와 'B'와 'C'를 연결

'%' : 임의의 문자열('_' : 하나의 문자)

SELECT ANIMAL_ID
     , NAME
  FROM ANIMAL_INS
 WHERE UPPER(NAME) LIKE UPPER('%el%')
   AND ANIMAL_TYPE = 'Dog'
ORDER BY NAME
SELECT ANIMAL_ID
     , NAME
  FROM ANIMAL_INS
 WHERE UPPER(NAME) LIKE CONCAT('%', UPPER('el'), '%')
   AND ANIMAL_TYPE = 'Dog'
ORDER BY NAME

<Oracle>

UPPER(NAME) : NAME 컬럼 값의 대문자

LOWER(NAME) : NAME 컬럼 값의 소문자

LIKE : 같은지 비교

'A' || 'B' || 'C' : 'A'와 'B'와 'C'를 연결

'%' : 임의의 문자열('_' : 하나의 문자)

SELECT ANIMAL_ID
     , NAME
  FROM ANIMAL_INS
 WHERE UPPER(NAME) LIKE UPPER('%el%')
   AND ANIMAL_TYPE = 'Dog'
ORDER BY NAME
SELECT ANIMAL_ID
     , NAME
  FROM ANIMAL_INS
 WHERE UPPER(NAME) LIKE '%' || UPPER('el') || '%'
   AND ANIMAL_TYPE = 'Dog'
ORDER BY NAME

'SQL > 참고자료' 카테고리의 다른 글

[SQL] @변수  (0) 2022.11.30
[SQL] ROW_NUMBER()  (0) 2022.11.30
[SQL] 집계 함수를 조건으로 사용  (0) 2022.11.29
[SQL] 멀티 테이블  (0) 2022.11.29
[SQL] MySQL & Oracle  (1) 2022.11.29

COUNT나 MAX와 같은 집계 함수를 조건으로 쓸 경우

'WHERE'절이 아닌

'HAVING'절에 쓴다.

-------------------------------------------------------------------------------------------

EX) (X)

SELECT ID

             , NAME

             , HOST_ID

   FROM PLACES

WHERE HOST_ID IN (

                                      SELECT HOST_ID

                                         FROM PLACES

                                      WHERE COUNT(HOST_ID) > 1

                                GROUP BY HOST_ID

                                     )

ORDER BY ID

-------------------------------------------------------------------------------------------

EX) (O)

SELECT ID

             , NAME

             , HOST_ID

   FROM PLACES

WHERE HOST_ID IN (

                                      SELECT HOST_ID

                                         FROM PLACES

                                 GROUP BY HOST_ID

                                      HAVING COUNT(HOST_ID) > 1

                                    )

ORDER BY ID

-------------------------------------------------------------------------------------------

'SQL > 참고자료' 카테고리의 다른 글

[SQL] ROW_NUMBER()  (0) 2022.11.30
[SQL] 대소문자 구분 없이 특정 문자열 포함하는 데이터 조회  (0) 2022.11.29
[SQL] 멀티 테이블  (0) 2022.11.29
[SQL] MySQL & Oracle  (1) 2022.11.29
[SQL] 빈 값 & NULL 처리  (0) 2022.11.29

★NULL처리★

MySQL : 빈 값과 NULL 구분함

<IF>
IF( expression1, expression2, expression3 )
expression1가 참이면 expression2를, 거짓이면 expression3을 반환합니다.

<IFNULL>
IFNULL( expression1, expression2 )
expression1이 NULL이 아니면 expression1을, NULL이면 expression2를 반환합니다.

<NULLIF>
NULLIF( expression1, expression2 )
expression1과 expression2가 같으면 NULL을, 같지 않으면 expression1를 반환합니다.

SELECT * FROM MEMBER WHERE NAME IS NULL
NAME이 NULL인 경우만 나옴
SELECT * FROM MEMBER WHERE NULLIF(NAME, '') IS NULL
NAME이 NULL과 빈 값인 경우 모두 나옴

Oracle : 빈 값도 NULL로 인식

<IS [NOT] NULL>
expr1 IS [NOT] NULL
테이블에서 expr1 칼럼이 NULL 값이거나 NULL 값이 아닌 행을 반환합니다.

<NVL>
NVL(expr1, expr2)
expr1이 NULL이 아니면 expr1을 반환합니다. expr1이 NULL인 경우 expr2를 반환합니다.

<NVL2>
NVL2(expr1, expr2, expr3)
expr1이 NULL이 아니면 expr2를 반환합니다. expr1이 NULL인 경우 expr3을 반환합니다.

<NULLIF>
NULLIF(expr1, expr2)
NULLIF는 expr1이 expr2와 같으면 NULL을 반환합니다. expr1이 expr2과 다르면, expr1을 반환합니다.

<COALESCE>
COALESCE(expr [, expr ]...)
COALESCE는 목록에 있는 표현식에서 NULL이 아닌 첫 번째 표현식을 반환합니다.

<DECODE>
DECODE(expr1, expr2, expr3, expr4)
expr1이 expr2와 같으면 expr3을, 그 밖의 값이라면 expr4반환
DECODE(expr1, expr2, expr3, expr4, expr5, expr6)
expr1이 expr2와 같으면 expr3을, expr1이 expr4와 같으면 expr5을, 그 밖의 값이라면 expr6반환

<CASE>
CASE NVL(NULL, 'C')
       WHEN 'A' THEN 'A'
       WHEN 'B' THEN 'B'
       WHEN 'C' THEN 'C'
ELSE 'NOT FOUND' END // 'C'
CASE문 표현식에 대해 NVL와 같은 NULL을 체크하는 함수를 이용하여 조건문을 처리할 수 있습니다.

SELECT * FROM MEMBER WHERE NAME IS NULL
NAME이 NULL과 빈 값인 경우 모두 나옴

★조건절★

공통

SELECT * FROM MEMBER WHERE NAME = 'A'
NAME이 'A'인 경우
SELECT * FROM MEMBER WHERE NAME IN ('A', 'B', 'C')
NAME이 'A' 또는 'B' 또는 'C'인 경우
SELECT * FROM MEMBER WHERE NAME != 'A'
NAME이 'A'가 아닌 경우
SELECT * FROM MEMBER WHERE NAME <> 'A'
NAME이 'A'가 아닌 경우
SELECT * FROM MEMBER WHERE NOT NAME = 'A'
NAME이 'A'가 아닌 경우
SELECT * FROM MEMBER WHERE NAME NOT IN ('A', 'B', 'C')
NAME이 'A', 'B', 'C' 모두 아닌 경우

COUNT, MAX와 같은 집계 함수를 조건으로 사용할 경우 WHERE절이 아닌 HAVING절에 사용★

같은 HOST_ID를 가진 데이터끼리 묶고 HOST_ID가 중복(2개 이상)인 HOST_ID 조회
EX) SELECT HOST_ID, COUNT(HOST_ID) FROM PLACES WHERE COUNT(HOST_ID) > 1 GROUP BY HOST_ID ORDER BY HOST_ID (X)
EX) SELECT HOST_ID, COUNT(HOST_ID) FROM PLACES GROUP BY HOST_ID HAVING COUNT(HOST_ID) > 1 ORDER BY HOST_ID (O)


MySQL

SELECT * FROM MEMBER WHERE UPPER(NAME) LIKE CONCAT('%', UPPER('A'), '%')
SELECT * FROM MEMBER WHERE LOWER(NAME) LIKE CONCAT('%', LOWER('A'), '%')
대소문자 구분 없이 NAME이 'A'를 포함하는 경우

SELECT * FROM MEMBER ORDER BY NAME LIMIT 5
MEMBER테이블의 데이터를 NAME 순으로 정렬하고 5개까지만 데이터만 조회


Oracle

SELECT * FROM MEMBER WHERE UPPER(NAME) LIKE '%' || UPPER('A') || '%'
SELECT * FROM MEMBER WHERE LOWER(NAME) LIKE '%' || LOWER('A') || '%'
대소문자 구분 없이 NAME이 'A'를 포함하는 경우

SELECT A.* FROM (SELECT * FROM MEMBER ORDER BY NAME) A WHERE ROWNUM <= 5
MEMBER테이블의 데이터를 NAME 순으로 정렬하고 5개까지만 데이터만 조회
SELECT * FROM MEMBER WHERE ROWNUM <= 5 ORDER BY NAME (잘못된 쿼리) 끝에서부터 5개의 데이터를 조회한 후 NAME순으로 정렬이 됨

★데이터 갯수 제한★

MySQL : 쿼리 마지막에 LIMIT 숫자
Oracle : WHERE절에 ROWNUM <= 숫자

★자르기★

공통

SELECT SUBSTR('내이름은이승엽', 5, 3) AS MY_NAME FROM MEMBER // 5번째 글자부터 3개


MySQL

DATETIME 컬럼의 값이 YYYY-MM-DD HH:MM:SS 형식일 때 바로 SUBSTR 가능


Oracle

DATETIME 컬럼의 값이 YYYY-MM-DD HH:MM:SS 형식일 때
TO_CHAR(DATETIME, 'YYYY-MM-DD HH24:MI:SS'), TO_CHAR(DATETIME, 'HH24:MI:SS') 등의 문자 형태로  꾼 후

SUBSTR 가능하다.

★범위★

공통

SELECT * FROM MEMBER WHERE USER_NO BETWEEN 1 AND 100

★순번 채번★

MySQL

변수 사용
SET @HOUR = -1;
SELECT (@HOUR := @HOUR + 1) AS HOUR, NAME FROM MEMBER WHERE @HOUR < 23

Oracle

계층 쿼리 CONNECT BY LEVEL 사용
SELECT LEVEL-1 AS HOUR FROM DUAL CONNECT BY LEVEL <= 24

★시간★

YYYY-MM-DD hh:mm:ss와 같은 형식으로 반환


MySQL

SELECT NOW() AS '현재 시간'
DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') // 대문자Y 소문자m 소문자d 대문자H 소문자i 소문자s // 0000-00-00 00:00:00

DATE_ADD(NOW(), INTERVAL 1 SECOND) // 1초 후
DATE_SUB(NOW(), INTERVAL 1 SECOND) // 1초 전

(SECOND, MINUTE, HOUR, DAY, MONTH, YEAR)

DATEDIFF(날짜1, 날짜2) // 두 날짜의 차


Oracle

SELECT SYSDATE FROM DUAL // AS 사용 불가
TO_CHAR(SYSDATE, 'YYYY/MM/DD') // 0000/00/00

SYSDATE + INTERVAL '1' SECOND // 1초 후
SYSDATE - INTERVAL '1' SECOND // 1초 전
SYSDATE + 1/(24*60*60) // 1초 후
SYSDATE - 1/(24*60*60) // 1초 전

(SECOND, MINUTE, HOUR, DAY, MONTH, YEAR)

TO_DATE(날짜1) - TO_DATE(날짜2) // 두 날짜의 차

TO_DATE('2020-05-02 20:50:50', 'YYYY-MM-DD HH24:MI:SS') // 문자형 -> 날짜형
TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') // 날짜형 -> 문자형

★그룹★

공통

GROUP BY NAME을 써서 묶게 되면
NAME 컬럼 중 같은 값들끼리 묶이게 되는데, 이 때 보여지는 NAME들은 각 NAME 값들 중 제일 위에 조회되던 데이터의 값이다.
GROUP BY NAME 후 COUNT(NAME)을 써서 조회하면 같은 NAME으로 묶인 데이터가 몇 개씩인지 보여준다.

<MySQL>

SELECT ANIMAL_TYPE
     , IFNULL(NULLIF(NAME, ''), 'No name') AS NAME
     -- NAME이 빈 값이라면 NULL로 만들고, 그 값이 NULL이라면 'No name'로 만들기
     , SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

NULLIF(A, B) : A와 B가 같다면 NULL

IFNULL(A, B) : A가 NULL이면 B

=> NAME이 빈 값인 경우 NULL로 -> NULL인 경우 No name으로

(결과적으로 빈 값과 NULL 모두 No name으로 표기됨)

 

<Oracle>

SELECT ANIMAL_TYPE
     , NVL(NAME, 'No name') AS NAME
     , SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

Oracle은 빈 값을 NULL로 인식한다.

NVL(A, B) : A가 NULL(빈 값 포함)이면 B

(빈 값과 NULL 모두 No name으로 표기됨)

function solution(name) {
    var answer = 0;
    var changeCnt = 0;
    let moveCnt = name.length - 1; // max 값은 name길이 -1

    for (var i = 0; i < name.length; i++) {
        let asciiValue = name.charCodeAt(i); // A 65 Z 90
        
        if (asciiValue < 78) {
            changeCnt += (asciiValue - 65); // A -> B 방향으로 변경하는 게 빠른 경우 // B일 경우 1
        } else {
            changeCnt += (91 - asciiValue); // Z일 경우 1이 나와야 함
        }

        let nextIndex = i + 1; // 다음 문자 확인을 위한 인덱스

        while (nextIndex < name.length && name.charCodeAt(nextIndex) == 65) { // nextIndex는 name.length - 1보다 크지 않을 때까지 연속해서 A가 나오는지 확인이 필요하다.
            nextIndex += 1;
        }

        // nextIndex는 A 다음의 문자 인덱스를 가리키게 된다.

        moveCnt = Math.min(moveCnt, (i * 2) + name.length - nextIndex); // 이동 거리 최소 카운트로 갱신
    }
    
    answer = moveCnt + changeCnt;

    return answer;
}

alert(solution("JEROEN")); // 56

/* <var>
변수 중복 선언 가능하여, 예기치 못한 값을 반환할 수 있다.
함수 레벨 스코프로 인해 함수 외부에서 선언한 변수는 모두 전역 변수로 된다.
변수 선언문 이전에 변수를 참조하면 언제나 undefined를 반환한다. */

/* <let>
let 키워드로는 변수 중복 선언이 불가하지만, 재할당은 가능하다. */

/* <const>
const가 let과 다른 점이 있다면, 반드시 선언과 초기화를 동시에 진행되어야 한다. */

프로그래머스 조이스틱 문제 풀이 JavaScript

public class Solution {
	
	// 순위
	// Floyd Warshall 알고리즘으로 풀이
	
	public static int solution(int n, int[][] results) {
		int answer = 0;
		int zeroCnt = 0;
		int[][] board = new int[n][n]; // 0 ~ 4
		
		for (int i = 0; i < results.length; i++) {
			// {4, 3}의 경우
			board[results[i][0] - 1][results[i][1] - 1] = 1; // 4는 3에게 이겼으므로 board[3][2] = 1
			board[results[i][1] - 1][results[i][0] - 1] = -1; // 3은 4에게 졌으므로 board[2][3] = -1
		}
		
//		0 : {0, 1, 0, 0, 0}
//		1 : {-1, 0, -1, -1, 1}
//		2 : {0, 1, 0, -1, 0}
//		3 : {0, 1, 1, 0, 0}
//		4 : {0, -1, 0, 0, 0}
		
		for (int k = 0; k < n; k++) {
			
			for (int i = 0; i < n; i++) {
				
				for (int j = 0; j < n; j++) {
					
					if (k == i || i == j || k == j) { // 자기 자신과의 경기는 있을 수 없다.
						continue;
					}
					
					if (board[i][j] == 0) { // i와 j의 경기 결과를 분실했다면
						
						if (board[i][k] == 1 && board[k][j] == 1) { // i가 k에게 이기고, k가 j에게 이겼다면
							board[i][j] = 1; // i는 j에게 이긴 것으로 체크
						} else if (board[i][k] == -1 && board[k][j] == -1) { // i가 k에게 지고, k가 j에게 졌다면
							board[i][j] = -1; // i는 j에게 진 것으로 체크
						}
					}
				}
			}
		}
		
//		0 : {0, 1, 0, 0, 1}
//		1 : {-1, 0, -1, -1, 1} // 자기 자신을 제외하고 다른 모든 선수들과의 경기 결과를 알 수 있는 선수
//		2 : {0, 1, 0, -1, 1}
//		3 : {0, 1, 1, 0, 1}
//		4 : {-1, -1, -1, -1, 0} // 자기 자신을 제외하고 다른 모든 선수들과의 경기 결과를 알 수 있는 선수
		
		for (int i = 0; i < n; i++) {
			
			zeroCnt = 0;
			
			for (int j = 0; j < n; j++) {
				
				if (board[i][j] == 0) {
					zeroCnt++;
				}
			}
			
			if (zeroCnt == 1) {
				answer++;
			}
		}

		return answer;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n = 5;
		int[][] results = {{4, 3}, {4, 2}, {3, 2}, {1, 2}, {2, 5}};
		
		System.out.println(solution(n, results)); // 2
	}
}

프로그래머스 순위 문제 풀이 Java

+ Recent posts