MySQL 정리

7 minute read

강의자료: https://www.youtube.com/watch?v=vgIc4ctNFbc

SHOW DATABASES

  • 현재 서버에 어떤 DB가 있는지 보기

USE

  • 사용할 데이터베이스 지정
  • 지정해 놓은 후 특별히 다시 USE문 사용하거나 다른 DB를 사용하겠다고 명시하지 않는 이상 모든 SQL 문은 지정 DB에서 수행
  • USE database_name;
  • 또는 Workbench에서 직접 선택해 사용 가능(네비게이터->스키마->데이터베이스 선택)

SHOW TABLE

  • SHOW TABLES;
  • 데이터베이스 world이 갖고있는 테이블 이름 보기

DESCRIBE(DESC)

  • city 테이블에 무슨 열이 있는지 확인
    • DESCRIBE city;
    • DESC city;
  • country 테이블과 countrylanguage 테이블 정보 보기
    • DESC country;
    • DESC countrytablelanguage;

SELECT

  • 요구하는 데이터를 가져오는 구문
  • SELECT select_expr [FROM table_references] [WHERE where_condition] [GROUP BY {col_name | expr | position}] [HAVING where_condition] [ORDER BY {col_name | expr | position}]

SELECT *

  • 테이블에 있는 모든 열 다 가져옴

SELECT FROM WHERE

  • SELECT 필드이름 FROM 테이블이름 WHERE 조건식;
  • SELECT Name, Population FROM city WHERE Population > 10000000;
  • 한국에 있는 도시들 보기
    • SELECT * FROM city WHERE CountryCode=’KOR’;
  • 한국에 있는 도시들 중에 인구수가 1,000,000 이상인 도시 보기
    • SELECT * FROM city WHERE CountryCode=’KOR’ AND Population >= 1000000;

MySQL 함수 및 연산자

https://dev.mysql.com/doc/refman/8.0/en/functions.html

BETWEEN

  • 데이터가 숫자로 구성되어 있어 연속전인 값은 BETWEEN…AND 사용 가능
  • SELECT * FROM city WHERE Population BETWEEN 7000000 AND 8000000;

IN

  • SELECT * FROM city WHERE Name IN (‘Seoul’, ‘New York’);
  • 한국, 미국, 일본의 도시들 보기
    • SELECT * FROM city WHERE CountryCode IN (‘KOR’, ‘USA’, ‘JPN’);

LIKE

  • 문자열의 내용 검색
  • %: 문자 뒤에 무엇이든 허용
  • _: 한 글자와만 매치
  • SELECT * FROM city WHERE CountryCode LIKE ‘KO_’;

Sub Query

  • 쿼리문 안의 쿼리. 서브쿼리 결과가 둘 이상이면 에러발생
  • 서울이 있는 나라의 국가코드와 같은 국가코드를 갖고있는 모든 결과 출력
  • SELECT * FROM city WHERE CountryCode = (SELECT CountryCode FROM city WHERE Name = ‘Seoul’);

ANY

  • 서브쿼리의 여러개의 결과 중 한 가지만 만족해도 가능
  • SOME은 ANY와 동일한 의미
  • =ANY는 IN과 동일한 의미
  • SELECT * FROM city WHERE Population >ANY (SELECT Population FROM city WHERE Name = ‘Seoul’);

ALL

  • 서브쿼리의 여러 개의 결과를 모두 만족시켜야 함
  • SELECT * FROM city WHERE Population >ALL (SELECT Population FROM city WHERE Name = ‘Seoul’);

ORDER BY

  • 결과가 출력되는 순서
  • 오름차순 ASC, 내림차순 DESC, 아무것도 안쓰면 기본으로 ASC
  • SELECT * FROM city ORDER BY Population DESC;
  • 혼합구문도 가능
  • SELECT * FROM city ORDER BY CountryCode ASC, Population DESC;
  • 인구수로 내림차순하여 한국에 있는 도시 보기
    • SELECT * FROM city WHERE CountryCode=’KOR’ ORDER BY Population DESC;
  • 국가 면적 크기로 내림차순하여 나라 보기
    • SELECT * FROM country ORDER BY SurfaceArea DESC;

DISTINCT

  • 중복된 것은 1개씩만 보여주면서 출력
  • 국가코드 중복없이 하나씩만 출력하기
    • SELECT DISTINCT CountryCode FROM city;

LIMIT

  • 출력개수 제한
  • SELECT * FROM city ORDER BY Population DESC LIMIT 10;

