0%

mySQL 2

JOIN

left join

왼쪽 테이블을 기준으로 왼쪽 테이블의 모든 데이터가 출력되고 매핑되는 키값이 없으면 NULL로 출력된다.

두 테이블을 합쳐 id, name, addr 출력

1
2
3
4
SELECT addr.id ,addr.addr, IFNULL(user.name,"-") as name
FROM addr
LEFT JOIN user
ON user.user_id = addr.user_id;

right join

오른쪽 테이블을 기준으로 왼쪽 테이블의 모든 데이터가 출력되고 매핑되는 키값이 없으면 NULL로 출력된다. > 두 테이블을 합쳐 id, name, addr 출력

1
2
3
4
SELECT addr.id, user.name, IFNULL(addr.addr,'=') as addr
FROM addr
RIGHT JOIN user
ON user.user_id = addr.user_id;
### union(outer join) select 문의 결과를 합쳐서 출력 > 자동으로 중복을 제거
1
2
3
4
5
6
7
8
9
10
11
select name
from user
union
select addr
from addr;

select name
from user
union all
select addr
from addr;
### outer join
1
2
3
4
5
6
7
8
9
select user.name, addr.addr, addr.user_id
from user
left join addr
on user.user_id = addr.user_id
union
select user.name, addr.addr, addr.user_id
from user
right join addr
on user.user_id = addr.user_id;
# SUB-QUERY 쿼리문 안에 쿼리가 있는 문법

select, from, where

전체 나라수, 전체 도시수, 전체 언어수를 출력

1
2
3
4
5
6
7
select 
(select count(*)
from country) as total_country,
(select count(*)
from city) as total_city,
(select count(distinct(language))
from countrylanguage) as total_language;

800만 이상이 되는 도시의 국가 코드, 도시이름, 도시인구수를 출력

1
2
3
4
5
6
7
8
9
select *
from
(select countrycode, name, population
from city
where population >= 8000000) as city
join
(select code, name
from country) as country
on city.countrycode = country.code;

800만 이상 도시의 국가코드, 국가 이름, 대통령 이름 출력

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
select code, name, HeadOfState
from country
where code in (
select distinct(Countrycode)
from city
where population >= 8000000);
```


# INDEX
데이터를 검색할때 바르게 찾을수 있도록 해주는 기능
index를 해주면 insert가 느려짐. 아무때나 쓰는건 아님

```SQL
use employees;

explain
select count(*)
from salaries
where to_date > "2000-01-01";

index 추가

1
2
3
create index tdate
-- salaries 테이블에 to_data에 인덱스를 만든다.
on salaries (to_date);

index 삭제

1
2
drop index tdate
on salaries;

VIEW

쿼리문에 대한 결과를 저장하는 개념

1
2
3
4
5
use world;

create view code_name as
select code, name
from country;

찍어주면 code_name라는 view에서 만들어진 country.code 와 country.name을 불러줌 즉 는 (select code, name from country) as code_name 임

1
2
3
4
select *
from city
join code_name
on city.countrycode = code_name.code;