본문 바로가기

SQLD · DB

[ MYSQL ] SELECT절과 WHERE절 실습

SELECT [ 조회하고자 하는 컬럼명 또는 전체 컬럼 조회시 * 입력 ] FROM [ 조회하고자 하는 테이블명 ];

 

ex. SELECT * FROM employees; → employees 테이블에 있는 전체 컬럼 조회하기

SELECT salary FROM employees; → employees 테이블에 있는 salary 컬럼 조회하기

 

컬럼을 조회하는 위치에서 * / + - 연산이 가능하다.

 

NULL 은 값이 없다는 것을 의미한다. NULL 은 * ( 곱하기 ) 연산이 안되며 숫자 0 이나 공백과는 다르다. 

만약 NULL 이 0 이라면 곱하기 연산시 결과가 0 이 나와야 하는데 0 이 아닌 NULL 산출된다.

 

조회결과의 컬럼이름은 별칭을 붙여 바꾸어줄 수 있다.

AS 라는 키워드를 통해 조회되는 컬럼에 별칭을 붙여줄 수 있다.

 

SQL문의 실행 순서

테이블을 먼저 정해야 하기 때문에 FROM 절부터 실행된다.

 

오라클은 홑따옴표로 문자열을 표현하고,

문자열 안에 홑따옴표 특수기호를 표현하고 싶다면 '' ( 홑따옴표 ) 기호를 연속으로 쓰면된다.

컬럼 값의 타입이 문자열이고, 문자열을 붙인 결과를 도출하고 싶다면

컬럼간에 || ( or 기호 ) 를 사용하여 컬럼의 문자열 타입의 값을 연결해 산출한다.

문자열 연결기호는 || 이다. 문자열은 덧셈 ( + ) 연산을 허용하지 않는다.

 

SELECT 뒤에 DISTINCT 키워드를 붙이면 중복 값을 가진 행을 제거한후 결과를 도출한다.

employees 테이블에서 department_id 컬럼에 대응하는 값을 모두 조회한 후 중복 값이 있다면 제거하라는 의미다.

 

테이블 생성시 자동으로 부여되는 ROWNUM, ROWID

ROWNUM은 쿼리에 의해 반환되는 행 번호를 반환 → 페이징 할 때 유용하게 사용됨

( ※ ROWNUM: 게시글은 삭제되면 글 번호가 들쭉날쭉 된다.

그런데 ROWNUM은 조회된 결과를 바탕으로 번호가 매겨지기 때문에

중간 숫자의 삭제 없이 항상 순차적으로 도출된다.

이는 페이징할 때 범위 지정시 유용하게 사용된다 )

 

ROWID는 데이터베이스 내의 행의 주소를 반환한다 → 사용할 일이 거의 적음

 

컬럼의 종류는 설정했지만 조건을 걸지 않는다면 인출되는 행의 갯수는 항상 같다.

조건을 걸기 위해 사용하는 키워드는 WHERE 다.

 

SELECT first_name, last_name, job_id FROM employees WHERE job_id = 'IT_PROG';

FROM employees → 테이블 employees 에서

WHERE job_id = 'IT PROG'  →  컬럼의 값을 이용해서 조건을 걸어준다 → job_id 가 IT PROG인 사람들의

SELECT first_name, last_name, job_id → 컬럼 first_name, last_name, job_id 를 조회해라

※ 데이터 값은 대/소문자를 구분한다.

 

IN 연산자의 사용

WHERE절에서 특정 값 여러 개를 선택하는 경우 IN 연산자를 사용한다.

예를 들어 employees 테이블에서 manager_id가 100 또는 101 또는 102에 해당하는 레코드를 모두 조회할 때

 

SELECT *

FROM employees

WHERE manager_id = 100

OR manager_id = 101

OR manager_id = 102; 

 

이렇게 작성할 수 있으나 IN 연산자를 사용하면 더 간단히 작성할 수 있다.

 

SELECT *

FROM employees

WHERE manager_id IN ( 100, 101, 102);

→ IN 연산자를 사용할 경우 검색할 값을 콤마로 구분해 작성한다.

 

LIKE 연산자는 지정한 문자열이 포함되는지 아닌지를 확인할 때 사용한다.

 

SELECT first_name, last_name, hire_date

FROM employees

WHERE hire_date LIKE '03%';

→ hire_date가 03으로 시작한다면 뒤에가 뭐든 상관없다 ( % )

→ % 의 의미는 어떠한 문자든 상관없다. anything의 의미

 

WHERE hire_date LIKE '%05%';

hire_date의 값이 앞이든 뒤든 어떤 값이 있는지는 상관하지 않고,

05가 포함만 되어 있다면 모두 가져와라

자리를 표현하는 _(언더바) 예를 들어 07/05/21 월이 05에 해당하는 모든 hire_date가 조건이라면

07/ 에 해당하는 자리수 3자리를 _(언더바)로 채우고 05 그리고 그 뒤에 어떤 값이 와도 상관 없다는 % 를 붙여준다.

→ ___05%

SELECT first_name, last_name, hire_date

FROM employees

WHERE hire_date LIKE '___05%';

