본문 바로가기
  • 공부한 것들과 여러가지를 기록해요
SQL/공부

sql select문, join (생활코딩)

by 티권 2023. 2. 4.

SQL과 테이블 구조

표 < 데이터베이스 < 데이터베이스 서버

SQL(Structured Query Language)

쿼리 - 데이터베이스에 요청(질의)하는 것

관계형 데이터베이스, 데이터베이스를 제어할 때 사용하는 표준화된 언어

 

table, 표

row, record, 행 - 데이터 하나하나, 자체

column, 열 - 데이터의 타입, 구조

 

조회(select)

SELECT 칼럼명1, 칼럼명2
     [FROM 테이블명 ]
     [GROUP BY 칼럼명]
     [ORDER BY 칼럼명 [ASC | DESC]]
     [LIMIT offset, 조회 할 행의 수]

 

대괄호는 생략 가능. 생략가능하다고 할지라도 저 순서대로 명령이 내려져야함.

 

SELECT * FROM student;

: student 테이블의 모든 컬럼에 들어있는 각각의 행들을 조회

 

SELECT name, birthday FROM student;

: student 테이블의 name, birthday 컬럼을 조회

 

SELECT * FROM student WHERE id=3;

: student 테이블의 id값이 3인 행에 대해서 모든 컬럼을 조회  

 

SELECT * FROM student WHERE sex='남자' AND address='서울';

: student 테이블의 sex가 남자이고 address가 서울인 행에 대해서 모든 컬럼을 조회 

: 숫자는 ' ' 안해도 무

 

SELECT * FROM student WHERE sex='여자' OR address='서울';

: student 테이블의 sex가 여자이거나 address가 서울인 행에 대해서 모든 컬럼을 조회

 

SELECT * FROM student LIMIT 1;

: LMIT - 조회한 결과를 몇 개(행) 가져올지 지정

: select문 사용시 where나 LIMIT 사용해야됨. 안그러면 모든 행 가져오기 때문.

 

SELECT * FROM student LIMIT 1, 1;

: LIMIT에 들어오는 첫 번째 값 - offset (0부터 시작)

: offset이 1이고, row count가 1이다.

: 두 번째 데이터 부터 한 개의 행을 가져온다.

 

SELECT * FROM student WHERE sex='남자' LIMIT 2;

: student 테이블의 sex가 남자인 두 개의 행에 대해서 모든 컬럼을 조회

 

 

 

조회(select) - 그룹핑(group by)

SELECT * FROM 테이블명 GROUP BY 그룹핑 할 기준 칼럼명

 

select sex from student group by sex;

: 이렇게 활용하면 데이터는 남자와 여자로 구성되어 있음을 알 수 있다.

 

select sex,sum(distance), avg(distance) from student group by sex;

: 그 데이터가 어떻게 구성되어있는지

: 그룹핑된 컬럼을 기준으로 특정한 다른 컬럼의 평균이나 합계 등 다른 작업을 할 수 있음

 

 

조회(select) - 정렬(order by)

SELECT * FROM 테이블명 ORDER BY 정렬의 기준으로 사용할 열 [DESC | ASC]

 

select * from student order by distance desc;

: desc - 내림차순, 최신 데이터, 데이터의 크기가 큰 거

: asc - 오름차순, 오래된 데이터, 1이 먼저 10이 나중

 

select * from student order by distance desc, address asc;

: 동일한 값이 있을 때 뒤에 있는 걸 기준으로 정렬

 

 

조회(select) - join

데이터베이스는 여러개의 테이블을 사용함.

정보를 하나의 테이블에 몰아 넣으면 비효율 발생.

테이블 분할 하고 관계성을 부여.

 

address에 제주 두 번 등장.

제주도의 distance를 변경하고 싶다면?

김경진 만 변경하고 김정인은 변경 안할수도 있음.

정보가 중복되어서 저장되면서 비효율이 발생. 

데이터가 많지 않은 경우에는 적은 비효율이지만, 데이터가 많아지면 심각한 비효율

 

address 와 distance 컬럼을 묶어서 별도의 테이블을 만들고,

식별자를 이 테이블에 컬럼으로 추가해서 그 테이블과 현재 student테이블 간에 관계성을 부여.

 

 

 

 

join

: 테이블간의 관계성에 따라서 복수의 테이블을 결합, 하나의 테이블인 것처럼 결과를 출력

 

OUTTER JOIN

- 매칭되는 행이 없어도 결과를 가져오고 매칭되는 행이 없는 경우 NULL로 표시

- LEFT JOIN 과 RIGHT JOIN

 

INNER JOIN

- 조인하는 두 개의 테이블 모두에 데이터가 존재하는 행에 대해서만 결과를 가져옴

 

LEFT JOIN : 가장 많이 사용되는 조인의 형태

SELECT s.name, s.location_id, l.name AS address, l.distance FROM student AS s LEFT JOIN location AS l ON s.location_id = l.id;

 

student AS s : student에 s라는 별명을 붙인 것.(쿼리를 간결하게 만들기 위해)

s.name

: student.name

l.name

: location.name

l.name AS address

: location테이블의 name이라는 컬럼을 가져올 때 그 컬럼에 address라는 별명을 부여

student AS s LEFT JOIN location AS l ON s.location_id = l.id

: student테이블에 location테이블을 조인

: student의 location_id 컬럼의 값에 해당하는 location의 id컬럼의 행들을 결과에 붙여서 출력.

 

 

 

DELETE FROM location WHERE name='제주'

: location에서 name이 제주인 행 삭제

OUTER JOIN(LEFT JOIN, RIGHT JOIN)

: 테이블 간 결합을 했을 때, 한 쪽 테이블에 데이터가 없다고 하더라도 가져와서 Null로 표시

INNER JOIN

: 한 쪽 테이블에 데이터가 없으면 그 행 자체를 결과에서 빼버림

 

 

 

 

 

 

'SQL > 공부' 카테고리의 다른 글

select 문 총정리  (0) 2023.07.09
개념적 데이터 모델링, ERD  (0) 2023.02.07
Codecademy - Multiple Tables  (0) 2023.02.05
Codecademy - Aggregate Functions  (0) 2023.02.05
Codecademy - Queries  (0) 2023.02.05