파트 4-2. 특정한 조건의 데이터만 조회하는 SELECT FROM WHERE

1. WHERE 절(between, and, in, like)


WHERE 절은 조회하는 결과에 특정한 조건을 줘서 원하는 데이터만 보고 싶을 때 사용하는데, 다음과 같은 형식을 갖는다.

SELECT 필드이름 FROM 테이블이름 WHERE 조건식;

예시
-- usertbl에서 김경호의 모든열 조회
SELECT * FROM usertbl WHERE name ='김경호';

-- 관계 연산자의 사용
SELECT userid FROM usertbl WHERE birthyear >= 1970 AND height >=182;

-- between and
SELECT height, name FROM usertbl WHERE height between 180 AND 183;

-- or 과 in , IN이 더 간편하다
SELECT height, name FROM usertbl WHERE addr ='경남' OR addr ='전남' OR addr ='경북';
SELECT height, name FROM usertbl WHERE addr  IN('경남', '전남' ,'경북');

-- 문자열 검색 LIKE %
-- 앞이 '김'이고 뒤에 문자는 어떤 문자든 관계 없다.
SELECT name FROM usertbl WHERE name LIKE '김%';

-- 문자열 검색 LIKE _  
-- 한글자만 매치하는 방법이다, 앞의 한글자는 관계없이 이름은 종신인 사람 찾기
SELECT name FROM usertbl WHERE name LIKE '_종신';


2. ANY/ALL/SOME 그리고 서브쿼리(SubQuery, 하위쿼리)


서브쿼리

서브쿼리란 쿼리문 안에 또 쿼리문이 들어 있는 것을 뜻한다. 예를 들어 김경호보다 키가 그거나 같은 사람의 이름과 키를 출력하려면 WHERE 조건에 김경호의 키를 직접 써줘야 한다. 그런데 177이라는 키를 직접 써주는 것이 아니라 이것도 쿼리를 통해 사용할 수 있다.

SELECT name, height FROM usertbl WHERE height > 177;

--  서브쿼리
SELECT name, height FROM usertbl WHERE height > (SELECT height FROM usertbl WHERE name ='김경호');


ANY

그런데 만약 서브쿼리를 통해 나온 결과값이 2개 이상의 결과를 반환하면 어떻게 될까? 만약 김경호라는 사람이 2명이상이 있다면 오류가 발생한다. 이때는 ANY구문을 통해 해결할 수 있다.

SELECT name, height FROM usertbl WHERE height >= ANY (SELECT height FROM usertbl WHERE addr ='경남');

ANY는 뜻 그대로 어떤거나 상관이 없다. 만약 170, 173이 반환되었다면 둘 다 포함할 수 있는, 결국 170보다 크거나 같은 사람에 해당된다.


ALL

위 ANY 코드에서 ANY 대신 ALL로 바꾸면 말 그대로 모두를 포함해야 하는 뜻으로 170, 173이상 모두를 포함하는, 결국 173보다 크거나 같은 사람에 해당한다.

SELECT name, height FROM usertbl WHERE height >= ALL (SELECT height FROM usertbl WHERE addr ='경남');


3. 원하는 순서대로 정렬하여 출력 ORDER BY


ORDER BY절은 결과물에 대해 영향을 미치지는 않지만, 결과가 출력되는 순서를 조절하는 구문이다. 기본적으로 오름차순으로 정렬되고, 내림차순으로 정렬하기 위해서는 열 이름 뒤에 DESC라고 적어주면 된다.
ORDER BY절은 MySQL의 성능을 상당히 떨어뜨릴 소지가 있으므로 되도록이면 사용하지 않도록 한다.

-- mdate를 기준으로 오름차순 정렬로 조회
SELECT name, mdate FROM usertbl ORDER BY mdate;

-- mdate를 기준으로 내림차순 정렬로 조회
SELECT name, mdate FROM usertbl ORDER BY mdate DESC;

-- height를 기준으로 내림차순, 만약 동일하다면 name을 기준으로 오름차순
-- 오름차순을 보여주기위해 ASC를 작성해도 되는데 디폴트값이므로 생략해도 무관하다.
SELECT name, height FROM usertbl ORDER BY height DESC, name ASC;


4. 중복된 것은 하나만 남기는 DISTINCT


만약 회원 테이블에서 회원들의 거주지역이 몇 군데인지만 알고 싶다. 이런 경우 DISTINCT를 사용한다.

SELECT DISTINCT addr FROM usertbl;


5. 출력하는 개수를 제한하는 LIMIT


입사일이 오래된 직원 5명의 사원 번호를 알고 싶은 경우 다음과 같이 사용한다. 또한 LIMIT절은 ‘LIMIT 시작, 개수’ 또는 ‘LIMIT 개수 OFFSET 시작’ 형식으로도 사용이 가능하다.

SELECT emp_no, hire_date FROM employees ORDER BY hire_date LIMIT 5;

-- 시작은 0부터 5개 조회
SELECT emp_no, hire_date FROM employees ORDER BY hire_date LIMIT 0,5;
-- LIMIT 5 OFFSET 0과 동일


6. 테이블을 복사하는 CREATE TABLE … SELECT


다른 테이블을 복사해서 사용하는 경우 사용한다. 주의할 점은 primary key 및 foreign key와 같은 제약조건은 복사되지 않는다는 것을 기억하자.

-- buytbl을 buytbl2로 복사하기
CREATE TABLE buytbl2 (SELECT * FROM buytbl);

-- 필요하다면 일부 열만 복사하기
CREATE TABLE buytbl2 (SELECT userid, prodname FROM buytbl);



본 포스팅은 ‘이것이 MySQL이다’를 읽고 공부한 내용을 바탕으로 작성하였습니다.


© 2021. By Backtony