→ employess 테이블에서 hire_date의 값이 월이 5월달인 모든 값을 기준으로

first_name, last_name, hire_date 컬럼을 조회하라. 는 시퀄 ( SQL ) 문이다.

 

예제 ---------------------------

'05%' → 05로 시작한다면

'%05' → 05로 끝난다면

'%05%' → 05라는 문자열이 포함만 되어 있다면

'___05%' → _(언더바)는 데이터의 자리 ( 위치 ) 를 표현할 때 사용하고,

_(언더바)를 3번 작성했으니 앞에서 3글자 뒤에 05가 작성된

그리고 05 뒤에는 어떤 글자가 작성되어 있더라도 상관없다 는 의미다. 

 

추가 ------------------------------------------------------------------------------------------------------------------------------------

WHERE 는 출력하는 데이터에 대해 조건을 걸 때 사용하는 키워드로

데이터 행 출력 제한에 함께 사용되는 키워드가 몇 개 있다 ( BETWEEN, IN, LIKE )

BETWEEN 연산자는 날짜, 숫자 또는 문자의 범위 검색에 주로 사용되며

AND 키워드와 함께 사용된다.

 

예를 들어 위 그림과 같이 employees 테이블에서 ( FROM employees )

salary 컬럼에 대응하는 값이 15000 과 20000 사이인 ( WHERE salary BETWEEN 15000 AND 20000 )

모든 행을 조회하라 ( SELECT * ) 는 질의를 할 때

'범위에 해당하는 값을 가진 행 ' 을 제한할 때 BETWEEN 연산자가 요긴하게 사용된다.

 

만약 BETWEEN 연산자를 사용하지 않는다면 이렇게 작성할 수 있다.

SELECT *

FROM employees

WHERE salary >= 15000 AND salary <= 20000; → salary 컬럼에 대응하는 값이 15000원 이상이면서 20000원 이하 사이인

 

employees 테이블에서 ( FROM employees )

hire_date 가 03/01/01 부터 ( 포함 ) 03/12/31 까지 ( 포함 ) 에 해당하는

( WHERE hire_date BETWEEN ' 03/01/01' AND ' 03/12/31' )

모든 레코드를 출력하라 ( SELECT * )

 

NULL

NULL의 여부를 확인할 때, 동등 연산자로 확인할 수 없다.

예를 들어 commission_pct 컬럼의 값이 NULL인 레코드를 출력할 때

SELECT * FROM employees WHERE commission_pct = NULL; ( x )

이렇게 작성하면 어떠한 결과도 출력되지 않는다.

NULL의 포함여부를 확인하려면 IS NULL ( NULL 의 값을 찾을 때 )

또는 IS NOT NULL ( NULL 이 아닌 값을 찾을 때 ) 키워드로 확인해야 한다.

 

AND와 OR의 연산 순서 → AND 가 OR 보다 연산 순서가 빠르다.

예를 들어 employees 테이블에서 job_id가 'IT_PROG' 또는 job_id가 'FI_MGR' 인데

salary가 6000 이상인 사람들만 출력하라를 다음과 같이 작성했다면

 

SELECT * FROM employees

WHERE job_id =  'IT_PROG'

OR  job_id =  'FI_MGR'

AND salary >= 6000;

job_id 가 'FI_MGR' 이면서 salary 가 6000 또는

job_id 가 'IT_PROG' 이면서 salary 가 6000 이상인

사람들이 출력되지 않는 걸 볼 수 있다.

 

AND 연산자가 OR 연산자보다 연산 순서가 빠르므로

1) job_id = 'FI_MGR' AND salary >= 6000 이 먼저 수행되면서

job_id가 FI_MGR 이면서 salary가 6000 이상인 사람들과

2) job_id가 'IT_PROG' 인 사람들이 출력되는 것이다.

 

()소괄호를 사용하여 연산 순서를 지정할 수 있는데

job_id가 IT_PROG 이면서 salary 가 6000 인 사람들도 같이 출력하려면

다음과 같이 소괄호 기호를 적용하면 된다.

 

SELECT * FROM employees

WHERE ( job_id =  'IT_PROG'

OR  job_id =  'FI_MGR' )

AND salary >= 6000;

 

데이터의 정렬은 SELECT 구문의 가장 마지막에 배치된다.

ASC는 ascending 으로 오름차순이며 기본 값이기 때문에 생략이 가능하다.

DESC는 descending 으로 내림차순이다.

 

SELECT * FROM employees ORDER BY hire_date;

employees 테이블에서 hire_date ( 입사일 ) 을 기준으로 오름차순 ( 기본값 ) 으로 조회하라

 

별칭도 정렬의 대상이 될 수 있다 → ORDER BY 뒤에 별칭 작성이 가능하다.

employees 테이블에서 ( FROM employees )

first_name 과 salary 에 12 를 곱한 값을 pay 라는 별칭 ( 컬럼명 ) 으로 조회하는데

( SELECT first_name, salary * 12 AS pay )

정렬의 기준은 별칭 pay 가 되며 DESC ( 내림차순 ) 으로 수행하라

( ORDER BY pay DESC )