728x90
반응형
단순 조회
- SELECT 문이 가장 기본이 되면서 가장 많이 사용하는 쿼리문
- 대부분의 SELECT문은 FROM절을 사용해 테이블에서 데이터를 조회함
- 하지만 SELECT문에 FROM절이 꼭 필요한 것은 아님
- 특정 값, 계산식 또는 함수 결과를 조회할 수 있음
- AS를 사용해 표시되는 열의 별칭을 지정할 수 있음
SELECT 'Hello SQL World'
SELECT 'Hello SQL WOrld' AS Start;
SELECT 10 + 20 AS Result;
SELECT CURDATE() AS Result;
SET @Today = CURDATE();
SELECT @Today;
기본적인 데이터 조회
SELECT 열1, 열2, ...
FROM 테이블
WHERE 조건 ;
- SELECT 절에 조회할 열 이름이나 수식 등을 보고자 하는 순서로 나열
- 만일 모든 열을 보고자 하는 경우는 *을 입력함
- FROM 절에 조회 대상 테이블, 뷰 또는 테이블 형태를 반환하는 함수나 하위 쿼리문을 입력
- WHERE절에 행 추출을 위한 조건을 입력하며, 조건을 생략하면 모든 행이 조회 대상이 됨
- employee 테이블에서 dept_id 열 값이 'SYS'인 행의 emp_id, emp_name을 조회하는 구문 예
SELECT emp_id, emp_name FROM employee WHERE dept_id = 'SYS'
- 열 이름 대신 *를 입력하고 조건을 입력하지 않으면 테이블의 모든 행의 모든 열을 조회
- 모든 열을 의미하는 * 는 ALL이라고 읽음
- 표시되는 열 순서는 테이블을 만들 때 지정한 열 순서와 동일함
SELECT * FROM employee;
SELECT * FROM department;
- 열 이름을 입력하고 조건을 입력하지 않으면 모든 행의 지정한 열을 조회
- 보고자 하는 순서대로 열 이름을 정확히 입력함
- 원하는 순서로 나열하면 되니 테이블에 정의한 열 순서는 조회에서 의미가 없음
SELECT emp_id, emp_name FROM employee;
SELECT emp_name, emp_id FROM employee;
- 열 이름 대신 * 를 입력하고 조건을 입력하면 조건에 맞는 행의 모든 열을 조회
SELECT * FROM employee WHERE emp_id = 'S0001';
SELECT * FROM vacation WHERE emp_id = 'S0002';
- 열 이름을 입력하고 조건을 입력하면 조건에 맞는 행의 지정한 열을 조회
- 가장 적절한 조회 형태라고 할 수 있음
SELECT emp_id, emp_name FROM employee WHERE emp_id = 'S0001';
SELECT dept_id, dept_name FROM department WHERE dept_id = 'SYS';
- 조건을 잘못 지정하면 오류 대신 의도하지 않은 결과를 얻게 됨
- 잘못된 결과를 조회하기보다는 차라리 오류가 발생하는 것이 더 좋을 수도 있음
- 조회된 결과에 대한 정합성을 항상 확인하는 습관이 필요함
비교 연산자
- 크기를 비교할 때 사용하는 연산자이며, 대부분 WHERE 절에서 조건을 정의할 때 사용
- 정확한 조회 결과를 얻기 위해 쿼리문 작성 시 가장 신중해야 할 부분
- 일반적으로 숫자의 크기를 비교하지만, 무낮와 날짜도 크기를 비교할 수 있음
- 같지 않다 즉, 다르다는 <> 또는 != 연산자를 사용함
SELECT * FROM Employee WHERE dept_id = 'SYS';
SELECT * FROM Employee WHERE salary > 7000;
SELECT * FROM Employee WHERE hire_date < '2015-01-28';
SELECT * FROM Employee WHERE dept_id <> 'SYS;
- 문자열 데이터는 숫자나 날짜 데이터와는 달리 다양한 조건의 검색이 요구됨
- LIKE 연산자로 문자 패턴을 비교해 원하는 데이터를 조회할 수 있음
- 이름에 '국'이 들어간 직원
SELECT * FROM Employee WHERE emp_name LIKE '%국%';
- 이름이 '국'으로 끝나는 직원
SELECT * FROM Employee WHERE emp_name LIKE '%국';
- 이메일 아이디가 4글자인 직원(_하나가 글자 하나를 의미함)
SELECT * FROM Employee WHERE email LIKE '____@%';
논리 연산자
- WHERE 절에서 여러 개의 조건을 연결하는 연산자
- AND 연산자는 조건을 만족할수록 결과 행이 줄어듦 -> 성능면에서 긍정적임
- OR 연산자는 조건을 만족할수록 결과 행이 늘어남 -> 성능면에서 부정적임
- NOT 연산자는 조건에 대한 부정을 의미 (IS NOT NULL, NOT LIKE, NOT IN, NOT BETWEEN 등)
- 여러 조건을 나열할 경우에는 괄호를 사용해 조건을 명확히 식별할 수 있도록 해야 함
SELECT * FROM Employee WHERE salary > 5000 AND hire_date <= '2006-12-31';
SELECT * FROM Employee WHERE dept_id = 'SYS' OR dept_id = 'MKT';
범위 조건과 리스트 조건
- WHERE 절에 조건을 간결하게 입력할 수 있는 방법 -> 가독성 향상
- 조건에 열 이름을 반복해서 입력하는 번거로움을 해결함
SELECT * FROM Employee WHERE salary >= 5000 AND salary <= 8000;
SELECT * FROM Employee WHERE dept_id = 'SYS' OR dept_id = 'MKT' OR dept_id = 'HRD';
↓
SELECT * FROM Employee WHERE salary BETWEEN 5000 AND 8000;
SELECT * FROM Employee WHERE dept_id IN ('SYS', 'MKT', 'HRD');
- NOT 연산자를 사용해 조건에 대한 부정을 쉽게 지정할 수 있음
SELECT * FROM Employee WHERE salary NOT BETWEEN 5000 AND 8000;
SELECT * FROM Employee WHERE dept_id NOT IN ('SYS', 'MKT', 'HRD');
NULL 값
- NULL 값은 0도 아니고 공백도 아닌 알 수 없는 값 -> Unknown Value
- 만일 홍길동 몸무게가 NULL, 일지매 몸무게가 NULL 이라면
-> 홍길동과 일지매는 몸무게가 0인가?
-> 홍길동과 일지매 몸무게가 같은가?
- NULL 값과 문자열 'NULL'은 완전히 다름
- IS NULL, IS NOT NULL을 사용해 NULL 값을 식별할 수 있음
SELECT * FROM Employee WHERE eng_name = 'NULL';
SELECT * FROM Employee WHERE eng_name IS NULL;
SELECT * FROM Employee WHERE retire_date IS NULL;
SELECT * FROM Employee WHERE retire_date IS NOT NULL;
- IFNULL() 함수를 사용해 NULL 값 대신 다른 값을 표시할 수 있음
SELECT emp_name, emp_id, IFNULL(eng_name, '') AS nick_name,
gender, dept_id, hire_date
FROM employee
WHERE retire_date IS NULL;
- DBMS 마다 다른 함수를 사용함
- MySQL : IFNULL() / MSSQL : ISNULL() / ORACLE : NVL()
- IFNULL() 함수 대신에 표준 함수인 COALESCE() 함수를 사용하기를 권고
SELECT emp_name, emp_id, COALESCE(eng_name, '') AS nick_name,
gender, dept_id, hire_date
FROM employee
WHERE retire_date IS NULL;
자동 형변환
- 문자 데이터가 연산에 사용되면 자동으로 숫자로 변환됨
- 숫자로 변환되지 못하는 문자는 0으로 변환됨
SELECT '10' + '20'; -- 30;
SELECT 10 + '20'; -- 30;
SELECT 10 + '20AX'; -- 30;
SELECT 10 + 'LX20'; -- 30;
- 문자열 데이터를 + 연산자로 결합할 수 없음 -> CONCAT 함수를 사용하여 결합함
SELECT CONCAT('10', '20'); -- 1020
SELECT CONCAT(10, '20'); -- 1020
SELECT CONCAT(10, 20); -- 1020
- 자동 형변환은 DBMS에 따라 다르게 수행됨을 유의해야 함
데이터 결합
- CONCAT 함수를 사용해 데이터 결합
- 결합되는 값에 NULL 값이 포함되면 결합 결과가 NULL 이 됨
SELECT CONCAT(emp_name, '(', emp_id, ')') AS emp_name,
dept_id, gender, hire_date, email
FROM employee;
데이터 정렬
SELECT 열1, 열2, ...
FROM 테이블
WHERE 조건
ORDER BY 정렬 기준 열 ASC | DESC;
- ORDER BY 절을 사용해 정렬된 결과를 표시할 수 있음
- ASC : 오름차순 -> 1, 2, 3, 4 / 가, 나, 다, 라 / A, B, C, D
- DESC : 내림차순 -> 4, 3, 2, 1 / 라, 다, 나, 가 / D, C, B, A
- 꼭 필요한 경우만 정렬하기를 권고(성능 문제 발생 가능)
- 숫자는 물론 문자, 날짜형 데이터 정렬이 가능함
- 복합 정렬은 콤마(,)로 구분해서 정렬 방식을 지정함
- ASC가 기본값 -> 정렬 방식이 지정되지 않으면 오름차순으로 정렬됨
SELECT * FROM Employee ORDER BY salary DESC;
SELECT * FROM Employee ORDER BY dept_id ASC, emp_id DESC;
CASE 문
CASE WHEN 조건1 THEN 값1
WHEN 조건2 THEN 값2
WHEN 조건3 THEN 값3
...
ELSE 값N END
- CASE 문을 사용하면 쿼리문 안에서 조건에 따른 처리(값 연산, 변환 등)를 수행할 수 있음
- 기본 구문이 다소 길다고 느낄 수 있으나, SELECT 문에서 매우 중요한 역할을 수행함
- gender 열 값이 'M'이면 '남자'로, 'F'면 '여자', 나머지는 공백으로 표시하는 예
SELECT emp_name, emp_id,
CASE WHEN gender = 'M' THEN '남자'
WHEN gender = 'F' THEN '여자'
ELSE '' END AS gender, hire_date, retire_Date, salary
FROM employee;
IF 함수
IF ( 조건, 값1, 값2)
- 조건이 참이면 값1, 거짓이면 값2가 선택됨
- CASE문처럼 IF 함수를 사용해 쿼리문 안에서 조건에 따른 처리를 수행할 수 있음
- CASE문보다는 상대적으로 구문이 짧아 간결한 쿼리문을 작성할 수 있음
- 하지만 CASE문처럼 여러 조건에 따라 분기하여 처리할 수는 없음
- 여러 조건에 따른 처리는 CASE문, 한 번의 조건 비교로 참/거짓에 따른 처리는 IF 함수 사용
728x90
반응형
'SQL > MySQL' 카테고리의 다른 글
[MySQL/Programmers] 동물의 아이디와 이름 (0) | 2023.07.24 |
---|---|
[MySQL/Programmers] 여러 기준으로 정렬하기 (0) | 2023.07.24 |
[MySQL/Programmers] 상위 n개 레코드 (0) | 2023.07.24 |
[MySQL/Programmers] 역순 정렬하기 (0) | 2023.07.24 |
[MySQL] 데이터 집계 (1) | 2023.05.09 |