쿼리실습 - 데이터 읽기

imjingu·2023년 8월 13일
0

개발공부

목록 보기
365/481

1. 필드 비교

WHERE 절은 읽을 레코드의 조건을 지정.
필드 목록은 읽을 열을 지정하는데 비해 WHERE 절은 읽을 행을 지정.
WHERE 절이 없으면 모든 레코드를 다 조회.
SELECT 명령은 조건에 맞는 레코드를 검색하는 것이 주 기능이어서 대개의 경우 WHERE 절과 함께 사용.
WHERE 절은 DELETE, UPDATE 등의 명 령과 함께 삭제 및 변경할 레코드를 선택할 때도 사용.
WHERE 절에는 레코드를 선택하는 조건문이 옴, 주로 필드와 특정값을 비교하는 조건문 형태로 작성.

SELECT * FROM tCity WHERE area > 1000;


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

SELECT name, area FROM tCity WHERE area > 1000;


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

조건문은 필드와 상수, 변수 등을 표 현식이되고 비교 대상끼리 타입이 호환되어야 함.
정수형을 문자열과 비교한다거나 실수형을 날짜와 비교해서는 안됨.

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


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

SELECT * FROM `tCity` WHERE `name` = '서울' -- 맞음

SELECT * FROM tCity WHERE name = 서울 -- 틀림

SELECT * FROM tCity WHERE name = "서울" -- 틀림. 단, 마리아는 인정한다.

따옴표없이 그냥 서울이라고 하면 이 때의 서울은 필드명을 의미.

SELECT * FROM tCity WHERE metro ='y';

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

2. NULL 비교

NULL은 값이 입력되어 있지 않은 특수 한 상태를 표현, 값을 알 수 없거나 아직 결정할 수 없다는 뜻이며 0이나 빈 문자열과는 다름. 필드를 선언할 때 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 가능하다고 되어 있음.
정보가 아직 조사되지 않았거나 모르는 상태일 때 이 필드를 NULL로 남겨 둠.
반면 광역시 여부나 지역은 NOT NULL 로 선언되어 있어 값이 없으면 레코드를 삽입할 수 없음.

tStaff 테이블에는 score필드가 NULL 가능한 것을 선언.

SELECT * FROM tStaff WHERE score = NULL;


NULL 값을 검색할려고 조건절에서 = NULL 로 작성.
하지만 NULL은 값이 아니라 상태이기 때문에 = 연산자로 비교할 수 없음.

SELECT * FROM tStaff WHERE score IS NULL;


필드는 값이고 NULL은 상태라서 IS NULL 연산자를 따로 제공.

SELECT * FROM tStaff WHERE score IS NOT 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 보다 높음. 애매할 경우에는 괄호로 우선 순위를 지정하는 것이 좋음.

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

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

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

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

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

NOT 연산자는 표현식의 진위 여부를 반대로 바꿈.
즉 뒤의 표현식이 참이면 거짓으로 바꾸고 거짓이면 참으로 바꾸어 반대 조건을 취함.
경기도 소속이 아닌 도시의 정보를 조사.
복합 조건의 반대를 취할때는 NOT이 편리.
SELECT * FROM tCity WHERE region != '경기';

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

전라도에 있거나 광역시인 도시를 조사.
SELECT * FROM tCity WHERE region = '전라' OR metro = 'y';


이 조건의 반대를 만들자면.

SELECT * FROM tCity WHERE region != '전라' AND metro != 'y';


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

SELECT * FROM tCity WHERE NOT(region = '전라' OR metro = 'y');

4. LIKE

= 비교 연산자를 완전히 일치하는 조건식을 표현하는데 비해 LIKE 연산자는 패턴으로 부분 문자열을 검색, 성이 김씨인 사람, 주소가 강남구인 사람들을 검색할 때 편리. LIKE 문의 패턴에는 다음의 와일드 카드를 사용.

SELECT * FROM tCity WHERE name LIKE '%천%';
이름에 "천"자가 들어가는 도시를 검색.


앞쪽이나 뒤쪽에 임의의 개수의 문자 가 있어도 상관없되 가운데 어딘가에 "천"자만 있으면 됨.
LIKE 연산자는 부분 문자열이 포함된 모든 필드를 검색.
반대 연산자는 NOT LIKE이며 부문 문 자열을 포함하지 않은 모든 필드를 검색.

SELECT * FROM tCity WHERE name NOT LIKE '%천%';
이름에 "천"이 들어가지 않는 도시 다섯개를 검색.

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

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


'천%'는 "천"으로 시작하는 도시를 찾음. 특정 문자로 시작하는 필드를 찾음.
'%천'는 "천"으로 끝나는 도시를 찾음. 특정 문자로 끝나는 필드를 찾 음.
'%천'의 경우 처리하는 DBMS나 타입 별로차이가있음.ex) '홍천 ' 공백 제거를 위해 아래와 같이 작성 하기도 함.

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

5. BETWEEN

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

SELECT * FROM tCity WHERE popu BETWEEN 50 AND 100;
인구가 50 ~ 100만 사이의 도시를 구함.

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


"~ 보다 크고 ~ 보다 작다" 조건의 조합이어서 AND 논리 연산자로 대체 가능.
BETWEEN ~ 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 ('경상', '전라');

region 필드가 '경상' 또는 '전라'인 모든 도시를 조사.
IN 연산자는 여러 값 중 하나라도 해 당하는지 점검하므로 각각의 비교문 을 OR 논리 연산자로 연결하여 표현 가능.

SELECT * FROM tCity WHERE region = '경상' OR region = '전라';

값 리스트가 많은 경우 일일히 OR 연 산자로 조건을 연결하는 것보다 IN 연산자로 값만 나열하는 것이 짧고 읽기 쉬움.
추후 값 리스트를 편집하기도 편해 관리상의 이점이 있음.
IN 연산자의 괄호 안에 목록을 직접 나열하는 것보다 서브쿼리로 대상 목록을 조사해서 사용하는 경우가 많 음.

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

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


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

부분 문자열 여러 개 중 하나에 해당 하는지 찾으려면 LIKE와 IN 연산자를 같이 써야 함.

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

직원 목록에서 이씨와 안씨를 찾음. 하지만 SQL 표준에서 지원하지 않음, LIKE와 IN 연산자는 같이 사용할 수 없음, 오류발생 이런 검색을 하고 싶으면 각각의 LIKE 조건을 OR 연산자로 연결

SELECT * FROM tStaff WHERE name LIKE '이%' OR name LIKE '안%';

0개의 댓글