SQL이란 DBMS에서 데이터를 질의하기 위해 만들어진 언어이다. 크게 다음과 같이 3가지로 분류된다.
- DDL (Data Definition Language) : 데이터를 정의하기 위한 언어로, CREATE, DROP, ALTER, TRUNCATE 등으로 시작하는 Query 문이 속한다.
- DML (Data Manipulation Language) : 데이터를 다루기 위한 언어로 흔히 말하는 CRUD 에 해당하는 SELECT, INSERT, UPDATE, DELETE 등 Query 문이 속한다.
- DCL (Data Control Language) : 데이터를 관리하기 위한 언어로 주로 사용자에게 권한을 부여하거나 철회할 수 있는 GRANT, REVOKE 등의 Query 문이 있다.
실제로 사용하면서 유용하게 썼던 SQL 쿼리문들을 정리해두었다. 실무에서도 응용해서 사용하면 크게 무리는 없었던 것 같다.
인터넷을 돌아다니다 발견할 수 있는 Geek 한 것들을 모아두진 않았다.
- 접속 방법
: mysql -u root -p (dbname)
- 비밀번호 변경
: mysqladmin -u root password 새로운 비밀번호
- 테이블의 생성
: create table {테이블이름}({칼럼명} {칼럼타입});
(ex) CREATE TABLE member (
id int(11) NOT NULL,
);
- 구조 보기
: desc 테이블 / explain 테이블 / show create table {테이블명}
- 이름 변경
: rename table {테이블명A} to {테이블명B}
- 삭제
: drop table {테이블명}
- 레코드 삽입
: Insert into {테이블명} values(v1, v2) / Insert into table(col1, col2) values(v1, v2);
- 조회
: select * from table {테이블명}
> AS : 칼럼의 이름을 달리 명명해서 출력. (ex) Col1 as 'name'
> Desc : 내림차순, Asc : 오름차순 (ORDER BY)
> LIMIT 10 : 0~10 까지 레코드 수 제한. / LIMIT 100, 10 : 100~110까지 레코드 범위
- 수정
: Update {테이블명} set col1 = 칼럼1 where 조건
- 삭제
: Delete from {테이블명} where 조건
- 칼럼 추가
: Alter table {테이블명} add col3 varchar(255) not null.
- 칼럼 삭제
: Alter table {테이블명} drop col3
- 칼럼 수정
: Alter table {테이블명} modify col3 char(50) not null.
- In : 원하는 필드값만을 선택 추출하는데 사용되는 그룹 조건문
- 조인
(1) Inner join
: Select * from tableA inner join tableB on tableA.col1 = tableB.col1
=> tableA의 col1과 tableB의 col1이 일치하는 데이터만을 출력. ON 절의 조건이 일치하는 조인테이블의 결과만을 출력한다.
(2) Outer join
: Select * from tableA left outer join tableB on tableA.col1 = tableB.col1
=> tableA.col1이 존재하나 tableB.col1이 존재하지 않으면 tableB.col1 = NULL인 상태로 출력. 조인하는 테이블의 ON 절 조건 중 한쪽의 모든 데이터를 가져옴(LEFT JOIN , RIGHT JOIN) 양쪽(FULL JOIN)
- 내장함수 Benchmark
: Select Benchmark(반복횟수, 실행쿼리)
(ex) Select Benchmark(100, (“select * from table”)); => 해당 쿼리를 100번 반복한 벤치마크 결과를 출력.
- DISTINCT
: 주로 UNIQUE한 COLUMN이나 TUPLE을 조회할 때 사용되는 키워드. 칼럼을 DISTINCT 를 이용하여 조회한다면 중복을 제거한 값들을 바로 얻을 수 있다. 단 이 때, 여러 개의 칼럼을 지정한다면 칼럼의 조합이 중복되는 것을 제외한다. DISTINCT는 함수처럼 WHERE이 아닌 HAVING 조건식에도 사용이 가능하다.
(ex) Select DISTINCT email from table;
(ex) SELECT class FROM courses GROUP BY(class) HAVING count(distinct student) >= 5;
- GROUP BY
: 데이터를 그루핑해서 결과를 가져오는 경우 사용. 내부적으로 중복값을 배제한채 정렬된 결과를 가져온다. 주로 HAVING과 같이 사용되며 그룹으로 묶어서 자체 정렬한다. 좀 더 정확히는 그룹의 대표값을 정렬해서 가져온다. 그렇기 때문에 모든 컬럼에 대해 단순 SELECT 하는 쿼리문에는 쓰기 적절치 않으며 테이블 내에서 데이터를 가공할 때 사용하기가 좋다. 예를 들어 accountType에 따라 해당하는 accountName의 row수를 그루핑 하고 싶다면 다음 쿼리를 사용해보자. Select accountType, COUNT(accountName) from accounts group by(accountType);
- HAVING
: HAVING은 GROUP BY 와 같이 쓰이는 구문으로 GROUP BY의 조건문이라 할 수 있다. 위의 쿼리에서 COUNT가 1개 이상인 내용만 쿼리를 하는데 다음처럼 사용 가능하다. SELECT accountType, COUNT(accountName) FROM accounts GROUP BY(accountType) HAVING COUNT(accountName) > 1; HAVING의 시점은 GROUPING이 끝난 이후이고 WHERE 절과 다르게 HAVING 절은 통계함수를 포함할 수 있다.
HAVING은 () 를 안 싸는 것이 좋다. 버전에 따라 오작동 위험이 있는듯하다 ;;
WHERE 구문과 같이 사용할 때, WHERE 구문이 먼저 적용되고 난 다음의 조건 결과에 대해 GROUP BY ~ HAVING 조건문이 걸린다. HAVING 조건문은 그룹화되어진 필드들에 대해 적용된다.
- SubQuery 사용법
: 복잡한 쿼리문을 만들 때 많이 사용하게 되는 구문이 서브쿼리문이다. 서브쿼리의 사용은 Nested Loop 를 돌기 때문에 사용에 주의하자.
(ex) SELECT accountInfo from accounts where accountName in (select accountName from accountNames); //accountNames 테이블에 있는 이름에 대해서만 accountInfo를 조회하는 쿼리(Validation)
간단한 쿼리문 들이라 대부분 자주 쓰다보니 외워진 상태이지만, SQL에 막 입문하는 사람이거나 쿼리문에 익숙하지 않은 분들은 이 내용만 알게되어도 어느정도 복잡한 쿼리문도 다룰 수 있을 것이다.
'Database > MySQL' 카테고리의 다른 글
RDB - MySQL 에서의 Primary Key 란? (0) | 2018.08.08 |
---|---|
MySQL 의 데이터 타입 캐스팅 (0) | 2018.08.07 |
RDB 의 데이터베이스 설계 시작하기 (0) | 2018.08.07 |
RDBMS의 관계 - Identifying & Non-Identifying Relationship 에 대하여 (2) | 2018.08.04 |
RDBMS? MySQL 은 어떤 소프트웨어일까 (0) | 2018.08.03 |