[MySQL] MySQL 정리 1
MySQL 소개
- MySQL은 가장 널리 사용되고 있는 관계형 데이터베이스 관리 시스템 (RDBMS:Realational DBMS)
- MySQL은 오픈 소스이며, 다중 사용자와 다중 스레드를 지원
- C언어, C++, JAVA, PHP 등 여러 프로그래밍 언어를 위한 다양한 API를 제공
- MySQL은 유닉스, 리눅스, 윈도우 등 다양한 운영체제에서 사용할 수 있으며, 특히 PHP와 함께 웹 개발에 자주 사용
- MySQL은 오픈 소스 라이센스를 따르기는 하지만, 상업적으로 사용할 때는 상업용 라이센스 구입 필요
SQL의 분류
DML(Data Manipulation Language)
- 데이터 조작 언어
- 데이터를 조작(선택, 삽입, 수정, 삭제)하는 데 사용되는 언어
- DML 구문이 사용되는 대상은 테이블의 행
- DML을 사용하기 위해서는 꼭 그 이전에 테이블이 정의되어 있어야 함
- SQL 문 중
SELECT, INSERT, UPDATE, DELETE
가 이 구문에 해당 - 트랜잭션(Transaction)이 발생하는 SQL도 이 DML에 속함
- 테이블의 데이터를 변경(입력, 수정, 삭제)할 때 실제 테이블에 완전히 적용하지 않고, 임시로 적용시키는것
- 취소 가능
DDL(Data Definition Language)
- 데이터 정의 언어
- 데이터베이스, 테이블, 뷰, 인덱스 등의 데이터베이스 개체를 생성 / 삭제 / 변경하는 역할
Create, Drop, ALTER
구문- DDL은 트랜잭션 발생시키지 않음
- ROLLBACK이나 COMMIT 사용 불가
- DDL문은 실행 즉시 MySQL에 적용
DCL(Data Control Language)
- 데이터 제어 언어
- 사용자에게 어떤 권한을 부여하거나 빼앗을때 주로 사용하는 구문
GRANT, REVOKE
구문
MySQL 구문
-
SHOW DATABASES;
현재 서버에 어떤 DB가 있는지 보기
-
USE database_name;
사용할 데이터 베이스 지정
지정해 놓은 후 특별히 다시
USE
문을 사용하지 않거나 다른 DB를 사용하겠다고 명시하지 않는 이상 모든 SQL문은 지정 DB에서 수행Workbench에서 직접 선택해 사용 가능 [Navigator] → [SCHEMAS] → 데이터베이스 선택
-
SHOW TABLES
데이터 베이스의 테이블 이름 보기
-
SHOW TABLE STATUS
데이터베이스의 테이블 정보 조회
-
DESCRIBE (DESC) table_name;
테이블에 무슨 열이 있는지 확인
일반적인 형식
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 [column_name] WHERE [table_name]
-
요구하는 데이터를 가져오는 구문 (일반적으로 가장 많이 사용되는 구문) → 원하는 정보 추출
-
여러 개의 열을 가져오고 싶을 때는 콤마로 구분 (전체 열 출력은
*
) -
열 이름의 순서를 출력하고 싶은 순서대로 배열 가능
SELECT * FROM city; SELECT Name, CountryCode FROM city;
-
DISTINCT
: 중복된 것은 1개씩만 보여주면서 출력, 테이블의 크기가 클수록 효율적SELECT DISTINCT CountryCode FROM city;
WHERE
-
조회하는 결과에 특정한 조건으로 원하는 데이터만 보고 싶을 때 사용
-
조건이 없을 경우 테이블의 크기가 클수록 찾는 시간과 노력이 증가
-
관계 연산자 사용 가능 → 연산자의 조합으로 데이터를 효율적으로 추출
- OR 연산자, AND 연산자, 조건 연산자(=, <, >, <=, >=, <>, !=), 관계 연산자(NOT, AND, OR)
-
BETWEEN
: 데이터가 숫자로 구성되어 있어 연속적인 값은BETWEEN ... AND
사용 가능SELECT * FROM city WHERE Population BETWEEN 7000000 AND 8000000;
-
IN
: 이산적인 값의 조건에서는IN()
사용 가능SELECT * FROM city WHERE Name IN('Seoul', 'New York', 'Tokyo');
-
LIKE
: 문자열의 내용 검색 →%
무엇이든 매치 /_
한 글자 매치SELECT * FROM city WHERE CountryCode LIKE 'KO_'; SELECT * FROM city WHERE Name LIKE 'Seo%'; SELECT * FROM city WHERE Name LIKE '%ork';
-
서브 쿼리 : 쿼리문 안에 또 쿼리문이 들어 있는 것, 서브 쿼리의 결과가 둘 이상이면 에러 발생
SELECT * FROM city WHERE CountryCode = (SELECT CountryCode FROM city WHERE Name = 'Seoul'); # CountryCode가 KOR인 결과 출력
-
ANY
: 서브쿼리의 여러 개의 결과 중 한가지만 만족해도 가능 (SOME
과ANY
는 동일한 의미로 사용 /=ANY
구문은IN
과 동일한 의미)SELECT * FROM city WHERE Population > ANY (SELECT Population From city WHERE District = 'New York'); # New York의 가장 인구수가 적은 지역보다 인구수가 많으면 모두 출력
-
ALL
: 서브쿼리의 여러 개의 결과를 모두 만족 시켜야 함SELECT * FROM city WHERE Population > ALL (SELECT Population FROM city WHERE District = 'New York'); # New York의 가장 인구수가 많은 지역보다 인구수가 많으면 모두 출력
ORDER BY
-
결과가 출력되는 순서를 조절하는 구문
-
기본적으로 오름차순 정렬, 내림차순으로 정력할 경우 열 이름 뒤에
DESC
, 혼합 가능SELECT * FROM city ORDER BY CountryCode, Population DESC; # CountryCode는 오름차순, Population은 내림차순으로 정렬되어 출력
LIMIT
-
출력 개수를 제한 → 상위의 N개만 출력하는
LIMIT N
구문SELECT * FROM city ORDER BY Population DESC LIMIT 10;
GROUP BY
-
그룹으로 묶어주는 역할
-
집계함수(Aggregate Function)를 함께 사용
- AVG() : 평균
- MIN() : 최소값
- MAX() : 최대값
- COUNT() : 행의 개수
- COUNT(DISTINCT) : 중복 제외된 행의 개수
- STDEV() : 표준 편차
- VARIANCE() : 분산
-
효율적인 그룹화가 가능하고 읽기 좋게 하기 위해 별칭(Alias) 사용
SELECT CountryCode, Max(Population) AS 'Popilation' FROM city GROUP BY CountryCode; # CountryCode가 같은 도시 중 가장 큰 인구 수를 출력 SELCT COUNT(*) FROM city; # city table의 전체 행 개수
-
WITH ROLLUP
: 총합 또는 중간 합계가 필요할 경우 사용SELECT CountryCode, Name, SUM(Population) FROM city GROUP BY CountryCode, Name WITH ROLLUP; # CountryCode 안 각 Name 인구수의 합계가 구해지고 각 CountryCode의 중간 합계 출력
HAVING
-
WHERE
과 비슷한 개념으로 조건 제한 -
집계 함수(그룹)에 대해서 조건 제한하는 편리한 개념
-
HAVING
절은 반드시GROUP BY
절 다음에 나와야함SELECT CountryCode, MAX(Population) FROM city GROUP BY CountryCode HAVING MAX(Population) > 8000000; # CountryCode로 묶인 그룹중에서 인구수가 8,000,000 이상일 경우 출력
JOIN
-
데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현
SELECT * FROM city JOIN country ON city.CountryCode = country.Code JOIN countrylanguage ON city.CountryCode = countrylanguage.CountryCode; # 세개의 테이블이 JOIN된 형태
댓글남기기