2020. 2. 10. 14:43ㆍMySQL
select문에 들어가기 앞서...
RDBMS에서는 데이터베이스 조작을 위해 SQL문을 명령어로 사용한다.
SQL문을 세 가지로 분류할 수 있다.
DML(Data Manipulation Language) |
•테이블의 행을 조작(선택, 삽입, 수정, 삭제) •트랜잭션 발생: 트랜잭션 제어어(TCL: Transaction Control Language): DML을 사용할 때 실제 테이블에 완전히 적용하지 않고, 임시로 적용시킴 COMMIT/ ROLLBACK/ SAVEPOINT |
SELECT INSERT UPDATE DELETE |
DDL(Data Definition Language) |
•데이터베이스 개체를 조작(생성, 삭제, 변경) •트랜잭션이 없어서 실행 즉시 MySQL에 적용 |
CREATE ALTER DROP RENAME TRUNCATE |
DCL |
•데이터베이스에 접근하고 객체들을 사용하도록 권한을 부여하고 회수하는 명령어 |
GRANT REVOKE |
SQL문의 특징이 있다.
- 대소문자를 구분하지 않는다: USE, use, uSE를 모두 동일하게 인식한다.
- MySQL의 주석: 주석으로 묶으면 글자들이 회색이 된다.
-한줄 주석: --
-블록 주석: /* */
- 열 이름에 별칭(Alias)을 지정할 수 있다: select first_name as ‘이름’ from employees;
- 식별자(데이터베이스 개체의 이름)를 만들 때 규칙:
-a-z, A-Z, 0-9, $, _를 사용할 수 있다.
-최대 64자로 제한
-예약어를 사용할 수 없다.
-공백을 사용하려면 백틱(``)으로 묶어서 사용한다.
-의미 있는 이름을 짓되 너무 길거나 짧은 것은 좋지 않다.
DML 중 테이블의 행을 선택할 수 있는 SELECT문에 대해서 알아본다.
MySQL 5.7버전 document에서 가져온 SELECT문이다.
보이는 것이 SELECT문의 거의 전부이다.
가장 기본적으로 사용하는 것이 select * from tablename; 인데
이 외에도 사진에서 보듯 다양한 옵션을 붙일 수 있다.
DB를 먼저 선택한다.
employees DB에서 테이블의 정보를 확인한다.
- FROM
맨 처음 언급했던 가장 기본적으로 쓰이는 select * from tablename; 형태이다.
*는 모든 행을 뜻한다.
from은 지정한 테이블에서 찾는다는 의미이다.
- AS
as를 사용하면 그 행의 alias(별칭)을 지정할 수 있다. 보다 쉽게 불러오기 위하여..
- WHERE
where은 조건을 붙이는 것이다. DB 테이블에서 이름이 김경호인 행을 찾는다.
- 연산자 사용
다음은 연산자를 사용하여 행을 선택하는 것이다.
연산자의 종류는 두 가지로 나눌 수 있다.
조건 연산자 |
=, <, >, <=, <=, <>, != 등 |
관계 연산자 | NOT, AND, OR 등 |
- BETWEEN ... AND
between과 and를 사용하면 조건연산자를 사용하지 않고도 범위를 정할 수 있다.
- IN()
in은 or 조건연산자를 보다 쉽게 사용할 수 있게 한다.
- LIKE
like는 검색할 때 쓰는 예약어이다. 글자 앞뒤에 %를 붙이면 그 글자를 포함한 단어를 검색한다.
_종신이면 종신앞에 한 글자가 있는 단어를 찾는다.
- 서브쿼리
예를 들어 김경호보다 키 큰 사람을 선택하려고 한다.
김경호의 키는 177이다. 직접 김경호의 키를 알아놓은 후에 그 키를 설정해서 select할 필요가 없다.
서브쿼리를 사용하면 김경호의 키를 알 수 없어도 김경호보다 큰 사람을 선택할 수 있다.
- 서브쿼리 ANY
서브쿼리의 다른 예이다.
주소지가 경남인 사람보다 키가 큰 사람을 찾으려고 서브쿼리를 사용했더니 오류가 발생했다.
오류문을 자세히 읽어보면 값이 1개보다 많다고 한다. 주소지가 경남인 사람이 1명보다 더 많기 때문인 것이다.
이러한 경우에는 서브쿼리 앞에 any를 붙여주면 주소지가 경남인 사람들 모두보다 키가 큰 사람들을 선택할 수 있는 것이다.
- 서브쿼리 =ANY
주소지가 경남인 사람들과 키가 같은 사람들을 선택하고자 한다.
height=any(서브쿼리)를 했더니 두 사람의 값이 나왔다.
=any 대신 in을 썼더니 같은 값을 출력하였다. 주소지가 경남인 사람과 키가 같은 사람 1이거나 2인 사람 모두를 출력한 것이다.
- ORDER BY
DESC는 내림차순, ASC는 올림차순이다. ASC가 디폴트이다.
- DISTINCT
중복된 값을 제거하고 선택한다.
- LIMIT
데이터가 30만 개나 되는 행을 다 출력할 수는 없다. 지정된 개수만 선택할 수 있다.
지정할 개수와 시작점을 설정할 수 있다.
- 테이블을 복사하여 CREATE
한 테이블을 복사한 새로운 테이블을 생성할 수 있다. 기존 테이블의 특정 열만 선택하여 생성할 수도 있다.
단, PK나 FK 등 제약조건은 복사할 수 없다.
- GROUP BY
userid로 묶어서 선택한 값들은 볼 수 있다.
sql문을 사용할 때 간단한 사칙연산도 할 수 있는 것을 아는가?
이를 이용한 것이 집계함수이다.
함수명 | 설명 |
SUM() | 총합 |
AVG() | 평균 |
MIN() | 최소값 |
MAX() | 최대값 |
COUNT() | 행의 개수 |
COUNT(DISTINCT) | 중복 없는 행의 개수 |
STDEV() | 표준편차 |
VAR_SAMP() | 분산 |
집계함수를 사용하여 키가 가장 큰 사람과 작은 사람을 선택하고자 한다.
첫 번째 명령문처럼 단순히 이름, 키의 최대값, 최소값을 선택하였더니 예상대로 나오지 않는다.
다시 이름별로 지정하여 SQL문을 실행하여도 원하는대로 나오지 않는다.
최대값과 최소값을 서브쿼리를 사용하여 설정하였더니 원하는대로 값을 확인할 수 있었다.
- HAVING
총 구매액 중 1000을 넘은 사람을 선택하고자 한다.
WHERE절을 사용하였지만 오류가 발생한다.
집계함수에 대한 조건을 설정할 때에는 HAVING을 사용해야 한다.
- ROLLUP
이름별로 중간합계를 내고 싶을 때 사용할 수 있다.
맨 처음 보여주었던 MySQL 5.7 document의 SELECT문의 거의 모든 것이다.
나도 실습하면서 SELECT문을 아는 데 많이 도움이 되었다.
'MySQL' 카테고리의 다른 글
MySQL 전체 텍스트 검색 (0) | 2020.03.19 |
---|---|
MySQL 잠금기능 (0) | 2020.02.20 |
MySQL view(뷰) (0) | 2020.02.17 |