실습환경
DBeaver 설치 후 mysql과 연결 후 강의에서 제공하는 인증계정을 통해 실습 진행
기초 문법
- show tables;
=> 현재 DB에 있는 table의 목록을 보여준다. - select [필드명 or *] from [테이블명];
=> 테이블 에서 필드명(or 모든 필드) 에 해당하는 데이터들을 가져온다. - select [필드명] from [테이블명] where [조건]
=> 테이블 에서 필드명에 해당하는 데이터 중에서 조건에 맞는 데이터들을 가져온다.
--users 테이블에서 point 필드가 10000이 넘은 모든 데이터
select * from users
where point > 10000;
--subjects 테이블에서 title의 필드 중 수학이 아닌 모든 데이터
select * from subjects
where title != '수학';
/*
orders 테이블에서 created_at의 날짜가 2023/01/01에서 2023/01/31 사이인 데이터
2023-01-01 00:00:00 ~ 2023-02-01 00:00:00 이기 때문에 2023-01-31 까지만 출력
*/
select * from orders
where created_at between '2023-01-01' and '2023-02-01';
--checkins 테이블에서 week 필드 중 1이나 4인 모든 데이터
select * from checkins
where week in (1,4);
--students 테이블에서 name이 김으로 시작하는 모든 데이터
select * from students
where name like '김%';
- select distinct(필드명) from [테이블명];
=> 필드의 데이터를 중복제거해서 확인 가능 - select * from [테이블명] limit 숫자
=> 숫자만큼의 데이터만 잘라서 보여줌 - select count(*) from [테이블명]
=> 총 데이터 수를 출력
통계내기
- group by
- select () from [테이블명] group by [필드명]
=> 필드의 동일한 데이터끼리 묶은 결과를 보여줌
- select () from [테이블명] group by [필드명]
--comments(댓글) 데이터를 week 별로 묶고 묶인 week를 출력한다.
select week from comments
group by week;
--주차별로 댓글마다에 달린 좋아요 수 중에서 최소값을 출력한다.
--max(), avg(), sum() 등의 함수도 사용가능
select week, min(likes) from comments
group by week;
- count() 함수
- NULL은 세지 않는다.
정렬하기
- order by
- select () from [테이블명] order by [필드명]
=> 테이블의 어떤 필드를 기준으로 데이터를 오름차순으로 정렬(숫자, 문자, 날짜 등)
- select () from [테이블명] order by [필드명]
-- 학생을 학년별로 모은 후, 각 학년의 수로 오름차순 정렬
--order by count(*) desc => 내림차순 정렬
select grade, count(*) from students
group by grade
order by count(*);
/*
order by가 꼭 group by와 같이다닐 필요 없음!!
*/
별칭(alias)
- select () from [테이블명] [별칭]
--students 테이블에 s라는 별칭을 붙여 사용 가능
select * from students s
where s.name = '김%';
--테이블 이외에도 사용 가능
select name, count(*) as cnt from students s
where s.grade = 1
group by name;
조인(join)
join: 테이블을 합칠 때 사용하는 것
left join: 기준되는 테이블에 다른 테이블을 키값을 기준으로 이어붙이는 것
inner join: 두 테이블의 교집합 부분을 추출하는 것
나머지 조인..⬇️
유니온(union)
- 테이블을 위아래로 합칠 때 사용
- select * FROM [테이블명] ;
UNION ALL
select * FROM [테이블명] ; - union all을 쓸 때에는 각 테이블에서 order by가 적용되지 않음
서브쿼리(subquery)
쿼리 안에 들어가는 쿼리
select * from users u
inner join orders o on u.user_id = o.user_id
where created_at = '2023-01-01'
--위와 동일한 결과
select * from users
where user_id in (
select user_id from orders
where created_at = '2023-01-01'
)
/*
select에 서브쿼리가 들어갈 경우
select 한 번당 서브쿼리가 한번씩 호출됨
*/
/*
서브쿼리로 생성된 데이터를 from절에서 기존 데이터와 join 가능
*/
with
- 서브쿼리로 생성된 데이터를 with 구문을 통해 이름을 붙여줄 수 있다.
with table1 as (
select age, count(*) from customers
group by age
), table2 as (
select source_id from sources
group by ratio
)
쿼리 작성 전
- show tables; 를 통해 사용할 테이블 확인
- 원하는 정보가 위치한 테이블에서 select문을 통해 데이터 확인
- 테이블에서 조회하고 싶은 필드명 확인
- 어떻게 통계를 내서 확인할건지 나누기
- 쿼리 작성!
다음 할 일
프로그래머스 sql 문제 풀기!!