1. 필드 비교 [ Where 절 ]

👾 WHERE 절은 읽을 레코드의 조건을 지정. ( * 필드 목록은 읽을 열을 지정하는데 비해 WHERE 절은 읽을 행을 지정 )

      ➡️  주로 필드와 특정값을 비교하는 조건문 형태로 작성한다.

👾 SELECT 명령은 조건에 맞는 레코드를 검색하는 것이 주 기능이어서 대개의 경우 WHERE 절과 함께 사용.

👾 WHERE 절은 DELETE, UPDATE 등의 명령과 함께 삭제 및 변경할 레코드를 선택할 때도 사용.

 

SELECT * FROM tCity WHERE area > 1000;
SELECT name, area  FROM tCity  WHERE  area > 1000;

 

 

📌 면적이 1000제곱킬로미터 보다 큰 도시만 검색.

📌 필드 목록에 * 대신 원하는 필드만 적으면 조건에 맞는 레코드의 지정한 필드만 표시.

📌 조건문은 필드와 상수, 변수 등을 표현식이되고 비교 대상끼리 타입이 호환되어야 함.

      ➡️  정수형을 문자열과 비교한다거나 실수형을 날짜와 비교해서는 안됨.


 

💡 조건문에 사용하는 비교 연산자

연산자
설명
A = B
같다.
WHERE name = '서울'
A > B
A가 더 크다.
WHERE area > 50
A < B
A가 더 작다.
WHERE popu < 100
A >= B
A가 B보다 크거나 같다.
WHERE popu >= 100
A <= B
A가 B보다 작거나 같다.
WHERE area <= 50
A <> B, A != B
A와 B는 다르다. 또는 같지 않다.
WHERE region <> '경기'

 


 

 

👾 숫자는 상수를 그냥 쓰지만 문자열과 날짜 상수는 항상 작은 따옴표로 감싸야 함.

👾 따옴표없이 서울이라고 하면 필드명을 의미.

 

SELECT * FROM `tCity` WHERE `name` = '서울' ( o )
SELECT * FROM tCity WHERE name = '서울' ( o )
SELECT * FROM tCity WHERE name = 서울 ( x )
SELECT * FROM tCity WHERE name = "서울" ( x )

 

 

 

👾 필드의 영문자를 비교할 때는 대소문자 주의. SQL문 자체는 대소문자를 가리지 않아 키워드나 테이블명, 필드명을 아무렇게나 적어도 상관이 없지만, 필드안에 저장된 값은 대소문자를 구분. 필드값의 대소문자 구분 여부는 DBMS에 따라, 설정에따라 다름. 어떤 DBMS를 사용하건 따옴표 내의 문자열 상수는 가급적 대소문자를 정확히적는 것이 바람직.

SELECT * FROM tCity WHERE metro = 'y' ;
SELECT * FROM tCity WHERE metro = 'Y' ;

 

실행 결과

 


 

 

2. NULL 비교

 

👾 NULL은 값이 입력되어 있지 않은 특수한 상태를 표현. 값을 알 수 없거나 아직 결정할 수 없다는 뜻이며 0이나 빈 문자열과는 다름.

👾 필드를 선언할 때 NULL 가능성을 미리 지정한다. 선언문 뒤에 NULL이 있으면 이 필드는 값을 입력하지 않아도 된다는 뜻

 

CREATE TABLE tCity (
name CHAR(10) PRIMARY KEY,
area INT NULL,
popu INT NULL,
metro CHAR(1) NOT NULL,
region CHAR(6) NOT NULL
);

 

 

  📌 인구와 면적이 NULL 가능하다고 되어 있음. 정보가 아직 조사되지 않았거나 모르는 상태일 때 이 필드를 NULL로 남겨 둠.

  📌 반면 광역시 여부나 지역은 NOT NULL로 선언 되어 있어 값이 없으면 레코드를 삽입할 수 없음.

 

 

