DBMS는 서버-클라이언트 구조로 동작
서버 역할을 하는 하나의 프로그램이 실행되고 있고, 사용자는 클라이언트 역할을 하는 프로그램으로
해당 서버에 접속하여 그 서버에 SQL을 전송해서 명령을 내리는 구조-클라이언트 구조로 동작
CSV파일로 테이블 생성하기
Table Data Import
csv의 구분자 ,로 설정하는 것 주의
Primary Key(PK) - not null(NN)
Type 1 ) Surrogate Key : PK로 사용하기 위해 인위적으로 생성한 컬럼. 주로 1부터 순차적으로 증가하는 숫자가 들어감.
Auto Increment(AI) - 자동 증가, MySQL이 자동으로 관리하는 컬럼
Type 2) Natural key는 그 값이 나중에 변경되면 모든 row의 값을 수정해야 한다는 문제가 있기에 보통 Surrogate key를 선택
- 쿼리 창 생성 아이콘
- 쿼리 창 탭
- 쿼리 창 - SQL 입력
- SQL문 실행 아이콘 (shift + cntl+ enter)
- 새로고침
- 테이블 조회
- 스패너 모양 : 해당 테이블의 컬럼과 각 컬럼의 데이터 타입 등을 볼 수 있음
- 표 모양 : 테이블의 전체 row를 조회할 수 있음
- SQL 문으로 테이블의 데이터를 조회했을 때 그 조회 결과가 출력되는 영역
- SQL 문이 잘 실행되었는지 알려주는 영역.
코드잇의 'SQL 실행기'는 사용자가 이미 하나의 데이터베이스를 선택했다고 가정한 상태에서 작동합니다.
따라서 테이블을 나타낼 때는, 테이블 이름만 적으셔야 하고, 데이터베이스 이름은 적으시면 안 됩니다.
예를 들어 member라는 테이블을 나타내고 싶을 때
SELECT * FROM copang_main.member; 라고 작성하시면 안 되고,
SELECT * FROM member; 라고 작성하셔야 하는데요.
영상에서는 테이블 이름을 나타낼 때 데이터베이스 이름을 함께 쓸 때도 있고 안 쓸 때도 있지만, ‘SQL 실행기’를 사용할 때는 꼭 테이블 이름만 써주세요!
참고로, ‘SQL 실행기’ 영역을 잠깐 가리고 영상을 좀더 크게 보고 싶으시면 아래 이미지의 빨간 박스로 표시된 버튼을 클릭하시면 됩니다.
SQL 문 끝에는 항상 세미콜론!
데이터베이스 이름 . 테이블 이름
SQL 작성 순서
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr] ...
[into_option]
[FROM table_references
[PARTITION partition_list]]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]
[HAVING where_condition]
[WINDOW window_name AS (window_spec)
[, window_name AS (window_spec)] ...]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[into_option]
[FOR {UPDATE | SHARE}
[OF tbl_name [, tbl_name] ...]
[NOWAIT | SKIP LOCKED]
| LOCK IN SHARE MODE]
[into_option]
into_option: {
INTO OUTFILE 'file_name'
[CHARACTER SET charset_name]
export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name] ...
}
문자열 패턴 매칭 조건
% 임의의 길이를 가진 문자열
_ 한 자리의 문자
해당 글자를 직접적으로 찾아야 한다면 이스케이프 코드 \ 백슬래시 사용
WHERE address LIKE "서울%"
문자열의 처음이 서울로 시작하는 행을 선택하는 쿼리문
WHERE address LIKE "%고앙시%"
문자열에 고양시가 포함되는 행을 선택하는 쿼리문
WHERE address LIKE "%__구%"
_로 적으면 글자 개수를 제한하여 검색
범위에 놓인 값, 범위 사이 값
column IN ( , , , ...) BETWEEN a AND b
+) BINARY - 대소문자를 구별
'%g%' -> BINARY '%g%'
날짜 추출
년: YEAR(birthday) = '1992'
월: MONTH(sign_up_day) IN (6,7,8)
일 : DAYOFMONTH(sign_up_day) BETWEEN 15 AND 31
시간: UNIX_TIMESTAMP(sign_up_day) - 1970년 1월 1일을 기준으로 총 몇 초 지났는지 나타낸 값
FROM_UNIXTIME( UNIX_TIMESTAMP(sign_up_day) ) - DATETIME처럼 모양 예쁘게 해서 출력
날짜 간 차이 구하기
DATEDIFF(날짜 A, 날짜 B) => B일로 부터 A일 까지 날짜 차이 계산
날짜 덧셈 뺄셈
DATE_ADD( sign_up_day, INTERVAL 300 DAY )
가입일 기준 300일 이후의 날짜 구하기
DATE_SUB( sign_up_day, INTERVAL 250 DAY )
가입일 기준 250일 이전의 날짜 구하기
오늘의 날짜 확인
SELECT email, sign_up_day, CURDATE(), DATEDIFF(sign_up_day, CURDATE()) FROM cloth_main.member;
+) 가입 당시 회원들의 나이 알아보기
가입일 - 생일 / 365
SELECT email, sign_up_day, DATEDIFF(sign_up_day, birthday) / 365 FROM cloth_main.member;
정렬 ORDER BY
오름차순 ASC (기본값)
내림차순 DESC
가입년도가 최신인 사람부터 출력하되 동일년도인 경우 email을 기준으로 오름차순을 정렬하는 내용
SELECT email, sign_up_day FROM cloth_main.member
ORDER BY YEAR(sign_up_day) DESC, email ASC;
데이터 타입 변환 (일시적)
signed : 양수 음수 포함한 모든 정수를 나타내는 데이터 타입
ORDER BY CAST(column AS signed);
decimal 소수점 포함
ORDER BY CAST(height AS decimal);
데이터 일부만 추려보기 - LIMIT
10개의 데이터만 보이기
SELECT email, sign_up_day FROM cloth_main.member
ORDER BY YEAR(sign_up_day) DESC, email ASC;
LIMIT 10;
8번째 행(실제로는 9번째)부터 2개의 데이터만 보이기
LIMIT 8, 2;
사용 예시
주로 검색 결과창이나, 게시판 페이지에서 볼 수 있습니다. 우리는 1, 2, 3 버튼을 눌러가면서 한 페이지씩 그 내용들을 살펴보곤 하죠?
매 페이지에는 아래와 같은 식으로 서로 다른 내용들이 담겨있습니다.
- 1페이지 : 1~10 번까지의 내용
- 2페이지 : 11~20 번까지의 내용
- 3페이지 : 21~30 번까지의 내용
- 4페이지 : 31~40 번까지의 내용 ...
우리가 새로운 페이지를 누르면 그때마다, 10개의 새로운 내용들을 로드(load)할 텐데요. 이런 걸 전문 용어로 '페이지네이션(Pagination)'이라고 합니다. 전체 결과를 한번에 로드하는 게 아니라 이렇게 페이지 단위로 쪼개서 그때그때 요청이 있을 때마다 부분 결과를 조금씩 로드하는 방식을 말하죠.
더불어 스크롤링 하여 댓글을 계속 보여주는 무한 로딩식 페이지BMS는 서버-클라이언트 구조로 동작
서버 역할을 하는 하나의 프로그램이 실행되고 있고, 사용자는 클라이언트 역할을 하는 프로그램으로
해당 서버에 접속하여 그 서버에 SQL을 전송해서 명령을 내리는 구조-클라이언트 구조로 동작
CSV파일로 테이블 생성하기
Table Data Import
csv의 구분자 ,로 설정하는 것 주의
Primary Key(PK) - not null(NN)
Type 1 ) Surrogate Key : PK로 사용하기 위해 인위적으로 생성한 컬럼. 주로 1부터 순차적으로 증가하는 숫자가 들어감.
Auto Increment(AI) - 자동 증가, MySQL이 자동으로 관리하는 컬럼
Type 2) Natural key는 그 값이 나중에 변경되면 모든 row의 값을 수정해야 한다는 문제가 있기에 보통 Surrogate key를 선택

