언젠가 활용될 지 모를 sql 고유값 만들기

아마 LEFT, INNER 등 조인을 통해 테이블 변환이 필요할 때 활용할 수 있을 것 같다.

CONCAT의 괄호 끝에 ' 넣어주고, 컬럼들 사이에 ,',', 넣어주면 끝이다.

전체 row갯수와 중복값을 제거한 row갯수가 같을 때만 활용해야한다.

 

ex)

SELECT ONLINE_SALE_ID
      ,USER_ID
      ,PRODUCT_ID
      ,SALES_AMOUNT
      ,concat(online_sale_id,',',user_id,',',PRODUCT_ID,',',SALES_AMOUNT) AS new
FROM ONLINE_SALE

 

 

 

전체 row 갯수 122

 

새로운 컬럼 new가 생성되고, 문자열 조합으로 이루어진 값을 확인할 수 있다.

'기존학습자료 > 기초 스킬' 카테고리의 다른 글

기초 함수 세부 활용  (0) 2023.06.25
사용자 함수  (0) 2023.06.25
정규표현식  (0) 2023.06.25
시간 더하기, 빼기
--------------------------------------------------------------------------
DATE_ADD

SELECT DATE_ADD(NOW(), INTERVAL 1 SECOND)
SELECT DATE_ADD(NOW(), INTERVAL 1 MINUTE)
SELECT DATE_ADD(NOW(), INTERVAL 1 HOUR)
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY)
SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH)
SELECT DATE_ADD(NOW(), INTERVAL 1 YEAR)
SELECT DATE_ADD(NOW(), INTERVAL -1 YEAR)


DATE_SUB
SELECT DATE_SUB(NOW(), INTERVAL 1 SECOND)





UNION(중복 제거된 값), UNION ALL
--------------------------------------------------------------------------
 *** 위 테이블에서 아래 테이블결과를 뺄때 >>> EXCEPT(ORACLE DB용) or MINUS(ORACLE DB용)
 *** 교집합(INTERSECT, Mysql 지원X )
 FULL OUTER JOIN을 Mysql로 구현하고 싶을 때는, LEFT, RIGHT 조인을 모두 활용





문자열 다루기   -> % / IN / NOT IN / BETWEEN A AND B / NOT BETWEEN A AND B
--------------------------------------------------------------------------
A로 시작하는 문자열 -> A %

B로 끝나는 문자열 -> % B
 
C가 들어있는 문자열 -> % C %




문자열 앞 뒤 글자 색출 활용

LEFT('문자열 or 컬럼명', 왼쪽으로부터 컬럼명 인덱스 )  -> ex) LEFT('giraffi',1) -> 'g'
RIGHT('문자열 or 컬럼명', 오른쪽으롭터 컬럼명 인덱스 )  -> ex) RIGHT('giraffi',1) -> 'I'

WHERE LEFT(CITY,1) NOT IN ('a','e','i','o','u')  -> 도시이름 문자열 첫 문자가 모음이 아닌 것
OR RIGHT(CITY,1) NOT IN ('a','e','i','o','u')  -> 도시이름 문자열 마지막 문자가 모음이 아닌 것




% 활용
WHERE ~~~ LIKE 'A%'   -> 따옴표 반드시


_ 은 한칸으로 취

_ _ %A -> 3번째 문자가 A인 문자열

_ _ A _ _ -> 총 5글자, 그 중 3번째 문자가 A인 문자열 





IN 활용 -> OR이 여러개 일때 활용, 여러번 적기 귀찮으니

SELECT * FROM lake
WHERE destination=10 OR destination=20 OR destination=30

두개 다 같은 구문

SELECT * FROM lake
WHERE destination IN(10,20,30)

***** NOT IN 도 응용해서 활용 가능





BETWEEN ~ AND 활용 예시

SELECT * FROM lake
WHERE destination BETWEEN 10 AND 30

***** NOT BETWEEN 도 응용해서 활용 가능





대/소문자 변환함수
--------------------------------------------------------------------------
UPPER
LOWER

INITCAP('문자열') - 첫 글자만 대문자 변환





제어함수
--------------------------------------------------------------------------
1) SUBSTR - 문자열 자르기

SUBSTR('문자열',시작위치,길이) -> 오라클 기준 숫자시작은 1

ex) SUBSTR('HELLO_KITTY',3,6) -> LLO_KI
              123456



