본문 바로가기
개발 관련 공부/TIL

SQL 고득점 킷 정리

by 슴새 2022. 9. 14.
반응형
이 포스트는 2021.12~2022.09 기간동안 벨로그에 작성한 글을 티스토리에 옮겨 적은 것입니다.

n개의 데이터 뽑기

limit를 이용한다.

SELECT NAME FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1

정렬한 다음에 맨 첫번째 데이터를 반환

SELECT NAME FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 6,3

7번째 행부터 3개의 데이터 반환

중복없이 데어터 뽑기

distinct를 이용한다.

SELECT distinct NAME from ANIMAL_INS

중복 없을때 몇 개 있을까?

SELECT count(distinct NAME)  from ANIMAL_INS

group by에서의 조건절

group by에서 조건쓸때는 where 대신 having을 쓴다.

SELECT NAME, count(NAME) as counts from ANIMAL_INS 
group by name having counts>=2 
order by NAME

이름으로 묶어서 2개이상인 애들만 출력.
한창 sql할때는 당연하다가도 좀 오래 안보면 맨날 까먹어..

DATETIME 타입에 대해

DATETIME 타입을 분,시간등으로 쪼개 볼 수 있다.
DATETIME타입의 DATETIME 칼럼이 있을때...

SELECT minute(DATETIME) from ANIMAL_OUTS
SELECT hour(DATETIME) from ANIMAL_OUTS

이런식.

Null 데이터

이름이 null인 동물의 id 출력..

SELECT ANIMAL_ID from ANIMAL_INS where NAME is null

where NAME = null..이런식 절대 노노 is null을 기억하자

SELECT ANIMAL_ID from ANIMAL_INS where NAME is not null

null이 아닌 애들을 출력하려면 is not null

SELECT ANIMAL_TYPE, IFNULL(NAME,"No name"),SEX_UPON_INTAKE 
from ANIMAL_INS
order by ANIMAL_ID

null인 애들을 다른 문자열로 대체하려면 IFNULL(칼럼명, 대체문자열)

특정 문자열이 포함되어 있는지 확인

where 칼럼 like '%[문자열]%' 을 쓰면 된다.

SELECT ANIMAL_ID, NAME from ANIMAL_INS
where NAME like '%el%' and ANIMAL_TYPE="Dog"
order by NAME

이름에 el이 있는 강아지 출력

SELECT ANIMAL_ID, NAME from ANIMAL_INS
where NAME like 'A%'

만약 %를 한쪽에만 쓰면..A로 시작하는 이름 가진 동물 출력. 문자 여러개일수도 있다. 'AB%' 이런식으로.. 특정 문자열로 끝나는 쿼리문을 작성할수도 있겠지.

SELECT ANIMAL_ID, NAME from ANIMAL_INS
where NAME like '__a' 

언더바도 쓸 수 있다. 이렇게 쓰면 이름의 세번째 글자가 a인 애들을 출력한다. Gia..Kia..등

SELECT ANIMAL_ID, NAME from ANIMAL_INS
where NAME like '__a%' 

%랑 조합하면? 3번째 글자가 a고 뒤에는 노상관. Diablo, Charlie 이런 애들도 같이 출력된다.

sql에서의 조건절

select *,
	case when 조건 then 값
    else 거짓일때 값
    end as 별명
from 테이블명

case when ~ then ~ end을 기억하자. else와 as 별명은 없어도 되지만 end는 있어야 한다! select 칼럼명 뒤에 쉼표가 있는 것도 유의

SELECT  ANIMAL_ID,NAME, 
    case when SEX_UPON_INTAKE like 'Intact %' 
    then 'X' else 'O'
    end as '중성화'
from ANIMAL_INS

JOIN에 대하여...

select ~ from 테이블명1 Join 테이블명2 on ~

기본적인 형태는 위와 같다. on을 잘 기억하자. 테이블명.칼럼명 이렇게 쓰기 귀찮아서 테이블명 as 별명으로 줄이는 경우도 많은 듯 하다.
inner join

SELECT O.ANIMAL_ID,O.NAME from ANIMAL_OUTS as O
JOIN ANIMAL_INS as I
on I.ANIMAL_ID= O.ANIMAL_ID

교집합이라고 생각하면 된다. 그냥 냅다 join을 쓰면 inner join이 된다.두 테이블은 ANIMAL_ID라는 공통된 칼럼으로 연결되며, 둘 중 하나에 없는 애들은 출력되지 않는다. 겹치는 칼럼명이 있기 때문에 어떤 테이블의 칼럼인지 꼭 명시해 둔다. select절에서도 마찬가지.

outer join
outer join은 합집합이다. 두가지가 있다.

  • LEFT OUTER
  • RIGHT OUTER

A LEFT JOIN B 와 B RIGHT JOIN A는 완전히 같은 식이다.

inner join에는 left고 right고 없기 때문인지..outer란 말 없이 left join 하면 알아서 left outer join으로 알아듣는다.

SELECT O.ANIMAL_ID,O.NAME from ANIMAL_OUTS as O
left JOIN ANIMAL_INS as I
on I.ANIMAL_ID= O.ANIMAL_ID
where I.NAME is null and O.NAME is not null

where을 적절히 활용하면 이렇게 뽑아낼수도 있다.


full outer join이란것도 있는데 mysql에서는 지원하지 않는다.

select *
from A left join B
union
select *
from A right join B;
 

대신 union 키워드와 join문을 적절히 써서 full outer join처럼 구현할 수 있다.

(번외)테이블 생성

create table 테이블명(
    필드명 타입,
    필드명 타입,
	PRIMARY KEY(필드명)
);

설마 이게 나올까 싶지만...기본적인 거니 복습해두자.

CREATE TABLE restList (
    restname VARCHAR(255) NOT NULL,
    resttype VARCHAR(80) DEFAULT NULL,
    addr VARCHAR(255) DEFAULT NULL,
    tel VARCHAR(80) DEFAULT NULL,
    location VARCHAR(255) DEFAULT NULL,
    
    PRIMARY KEY (restname)
) ;

더 구체적인 예시!

insert,delete,update

insert

INSERT INTO `student` VALUES ('2', 'leezche', '여자', '서울', '2000-10-26');

delete

DELETE FROM student WHERE id = 2;

update

UPDATE `student` SET name='이진경' WHERE id=1;

update 테이블명 set 칼럼명=값 where 조건을 기억하기..

끝으로... 명령어 마지막에 ;를 붙이는 걸 잊지 말자. 프로그래머스 환경에선 없어도 괜찮았지만 ;가 없다면 에러나는 플랫폼도 존재!

반응형

'개발 관련 공부 > TIL' 카테고리의 다른 글

코루틴 이해하기  (0) 2022.09.19
MVVM 패턴이란?  (0) 2022.09.19
동기와 비동기  (0) 2022.09.18
인적성 수리 공식 모음  (0) 2022.09.16
get과 post의 차이점  (0) 2022.09.15

댓글