쿼리 창 생성 아이콘
쿼리 창 탭
쿼리 창 - SQL 입력
SQL문 실행 아이콘 (shift + cntl+ enter)
새로고침
테이블 조회
스패너 모양 : 해당 테이블의 컬럼과 각 컬럼의 데이터 타입 등을 볼 수 있음
표 모양 : 테이블의 전체 row를 조회할 수 있음
SQL 문으로 테이블의 데이터를 조회했을 때 그 조회 결과가 출력되는 영역
SQL 문이 잘 실행되었는지 알려주는 영역.
코드잇의 'SQL 실행기'는 사용자가 이미 하나의 데이터베이스를 선택했다고 가정한 상태에서 작동합니다.
따라서 테이블을 나타낼 때는, 테이블 이름만 적으셔야 하고, 데이터베이스 이름은 적으시면 안 됩니다.
예를 들어 member라는 테이블을 나타내고 싶을 때
SELECT * FROM copang_main.member; 라고 작성하시면 안 되고,
SELECT * FROM member; 라고 작성하셔야 하는데요.
영상에서는 테이블 이름을 나타낼 때 데이터베이스 이름을 함께 쓸 때도 있고 안 쓸 때도 있지만, ‘SQL 실행기’를 사용할 때는 꼭 테이블 이름만 써주세요!
참고로, ‘SQL 실행기’ 영역을 잠깐 가리고 영상을 좀더 크게 보고 싶으시면 아래 이미지의 빨간 박스로 표시된 버튼을 클릭하시면 됩니다.
SQL 문 끝에는 항상 세미콜론!
데이터베이스 이름 . 테이블 이름
SQL 작성 순서
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr] ...
[into_option]
[FROM table_references
[PARTITION partition_list]]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]
[HAVING where_condition]
[WINDOW window_name AS (window_spec)
[, window_name AS (window_spec)] ...]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[into_option]
[FOR {UPDATE | SHARE}
[OF tbl_name [, tbl_name] ...]
[NOWAIT | SKIP LOCKED]
| LOCK IN SHARE MODE]
[into_option]
into_option: {
INTO OUTFILE 'file_name'
[CHARACTER SET charset_name]
export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name] ...
}
문자열 패턴 매칭 조건
% 임의의 길이를 가진 문자열
_ 한 자리의 문자
해당 글자를 직접적으로 찾아야 한다면 이스케이프 코드 \ 백슬래시 사용
WHERE address LIKE "서울%"
문자열의 처음이 서울로 시작하는 행을 선택하는 쿼리문
WHERE address LIKE "%고앙시%"
문자열에 고양시가 포함되는 행을 선택하는 쿼리문
WHERE address LIKE "%__구%"
_로 적으면 글자 개수를 제한하여 검색
범위에 놓인 값, 범위 사이 값
column IN ( , , , ...) BETWEEN a AND b
+) BINARY - 대소문자를 구별
'%g%' -> BINARY '%g%'
날짜 추출
년: YEAR(birthday) = '1992'
월: MONTH(sign_up_day) IN (6,7,8)
일 : DAYOFMONTH(sign_up_day) BETWEEN 15 AND 31
시간: UNIX_TIMESTAMP(sign_up_day) - 1970년 1월 1일을 기준으로 총 몇 초 지났는지 나타낸 값
FROM_UNIXTIME( UNIX_TIMESTAMP(sign_up_day) ) - DATETIME처럼 모양 예쁘게 해서 출력
날짜 간 차이 구하기
DATEDIFF(날짜 A, 날짜 B) => B일로 부터 A일 까지 날짜 차이 계산
날짜 덧셈 뺄셈
DATE_ADD( sign_up_day, INTERVAL 300 DAY )
가입일 기준 300일 이후의 날짜 구하기
DATE_SUB( sign_up_day, INTERVAL 250 DAY )
가입일 기준 250일 이전의 날짜 구하기
오늘의 날짜 확인
SELECT email, sign_up_day, CURDATE(), DATEDIFF(sign_up_day, CURDATE()) FROM cloth_main.member;
+) 가입 당시 회원들의 나이 알아보기
가입일 - 생일 / 365
SELECT email, sign_up_day, DATEDIFF(sign_up_day, birthday) / 365 FROM cloth_main.member;
정렬 ORDER BY
오름차순 ASC (기본값)
내림차순 DESC
가입년도가 최신인 사람부터 출력하되 동일년도인 경우 email을 기준으로 오름차순을 정렬하는 내용
SELECT email, sign_up_day FROM cloth_main.member
ORDER BY YEAR(sign_up_day) DESC, email ASC;
데이터 타입 변환 (일시적)
signed : 양수 음수 포함한 모든 정수를 나타내는 데이터 타입
ORDER BY CAST(column AS signed);
decimal 소수점 포함
ORDER BY CAST(height AS decimal);
데이터 일부만 추려보기 - LIMIT
10개의 데이터만 보이기
SELECT email, sign_up_day FROM cloth_main.member
ORDER BY YEAR(sign_up_day) DESC, email ASC;
LIMIT 10;
8번째 행(실제로는 9번째)부터 2개의 데이터만 보이기
LIMIT 8, 2;
사용 예시
주로 검색 결과창이나, 게시판 페이지에서 볼 수 있습니다. 우리는 1, 2, 3 버튼을 눌러가면서 한 페이지씩 그 내용들을 살펴보곤 하죠?
매 페이지에는 아래와 같은 식으로 서로 다른 내용들이 담겨있습니다.
1페이지 : 1~10 번까지의 내용
2페이지 : 11~20 번까지의 내용
3페이지 : 21~30 번까지의 내용
4페이지 : 31~40 번까지의 내용 ...
우리가 새로운 페이지를 누르면 그때마다, 10개의 새로운 내용들을 로드(load)할 텐데요. 이런 걸 전문 용어로 '페이지네이션(Pagination)'이라고 합니다. 전체 결과를 한번에 로드하는 게 아니라 이렇게 페이지 단위로 쪼개서 그때그때 요청이 있을 때마다 부분 결과를 조금씩 로드하는 방식을 말하죠.
더불어 스크롤링 하여 댓글을 계속 보여주는 무한 로딩식 페이지 또한 가능합니다.
산술 함수
SUM()
COUNT()
AVG()평균, STD()표준편차
ROUND()반올림
MAX(), MIN()
SORT() 제곱근,
CEIL() 올림, FLOOR() 내림
NULL 다루기
WHERE column IS NULL -> NULL값이 들어간 ROW만 추출
WHERE column IS NOT NULL -> NULL값 제외하기
COALESCE() 합치다. column에 null이 들어있다면 "###"이 출력되도록 함
SELECT COALESCE(colname, "###") FROM member;
IFNULL(COLNAME, '###")
IF(COLNAME IS NOT NULL, COLNAME, '###") -> (조건문,참,거짓)
!!주의
IS NULL 과 = NULL은 다르다
NULL은 어떤 값이 아니기 때문에 애초에 등호를 사용해서 비교할 수 있는 대상이 아님
이상한 값 제외 하기
WHERE age BETWEEN 5 AND 100;
WHERE address NOT LIKE '%호';
컬럼끼리 계산하기
+ - * / %
NULL이 포함된 계산식은 항상 NULL
컬럼에 alias 붙이기 => AS COLNAME
컬럼 이름에 공백이 포함된다면 '' 문자열 표식 안에 적어주기
CONCAT( COLNAME1, "동", COLNAME2, "호")
요렇게 나만의 형식을 갖춘 COLUMN 생성 가능
!!주의 SELECT 절에서 생성한 ALIAS는 WHERE, CASE 등에서 곧바로 사용 불가능
왜냐면 ALIAS는 SELECT절 안에서 설정했기 때문에 다른 곳에서는 인식 불가능는 하나의 프로그램이 실행되고 있고, 사용자는 클라이언트 역할을 하는 프로그램으로
해당 서버에 접속하여 그 서버에 SQL을 전송해서 명령을 내리는 구조-클라이언트 구조로 동작
CSV파일로 테이블 생성하기
Table Data Import
csv의 구분자 ,로 설정하는 것 주의
Primary Key(PK) - not null(NN)
Type 1 ) Surrogate Key : PK로 사용하기 위해 인위적으로 생성한 컬럼. 주로 1부터 순차적으로 증가하는 숫자가 들어감.
Auto Increment(AI) - 자동 증가, MySQL이 자동으로 관리하는 컬럼
Type 2) Natural key는 그 값이 나중에 변경되면 모든 row의 값을 수정해야 한다는 문제가 있기에 보통 Surrogate key를 선택

