① 테 이블에 있는 데 이 터들을 걸러 내는 필터 역힐을 하는 일반조건 ② 조인 시에 테이블들을 연결하는 조인조건
SELECT *
FROM employees
WHERE employee_id = 101;
S E L E C T FROM WHERE first name l l 1ast name full name e mp 1 • y e e S empI•yee id = 101;
S E L E C T FROM WHERE S E L E C T FROM WHERE S E L E C T FROM WHERE first name l l 1ast name AS full name e mp 1 O Ve e S empl•vee id = 101F 낙 AS 별칭 이름 Eirst name l l 1ast name "full name" 다 큰 따옴표로 묶어야함
S E L E C T FROM W H E RE AND AND [출 력 결과] first name l l ' ' l l 1ast namE salary 월급, department id 부서번호 e mp 1 • ye e S department id = 30 salarV < 10000 hire date < rl996-01-01';
조건 AND연결
SELECT empI○yee id 사원번호, firstnamell''ll1astname성명, salary월급, hiredate입사일자 FROM empI•yees WHERE hire date BETWEEN TO DATE('1995-01-01') ANDTODATE('1999-12=31')
l N BETWEEN AND조건은일정한범위의값을비교하는데,범위값괴는다르게여러개의값을 동시에 비교해야 할 경우
SELECT empl○yee id 사원번호, firstnamell''ll1astname성명, Salary월급, departmentid부서코드 FROM empl•Vees WHERE department id IN (30, 60, 90) ;
E X l ST S IN과 비슷한 용도로 EXISTS 조건이 있다. 어떤 값에 포함되는지 여부를 체크하는 것이 IN이라면 EXISTS는 특정 컬럼값이 존재하는지 여부를 체크한다
SELECT emp.empIoyee id 사원번호, emp.firstnamell''ll1astname성명, emp.salary월급, emp.departmentid부서코드 FROM empI•yees emp WHERE EXISTS (SELECTdep.departmentid FROMdepartmentsdep 密 찮 쑈藤렸肄 옳 옳 ☎ 2부 SQL 들어가기 WHERE dep AND emp _l4 r•ws se_lected department id IN (30, 60, 90) department id = dep.department id );
SELECT emp.empI○yee id 사원번호, emp.firstnamell''ll1astname성명, emp.salary월급, emp.departmentid부서코드 FROM empI•yees emp WHERE NOT EXISTS (SELECT deP.departmentid FROMdep WHEREdep.departmentidIN(30,60,90) ANDemp.departmentid=dep.departmentid) (30,60,90)AND emp.department_id =dep.department_id);
IN 연산자는 해당 컬럼값을 비교대상 값들과 직접 비교
EXISTS의 경우에는 값을 직접 비교하는 것이 아니라 존재하는지 여부를 판단한다. 따라서 EXISTS는 DEPARTMENT一ID 값이 30, 60, 90인 데이터만 조회하게 되며, NOT E지STS는 이 값 이외의 모든 값을 가진 로우를 조회하게 된다 따라서 조회 결과에 NULL을 가진 대이터가 포함되 어 95건의 데 이터가 조회
• IN - 테이블의 컬럼값이 특정 값들에 속해 있는지 여부를 판단하는 조건식이다. - IN 조건은 OR 조건으로 바꾸어 사용할 수 있다. 혁 반드시 괄호와 함께 쓰이 며 , 괄호 안에는 비교할 값의 리스트나 서브쿼 리가 올 수 있다. - IN의 반대 개념은 NOT IN이다. - 컬럼값이 NULL이거나 비교하는 값의 리스트 중에 NULL이 있으면 제대로 비교하지 못한다
EXISTS - IN과 동일한 기능을 수행하지만, 비교연산 방식은 다르다.
- 뒤 에 오는 괼호 안에는 오직 서 브쿼 리 만 올 수 있다. 一 서브쿼리의 WHERE 절에서 비교할 기준테이블의 컬럼과 조인을 맺어야 하며, 서브쿼리의 결과 로 반환되는 로우가 1 개리도 있을 경우 EXISTS 조건을 만족하게 된다.
- 서브쿼리의 SELECT 리스트에는 어떤 유형의 값도 올 수 있다.
一 EXISTS의 반대 개념은 NOT EXISTS이다. 一 성능면에서는 IN보다 EXISTS가 월등히 우수하다.
WHERE full name 1ike '박
WHERE full name 1ike '박%'
. Charl : 검색 값GeaTch v첸lue)이라고 하며. 문자형 컬럼 이나 문자형 표현식 형태이다 . Char2 : 문자형 표현식 형태이며 패턴이라고 부른다. . Esc char , 특정 의미를 가진 문자형 표현식으로 ‘%’ 나 볕’ 가 올 수 있다
SELECT empI○yee id 사원번호, firstnamell''ll1astname성명, salary월급, departmentid부서코드 FROM empl•yees WHERE ph•ne number LIKE $515%'
. 전화번호가 515로 시작되지 않는 모든 사원을 조회할 경우 조건은
SELECT empl○yee id 사원번호, firstnamell''ll1astname성명, salary월급, ph○nenumber전화번호 FROM empl•vees 속쁜 WHERE ph•ne number NOT LIKE r515%V ;
SELECT empl○vee id 사원번호, 上쁜 firstnamell''ll1astname성명, email이메일계정, ph○nenumber전화번호 FROM empl•yees WHERE email LIKE '%S I%r;
l NULL 처리
WHERE state Provlnce LIKE I%
S E L E C T FROM WHERE 1•catl•n id/ street address, city, state provlnce 1 • C a t 1 o n S state provlnce LIKE I%I;
S E L E C T FROM WHERE 1•cati•n 1d, street address/ city, state province , U _L • C a t 1 • n S State province IS NOT NULL;
조인이란?
SELECT first name, 1ast name, email, phone number/,hire date/ salary,jobid,departmentid FROM employees;
S E L E C T FROM WHERE 컬럼 리스트 조인대상 테이블 조인조건 ;
조인은 두 개 이상의 테이블들이 대상이 되므로 FROM 절에 연결할 테이블들을 기술해 주는데 각 데 이 불의 구분은 콤마( , )를 사용한다
S E L E C T FROM WHERE 컬럼 리스트 조인대상 테이블 조인조건 ;
SELECT empIoyees.first name, empl•yees.last name, empIoyees.email/ departments.departmentname FROM empl•Veesr departments WHERE empIoyees.department_id = departments.department_id
인 시에는 조회 대상 데이블이 두 개 이상이므로 컬럼을 명시할 때 항상 ‘데이블명컬럼명' 형식을 따라야 한다.
동일한 SELECT 문장인데도 조금 간편해졌다. 기존 문장과 달라진 점은 FROM 절에서 각 테이블 이름 뒤에 emp, dep리는 단어를 추가했는데, 이를 테이블의 별칭 혹은 별명(AIias)이라고 한다
내부조인
내부조인을 하게 되면 조인에 참여하는 테이블들 중에 기준이 되는 데이블이 존재하게 된다 조인이리는 것이 여러 테이블 사이에서 같은 값을 가진 데이터를 찾아내기 위해 테이블들을 연결하여 사용하는 것이므로 어느 한 테이블을 기준으로 해서 이와 연결된 다른 테이블의 데이터 를 추출
SELECT emp.first name, emp.1ast namer emp.email/ emp.departmentid,dep.departmentname, emp.j•bid,job.jobtitle FROM empI•yees empr departmentsdepr 1○bs헤○b WHERE emp.department id = dep.department id ANDenp.jobid =job.jobidF
S E L E C T F R O M W H E R E AND AND AND emp.first namer emp.1ast name, emp.emallr dep.department name, j•b.j•b title, 1oc . City empl•yees emp/ departments dep, =○bs j○b, 1•catl•ns 1oc emp.department id = dep.department id emp.job_id =j•b.j•bid dep.1ocati•nid =1•c.1•cati•nid 1oc.state-province = '캘리포니아
① L○CATIONS 테이블에서 STATE PROVINCE 값이 캘리포니 아인 로우를 찾는다. ② 찾은 LOCATION_ID 값과 같은 값을 가진 데이터를 DEPARTMENTS 데이블에서 핵f 조인을 한다. ③ ②의 결과와 EMPLoYEES 데이블을 비교하여①EPARTMENT_ID 값이 같은 것) 조인한다. ④ ③의 결과와JOBS 테이블을 비교하여 조인하여 최종 쿼리결괴를 얻는다
만약 WHERE 절에서 조인조건을 넣지 않으면 어떻게 될까
SELECT COUNT(*) FROM empl•yees
SELECT COUNT(*) FROM departments
S E L E C T FROM WHERE AND [출 력 결 과] a.empl•yee 1d, b.first name/ b.1ast name empIoyees a/ empI•yees b HT U T a.emP_L○yee 1α = p.emPL○yee 1CI r•wnum < 51
셀프조인을 할 경우에는 반드시 테이블 별칭(alias)을 사용해야 한다 셀프조인이 아닌 다른 조인의 경우 별칭을 사용하지 않더라도 SELECT 리스트나 WHERE 조건에서 시용되는 컬럼만 정확히 명 시하면 되지만 셀프조인에서는 동일한 테이블을 사용하기 때문에 반드시 별칭을 사용
SELECT empl•yees.empl•yee id, empl•yees.firstname, empl•yees.departmentid/ departments.departmentname FROM employees, departments WHERE empl•yees.department id = departments.department id/
셀프조인이 아닌 경우 테이블 별칭을 사용하지 않더라도 조인조건 등에서 사용되는 컬럼들이 어떤 테이블에 있는 컬럼이지만 명시하면 된다. S E L E C T FROM WHERE empl•yee id, first name empIoyees, empl•yees empIoyees.employee id 三 employees.employee id
SELECT empl•yees.empl•yee id, empl•yees.firstname, empl•yees.departmentid, departments.departmentname FROM employees, departments WHERE empl•yees.department id = departments.department id;
-셀프조인
셀프조인(Selfjoin)이리는 말 그대로 자기 자신과 조인을 맺는 것을 말한다. 여기서 자기 자신이란 당연히 테이블을 말한다. 즉 실제 조인에 사용되는 테이블은 한 개지만 FROM 절에서는 동일한 테 이블을 두 번 명시하고 WHERE 절에 조인조건을 주어, 서로 다른 두 개의 테이블을 조인히는 것처럼 사용하게 된다
SELECT a.employee_id, b.first_name, b.last_name
FROM employee a, employees b
WHERE a.employee_id = b.employee_id
AND rownum < 5;
EMPLOYEES 데이블에서 EMPLOYEE그D 값과 MANAGER_ID를 조인조건으로연결
SELECT employee_id, first_name
FROM employees
WHERE manager_id is null;
SELECT emp.employee
안티조인
말그대로 동등조인과는 반대되는 개념의 조인
“안티조인이란 조인조건에서 NOT lN 연산자를 사용하는 조인을 말한다"
벱_IHIII실납 FROM W H E R E emp.empl•yee id, emp.first name, emp.department id, dep.department name empl•yees emp, departments dep emp.department id <> dep.department id
세미조인
세미조인 앞에서 IN과 비슷한 동직을 하는 연산자로 EXISTS를 설명했었다. 세미조인Gemijoin)은 바로 IN 대신 EXISTS를 사용하는 조인을 말한다.
SELECT dep.* FROM departments dep WHERE EXISTS ( SELECT 1 FROMempIoyeesemp WHEREemp.departmentid三dep.departmentid ANDemp.Salary>10000) ORDER BY dep.department id;
-in과 비슷
외부조인
일반적 인 조인인 내부조인을 확장한 개념의 조인
외부조인을 하게 되면 어느 한 테이블의 공 통 컬럼값이 없더리도(컬럼값이 NULL인 경우) 해당 로우들이 조회결과에 포함
SELECT emp.empI•yee id, emp.firstname, emp.departmentid, dep.departmentname FROM empl•yees emp/ departments dep WHERE emp.department id = dep.department id
외부조인은 조인에 참여하는 테이블 중 어느 한 테이블에서만 조회조건을 만족한다면, 다른 하 ㄴ테이블 값이 없더라도 데이터를 조회할 수 있다.
_id,
SELECT emp.employee_id, emp.first_name, emp.department,dep.department_name
FROM employees emp, departments dep
WHERE emp.department_id = dep.department_id(+)
ORDER BY emp.department_id;
외부조인은 바로 조회조건에서 (+) 기호를 사용한 조인을 말한다
SELECT emp.employee_id,
emp.first_name,
dep.department-name,
loc.city
FROM employee emp, department dep
locations loc
WHERE emp.dapartment_id = dep.department_id(+)
AND dep.location_id = loc,loction_id(+)
ORDER BY emp.deprtment_id;
위 문장에서 외부조인 역할을 하는 것은 e.employe_id = i.employee一id(+) 조건이며 e.department_id = i.department_id 조건에는 붙일 필요가 없다. 하지만 두 번째 조건에서 (+)를 붙이지 않으면 첫 번째 조건에서 (十)가 있음에도 불구하고 결괴는 내부조인이 된다 따라서 외부 조인을 할 때에는 조인조건이 하나 이상일 경우에는 모든 조인조건에 (=)를 붙여야 한다
첫째, (+)는 WHERE 절에서만 시용이 가능하다. 둘째, 데이블간 외부조인 조건이 한 개 이상일 경우, 모든 외부조인 조건에 (十)를 붙여야 외부조인 이 성립된다 결과를 얻기 위해서는 조인조건 외의 일반조건에도 (+)를 붙여야한다
SELECT e.employee_id, e.first_name, j.start_date, j_end_date.
j.job_id, j.department_id old_dept
FROM employee e,
job_history j
WHERE e.employee_id = j.employee_id(+)
AND j.department_id(+) = 80
외부조인을 구성하는 조인조건에서 (수)가 붙은 테이블의 컬럼에는 조인조건 뿐만 아니라 디른 조건에도 (十)를 붙여야 한다 위 문장의 경우 마
지막 조건인 jdepartment id = 80올 i.department一id (수) = 80으로 변경해야 외부조인이 성립된다.
SELECT e.employee_id, e.first_name, j.start_date, j_end_date.
j.job_id, j.department_id old_dept
FROM employee e,
job_history j
WHERE e.employee_id = j.employee_id(+)
AND j.department_id(+) = 80
외부조인을 구성하는 조인조건에서 (수)가 붙은 테이블의 컬럼에는 조인조건 뿐만 아니라 디른 조건에도 (十)를 붙여야 한다 위 문장의 경우 마지막 조건인 jdepartment id = 80올 i.department一id (수) = 80으로 변경해야 외부조인이
셋째. 테이블 자신에 (十)를 붙일 수 없다.이와 같은 경우에는 셀프조인을 사용해야 한다
SELECT employee_id, manager_id
FROM employee e1, employees e2
WHERE e1.manager_id(+) = e2.employee_id;
넷째(+)는 오직 컬럼에만 붙일 수 잇으며 OR 연산자와는 같이 사용할 수 없다
SELECT e.employee_id, e.first_name, e.department_id current_dept,
j.start_date, j.end_date, j.job_id, j.department_id old_dept
FROM employees e,
job_history j
WHERE e.employee_id =j.employee_id(+)
OR e.depatrment_id = j.departement_id
ORDER BY j.employee_id;
(+) 오직 컬럼에만붙일 수 잇으며 OR 연산자와는 같이 사용할 수 없다
다섯째. 외부조인시에 대상 데이블은 오직 한 개의 테이블과만 외부조인이 기능하다.
예를 들어 SELECT 문장에서 대상 테이블이 A, B, C가 있다고 하자 여기서 A와B나 B와C 데이블에 동시에 외 부조인을맺을수는없다.
WHERE e.employees e,
job_history j, departments d
WHERE e.employee_id = j. employee_id(+)
AND e,depatement_id = j .department_id(+)
AND d.department_id = j.department_id(+)
여섯째, 조인조건식 에서 (수)가 붙은 컬럼괴는 m 연산지를 같이 사용할 수 없다
외부조인시 컬럼에 G)가 붙었다는 의미는 해당 컬럼에 비교대상이 되는 값이 없더라도 조회결과에 나와야 한다는 의미인데 특정 값들에 포함되는지 여부를 비교하는 IN과 는당연히같이사용될수없다.
WHERE e/employee-id = j.employee_id(+)
AND e.department_id = j.employee_id(+)
AND j.department_id(+) IN(80,900
ORDER BY j.employee_id;
-> 오류
일곱째. 조인조건식에서 (수)가 붙은 컬럼괴는 서브쿼 리를 같이 시용할 수 없다.
여덟째, 조인조건의 오직 한 쪽에만 (+)를 붙일 수 있다.
첫째, SQL의 시장에 맞게 평이한 텍스트 형식의 문법을 사용하고 있다.
ANSI 외부조인
empl○yees 사원, j○b hist○ry 직책테이블에서 사원.사번= 직책.사번(十) 인데이터중 직책.사번, 사원.사번을선택한다.
둘째, FULL OUTER JOIN을 지원한다.
FULL oUTER 조인을 위해 조인조건 양쪽에 G)를 붙이는 것을 허용히는 것은 하위 버전과의 호환성을위해서나기타여러가지이유로많은문제점을발생시킬소지가있다``
다른 DBMS와의 호환성을 위해서는 ANSI 조인을 시용하는 것이 좋다
'취준 note 2023 > db' 카테고리의 다른 글
postgres실습,docker (1) | 2023.01.21 |
---|