Post

SQL_2 (간단한 문법)

🙅‍♂️휴대폰으로 볼 때 혹시 글자나 숫자가 화면에 다 안나오면, 휴대폰 가로로 돌리시면 됩니다

1
2
3
4
5
6
7
8
9
10
<목차>

1. 간단한 조건
2. logical operation
3. UNION
4. JOIN
5. CONCAT
6. ALIAS
7. DISTINCT
8. LIMIT

1. 간단한 조건

1
2
3
4
5
6
7
8
9
10
11
12
13
14
select 컬럼1, 컬럼2... FROM 테이블명 WHERE 조건 ORDER BY 컬럼n
⬇️

# 나이가 29세가 아닌 사람
SELECT name, age FROM celab WHERE age != 29 ORDER BY age;

# 나이가 29세랑 같지 않은 데이터 검색
SELECT name, age FROM celab WHERE age <> 29 ORDER BY age;

# `아이유` 찾기
SELECT name, age, sex, agency, job_title from celab WHERE name = '아이유';

# celab 테이블에서 소속사 != YG엔터 그리고 이름, 직업, 소속사를 추출하여 소속사 순으로 정렬
select name, job_title, agency from celab WHERE agency != 'YG엔터테인먼트' ORDER BY agency ASC;





2. logical operation

and, or, not, between, like, in

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# and
 나이<29, 성별=여성, 이름 오름차순으로
SELECT * FROM celab WHERE age<29 AND sex='F' ORDER BY name;

# or 
YG엔터 소속 or 나무엑터 소속 중에 나이 < 30
SELECT * FROM celab WHERE (agency='YG엔터테인먼트' OR agency = '나무엑터스') AND age < 30;

# or
celab 테이블에서 아이디가 홀수면서 성별이 남자거나,
아이디가 짝수면서 yg엔터를
나이순으로 정렬하여 검색해라
SELECT * FROM celab WHERE ((id%2)= 1 AND sex='M') OR ((id%2)= 0 AND agency='YG엔터테인먼트') ORDER BY age ASC;

# or and not
생일이 1990 이후, 여자가 아니면서,
생일이 1979 이전, 소속사가 안테나가 아닌 경우
SELECT * FROM celab WHERE (birthday > 19891231 AND NOT sex='F') OR (birthday<19800101 AND NOT agency='안테나 엔터테인먼트');

# 변경   YH엔터 --> YG엔터
update celab set agency='YG엔터테인먼트' where name='차승원';

# between
생년월일이 1980년에서 1995 사이가 아니면서 여자이거나,
소속사가 YG면서 나이가 20~45세가 아닌 데이터
SELECT * FROM celab WHERE(NOT birthday BETWEEN 19800101 AND 19951231 AND sex='F') OR (agency='YG엔터테인먼트' AND NOT age BETWEEN 20 AND 45);

# in
소속사가 나무엑터스, 안테나, 울림엔터가 아니면서, 성별 = 여자 or 나이 >=45
SELECT * FROM celab WHERE not agency IN ('나무엑터스', '안테나 엔터테인먼트', '울림엔터테인먼트') AND (sex='F' OR age >= 45);

# like
`YG` 시작하는 소속사 이름을 가진 데이터
SELECT * from celab WHERE agency LIKE 'YG%';

엔터테인먼트로 끝나는 소속사
    //      like '%엔터테인먼트';

직업명에 가수 포함
    //   WHERE job_title like '%가수%';
    
소속사 이름의 두번째 글자가 G 데이터 검색
   //    WHERE agency like '%_G';
   
직업명이 '가' 시작하고 최소 2글자 이상인 데이터 검색
   //     WHERE job_title LIKE '가_%';
   
직업명이 '가' 시작하고 최소 5글자 이상인 데이터 검색
   //     WHERE job_title LIKE '가_____%';
   
직업명이 '영' 시작하고 '모델' 끝나는 데이터 검색
   //        LIKE '영%모델';

   