쿼리 창 생성 아이콘
쿼리 창 탭
쿼리 창 - SQL 입력
SQL문 실행 아이콘 (shift + cntl+ enter)
새로고침
테이블 조회
스패너 모양 : 해당 테이블의 컬럼과 각 컬럼의 데이터 타입 등을 볼 수 있음
표 모양 : 테이블의 전체 row를 조회할 수 있음
SQL 문으로 테이블의 데이터를 조회했을 때 그 조회 결과가 출력되는 영역
SQL 문이 잘 실행되었는지 알려주는 영역.
코드잇의 'SQL 실행기'는 사용자가 이미 하나의 데이터베이스를 선택했다고 가정한 상태에서 작동합니다.
따라서 테이블을 나타낼 때는, 테이블 이름만 적으셔야 하고, 데이터베이스 이름은 적으시면 안 됩니다.
예를 들어 member라는 테이블을 나타내고 싶을 때
SELECT * FROM copang_main.member; 라고 작성하시면 안 되고,
SELECT * FROM member; 라고 작성하셔야 하는데요.
영상에서는 테이블 이름을 나타낼 때 데이터베이스 이름을 함께 쓸 때도 있고 안 쓸 때도 있지만, ‘SQL 실행기’를 사용할 때는 꼭 테이블 이름만 써주세요!
참고로, ‘SQL 실행기’ 영역을 잠깐 가리고 영상을 좀더 크게 보고 싶으시면 아래 이미지의 빨간 박스로 표시된 버튼을 클릭하시면 됩니다.
SQL 문 끝에는 항상 세미콜론!
데이터베이스 이름 . 테이블 이름
SQL 작성 순서
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr] ...
[into_option]
[FROM table_references
[PARTITION partition_list]]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]
[HAVING where_condition]
[WINDOW window_name AS (window_spec)
[, window_name AS (window_spec)] ...]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[into_option]
[FOR {UPDATE | SHARE}
[OF tbl_name [, tbl_name] ...]
[NOWAIT | SKIP LOCKED]
| LOCK IN SHARE MODE]
[into_option]
into_option: {
INTO OUTFILE 'file_name'
[CHARACTER SET charset_name]
export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name] ...
}
문자열 패턴 매칭 조건
% 임의의 길이를 가진 문자열
_ 한 자리의 문자
해당 글자를 직접적으로 찾아야 한다면 이스케이프 코드 \ 백슬래시 사용
WHERE address LIKE "서울%"
문자열의 처음이 서울로 시작하는 행을 선택하는 쿼리문
WHERE address LIKE "%고앙시%"
문자열에 고양시가 포함되는 행을 선택하는 쿼리문
WHERE address LIKE "%__구%"
_로 적으면 글자 개수를 제한하여 검색
범위에 놓인 값, 범위 사이 값
column IN ( , , , ...) BETWEEN a AND b
+) BINARY - 대소문자를 구별
'%g%' -> BINARY '%g%'
날짜 추출
년: YEAR(birthday) = '1992'
월: MONTH(sign_up_day) IN (6,7,8)
일 : DAYOFMONTH(sign_up_day) BETWEEN 15 AND 31
시간: UNIX_TIMESTAMP(sign_up_day) - 1970년 1월 1일을 기준으로 총 몇 초 지났는지 나타낸 값
FROM_UNIXTIME( UNIX_TIMESTAMP(sign_up_day) ) - DATETIME처럼 모양 예쁘게 해서 출력
날짜 간 차이 구하기
DATEDIFF(날짜 A, 날짜 B) => B일로 부터 A일 까지 날짜 차이 계산
날짜 덧셈 뺄셈
DATE_ADD( sign_up_day, INTERVAL 300 DAY )
가입일 기준 300일 이후의 날짜 구하기
DATE_SUB( sign_up_day, INTERVAL 250 DAY )
가입일 기준 250일 이전의 날짜 구하기
오늘의 날짜 확인
SELECT email, sign_up_day, CURDATE(), DATEDIFF(sign_up_day, CURDATE()) FROM cloth_main.member;
+) 가입 당시 회원들의 나이 알아보기
가입일 - 생일 / 365
SELECT email, sign_up_day, DATEDIFF(sign_up_day, birthday) / 365 FROM cloth_main.member;
정렬 ORDER BY
오름차순 ASC (기본값)
내림차순 DESC
가입년도가 최신인 사람부터 출력하되 동일년도인 경우 email을 기준으로 오름차순을 정렬하는 내용
SELECT email, sign_up_day FROM cloth_main.member
ORDER BY YEAR(sign_up_day) DESC, email ASC;
데이터 타입 변환 (일시적)
signed : 양수 음수 포함한 모든 정수를 나타내는 데이터 타입
ORDER BY CAST(column AS signed);
decimal 소수점 포함
ORDER BY CAST(height AS decimal);
데이터 일부만 추려보기 - LIMIT
10개의 데이터만 보이기
SELECT email, sign_up_day FROM cloth_main.member
ORDER BY YEAR(sign_up_day) DESC, email ASC;
LIMIT 10;
8번째 행(실제로는 9번째)부터 2개의 데이터만 보이기
LIMIT 8, 2;
사용 예시
주로 검색 결과창이나, 게시판 페이지에서 볼 수 있습니다. 우리는 1, 2, 3 버튼을 눌러가면서 한 페이지씩 그 내용들을 살펴보곤 하죠?
매 페이지에는 아래와 같은 식으로 서로 다른 내용들이 담겨있습니다.
1페이지 : 1~10 번까지의 내용
2페이지 : 11~20 번까지의 내용
3페이지 : 21~30 번까지의 내용
4페이지 : 31~40 번까지의 내용 ...
우리가 새로운 페이지를 누르면 그때마다, 10개의 새로운 내용들을 로드(load)할 텐데요. 이런 걸 전문 용어로 '페이지네이션(Pagination)'이라고 합니다. 전체 결과를 한번에 로드하는 게 아니라 이렇게 페이지 단위로 쪼개서 그때그때 요청이 있을 때마다 부분 결과를 조금씩 로드하는 방식을 말하죠.
더불어 스크롤링 하여 댓글을 계속 보여주는 무한 로딩식 페이지BMS는 서버-클라이언트 구조로 동작
서버 역할을 하는 하나의 프로그램이 실행되고 있고, 사용자는 클라이언트 역할을 하는 프로그램으로
해당 서버에 접속하여 그 서버에 SQL을 전송해서 명령을 내리는 구조-클라이언트 구조로 동작
CSV파일로 테이블 생성하기
Table Data Import
csv의 구분자 ,로 설정하는 것 주의
Primary Key(PK) - not null(NN)
Type 1 ) Surrogate Key : PK로 사용하기 위해 인위적으로 생성한 컬럼. 주로 1부터 순차적으로 증가하는 숫자가 들어감.
Auto Increment(AI) - 자동 증가, MySQL이 자동으로 관리하는 컬럼
Type 2) Natural key는 그 값이 나중에 변경되면 모든 row의 값을 수정해야 한다는 문제가 있기에 보통 Surrogate key를 선택

