본문 바로가기
데이터베이스

MySQL 문법 정리 1. SELECT문 (where, 서브쿼리, order by, distinct 등)

by 호놀롤루 2022. 4. 16.

1. MySQL을 터미널(CMD) 창에서 조작할 때, SELECT문을 어떻게 사용하는지 정리할 것이다.

 

 

2. 설명

2-1. SELECT ?? FROM ??

원하는 데이터를 가져오는 기본적인 구문이다.

필자의 데이터베이스에 있는 db1의 테이블은 3개다.

그 중, student 테이블의 데이터를 가져와보려 한다.

 

DESC 테이블명; 이란 명령어로 테이블의 구성이 어떻게 되어있는지 확인할 수 있다.

 

 

 

 

 

 

 

student 테이블은 이름과 학과라는 열을 가지고 있다.

select 구문으로 정보를 가져오려면

select 원하는 열 from 테이블명;

으로 데이터를 가져올 수 있고, 원하는 열에 *을 집어넣으면 모든 열을 가져온다.

select 앞에 name만 적는다면, 김아무개와 박아무개라는 이름만 가져올 수 있다.

한 열이 아닌, 여러 열을 가져오고 싶으면 열이름 뒤에 콤마(,)를 붙이고, 다른 열을 적으면 된다.

 

여러 열을 적을 경우, 적은 순서대로 출력된다.

 

 

2-2. SELECT ?? FROM ?? WHERE ??

where 절은 조건을 추가하는 것이다.

만약, student 테이블에서 전산과 학생만 찾고싶다면

SELECT * FROM STUDENT WHERE dept = '전산과'; 라는 명령어를 입력해주면 된다.

만약 특정한 이름을 찾고싶다면 name = '원하는 이름' 으로 바꾸면 된다.

 

그리고 where 절에서 여러 조건을 적용시킬 수 있다.

OR의 경우, 두 조건 중 하나만 충족되면 데이터를 가져오는 조건이다.

AND의 경우, 두 조건 모두 충족되는 데이터만 가져오는 조건이다.

 

select * from student where name = '박아무개' OR dept = '전산과';

이름이 '박아무개' 거나 학과가 '전산과', 둘 중하나만 맞으면 데이터를 가져온다.

 

select * from student where name = '박아무개' AND dept = '전산과';

이름이 '박아무개'이고, 학과가 '전산과' 인 데이터만 가져온다.

 

이 외에도, 조건 연산자 (=, <, >, <=, >=, <>, 등)를 사용해서 특정 테이블에서 나이가 20살이상인 사람을

찾아라, 등의 명령문을 만들 수 있다.

 

 

2-3. where문 심화

만약, data란 테이블에서 키가 175~180인 사람을 찾고싶다면

 

SELECT * FROM data WHERE height BETWEEN 175 AND 180;

이란 명령어로 특정 숫자 안에 있는 데이터를 찾을 수 있다.

 

 

그 외에도 IN()을 사용해서 특정 범위안에 있는 데이터를 찾을 수 있다.

학과가 '전산과', '컴공과', '전기과' 인 학생을 찾으려 할 때,

 

SELECT * FROM student WHERE dept IN('전산과', '컴공과', '전기과');

라는 명령어로 해당되는 학생들의 데이터를 가져올 수도 있다.

 

 

그리고 특정 문자열이 포함된 결과를 찾을 경우, LIKE 를 사용해서 찾을 수 있다.

이름이 '김'으로 시작하는 학생을 찾을 경우,

 

SELECT * FROM student WHERE name LIKE '김%';

이름이 '김' 으로 시작하는 학생을 찾을 수도 있다.

 

 

2-4. 서브쿼리

데이터를 검색할 때, 다른 테이블에서 조건을 가져올 수도 있다.

data라는 테이블이 있고, data라는 테이블엔 학생들의 키, 몸무계같은 정보가 들어있다고 치자.

 

'박아무개' 라는 학생보다 키가 큰 학생을 찾고싶을 경우,

 

SELECT * FROM data WHERE height > (SELECT height FROM data WHERE name = '박아무개');

라는 형태로 박아무개의 키를 가져와서(서브쿼리), 비교하는 방법도 있다.

 

 

SELECT * FROM data WHERE height > ANY(SELECT height FROM data WHERE dept = '전산과');

서브쿼리 앞에 ANY를 붙이게 되면, 서브쿼리의 결과 중 하나만 만족해도 데이터를 가져온다.

즉 data 테이블에 있는 학생 중, 전산과에 있는 학생 중 아무나 한명 보다 키가 큰 사람이 있으면 데이터를 다 가져온다.

 

SELECT * FROM data WHERE height > ALL(SELECT height FROM data WHERE dept = '전산과');

서브쿼리 앞에 ALL을 붙이게 되면, 모든 조건이 만족되어야 데이터를 가져온다.

이 경우, 전산과에서 가장 큰 사람보다 키가 커야만 데이터를 가져온다. 위의 코드는 예시라 상당히 비효율적이지만

그냥 써봤다.

 

 

2-5. ORDER BY

정렬하는 절이다.

  • 결과물에 영향을 끼치지 않고, 출력되는 순서를 정렬한다.
  • WHERE이 없으면 FROM 뒤, WHERE이 있으면 WHERE 뒤에 "ORDERY BY 원하는 열" 의 형태로 사용한다.
  • 기본적으로 오름차순(ASCENDING, 작은 거 먼저) 정렬이다.
  • 내림차순(DESCENDING)으로 정렬하려면, 정렬하려는 열 뒤에 DESC 를 붙여야 한다.
  • 정렬하는 기준은 하나가 아니어도 된다. (키 순서대로 하지만, 키가 같을 경우, 학번 순서대로 정렬하는 등)
    SELECT * FROM data ORDER BY height DESC, id ASC;
    이런 식으로도 사용 가능하다. (오름차순이라 디폴트라 ASC는 꼭 붙일 필요 없다.)

 

2-6. 옵션

말 그대로 명령문 뒤에 붙이는 옵션이다.

 

2-6-1. DISTINCT

  • 중복되는 게 있다면 하나만 표시한다.
  • SELECT DISTINCT 열이름 FROM 테이블이름; 형태로 사용한다.
  • 테이블 크기가 크면 클수록 효율적이다.

 

2-6-2. LIMIT

  • 불러오는 데이터의 갯수를 지정하는 것이다.
  • SELECT 열이름 FROM 테이블이름 LIMIT 숫자; 형태로 사용한다.
  • DB가 크면 속도를 향상시키는데 도움된다.

 

2-6-3. 테이블 복사

CREATE TABLE 테이블이름 (SELECT 복사할 열 FROM 복사할 테이블명)

table55를 생성할 때, student 테이블의 내용을 그대로 복사할 수 있다.

그런데 기본키(Primary Key)나 외래키(Foreign Key)같은 제약 조건은 복사되지 않는다.

 

그리고 특정 열만 복사하는 것도 된다.

 

 

댓글