직업이 하나 이상인 연예인  영화배우 혹은 가수가 아닌 사람 검색
SELECT * FROM celab WHERE NOT (job_title LIKE '%영화배우%' OR job_title LIKE '%가수%');





3. union

여러 개의 SQL문을 합쳐 하나의 SQL문으로 만듦
(칼럼의 갯수는 같을 것!)

1
2
3
4
5
UNION
중복된 값을 제거하여 알려준다

UNION ALL
중복된 값도 모두 보여준다
1
2
3
4
5
6
# 성별이 여자인 데이터를 검색하는 쿼리와 소속사가,
# YG엔터인 데이터를 검색하는 쿼리를 UNION ALL 실행

SELECT name, sex, agency FROM celab WHERE sex = 'F' 
UNION ALL 
SELECT name, sex, agency FROM celab WHERE agency = 'YG엔터테인먼트';
1
2
3
4
5
6
7
8
9
10
11
12
예제)
가수가 직업인 연예인의 이름, 직업을 검색하는 쿼리와
1980년대에 태어난 연예인의 이름, 생년월일, 나이를 검색하는
쿼리를 UNION으로 실행해주세요

step 1) 가수가 직업인 연예인의 이름, 직업을 검색하는 쿼리
step 2) 1980년대에 태어난 연예인의 이름, 생년월일 ,나이를 검색
step 3) UNION

SELECT name, job_title FROM celab WHERE job_title LIKE '%가수%'
UNION
SELECT name, birthday from celab WHERE birthday BETWEEN '1980-01-01' AND '1989-12-31' ;






4. JOIN

셋팅

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 새로운 테이블 snl_show 생성
CREATE TABLE snl_show
(
ID int NOT NULL AUTO_INCREMENT PRIMARY KEY,
SEASON int NOT NULL,
EPISODE int NOT NULL,
BROADCAST_DATE date,
HOST varchar(32) not null
);



# 데이터 넣기
INSERT INTO snl_show VALUES(1, 8, 7, '2020-09-05', '강동원');
INSERT INTO snl_show VALUES(2, 8, 8, '2020-09-12', '유재석');
INSERT INTO snl_show VALUES(3, 8, 9, '2020-09-19', '차승원');
INSERT INTO snl_show VALUES(4, 8, 10, '2020-09-26', '이수현');
INSERT INTO snl_show VALUES(5, 9, 1, '2021-09-04', '이병헌');
INSERT INTO snl_show VALUES(6, 9, 2, '2021-09-11', '하지원');
INSERT INTO snl_show VALUES(7, 9, 3, '2021-09-18', '제시');
INSERT INTO snl_show VALUES(8, 9, 4, '2021-09-25', '조정석');
INSERT INTO snl_show VALUES(9, 9, 5, '2021-10-02', '조여정');
INSERT INTO snl_show VALUES(10, 9, 6, '2021-10-09', '옥주현');


4-1) inner join

두개의 테이블에서 공통된 요소만 추출

1
2
3
4
5
ex) snl_show 호스트로 출연한 celab 기준으로 celab, snl_show 테이블을 INNER JOIN 하자
SELECT celab.id, celab.name, snl_show.id, snl_show.host
FROM celab
INNER JOIN snl_show
ON celab.name = snl_show.host;


4-2) LEFT JOIN

두개의 테이블에서 공통영역을 포함해 왼쪽 테이블의 다른 데이터를 포함
(AUB) - (B-A) = A

1
2
3
4
5
6
7
# snl_show 호스트로 출연한 celab 기준으로
# celab + snl_show 테이블을 LEFT JOIN

SELECT celab.id, celab.name, snl_show.id, snl_show.host
FROM celab
LEFT JOIN snl_show
ON celab.name = snl_show.host;


4-3) RIGHT JOIN

두개의 테이블에서 공통영역을 포함해 오른쪽 테이블의 다른 데이터를 포함
(AUB) - (A-B) = B

