[MySQL] SQL 연산자 [SELECT]

심진주·2024년 10월 6일
0

MySQL

목록 보기
4/10
post-thumbnail
  • 기본 문법
SELECT [DISTINCT] 컬럼 [별칭]
FROM 테이블명
WHERE 조건식;

📕 BETWEEN 연산자

  • BETWEEN 연산자는 특정 컬럼의 데이터 값이 하한값 A와 상한값 B 사이에 포함하는 행을 검색하기 위한 연산자다.
SELECT 컬럼 FROM 테이블 WHERE 컬럼 BETWEEN A AND B;
  • BETWEEN 연산자는 두개의 비교식을 AND 연산자로 묶은 것과 동일한 결과를 얻을 수 있다.
    조회 조건값의 범위를 설정한다.
SELECT 컬럼 FROM 테이블 WHERE 컬럼 >= A AND 컬럼 <= B;

예제1

  • BETWEEN 연산자를 사용하여
  • 몸무게가 50~70KG 사이인 학생의 학번, 이름, 몸무게 출력
SELECT studno, name, weight FROM student WHERE weight BETWEEN 50 AND 70;
+--------+--------+--------+
| studno | name   | weight |
+--------+--------+--------+
|  10102 | 박미경 |     52 |
|  10105 | 임유진 |     54 |
|  10203 | 하나리 |     68 |
|  10204 | 윤진욱 |     70 |
|  20101 | 이동훈 |     64 |
|  20102 | 박동진 |     70 |
|  20103 | 김진경 |     51 |
|  20104 | 조명훈 |     62 |
+--------+--------+--------+

예제2

  • 비교 연산자와 AND 연산자를 사용하여
  • 몸무게가 50~70KG 사이인 학생의 학번, 이름, 몸무게 출력
SELECT studno, name, weight FROM student WHERE weight >= 50 AND weight <= 70;
+--------+--------+--------+
| studno | name   | weight |
+--------+--------+--------+
|  10102 | 박미경 |     52 |
|  10105 | 임유진 |     54 |
|  10203 | 하나리 |     68 |
|  10204 | 윤진욱 |     70 |
|  20101 | 이동훈 |     64 |
|  20102 | 박동진 |     70 |
|  20103 | 김진경 |     51 |
|  20104 | 조명훈 |     62 |
+--------+--------+--------+

📕 IN 연산자

  • 특정 컬럼의 데이터 값이 A,B,...,Z 값 중에서 하나라도 일치하면 참이 되는 연산자
SELECT 컬럼이름 FROM WHERE 컬럼 IN (A, B, ..., Z);
  • IN 연산자는 여러개의 비교식을 OR 연산자로 묶은 것과 동이한 결과를 얻을 수 있다.
SELECT 컬럼이름 FROM WHERE 컬럼=A OR 컬럼=B OR ... OR 컬럼=Z;

예제 1

  • IN 연산자를 사용하여
  • 102번 학과와 201번 학과 학생의 이름, 학년, 학과번호 출력
SELECT name, grade, deptno FROM student WHERE deptno IN (102,201);
+--------+-------+--------+
| name   | grade | deptno |
+--------+-------+--------+
| 김진영 |     2 |    102 |
| 오유석 |     4 |    102 |
| 하나리 |     1 |    102 |
| 윤진욱 |     3 |    102 |
| 이동훈 |     1 |    201 |
| 박동진 |     1 |    201 |
| 김진경 |     2 |    201 |
| 조명훈 |     1 |    201 |
+--------+-------+--------+

예제 2

비교연산자와 OR 연산자를 사용하여
102번 학과와 201번 학과 학생의 이름, 학년, 학과번호 출력

SELECT name, grade, deptno FROM student WHERE deptno=102 OR deptno=201;
+--------+-------+--------+
| name   | grade | deptno |
+--------+-------+--------+
| 김진영 |     2 |    102 |
| 오유석 |     4 |    102 |
| 하나리 |     1 |    102 |
| 윤진욱 |     3 |    102 |
| 이동훈 |     1 |    201 |
| 박동진 |     1 |    201 |
| 김진경 |     2 |    201 |
| 조명훈 |     1 |    201 |
+--------+-------+--------+