GROUP BY

  • 그룹으로 묶어줌, 집계함수 함께 사용
  • AVG()-평균, MIN()-최소값, MAX()-최대값, COUNT()-행의 개수, COUNT(DISTINCT)-중복 제외된 행의 개수, STDEV()표준편차, VARIANCE()-분산
  • AS쓰면 열 이름 새로 정할 수 있음
  • 국가코드 기준으로 그룹화해서 국가코드별로 인구수 최대값 집계하면서 그 열의 값은 Population으로 하기
    • SELECT CountryCode, MAX(Population) AS ‘Population’ FROM city GROUP BY CountryCode;
  • 도시는 몇개인가?
    • SELECT COUNT(*) FROM city;
  • 도시들의 평균 인구수는?
    • SELECT AVG(Population) FROM city;

HAVING

  • WHERE 과 비슷한 조건제한인데, 집계함수에 대해서 조건제한하는 것. 따라서 반드시 GROUP BY 뒤에 쓰임
  • SELECT CountryCode, Max(Population) FROM city GROUP BY CountryCode HAVING MAX(Population) > 8000000;

ROLLUP

  • 총합 또는 중간합계를 보여줌
  • GROUP BY 절과 함께 WITH ROLLUP문 사용
  • SELECT CountryCode, Name, SUM(Population) FROM city GROUP BY CountryCode, Name WITH ROLLUP;

JOIN

  • 데이터베이스 내의 여러 테이블에서 가져온 레코드(테이블)들을 조합하여 하나의 테이블이나 결과집합으로 표현. 조건을 줄때 ON 사용
  • city 테이블을 country테이블과 조인, 근데 city의 국가코드와 country의 국가코드가 같은걸 기준으로 조인할 것
    • SELECT * FROM city JOIN country ON city.CountryCode = country.Code;
  • city, country, countrylanguage 테이블 3개 조인
    • SELECT * FROM city JOIN country ON city.CountryCode = country.Code JOIN countrylanguage ON city.CountryCode = countrylanguage.CountryCode;

MySQL 내장함수

  • 문자열 함수
  • 수학 함수
  • 날짜와 시간 함수

LENGTH()

  • 전달받은 문자열의 길이를 반환
  • SELECT LENGTH(‘abc’)

CONCAT()

  • 전달받은 문자열 결합해 하나로 반환, 그중 하나라도 NULL이면 NULL 반환
  • SELECT CONCAT(‘hello’, ‘world’)

LOCATE()

  • 문자열 내에서 찾는 문자열이 처음으로 나타나는 위치를 반환
  • 찾는게 없으면 0 반환
  • 문자열 시작인덱스는 0이 아니라 1
  • SELECT LOCATE(‘abc’, ‘avcabcaaa’)

LEFT(), RIGHT()

  • LEFT(): 문자열의 왼쪽부터 지정한 개수만큼의 문자를 반환
  • RIGHT(): 문자열의 오른쪽부터 지정한 개수만큼의 문자를 반환
  • SELECT LEFT(‘abcabcabcabc’, 3)

LOWER(), UPPER()

  • LOWER(): 문자열의 문자를 모두 소문자로 변경
  • UPPER(): 문자열의 문자를 모두 대문자로 변경
  • SELECT LOWER(‘ABCABC’)

REPLACE()

  • 문자열에서 특정 문자열을 대체 문자열로 교체
  • MSSQL을 MySQL로 교체
    • SELECT REPLACE(‘MSSQL’, ‘MS’, ‘My’)

