이전 게시글들을 통해 정리했다시피 데이터 조회는 기본적으로 이러한 형식을 가지고 있다.

USE [데이터베이스 이름] ; -- 항상 습관처럼 쿼리의 처음에 DB를 지정하기
SELECT [열 목록] FROM [테이블 이름] ;

 

 하지만 우리가 SQL을 통해 궁극적으로 하고자 하는 것은 '특정한 조건'을 가진 데이터를 모아서 조회하는 것이며, 이것을 어떻게 잘 추출하는 지가 관건인 언어가 SQL이다. 따라서 가장 기본이 되는 SELECT문에서 조건부를 설정해 쿼리를 더 구체화하는 방법을 정리해보고자 한다.

 

SELECT * FROM usertbl WHERE name = '김경호' ;

 이렇게 WHERE 다음에 조건을 정해줘서 해당하는 행과 열만 간추려서 조회할 수 있는 것이다. 이렇게 특정 값을 가지는 것만 조회하는 것이 아니라 범위를 정해 그 안의 모든 데이터를 조회하는 방법도 다양하다.

 

연산자 표현법 (숫자 범위)

SELECT userID, name FROM usertbl WHERE birthYear >= 1970 AND height >= 182 ;

SELECT userID, name FROM usertbl WHERE birthYear >= 1970 OR height >= 182 ;

SELECT * FROM usertbl WHERE height >= 180 AND height <=183 ;
SELECT name, height FROM usertbl WHERE height BETWEEN 180 AND 183 ;

 

 

이산자 (특정 명칭)

SELECT name, addr FROM usertbl WHERE addr='경남' OR addr='전남' OR addr='경북' ;
SELECT name, addr FROM usertbl WHERE addr IN ('경남', '전남', '경북') ;

SELECT name, height FROM usertbl WHERE name LIKE '김%' ; -- %는 그 뒤는 무엇이든 허용된다는 뜻

SELECT name, height FROM usertbl WHERE name LIKE '_종신' ; -- _는 해당 위치에 아무 글자나 올 수 있다는 뜻

 

 

서브쿼리(SubQuery): 쿼리 속의 쿼리

SELECT name, height FROM usertbl WHERE height > 177 ; -- 김경호 보다 키가 큰 사람을 찾으려면 원래는 김경호의 키(177)를 입력해서 보다 큰 사람을 찾아야했다
SELECT name, height FROM usertbl
	WHERE height > (SELECT height FROM usertbl WHERE name = '김경호') ; -- 이런식으로 부수적인 쿼리를 입력하면 해당값을 직접 찾아서 쿼리문에 입력하는 수고를 덜 수 있다
    
SELECT name, height FROM usertbl
	WHERE height >= (SELECT height FROm usertbl WHERE addr = '경남') ; -- 해당 구문을 실행하면 주소가 경남인 경우가 여러개이므로 오류가 생긴다
SELECT name, height FROM usertbl
	WHERE height >= ANY (SELECT height FROM usertbl WHERE addr = '경남') ; -- ANY구문을 사용하면 경남이 주소지인 사람들 키중 아무거나 보다 큰 사람들의 결과가 나온다

SELECT name, height FROM usertbl
	WHERE height >= ALL (SELECT height FROM usertbl WHERE addr = '경남') ; -- ALL의 경우 해당 서브쿼리의 결과값 모두를 충족하는 결과를 보여주게 된다

*ANY는 해당 결과들 중에서 한 가지만 만족해도 되고, ALL은 모든 결과값을 만족하는 대상을 고른다*

 

 이와같이 WHERE문으로 범위를 설정해주는 것 이외에도 출력값을 정리하거나 제한을 걸어 보기 편하게 만드는 방법들이 있다.

-- 순서대로 출력 (ORDER BY)
SELECT name, mDate FROM usertbl ORDER BY mDate ;

SELECT name, mDate FROM usertbl ORDER BY mDate ASC ; -- 오름차순으로 정렬(ascending)인데 기본값으로 오름차순 정렬을 하기 때문에 생략 가능하다
SELECT name, mDate FROM usertbl ORDER BY mDate DESC ; -- 내림차순(descending) 정렬 방식

SELECT name, height FROM usertbl ORDER BY height DESC, name ASC ; -- 키 내림차순으로 정렬하되 키가 같을경우 이름 순으로 정렬 (ASC 생략 가능)

-- 중복값 정리 (DISTINCT)	
SELECT addr FROM usertbl ; -- 여러 값들이 분산되어있어 찾기 힘들다

SELECT addr FROM usertbl ORDER BY addr ; -- 보기 편해졌지만 여전히 중복된 값이 존재한다

SELECT DISTINCT addr FROM usertbl ; -- 중복된 값은 한 번만 출력하도록 할 수 있다

-- 출력개수 제한 (LIMIT)
USE employees ;
SELECT emp_no, hire_date FROM employees
	ORDER BY hire_date ASC ; -- 소수의 앞부분 정보가 필요했다면 대량의 정보가 조회되며 MySQL에 부담을 줬다

SELECT emp_no, hire_date FROM employees
	ORDER BY hire_date ASC
    LIMIT 5 ; -- 최초의 5개 결과만 보여주게 됐다 (MySQL에 부하를 줄임)

 (마지막 employees DB는 대용량 데이터 속에서 효율을 높이는 방법을 보여주기 위해 필자가 가지고 있는 큰 테스트용 DB를 사용한 것이다.) 

 

 앞으로 더 복잡하고 어려운 조건으로 조회를 하는 방법들이 등장할 것이다. 일단은 기본적으로 이번 조건부 검색 방법을 익히면 마주하게될 복잡한 쿼리문들을 이해하는 데 큰 도움이 될 것이다.

'IT Self-study > MySQL & Database' 카테고리의 다른 글

집계 함수: 데이터 그룹화  (0) 2025.01.07
테이블 복사 (별첨)  (0) 2025.01.07
실습용 DB 제작  (0) 2024.11.02
SELECT  (0) 2024.11.02
MySQL 기초 기능 (2)  (0) 2024.10.18