쿼리 창 생성 아이콘
쿼리 창 탭
쿼리 창 - SQL 입력
SQL문 실행 아이콘 (shift + cntl+ enter)
새로고침
테이블 조회
스패너 모양 : 해당 테이블의 컬럼과 각 컬럼의 데이터 타입 등을 볼 수 있음
표 모양 : 테이블의 전체 row를 조회할 수 있음
SQL 문으로 테이블의 데이터를 조회했을 때 그 조회 결과가 출력되는 영역
SQL 문이 잘 실행되었는지 알려주는 영역.
코드잇의 'SQL 실행기'는 사용자가 이미 하나의 데이터베이스를 선택했다고 가정한 상태에서 작동합니다.
따라서 테이블을 나타낼 때는, 테이블 이름만 적으셔야 하고, 데이터베이스 이름은 적으시면 안 됩니다.
예를 들어 member라는 테이블을 나타내고 싶을 때
SELECT * FROM copang_main.member; 라고 작성하시면 안 되고,
SELECT * FROM member; 라고 작성하셔야 하는데요.
영상에서는 테이블 이름을 나타낼 때 데이터베이스 이름을 함께 쓸 때도 있고 안 쓸 때도 있지만, ‘SQL 실행기’를 사용할 때는 꼭 테이블 이름만 써주세요!
참고로, ‘SQL 실행기’ 영역을 잠깐 가리고 영상을 좀더 크게 보고 싶으시면 아래 이미지의 빨간 박스로 표시된 버튼을 클릭하시면 됩니다.
SQL 문 끝에는 항상 세미콜론!
데이터베이스 이름 . 테이블 이름
SQL 작성 순서
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr] ...
[into_option]
[FROM table_references
[PARTITION partition_list]]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]
[HAVING where_condition]
[WINDOW window_name AS (window_spec)
[, window_name AS (window_spec)] ...]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[into_option]
[FOR {UPDATE | SHARE}
[OF tbl_name [, tbl_name] ...]
[NOWAIT | SKIP LOCKED]
| LOCK IN SHARE MODE]
[into_option]
into_option: {
INTO OUTFILE 'file_name'
[CHARACTER SET charset_name]
export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name] ...
}
문자열 패턴 매칭 조건
% 임의의 길이를 가진 문자열
_ 한 자리의 문자
해당 글자를 직접적으로 찾아야 한다면 이스케이프 코드 \ 백슬래시 사용
WHERE address LIKE "서울%"
문자열의 처음이 서울로 시작하는 행을 선택하는 쿼리문
WHERE address LIKE "%고앙시%"
문자열에 고양시가 포함되는 행을 선택하는 쿼리문
WHERE address LIKE "%__구%"
_로 적으면 글자 개수를 제한하여 검색
범위에 놓인 값, 범위 사이 값
column IN ( , , , ...) BETWEEN a AND b
+) BINARY - 대소문자를 구별
'%g%' -> BINARY '%g%'
날짜 추출
년: YEAR(birthday) = '1992'
월: MONTH(sign_up_day) IN (6,7,8)
일 : DAYOFMONTH(sign_up_day) BETWEEN 15 AND 31
시간: UNIX_TIMESTAMP(sign_up_day) - 1970년 1월 1일을 기준으로 총 몇 초 지났는지 나타낸 값
FROM_UNIXTIME( UNIX_TIMESTAMP(sign_up_day) ) - DATETIME처럼 모양 예쁘게 해서 출력
날짜 간 차이 구하기
DATEDIFF(날짜 A, 날짜 B) => B일로 부터 A일 까지 날짜 차이 계산
날짜 덧셈 뺄셈
DATE_ADD( sign_up_day, INTERVAL 300 DAY )
가입일 기준 300일 이후의 날짜 구하기
DATE_SUB( sign_up_day, INTERVAL 250 DAY )
가입일 기준 250일 이전의 날짜 구하기
오늘의 날짜 확인
SELECT email, sign_up_day, CURDATE(), DATEDIFF(sign_up_day, CURDATE()) FROM cloth_main.member;
+) 가입 당시 회원들의 나이 알아보기
가입일 - 생일 / 365
SELECT email, sign_up_day, DATEDIFF(sign_up_day, birthday) / 365 FROM cloth_main.member;
정렬 ORDER BY
오름차순 ASC (기본값)
내림차순 DESC
가입년도가 최신인 사람부터 출력하되 동일년도인 경우 email을 기준으로 오름차순을 정렬하는 내용
SELECT email, sign_up_day FROM cloth_main.member
ORDER BY YEAR(sign_up_day) DESC, email ASC;
데이터 타입 변환 (일시적)
signed : 양수 음수 포함한 모든 정수를 나타내는 데이터 타입
ORDER BY CAST(column AS signed);
decimal 소수점 포함
ORDER BY CAST(height AS decimal);
데이터 일부만 추려보기 - LIMIT
10개의 데이터만 보이기
SELECT email, sign_up_day FROM cloth_main.member
ORDER BY YEAR(sign_up_day) DESC, email ASC;
LIMIT 10;
8번째 행(실제로는 9번째)부터 2개의 데이터만 보이기
LIMIT 8, 2;
사용 예시
주로 검색 결과창이나, 게시판 페이지에서 볼 수 있습니다. 우리는 1, 2, 3 버튼을 눌러가면서 한 페이지씩 그 내용들을 살펴보곤 하죠?
매 페이지에는 아래와 같은 식으로 서로 다른 내용들이 담겨있습니다.
1페이지 : 1~10 번까지의 내용
2페이지 : 11~20 번까지의 내용
3페이지 : 21~30 번까지의 내용
4페이지 : 31~40 번까지의 내용 ...
우리가 새로운 페이지를 누르면 그때마다, 10개의 새로운 내용들을 로드(load)할 텐데요. 이런 걸 전문 용어로 '페이지네이션(Pagination)'이라고 합니다. 전체 결과를 한번에 로드하는 게 아니라 이렇게 페이지 단위로 쪼개서 그때그때 요청이 있을 때마다 부분 결과를 조금씩 로드하는 방식을 말하죠.
더불어 스크롤링 하여 댓글을 계속 보여주는 무한 로딩식 페이지 또한 가능합니다.
산술 함수
SUM()
COUNT()
AVG()평균, STD()표준편차
ROUND()반올림
MAX(), MIN()
SORT() 제곱근,
CEIL() 올림, FLOOR() 내림
NULL 다루기
WHERE column IS NULL -> NULL값이 들어간 ROW만 추출
WHERE column IS NOT NULL -> NULL값 제외하기
COALESCE() 합치다. column에 null이 들어있다면 "###"이 출력되도록 함
SELECT COALESCE(colname, "###") FROM member;
IFNULL(COLNAME, '###")
IF(COLNAME IS NOT NULL, COLNAME, '###") -> (조건문,참,거짓)
!!주의
IS NULL 과 = NULL은 다르다
NULL은 어떤 값이 아니기 때문에 애초에 등호를 사용해서 비교할 수 있는 대상이 아님
이상한 값 제외 하기
WHERE age BETWEEN 5 AND 100;
WHERE address NOT LIKE '%호';
컬럼끼리 계산하기
+ - * / %
NULL이 포함된 계산식은 항상 NULL
컬럼에 alias 붙이기 => AS COLNAME
컬럼 이름에 공백이 포함된다면 '' 문자열 표식 안에 적어주기
CONCAT( COLNAME1, "동", COLNAME2, "호")
요렇게 나만의 형식을 갖춘 COLUMN 생성 가능
!!주의 SELECT 절에서 생성한 ALIAS는 WHERE, CASE 등에서 곧바로 사용 불가능
왜냐면 ALIAS는 SELECT절 안에서 설정했기 때문에 다른 곳에서는 인식 불가능
컬럼의 값 변환해서 보기 (CASE - 조건문)
(CASE
WHEN weight IS NULL OR height IS NULL THEN '비만 여부 알 수 없음'
WHEN weight/((height/100)*(height/100)) >= 25 THEN '과체중 또는 비만'
ELSE '저체중'
END) AS obesity_check
ORDER BY obesity_check ASC;
고유값의 개수 구하기
SELECT COUNT(DISTINCT(gender)) FROM member;
성별은 결국 여자 아니면 남자이므로, 고유값의 개수는 2가 출력됨
SELECT COUNT(DISTINCT(SUBSTRING(address,1,2))) AS region_count
FROM member;
서울 경기 처럼 주요 지역을 나타내는 단어의 종류는 9개 이기에 9가 출력됨.
문자열 관련 함수
1. LENGTH - 문자열의 길이
SELECT LENGTH(address) FROM member;
2. UPPER, LOWER - 대문자, 소문자로 전환
SELECT UPPER(email), LOWER(email) FROM member;
3. LPAD, RPAD - 왼쪽 또는 오른쪽을 특정 문자열로 채워주는(PADDING) 함수
SELECT LPAD(aeg,10,'0' FROM member;
age 컬럼의 값을, 왼쪽에 문자 0을 붙여서 총 10자리로 만드는 함수
보통 어떤 숫자의 자릿수를 맞출 때 자주 사용
대신 숫자형이 자동으로 문자열로 형변환되니 주의
4. TRIM, LTRIM, RTRIM - 공백 제거
TRIM은 왼쪽 오른쪽 양쪽 다 공백 삭제
SELECT TRIM(word) FROM member;
HAVING :: GROUP BY 후 특정 그룹 선별
WHERE은 SELECT절에서 맨 처음에 ROW를 필터링 할 때 사용.
그 후로 그룹화 후에 HAVING을 써서 그룹들을 필터링
GROUP BY를 안 썼을 때
GROUP BY를 쓴 후에 생성된 각 그룹(하나의 ROW로 표현되었던)에 대해서 AVG, MIN 등의 집계함수 (aggregate func)가 각각 동작했던 아래와 같은 화면 속 이미지를 잘 기억하셔야 합니다.
예를 들어, 그룹화 후 집계 함수 중 하나인 COUNT 함수를 사용하면, 아래와 같이 각 그룹의 ROW 수가 잘 출력됩니다.
GROUP BY를 안 썼을 때는 전체 테이블이 그냥 하나의 그룹이라고 생각하시면 좋습니다. 전체 ROW가 하나의 그룹이고, 그 하나의 그룹에 집계함수가 작동했던 겁니다. 하지만 그룹핑 후에는 각 그룹에 대해서 집계 함수가 작동됩니다.
GROUP BY 사용 시 규칙
SELECT SUBSTRING(address, 1, 2) AS region, gender, COUNT(*) FROM member;
GROUP BY SUBSTRING(address, 1, 2), gender
HAVING region IS NOT NULL
ORDER BY region ASC, gender DESC;
위의 쿼리문은
1. 주요 지역 2. 성별의 조합 (서울-남성, 서울-여성, 경기-남성, 경기-여성)을 기준으로 그룹화 됐습니다.
GROUP BY 사용시 지켜야할 규칙은
SELECT 절에는
1. GROUP BY 뒤에서 사용한 컬럼들 사용 가능
2. COUNT, MAX등과 같은 집계 함수 사용 가능
하다는 점입니다.
이건 거꾸로 말해 GROUP BY 뒤에 쓰지 않은 컬럼 이름을 SELECT 뒤에 쓸 수 없습니다.
그 이유는, 각 그룹은 단순한 하나의 ROW가 아닙니다. 하나의 ROW는 하나의 그룹을 의미하기에 그 안에 여러 ROW가 포함된 걸로 생각해야 맞습니다.
그런데 GROUP BY 뒤에 스지 않은, 그러니까 그룹화 기준으로 사용하지 않은 컬럼명을
SELECT 절 뒤에 서서 조회하면, 각 그룹의 ROW들 중에서 해당 컬럼의 값을
어느 ROW에서 가져와야할 지 결정할 수 없습니다.
예를 들어 위의 SQL 문에서 그룹화에 사용하지 않은 age 컬럼을 SELECT문 뒤에 붙이면
다음과 같은 에러메세지가 뜹니다.
그룹화에 사용되지 않은 컬럼(nonaggregated column)이 SELECT 절에 존재하면 안 된다는 뜻입니다.
Error Code: 1055. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'copang_main.member.age' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
대신 집계함수는 사용할 수 있습니다.
SELECT 절 뒤에 age를 바로 쓸 순 없지만, AVG(age)처럼 집계 함수의 인자로 사용하는 건 괜찮습니다.
왜냐하면 각 그룹에서 특정 row의 age 값을 보여주는 게 아니라 그저 각 그룹 내 모든 row들의 age 컬럼값의 평균을 구하면 되기 때문입니다.
자, 이때까지의 내용을 정리하자면,
(1) GROUP BY 절 뒤에 쓴 컬럼 이름들만, SELECT 절 뒤에도 쓸 수 있다.
(2) 대신 SELECT 절 뒤에서 집계 함수에 그 외의 컬럼 이름을 인자로 넣는 것은 허용된다.
입니다.
SELECT 문의 실행 순서
- FROM : 어느 테이블을 대상으로 할 것인지를 먼저 결정합니다.
- WHERE : 해당 테이블에서 특정 조건(들)을 만족하는 row들만 선별합니다.
- GROUP BY : row들을 그루핑 기준대로 그루핑합니다. 하나의 그룹은 하나의 row로 표현됩니다.
- HAVING : 그루핑 작업 후 생성된 여러 그룹들 중에서, 특정 조건(들)을 만족하는 그룹들만 선별합니다.
- SELECT : 모든 컬럼 또는 특정 컬럼들을 조회합니다. SELECT 절에서 컬럼 이름에 alias를 붙인 게 있다면, 이 이후 단계(ORDER BY, LIMIT)부터는 해당 alias를 사용할 수 있습니다.
- ORDER BY : 각 row를 특정 기준에 따라서 정렬합니다.
- LIMIT : 이전 단계까지 조회된 row들 중 일부 row들만을 추립니다.