📕 LIKE 연산자

  • 특정 키워드가 포함된 데이터를 검색하기
  • LIKE 연산자는 컬럼에 저장된 문자열이
  • LIKE 연산자에서 지정한 문자패턴과 부분적으로 일치하면 참이 되는 연산자다.
SELECT 컬럼 FROM 테이블 WHERE 컬럼 LIKE '%검색어%';
  • % : 임의의 길이인 문자열(길이가 0인 경우도 포함)에 대한 특수 문자로 윈도우에서의 *과 동일한 의미를 갖는다.
LIKE설명
'%검색어''검색어'로 끝나는 모든 내용
'검색어%''검색어'로 시작하는 모든 내용
'%검색어%'앞 뒤 구분 없이 '검색어'를 포함하는 모든 내용
  • 조회 속도가 느리다.
  • 따라서 한글자 검색은 막자.( SQL은 막지 못하니 프로그램 글자수 제한을 두게 유효성 검사를 해줘야함)

예제 1

  • 학생 테이블에서 성이 '김'씨인 학생의 이름, 학년, 학과번호를 출력
SELECT name, grade, deptno FROM student WHERE name LIKE '김%';
+--------+-------+--------+
| name   | grade | deptno |
+--------+-------+--------+
| 김영균 |     3 |    101 |
| 김진영 |     2 |    102 |
| 김진경 |     2 |    201 |
+--------+-------+--------+

📕 NULL 값의 의미

  • NULL은 미확인 값 혹은 아직 결정되지 않은 값을 의미
  • NULL은 숫자 0이나 공백과는 다른 값이다.
    EX) 학생 몸무게가 NULL인 경우는 학생 몸무게가 0이 아니라 현재 시점에서 그 학생의 몸무게를 모른다는 의미
  • 대부분의 프로그래밍 구현에서 미필수 항목에 대하여 사용자가 입력하지 않은 경우를 NULL 로 처리한다.
  • 빈문자열도 값이 있는 것이므로 NULL이 아니다.
  • 입력하지 않은 경우 NULL로 저장된다.
  • DATABASE에서는 NULL 데이터를 받지 않는 것을 지향한다. (값을 받는 것이 좋다.)

예제1

  • 교수 테이블에서 이름, 직급, 보직수당을 출력 -> NULL 데이터 확인
SELECT name, position, comm FROM professor;
+--------+----------+------+
| name   | position | comm |
+--------+----------+------+
| 김도훈 | 교수     |   20 |
| 이재우 | 조교수   | NULL |
| 성연희 | 조교수   |   15 |
| 염일웅 | 전임강사 | NULL |
| 권혁일 | 교수     |   25 |
| 이만식 | 부교수   | NULL |
| 전은지 | 전임강사 | NULL |
| 남은혁 | 부교수   |   17 |
+--------+----------+------+
  • 이 테이블에서 NULL 데이터는 보직수당이 결정되지 않았음을 의미

📕 IS NULL, IS NOT NULL 연산자

  • 특정 컬럼에 저장된 데이터에 대한 NULL 여부 검사하기
SELECT 컬럼 FROM 테이블 WHERE 컬럼 IS [NOT] NULL;
  • IS NULL : 컬럼 값 중에 NULL을 포함하는 행을 검색하기 위해 사용
  • IS NOT NULL : NULL을 포함하지 않는 행을 검색하기 위해 사용

예제 1

  • 교수 테이블에서 보직수당이 없는 교수의 이름, 직급, 보직수당을 출력
SELECT name, position, comm FROM professor WHERE comm IS NULL;
+--------+----------+------+
| name   | position | comm |
+--------+----------+------+
| 이재우 | 조교수   | NULL |
| 염일웅 | 전임강사 | NULL |
| 이만식 | 부교수   | NULL |
| 전은지 | 전임강사 | NULL |
+--------+----------+------+

예제 2

  • 교수 테이블에서 보직수당을 받고 있는 교수의 이름, 급여, 보직수당을 출력
SELECT name, sal, comm FROM professor WHERE comm IS NOT NULL;
+--------+-----+------+
| name   | sal | comm |
+--------+-----+------+
| 김도훈 | 500 |   20 |
| 성연희 | 360 |   15 |
| 권혁일 | 450 |   25 |
| 남은혁 | 400 |   17 |
+--------+-----+------+

📕 WHERE - 연산자 우선순위