2) INSTR - 내가 찾고자하는 문자열이 전체 문자열에서 몇번째 위치에 있는지 위치를 알려줌

INSTR('문자열','비교하고자 하는 값',시작위치, 몇 번째 비교값인지)

ex) INSTR('HELLO_KITTY',T,1,2) -> 두번째 T가 시작 위치로부터 몇 번째에 위치해 있는지?
           12345678910
=> 10

*** 시작위치가 1이 아닐경우, 시작위치 전의 문자는 비교하지 않음, 번호는 시작위치가 1일때와 동일

INSTR('HELLO_KIOTTY','K',1,1) => 7
INSTR('HELLO_KIOTTY','K',5,1) => 7

INSTR('HELLO_KIOTTY','O',6,2) => 0   >>> 6 번째부터 검색하기 때문에 2번쨰 O가 없다고 생각
INSTR('HELLO_KIOTTY','O',6,1) => 9



3) CONCAT - 문자열 병합
CONCAT('안녕','하세요')


보통 CONCAT 보다는 || 를 많이 활용
'안녕'||'하세요'  -> '안녕하세요'



4) REPLACE - 특정문자를 다른문자로 변환

REPLACE('문자열','찾을문자','변환문자')
ex) REPLACE('HELLO_KITTY','H','C') => 'CELLO_KITTY'





문자열 채우기 함수
--------------------------------------------------------------------------

1) LPAD - 지정한 길이만큼 왼쪽부터 특정문자로 채우기
LPAD('문자열',총 문자길이,'채움문자')
ex) LPAD('admin',10,'*') => *****admin



2) RPAD - 지정한 길이만큼 오른쪽부터 특정문자로 채우기
ex) RPAD('admin',10,'*') => admin*****





제거함수(두번째 argument 생략가능, 생략시 단순 공백제거 기능)
--------------------------------------------------------------------------

1) LTRIM - 문자열의 왼쪽 공백을 제거하거나, 문자열 왼쪽의 반복적인 문자를 제거

LTRIM('문자열','반복되는 문자')

ex) LTRIM('AAABBB','A') => 'BBB'

ex) LTRIM('  AAABBB') => 'AAABBB'

ex) LTRIM('ABABBBBC','AB') => 'BBBC' -> 왼쪽 반복문자열만 제거

ex) LTRIM('AB  ABBBBC','AB') => '  ABBBBC' -> 왼쪽 반복문자열만 제거
             12                  12


ex) LTRIM('ABCAB DCCCBB','ABC') 
=> ABC가 하나의 세트로 되어있는 구성을 제거하는 것이 아님
=> 반복되는 문자 여러개를 입력한 경우, 왼쪽에 개별 문자가 있는지 하나씩 체크해서 없앰
=> 왼쪽에서부터 'A','B','C' 가 있는지 각각을 검사해서 제거
'ABCAB' 까지 삭제


=> ' DCCCBB'
    1             >> 위치


2) RTRIM - 문자열의 오른쪽 공백을 제거하거나, 문자열 오른쪽의 반복적인 문자를 제거

"
"


3) TRIM - 문자열의 양쪽 공백을 제거하거나, 문자열 양쪽에서 지정된 문자를 제거

TRIM('문자열')
TRIM('제거할 문자' FROM '문자열')


TRIM('  HELLO_KITTY  ') => 'HELLO_KITTY'
TRIM('H' from 'HHELLO_KITTYH') => 'ELLO_KITTY'
TRIM('A' from 'AACDEFA') => 'CDEF'


TRIM(옵션, '제거할 문자' FROM '문자열')의 형태로도 사용가능

** 옵션을 쓰지 않으면 both로 인식
- 옵션: leading, trailing, both

1) leading - 문자열 앞 반복 문자 제거

ex) TRIM(LEADING 'A' FROM 'AAACDEAAA') = > 'CDEAAA'

2) trailing - 문자열 뒤 반복 문자 제거

ex) TRIM(TRAILING 'A' FROM 'AAACDEAAA') = > 'AAACDE'


3) both - 문자열 앞/뒤 반복 문자 제거 = 안써도 됨, 생략하면 both 로 인식

ex) TRIM(BOTH 'A' FROM 'AAACDEAAA') = > 'CDE'

'기존학습자료 > 기초 스킬' 카테고리의 다른 글

고유값 만들기  (0) 2023.07.02
사용자 함수  (0) 2023.06.25
정규표현식  (0) 2023.06.25

Leetcode 177 - Nth Highest Salary

