티스토리 뷰

개발일지/TIL

SQL 기본문법 정리

OH!Lee 2022. 10. 13. 20:53
반응형

SELECT문


기본 구조

SELECT 필드이름 FROM 테이블

모든 테이블 보기

SHOW TABLES

여러 필드를 조회하는 경우

SELECT 필드이름1, 필드이름2 FROM 테이블

모든 필드를 조회하는 경우

SELECT * FROM 테이블

중복된 데이터를 없애고 조회하는 경우

SELECT DISTINCT 필드이름 FROM 테이블

조건식을 적용하는 경우

SELECT * FROM 테이블
WHERE 필드이름 = 0(또는 '문자열')

여러 조건식을 적용하는 경우

SELECT * FROM 테이블
WHERE 필드이름 = 0(또는 '문자열')
AND 필드이름2 = 0(또는 '문자열')
OR 필드이름3 = 0(또는 '문자열')

조건식의 종류

(범위 지정 A~B 사이) (NOT 구문은 반대)
WHERE 필드이름 BETWEEN 0 AND 100
WHERE 필드이름 NOT BETWEEN 0 AND 100

(특정값 여러개 선택)
WHERE 필드이름 IN(0, 10, 100)
WHERE 필드이름 NOT IN(0, 10, 100)

(비어있는 값 확인)
WHERE 필드이름 IS NULL
WHERE 필드이름 NOT IS NULL

(문자열 '이**'검색)
WHERE 필드이름 LIKE '이**'
WHERE 필드이름 NOT LIKE '이**'

(%의 경우 모든 문자가 와도 상관 없다는 뜻 EX-이슬,이빨,이쑤시게)
WHERE 필드이름 LIKE '이%'
WHERE 필드이름 NOT LIKE '이%'

(_의 경우 갯수만큼의 문자추가 EX-모이,사이)
WHERE 필드이름 LIKE '_이'
WHERE 필드이름 NOT LIKE '_이'

특정 필드 기준으로 정렬하는 경우

SELECT 필드이름 FROM 테이블 
ORDER BY 필드이름

정렬 기준이 여러 개인 경우

SELECT 필드이름 FROM 테이블
ORDER BY 필드이름1, 필드이름2, 필드이름3

LEFT JOIN으로 테이블 합치기 (비어있는 테이블은 NULL값)

SELECT * FROM 테이블 u
LEFT JOIN 테이블 p
ON u.필드이름 = p.필드이름;

INNER JOIN으로 테이블 합치기 (교집합 테이블, 비어있는 테이블이 없음!)

SELECT * FROM 테이블 u
INNER JOIN 테이블 p
ON u.필드이름 = p.필드이름;

집합 연산을 이용해 결과를 출력하는 경우

SELECT 필드이름1 FROM 테이블1
UNION(또는 UNION ALL, MINUS, INTERSET)
SELECT 필드이름2 FROM 테이블2

Select를 두번 하지 않고, 한번에 모아서 보고 싶은 경우(UNION ALL)

예상 결과값

(
select '7월' as month, c.title, c2.week, count(*) as cnt from checkins c2
inner join courses c on c2.course_id = c.course_id
inner join orders o on o.user_id = c2.user_id
where o.created_at < '2020-08-01'
group by c2.course_id, c2.week
order by c2.course_id, c2.week
)
union all
(
select '8월' as month, c.title, c2.week, count(*) as cnt from checkins c2
inner join courses c on c2.course_id = c.course_id
inner join orders o on o.user_id = c2.user_id
where o.created_at > '2020-08-01'
group by c2.course_id, c2.week
order by c2.course_id, c2.week
)

단! 내부의 order by의 정렬이 깨져 버린다.


Where에 들어가는 Subquery -> where 필드명 in (subquery) 

SELECT * FROM users u
WHERE u.user_id IN (SELECT o.user_id FROM orders o
                    WHERE o.payment_method = 'kakaopay');

쿼리가 실행되는 순서

1. from 실행: users 데이터를 가져와줌
2. Subquery 실행: 해당되는 user_id의 명단을 뽑아줌
3. where .. in 절에서 subquery의 결과에 해당되는 'user_id의 명단' 조건으로 필터링 해줌
4. 조건에 맞는 결과 출력

Select에 들어가는 Subquery -> select 필드명, 필드명, (subquery) from..

SELECT c.checkin_id, c.user_id, c.likes,
       (SELECT avg(likes) FROM checkins c2
        WHERE c2.user_id = c.user_id) AS avg_like_user
FROM checkins c;
1. 밖의 select * from 문에서 데이터를 한줄한줄 출력하는 과정에서
2. select 안의 subquery가 매 데이터 한줄마다 실행되는데
3. 그 데이터 한 줄의 user_id를 갖는 데이터의 평균 좋아요 값을 subquery에서 계산해서
4. 함께 출력해준다!

From에 들어가는 Subquery (가장 많이 사용되는 유형!) => 내가 만든 Select와 이미 있는 테이블을 Join 하고 싶을 때 사용

 

먼저 유저 별 좋아요 평군을 구한다.

SELECT user_id, round(avg(likes),1) AS avg_like FROM checkins
GROUP BY user_id

그리고 해당 유저 별 포인트에 붙인다.

SELECT pu.user_id, a.avg_like, pu.point FROM point_users pu
INNER JOIN (
    SELECT user_id, round(avg(likes),1) AS avg_like FROM checkins
    GROUP BY user_id
) a ON pu.user_id = a.user_id

 

쿼리가 실행되는 순서

1.먼저 서브쿼리의 SELECT가 실행이 되고,
2.이것을 테이블처럼 여기고 밖의 SELECT가 실행

INSERT문

INSERT INTO 테이블(필드이름1, 필드이름2)
VALUES (값1, 값2)

UPDATE문

UPDATE 테이블 SET 필드이름1 = 값1, 필드이름2 = 갑2
WHERE 조건문

DELETE문

DELETE FROM 테이블
WHERE 조건문
반응형

'개발일지 > TIL' 카테고리의 다른 글

TreeSet이란?  (0) 2022.07.20
HashSet 이란?  (0) 2022.07.20
JPA 연관관계, Spring Dada JPA  (0) 2022.07.18
DB의 연관관계 이해  (0) 2022.07.18
JPA 영속성 컨텍스트 이해  (0) 2022.07.18
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함