순위연산자
1괄호로 묶인 부분
2비교연산자( =, !=, <>, >, >=, <, <= )
SQL 연산자( BETWEEN, IN, LIKE, IS NULL )
3NOT
4AND
5OR
  • AND 가 OR보다 우선한다.

예제 1

  • 102번 학과의 학생중에서 1학년 또는 4학년 학생의 이름, 학년, 학과 번호를 출력
SELECT name, grade, deptno FROM student WHERE deptno = 102 AND (grade=1 OR grade=4);
+--------+-------+--------+
| name   | grade | deptno |
+--------+-------+--------+
| 오유석 |     4 |    102 |
| 하나리 |     1 |    102 |
+--------+-------+--------+

✏️ 연습문제

연습문제 1

  • 교수테이블에서 급여가 300~400만원 사이인 교수의 이름과 급여를 BETWEEN 연산자를 사용하여 조회하시오.
SELECT name, sal FROM professor WHERE sal BETWEEN 300 AND 400;
+--------+-----+
| name   | sal |
+--------+-----+
| 이재우 | 320 |
| 성연희 | 360 |
| 남은혁 | 400 |
+--------+-----+

연습문제 2

  • 교수테이블에서 직급이 조교수 또는 전임강사인 교수의 번호, 이름, 직급, 학과번호를 IN 연산자로 조회
SELECT profno, name, position, deptno FROM professor WHERE position IN ('조교수', '전임강사');
  • IN연산자는 OR일 때 사용
  • sql은 문자열을 홑따옴표'를 사용한다.
+--------+--------+----------+--------+
| profno | name   | position | deptno |
+--------+--------+----------+--------+
|   9902 | 이재우 | 조교수   |    201 |
|   9903 | 성연희 | 조교수   |    101 |
|   9904 | 염일웅 | 전임강사 |    102 |
|   9907 | 전은지 | 전임강사 |    101 |
+--------+--------+----------+--------+

연습문제 3

  • 학과 이름에 공학 이라는 단어가 포함된 모든 학과의 학과번호,이름, 위치를 조회
SELECT deptno, dname, loc FROM department WHERE dname LIKE '%공학%';
+--------+--------------+-------+
| deptno | dname        | loc   |
+--------+--------------+-------+
|    101 | 컴퓨터공학과 | 1호관 |
|    201 | 전자공학과   | 3호관 |
|    202 | 기계공학과   | 4호관 |
+--------+--------------+-------+

연습문제 4

  • 학생 테이블에 해당하는 학생의 담당 교수가 결정된 경우 교수번호가 함께 저장되어 있다.
  • 담당 교수가 결정된 학생의 학번, 이름, 학년, 담당 교수 번호를 조회하시오.
SELECT studno, name, grade, profno FROM student WHERE profno IS NOT NULL;
+--------+--------+-------+--------+
| studno | name   | grade | profno |
+--------+--------+-------+--------+
|  20103 | 김진경 |     2 |   9902 |
|  10101 | 전인하 |     4 |   9903 |
|  10107 | 이광훈 |     4 |   9903 |
|  10201 | 김진영 |     2 |   9905 |
|  10202 | 오유석 |     4 |   9905 |
|  10204 | 윤진욱 |     3 |   9905 |
|  10103 | 김영균 |     3 |   9906 |
|  10104 | 지은경 |     2 |   9907 |
|  10105 | 임유진 |     2 |   9907 |
|  10108 | 류민정 |     2 |   9907 |
+--------+--------+-------+--------+
  • 담당 교수가 결정된 학생 : 해당 교수번호에 대해서 NULL이 아닌 데이터 조회

연습문제 5

  • 102번 학과의 학생중에서 4학년 학생이거나, 소속된 학과에 상관없이 1학년 학생들의 이름, 학년, 학과 번호를 출력해라
SELECT name, grade, studno, deptno FROM student WHERE deptno = 102 AND (grade = 1 OR grade = 4);
+--------+-------+--------+--------+
| name   | grade | studno | deptno |
+--------+-------+--------+--------+
| 오유석 |     4 |  10202 |    102 |
| 하나리 |     1 |  10203 |    102 |
+--------+-------+--------+--------+
  • deptno = 102 AND grade = 4 OR grade = 1 의 의미

0개의 댓글