https://leetcode.com/problems/nth-highest-salary/description/

 

CASE 문

CREATE FUNCTION getNthHighestSalary (N INT) 
RETURNS INT

BEGIN
  RETURN (
            SELECT 
                  CASE WHEN COUNT(sub.Salary) < N THEN NULL
                      ELSE MIN(sub.Salary) -- 가장 작은 값
                  END
            FROM(
                  SELECT DISTINCT Salary
                  FROM Employee
                  ORDER BY Salary DESC
                  LIMIT N
                ) sub
  
        );
END

IF 문  >>>  건이 순차적으로 실행되어야 하는 상황에는 CASE가 적합 (구간을 특정 기준으로 나눠야 할 때)

CREATE FUNCTION getNthHighestSalary (N INT) 
RETURNS INT

BEGIN
  RETURN (
            SELECT 
                  IF(COUNT(sub.Salary) <N, NULL, MIN(sub.Salary))

            FROM(
                  SELECT DISTINCT Salary
                  FROM Employee
                  ORDER BY Salary DESC
                  LIMIT N
                ) sub
        );
END

LIMIT 심화 
- return 구문에 서브쿼리를 활용하지 않는다면, 쿼리의 결과가 나오지 않을 시 자동으로 NULL 값 반환

CREATE FUNCTION getNthHighestSalary (N INT) 
RETURNS INT

BEGIN

  DECLARE A INT;
  SET A = N -1;      -- equal SET N = N-1;   >>> LIMIT N-1,1
  RETURN (

            SELECT DISTINCT Salary
            FROM Employee
            ORDER BY Salary DESC
            # LIMIT A, 1       >>> 맨 앞에서 A개를 날리고 그 다음 1개를 가져와
            LIMIT 1 OFFSET A.  >>> 맨 앞에서 A개를 날리고 그 다음 1개를 가져와

        );
END

'기존학습자료 > 기초 스킬' 카테고리의 다른 글

고유값 만들기  (0) 2023.07.02
기초 함수 세부 활용  (0) 2023.06.25
정규표현식  (0) 2023.06.25

regxone.com/lesson/introdution_abcs. >>> 연습사이트
regxr.com

 


Weather Observation Station 6
https://www.hackerrank.com/challenges/weather-observation-station-6/problem?h_r=internal-search

 

기존 풀이

SELECT DISTINCT city
FROM station
WHERE city LIKE 'a%'
OR city LIKE 'e%'
OR city LIKE 'i%'
OR city LIKE 'o%'
OR city LIKE 'u%'


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

정규표현식 활용

SELECT DISTINCT city
FROM station
WHERE city REGEXP '^[aeiou].*'       >>> regular expression 
a,e,i,o,u 로 시작해야 하고, 그 뒤는 어떤 문자열이 와도 상관이 없음.


[aeiou] >>> a,e,i,o,u 중 어떤 문자중에 하나라도 들어가면
^문자열 시작위치 >>> 맨 앞
.* 임의의 문자열. = %
. >>> 어떤 문자열도 상관 없음
* >>> .이 몇번 반복될 것 인지?

 

-----------------------------------------------------------------
Weather Observation Station 7

https://www.hackerrank.com/challenges/weather-observation-station-7/problem?h_r=internal-search

SELECT DISTINCT city
FROM station
WHERE city REGEXP '.*[aeiouAEIOU]$'.  >>> ~로 끝나야 할떄 괄호 끝 $표시 >>> [~]$

 

 

Weather Observation Station 8

https://www.hackerrank.com/challenges/weather-observation-station-8/problem?h_r=internal-search

SELECT DISTINCT city
FROM station
WHERE city REGEXP '^[aeiouAEIOU].*[aeiouAEIOU]$' >>> 모음으로 시작하고 모음으로 끝나는 경우

 


Weather Observation Station 9
https://www.hackerrank.com/challenges/weather-observation-station-9/problem?h_r=internal-search

SELECT DISTINCT city
FROM station
WHERE city NOT REGEXP '^[aeiouAEIOU].*'.  >>> 모음으로 시작하지 않아야 할 때.  NOT 추가

 

 

 

 

 

 

 

 

 

 

'기존학습자료 > 기초 스킬' 카테고리의 다른 글

고유값 만들기  (0) 2023.07.02
기초 함수 세부 활용  (0) 2023.06.25
사용자 함수  (0) 2023.06.25

+ Recent posts