SELECT * FROM tStaff WHERE score = NULL;       ( x )
SELECT * FROM tStaff WHERE score IS NULL;      ( o )
SELECT * FROM tStaff WHERE score IS NOT NULL;  ( o )

 

  📌 NULL 값을 검색할려고 조건절에서 = NULL 로 작성.

  📌 NULL은 값이 아니라 상태이기 때문에 = 연산자로 비교할 수 없음.

       ➡️ IS NULL 연산자를 따로 제공.

       ➡️ NULL이 아니라는 조건은 IS NOT NULL로 표기.

 

 

 


 

 

3. 논리 연산자

 

👾 두 개 이상의 조건을 동시에 검색할 때는 AND, OR 논리 연산자를 사용

👾 AND는 두 조건이 모두 참인 레코드를 검색하며 OR는 두 조건 중 하나라도 참인 레코드를 검사.

 

SELECT * FROM tCity WHERE popu >=100 AND area >= 700;

 

 

 

📌 인구 100만명 이상, 면적 700제곱킬로미터 이상인 도시를 검색하여

두 조건을 만족하는 부산만 출력.

 

 

SELECT * FROM tCity WHERE popu >=100 OR area >= 700;

 

 

 

 

📌 AND를 OR로 변경하면 두 조건중 하나라도 참인 레코드 검색.

 

 

 

 

 

 

 

👾 세 개 이상의 조건문을 지정할 때도 마찬가지로 WHERE 절을 작성하되 조건의 우선순위에 주의

👾 AND의 우선 순위가 OR 보다 높다. 애매할 경우에는 괄호로 우선 순위를 지정하는 것이 좋음.

 

SELECT * FROM tCity WHERE region = '경기' AND popu >= 50 OR area >= 500;
SELECT * FROM tCity WHERE area >= 500 OR region = '경기' AND popu >= 50 ;

 

 

 

 

📌 경기권 도시중 인구 50만이상이거나 또는 경기권이 아니고 인구가 50만보다 적더라도 면적이 500 이상인 도시를 검색

 

 

 

SELECT * FROM tCity WHERE region = '경기' AND (popu >= 50 OR area >= 500);

 

 

📌 인구가 50만이 넘거나 면적이 500이상인 경기도 도시를 검색.

 

 


👾 NOT 연산자는 표현식의 진위 여부를 반대로 바꿈. 즉 뒤의 표현식이 참이면 거짓으로 바꾸고 거짓이면 참으로 바꾸어 반대 조건을 취함.

SELECT * FROM tCity WHERE region != '경기';
SELECT * FROM tCity WHERE NOT (region = '경기');

 

 

 

 

📌 경기도 소속이 아닌 도시의 정보를 조사. 복합 조건의 반대를 취할때는 NOT이 편리.

 

 

 

 

 

SELECT * FROM tCity WHERE region = '전라' OR metro = 'y'; // 전라도에 있거나 광역시인 도시
SELECT * FROM tCity WHERE region != '전라' AND metro != 'y'; // 위의 조건의 반대
SELECT * FROM tCity WHERE NOT(region = '전라' OR metro ='y');

 

 

📌 A AND B의 부정은 !A OR !B 이며 이를 모르간의 법칙

 


 

 

4. LIKE

 

👾 '=' 비교 연산자를 완전히 일치하는 조건식을 표현하는데 비해 LIKE 연산자는 패턴으로 '부분 문자열'을 검색.

ex. 성이 김씨인 사람, 주소가 강남구인 사람들을 검색할 때 편리

 

⚡️ LIKE 문의 패턴에 사용하는 와일드 카드 ⚡️

 
문자
설명
%
복수 개의 문자와 대응. %자리에는 임의 개수의 임의 문자가 올 수 있음
_
하나의 문자와 대응 _자리에는 하나의 임의 문자가 올수 있음
[]
[]안에 포함된 문자 리스트 중 하나의 문자와 대응
[^]
[^]안에 포함된 문자 리스트에 포함되지 않은 하나의 문자와 대응

👾 임의 개수의 임의 문자와 대응하는 % 와일드 카드를 주로 사용한다.

 

SELECT * FROM tCity WHERE name LIKE '%천%';

 

 

 