TRIM()

  • 문자열의 특정 문자를 제거
  • BOTH: 문자열의 양 끝의 특정문자 제거(디폴트)
  • LEADING: 문자열의 앞에 존재하는 특정문자 제거
  • TRAILING: 문자열의 뒤에 존재하는 특정문자 제거
  • 제거할 문자 명시 안하면 자동으로 공백 제거
  • SELECT TRIM(‘ MySQL ‘), TRIM(LEADING ‘#’ FROM ‘###MySQL###’), TRIM(TRAILING ‘#’ FROM ‘###MySQL###’);

FORMAT()

  • 숫자 타입을 세 자리마다 쉼표로 구분
  • 반환 형식은 문자열 타입
  • 두번째 인수는 반올림할 소수 부분의 자릿수
  • SELECT FORMAT(123123.123123, 3);

FLOOR(), CEIL(), ROUNT()

  • FLOOR(): 내림
  • CEIL(): 올림
  • ROUND(): 반올림
  • SELECT FLOOR(10.95), CEIL(10.95), ROUND(10.95)

SQRT(), POW(), EXP(), LOG()

  • SQRT(): 양의 제곱근
  • POW(): 첫 번째 인수는 밑수, 두번째 인수는 지수 -> 거듭제곱 계산
  • EXP(): 지수를 전달받아 e의 거듭제곱 계산
  • LOG(): 자연로그 값 계산
  • SELECT SQRT(4), POW(2,3), EXP(3), LOG(3)

SIN(), COS(), TAN()

  • SELECT SIN(PI()/2), COS(PI()), TAN(PI()/4)

ABS(), RAND()

  • ABS(): 절대값
  • RAND(): 0.0~1.0사이의 랜덤실수 생성. ROUND로 반올림하고 RAND에 100곱해서 0~100사이의 랜덤수 생성할수도 있음
  • SELECT ABS(-3), RAND(), ROUND(RAND()*100, 0)

NOW(), CURDATE(), CURTIME()

  • NOW(): 현재 날짜와 시간
  • CURDATE(): 현재 날짜
  • CURTIME(): 현재 시각

DATE(), MONTH(), DAY(), HOUR(), MINUTE(), SECOUND()

  • DATE(): 날짜정보
  • MONTH(): 월 정보 0~12
  • DAY(): 일 정보, 0~31
  • HOUR(): 시간 정보, 0~23
  • MINUTE(): 분 정보, 0~59
  • SECOUND(): 초 정보, 0~59
  • SELECT NOW(), DATE(NOW()), SECOND(NOW())

MONTHNAME(), DATNAME()

  • MONTHNAME(): 월에 해당하는 이름 반환
  • DATNAME(): 요일에 해당하는 이름 반환
  • SELECT NOW(), MONTHNAME(NOW())

DAYOFWEEK(), DAYOFMONTH(), DAYOFYEAR()

  • DAYOFWEEK(): 일자가 해당 주에서 몇번째 날인지 반환. 1~7, 일~토
  • DAYOFMONTH(): 일자가 해당 월에서 몇번째 날인지 반환, 0~31
  • DAYOFYEAR(): 일자가 해당 연도에서 몇번째 날인지 반환, 1~366
  • SELECT NOW(), DAYOFMONTH(NOW())

DATE_FORMAT()

  • 전달받은 형식에 맞춰 날짜와 시간 정보를 문자열로 반환
  • SELECT DATE_FORMAT(NOW(), ‘%D %y %a %d %m %n %j’)

CREATE TABLE AS SELECT

  • city 테이블과 똑같은 city2 테이블 생성
  • CREATE TABLE city2 AS SELECT * FROM city;

CREATE DATABASE

  • 새로운 데이터베이스 생성, USE로 새 데이터베이스 사용
  • workbencch에서 gui로 테이블들 생성 가능
  • CREATE DATABASE chaelin;
  • USE chaelin;

데이터 타입

https://dev.mysql.com/doc/refman/8.0/en/data-types.html

CREATE TABLE

  • workbencch에서 gui로 테이블들 생성 가능
  • 또는 직접 써서 가능
  • CREATE TABLE test2( id INT NOT NULL PRIMARY KEY, col1 INT NULL, col2 FLOAT NULL, col3 VARCHAR(45) NULL )

ALTER TABLE

  • ALTER TABLE 문과 함께 ADD 문을 사용하면 테이블에 컬럼 추가 가능
  • MODIFY 사용하면 컬럼 수정 가능
  • DROP 사용하면 컬럼 삭제 가능
  • ALTER TABLE test2 ADD col4 INT NULL;
  • ALTER TABLE test2 MODIFY col4 VARCHAR(20) NULL;
  • ALTER TABLE test2 DROP col4;

Index

  • 테이블에서 원하는 데이터를 빠르게 찾기 위해 사용
  • 검색, 질의 시 테이블 전체를 안읽기 때문에 빠름
  • 설정된 컬럼 값을 포함한 데이터의 삽입, 삭제, 수정 작업이 원본 테이블에서 이루어질 경우 인덱스도 함께 수정되어야 함
  • 인덱스가 있는 테이블은 처리 속도가 느려질 수 있으므로 수정보다는 검색이 많이 쓰이는 테이블에 사용

CREATE INDEX

  • 인덱스를 생성
  • CREATE INDEX Col1Idx ON test(col1);

SHOW INDEX

  • 인덱스 정보보기
  • SHOW INDEX FROM test;
  • 기본적인 Primary키와 우리가 만든 Col1Idx가 생성된 것을 볼 수 있음

CREATE UNIQUE INDEX

  • 중복 값을 허용하지 않는 인덱스
  • 다음을 실행하면 Non_unique가 0으로 뜸. 즉 유니크하단것
  • CREATE UNIQUE INDEX Col2Idx ON test(col2);

FULLTEXT INDEX

  • 일반적인 인덱스와 달리 매우 빠르게 테이블의 모든 텍스트 컬럼을 검색
  • 다음을 싫애하면 Index_type에 FULLTEXT라고 뜸
  • ALTER TABLE test ADD FULLTEXT Col3Idx(col3);

INDEX 삭제(ALTER)

  • ALTER TABLE test DROP INDEX Col3Idx;

INDEX 삭제(DROP INDEX)

  • DROP문은 내부적으로 ALTER 문으로 자동 변환되어 명시된 이름의 인덱스를 삭제
  • test테이블에 있는 인덱스 삭제
    • DROP INDEX Col2Idx ON test;

VIEW

  • 뷰는 데이터베이스의 가상 테이블
  • 실제 테이블처럼 행과 열을 가지고 있지만 실제로 데이터 저장 x
  • 다른 테이블이나 다른 뷰에 저장된 데이터를 보여주기만 함
  • 뷰를 사용해 여러 테이블이나 뷰를 하나의 테이블처럼 볼 수 있음
  • 뷰의 장점
    • 특정 사용자에게 테이블 전체가 아닌 필요한 컬럼만 보여줌
    • 복잡한 쿼리 단순화
    • 쿼리 재사용 가능
  • 뷰의 단점
    • 한번 정의된 뷰 변경 x
    • 삽입, 삭제, 갱신에 제한사항 많음
    • 자신만의 인덱스 x

CREATE VIEW

  • test테이블에 Col1, Col2를 가지는 뷰 생성
  • CREATE VIEW testView AS SELECT Col1, Col2 FROM test;
  • SELECT * FROM testView;

ALTER VIEW

  • 뷰를 수정
  • ALTER VIEW testView AS SELECT Col1, Col2, Col3 FROM test;

DROP VIEW

  • 뷰를 삭제
  • DROP VIEW testView

city, country, countrylanguage 테이블을 조인하고, 한국에 대한 정보만 뷰 생성하기

  • USE world
  • CREATE VIEW allView AS SELECT city.Name, country.SurfaceArea, city.Population, countrylanguage.Language FROM city JOIN country ON city.CountryCode = country.Code JOIN countrylanguage ON city.CountryCode = countrylanguage.CountryCode WHERE city.CountryCode=’KOR’;
  • SELECT * FROM allView;

INSERT

  • 테이블 이름 다음에 나오는 열 생략 가능
  • 생략할 경우 VALUE 다음에 나오는 값들의 순서, 개수가 테이블이 정의된 열 순서, 개수와 동일해야 함
  • INSERT INTO test VALUE(1, 123, 1.1, “Test”);
  • SELECT * FROM test;
  • 또는 워크벤치에서 테이블에 gui로 직접 입력

INSERT INTO SELECT

  • test 테이블에 있는 내용을 test2 테이블에 삽입(복사)
  • INSERT INTO test2 SELECT * FROM test;
  • SELECT * FROM test2;

UPDATE

  • 기본에 입력되어 있는 값 변경하는 구문
  • WHERE 절 생략 가능하나 테이블의 전체 행의 내용 변경됨. 꼭 WHERE절 쓸 것.
  • UPDATE test SET col1=1, col2=1.0, col3=’test’ WHERE id=1;
  • SELECT * FROM test;

DELETE

  • 행 단위로 데이터 삭제
  • DELETE FROM 테이블이름 WHERE 조건;
  • WHERE 조건 안쓰면 전체 날아감
  • 데이터는 지워지지만 테이블 용량은 줄어들지 않고, 원하는 데이터만 지울 수 있고, 삭제후 복구 가능
  • DELETE FROM test WHERE id=1;
  • SELECT * FROM test;

TRUNCATE

  • 용량 줄어들고, 인덱스 등 모두 삭제
  • 테이블은 삭제하지않고 데이터만 삭제
  • 한꺼번에 다 지워야하고, 삭제 후 복구 불가
  • TRUNCATE TABLE test;

DROP TABLE

  • 테이블 전체를 삭제, 공간, 객체 삭제
  • 삭제 후 복구 불가
  • DROP TABLE test;

DROP DATABASE

  • 데이터베이스를 삭제
  • DROP DATABASE chaelin;

자신만의 연락처 테이블 만들기(이름, 전화번호, 주소, 이메일)

INSERT INTO information VALUE(1, “chaelin”, 01012345678, “서울시”, “abc@abc.com”);

SELECT * FROM information; ```

Categories:

Updated: