웹 백엔드 개발/MySQL
[MySQL] SQL Tutorial Course - Basic Part
iinana
2025. 2. 20. 12:44
728x90
아래 영상을 시청하며 공부한 MySQL 공부 내용이다.
https://www.youtube.com/watch?v=vgIc4ctNFbc
1. SQL의 분류
- DML (Data Manipulation Language) : 데이터 조작 언어 (SELECT, INSERT, UPDATE, DELETE)
- DDL (Data Definition Language) : 데이터 정의 언어 (CREATE, DROP, ALTER), 데이터베이서 개체를 생성/삭제/변경하는 역할을 한다.
- DCL (Data Control Language) : 데이터 제어 언어 (GRANT, REVOKE), 권한 설정 관련된 역할을 한다.
2. 기본 명령문
- SHOW DATABASE : 연결된 데이터베이스 보여주기
- USE {database_name} : 해당 데이터베이스에서 SQL문 실행하는 것으로 지정
- SHOW TABLES : 지정된 데이터베이스 내 테이블 이름 보기
- SHOW TABLE STATUS : 테이블의 상태(어떤 엔진을 쓰는지, 버전, row의 개수 등)를 보기
- DESCRIBE {table_name} or DESC {table_name} : 특정 테이블에 어떤 열이 있는지 확인
3. SELECT 문 (중요⭐)
3.1. 기본 구조
SELECT 문으로 특정한 열을 선택(특수문자 '*'을 사용할 경우 전체 열을 의미)하고, 나머지 조건들을 함께 설정하여, table에서 가져올 데이터를 정한다.
SELECT {selecting_col_name}
[ FROM {table_name} ]
[ WHERE {where_condition} ]
[ GROUP BY {col_name | expr | position} ]
[ HAVING {where_condition} ]
[ ORDER BY {col_name | expr | position} ]
3.2. FROM : 어떤 table에서 가져올지 지정
SELECT Name, Population
FROM city
3.3. WHERE : 행 조건 설정 (작성한 조건에 맞는 특정한 행만 선택하고 싶을 때)
조건연산자(=, <, > 등)나 관계연산자(NOT, AND, OR)와 함께 많이 사용.
SELECT *
FROM city
WHERE Population >= 7000000
AND Population < 8000000;
- BETWEEN {num1} AND {num2} : 연속적인 범위를 지정할 때 많이 사용 (아래 코드가 위 코드와 똑같이 작동)
SELECT *
FROM city
WHERE Population BETWEEN 7000000 AND 8000000
- IN(a, b, c ...) : 이산적인 값의 조건에서 사용
SELECT *
FROM city
WHERE Name IN('Seoul', 'New York', 'Tokyo')
- LIKE 연산자 : 문자열의 내용을 검색하고자 사용 (글자 개수 지정 시, 한 글자 당 _ 하나로 표현, 비지정 시 %로 사용)
SELECT *
FROM city
WHERE CountryCode LIKE 'KO_'
SELECT *
FROM city
WHERE Name = '%NA%' #이름에 NA를 포함하는 모든 city
- SubQuery
SELECT *
FROM city
WHERE CountryCode = ( SELECT CountryCode
FROM city
WHERE Name = 'Seoul' );
/* SubQuery의 결과값이 복수개인 경우
- ANY or SOME 사용(New York 주 내의 도시들의 Population 중 하나라도 더 작으면 해당) */
SELECT *
FROM city
WHERE Population > ANY ( SELECT Population
FROM city
WHERE District = 'New York' );
/* SubQuery의 결과값이 복수개인 경우
- ALL 사용(New York 주 내의 도시들의 Population 모두보다 더 커야 해당) */
SELECT *
FROM city
WHERE Population > ALL ( SELECT Population
FROM city
WHERE District = 'New York' );
3.4. ORDER BY : 결과가 출력되는 순서를 조절
default는 ASC(오름차순)이고 생략 가능함. DESC(내림차순)은 생략 불가능함.
SELECT *
FROM city
ORDER BY Population DESC
ORDER BY 구문을 혼합해서 사용 가능함.
SELECT *
FROM city
ORDER BY CountryCode ASC, Population DESC
LIMIT {num} 과 함께 사용 용이 (상위의 N개만 출력) 아래는 인구수가 가장 적은 10개의 도시를 보여줌.
SELECT *
FROM city
ORDER BY Population DESC
LIMIT 10
3.5. GROUP BY : 그룹으로 묶어주는 역할
집계 함수(Aggregate Function)를 함께 사용하는 경우가 많음.
AVG(), MIN(), MAX(), STDEV(), VARIANCE()
COUNT() : 행의 개수
COUNT(DISTINCT) : 중복 제외 행의 개수
SELECT CountryCode, MAX(Population) AS 'max population'
FROM city
GROUP BY CountryCode
- HAVING {aggregate condition} : 집계함수에 대해서 조건을 제한하는 개념 (반드시 GROUP BY절 다음에 나와야 함)
SELECT CountryCode, MAX(Population)
FROM city
GROUP BY CountryCode
HAVING MAX(Population) > 8000000
- ROLLUP : 총합 도는 중간합계가 필요할 경우 사용. 아래 코드처럼 작성하면, CountryCode가 같은 것끼리 모여서 보이되, 원 데이터도 모두 보이고, CountryCode가 같은 것끼리의 Population 합계가 중간에 추가된다.
SELECT CountryCode, Name, SUM(Population)
FROM city
GROUP BY CountryCode, Name WITH ROLLUP
3.7. 기타
- DISTICT {col_name} : 중복된 것은 하나씩만 보여주면서 출력
SELECT DISTINCT CountryCode
FROM city;
- JOIN {table_name} ON {standard_col} : 데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 표현
SELECT *
FROM city
JOIN country ON city.CountryCode = country.Code
# city의 CountryCode와 country의 Code가 같은 것을 기준으로 Join
4. MySQL 내장함수
4.1. 문자열 함수
- LENGTH('{string}') : 전달받은 문자열의 길이를 반환
- CONCAT('{string1}', '{string2}', '{string3}' ...) : 전달받은 문자열을 모두 결합하여 하나의 문자열로 반환 (하나라도 NULL이 존재하면 NULL 반환)
- LOCATE('{string_to_find}', '{string_find_from}') : 첫 번째 문자열이 두 번째 문자열에서 처음으로 나타나는 위치를 반환 (존재하지 않으면 0을 반환, 시작인덱스=1)
- LEFT('{string}', {num}) / RIGHT('{string}', {num}) : 문자열의 왼쪽/오른쪽부터 지정한 개수만큼의 문자를 반환
- LOWER('{string}') / UPPER('{string}') : 문자열의 문자를 모두 소문자/대문자로
- REPLACE( '{string1}', '{string2}', '{string3}' ) : 첫번째 문자열에서 두번째 문자열 부분을 세 번째 문자열로 변경
- TRIM() : 문자열의 앞/뒤/양/옆에 있는 특정 문자를 제거
SELECT TRIM(' MySQL '), #공백 제거
TRIM(LEADING '#' FROM '###MySQL###'), #MySQL 앞의 샵(#) 제거
TRIM(TRAILING '#' FROM '###MySQL###'), #MySQL 뒤의 샵(#) 제거
TRIM(BOTH '#' FROM '###MySQL###'); #MySQL 양 옆의 샵(#) 제거
4.2. 수학 함수
- FORMAT({num_to_transfrom}, {num_to_round}) : 숫자 타입의 데이터를 세 자리마다 쉼표를 사용하는 형식의 문자열로 변환하여 반환 (두 번째 숫자는 반올림할 소수 자릿수)
- FLOOR({num}), CEIL({num}), ROUND({num}) : 내림, 올림, 반올림
- SQRT({num}), POW({base}, {exponent}), EXP({num}), LOG({num}) : 양의 제곱근, 거듭제곱, e의 거듭제곱, 자연로그
- SIN({num}), COS({num}), TAN({num}) : 삼각함수 (사인, 코사인, 탄젠트)
- PI() : 파이값 반환
- ABS({num}) : 절댓값 반환
- RAND() : 0.0보다 크거나 같고 1.0보다 작거나 같은 하나의 실수를 무작위로 생성
SELECT ROUND(RAND()*100, 0) #0부터 100까지 정수 중 랜덤값 추출
4.3. 날짜와 시간 함수
- NOW() : 현재 날짜와 시간을 반환 (YYYY-MM-DD HH:MM:SS || YYYYMMDDHHMMSS)
- CURDATE() : 현재 날짜를 반환 (YYYY-MM-DD || YYYYMMDD)
- CURTIME() : 현재 시각을 반환 (HH:MM:SS || HHMMSS)
SELECT NOW(), CURDATE(), CURTIME();
- DATE({time_info}) : 전달받은 값에 해당하는 날짜 정보 반환
- MONTH({time_info}) : 전달받은 값의 월 반환 (0~12)
- DAY({time_info}) : 전달받은 값의 일 반환 (0~31)
- HOUR({time_info}) : 전달받은 값의 시간을 반환 (0~23)
- MINUTE({time_info}) : 전달받은 값의 분을 반환 (0~59)
- SECOND({time_info}) : 전달받은 값의 초를 반환 (0~59)
SELECT
DATE(NOW()),
DAY(NOW()),
HOUR(NOW()),
SECOND(NOW());
- MONTHNAME({time_info}) : 월에 해당하는 이름을 반환
- DAYNAME({time_info}) : 요일에 해당하는 이름을 반환
SELECT MONTHNAME(NOW()), DAYNAME(NOW());
- DAYOFWEEK({time_info}) : 해당 주의 몇 번째 날인지 (일요일=1 ~ 토요일=7)
- DAYOFMONTH({time_info}) : 해당 월의 몇번째 날인지 (0~31)
- DAYOFYEAR({time_info}) : 해당 연도의 몇번째 날인지 (1~366)
SELECT
DAYOFWEEK(NOW()),
DAYOFMONTH(NOW()),
DAYOFYEAR(NOW());
- DATE_FORMAT({time_info}, {date_format}) : 전달받은 형식에 맞춰 날짜와 시간 정보를 문자열로 반환
SELECT
DATE_FORMAT(NOW(), '%D %y %a %d %m %j')
/* 2018년 11월 27일 2시 24분 15초일 경우
%D : 27th (날짜)
%y : 18 (연도 끝 두자리)
%a : Tue (요일)
%d : 27 (일)
%m : 11 (월)
%j : 331 (연도의 몇번째 날인지) */
728x90