1
2
3
4
5
6
7
# snl_show 호스트로 출연한 celab 기준으로
# celab + snl_show 테이블을 RIGHT JOIN

SELECT celab.id, celab.name, snl_show.id, snl_show.host
FROM celab
RIGHT JOIN snl_show
ON celab.name = snl_show.host


4-4) FULL OUTER JOIN

(AUB)

1
2
(mysql에서 지원 안함)
대신 full outer join 같은 결과⬇️
1
2
3
4
5
6
7
8
9
10
11
12
13
snl_show 호스트로 출연한 celab 기준으로
celab + snl_show 테이블을 FULL OUTER JOIN
-----------------------------------------------------------------

SELECT celab.id, celab.name, snl_show.id, snl_show.host
FROM celab
LEFT JOIN snl_show
ON celab.name = snl_show.host
UNION
SELECT celab.id, celab.name, snl_show.id, snl_show.host
FROM celab
RIGHT JOIN snl_show
ON celab.name = snl_show.host;


4-5) SELF-JOIN

공통된 요소만 추출 (inner join과 같은 결과)

1
2
3
4
5
6
7
8
9
10
11
12
celab 테이블의 연예인 , 
snl_show host 출연했고,
배우는 아니면서 YG소속이거나 40 이상이면서 
YG 아닌 연예인의 이름, 나이, 직업, 소속사, 시즌, 에피소드 정보 검색




SELECT celab.name, celab.age, celab.job_title, celab.agency, snl_show.season, snl_show.episode
FROM celab, snl_show
WHERE celab.name = snl_show.host
AND ((NOT job_title LIKE '%배우%' AND agency = 'YG엔터테인먼트') OR (age >= 40 AND agency != 'YG엔터테인먼트'));






5. CONCAT

여러 문자열을 하나로 합치거나 연결

1
2
# index, value 연결  (: 빠뜨리지 말것!)
SELECT concat('이름:', name) FROM celab;




6. ALIAS

컬럼이나 테이블에 별칭 생성

1
2
3
4
SELECT 컬럼1 as '별칭', 컬럼2 as '별칭2' FROM 테이블
⬇️
# celab 테이블에서 name, agency 대신 이름, 소속사로 결과 추출
SELECT name as '이름', agency as '소속사' FROM celab

🐬CONCAT & ALIAS

1
2
3
4
5
6
7
8
9
10
11
# name, job_title 합쳐 profile 만들기
SELECT concat(name, ' : ', job_title) as profile from celab;

# snl_show 출연한 celab 기준으로  테이블을 조인하여,
# celab 테이블은 c,
# snl_show 테이블은 s
# 라는 별칭을 만들어 출연한 시즌과 에피소드, 이름, 직업을 검색

SELECT s.season, s.episode, c.name, c.job_title
FROM celab AS c, snl_show AS s
WHERE c.name = s.host;
1
2
3
4
5
6
7
8
9
10
11
# ---------------- 이렇게 똑같이 만들기 --------------------------------
방송정보
8-7(2020-09-5)

출연자정보
강동원(배우)

select concat(s.season, '-', s.episode, '(', s.broadcast_date, ')') AS '방송정보',
concat(c.name, '(', c.job_title, ')') AS '출연자정보'
FROM celab AS c, snl_show AS s
WHERE NAME = host;




7. DISTINCT

중복 제거

1
2
# 가수 중에서 성별과 직업별 종류를 검색 (중복제거)
SELECT DISTINCT sex, job_title FROM celab WHERE job_title like '%가수%'




8. LIMIT

검색결과를 정렬된 순으로 주어진 숫자만큼만 조회 Desktop View

1
2
3
SELECT CONCAT('SNL 시즌 ', s.season, ' 에피소드 ', s.episode, ' 호스트 ', s.host) '방송정보',  c.age
FROM snl_show s, celab c WHERE s.host = c.name
ORDER BY c.age DESC LIMIT 2;
This post is licensed under CC BY 4.0 by the author.
3D GIF