📌  이름에 "천"자가 들어가는 도시를 검색

 

 

 

SELECT * FROM tCity WHERE name LIKE '천%';

 

 

📌  "천"으로 시작하는 도시를 검색

 

 

 

SELECT * FROM tCity WHERE name LIKE '%천';

 

 
📌  "천"으로 끝나는 도시를 검색.

📌  '%천'의 경우 처리하는 DBMS나 타입별로 차이가 있음.

📌  공백 제거를 위해 아래와 같이 작성하기도 함.

      SELECT * FROM tCity WHERE TRIM(name) LIKE '%천' ;

 

 


 

 

5. BETWEEN

 

👾 BETWEEN A AND B 문은 "BETWEEN 최소값 AND 최대값" 형식으로 두 값 사이의 범위를 제한

👾 BETWEEN ~ AND 문은 작은 값, 큰 값 순이 상식적이어서 실수할 위험이 낮으며 구문 전체가 하나의 조건이어서 가독성이 높음.

👾 이상, 이하의 범위만 가능하며 미만, 초과는 지정할 수 없는 활용성의 한계가 있음.

👾 문자열이나 날짜에도 사용 가능. ( * 문자열은 사전순으로 비교 )

 

SELECT * FROM tCity WHERE popu BETWEEN 50 AND 100;
SELECT * FROM tCity WHERE popu >= 50 AND popu <= 100;

 

 

 

📌 인구가 50 ~ 100만 사이의 도시를 구함.

📌 "~ 보다 크고 ~ 보다 작다" 조건의 조합이어서 AND 논리 연산자로 대체 가능

 

 

 

SELECT * FROM tStaff WHERE name BETWEEN '가' AND '사';

 

 
SELECT * FROM tStaff WHERE joindate BETWEEN '20150101' AND '20180101';

 

 

 


 

 

 

6. IN

 

👾 BETWEEN 연산자는 연속된 범위만 검색할 수 있으며 불연속적이고 임의적인 값 여러 개를 조사하기 어려움.

👾 이에 비해 IN 연산자는 불연속적인 값 여러 개의 목록을 제공하여 이 목록과 일치하는 레코드를 검색.

👾 IN 연산자 뒤의 괄호 안에 콤마로 구분된 값 목록을 나열하여 이 중 하나에 해당하는지 점검.

👾 값 개수에는 제한이 없다.

 

SELECT * FROM tCity WHERE region IN ('경상','전라');
SELECT * FROM tCity WHERE region = '경상' OR region = '전라';

 

 

📌  region 필드가 '경상' 또는 '전라'인 모든 도시를 조사.

📌  IN 연산자는 여러 값 중 하나라도 해당하는지 점검하므로 각각의 비교문을 OR 논리 연산자로 연결하여 표현가능.

 

 

 

 

👾  값 리스트가 많은 경우 일일히 OR 연산자로 조건을 연결하는 것보다 IN 연산자로 값만 나열하는 것이 짧고 읽기 쉬움.

      추후 값 리스트를 편집하기도 편해 관리상의 이점이 있음.

👾  IN 연산자의 반대 조건은 NOT IN

 

SELECT * FROM tCity WHERE region NOT IN ('경상','전라');

 

 

 

📌  경상도와 전라도에 있지 않은 도시 목록을 조사

 

 

 

 

 

 

👾  부분 문자열 여러 개 중 하나에 해당하는지 찾으려면 LIKE와 IN 연산자를 같이 써야 하지만 SQL 표준에서 지원하지 않음.

      ➡️  즉 LIKE와 IN 연산자는 같이 사용할 수 없음. 이런 검색을 하고 싶으면 각각의 LIKE 조건을 OR 연산자로 연결

 

SELECT * FROM tStaff WHERE name LIKE IN ('이%', '안%'); ( x )
SELECT * FROM tStaff WHERE name LIKE '이%' OR name LIKE '안%';

 

 

 

 

📌  직원 목록에서 이씨와 안씨를 찾음

 

 

 

 

 

 

 

 

[ 내용 출처 ; IT 학원 강의 ]

+ Recent posts