Search
Duplicate

2장 - SQL 기초

상태
Done
생성자
2장 - SQL 기초

6강 SELECT 구문

데이터베이스의 핵심은 검색 이다
필요한 데이터를 뽑아내는 행위를 질의 또는 추출이라고도 한다
검색을 위해 사용되는게 SELECT 구문이다.
SELECT name,phone_nbr, address, sex, age FROM Address
SQL
복사

SELECT & FROM

SELECT 구문은 두 부분으로 구성
SELECT 구
테이블이 갖고 있는 필드 일 경우, 로 연결해서 사용
수식
FROM 구
FROM [테이블 이름]
테이블에서 데이터를 검색하는경우 FROM 필수
SELECT 1 처럼 상수를 선택하는 경우 불필요
SELECT 구문에는 데이터를 ‘어떤 방법’으로 선택할지 나타내지 않는다. 사용자가 생각해야 하는 부분은 어떤 데이터가 필요한지 정도

WHERE 구

SELECT name, address FROM Address WHERE address = '경기도';
SQL
복사
엑셀의 필터 조건과 같다
어디? 가 아니라 ~ 라는 경우 를 나타내는 관계부사다

WHERE 구의 다양한 조건 지정

연산자
의미
=
~ 와 같음
< >
~와 같지 않음
~ 이상
~ 이하
<
~ 보다 작음
WHERE 구는 거대한 벤다이어그램이다
주소가 서울시 이며, 나이가 30세 이상 을 찾으려면 다음과 같다
SELECT name, address.age FROM address WHERE address = '서울시' AND age >= 30;
SQL
복사
교집합

OR

서울시 또는 30세 이상
합집합
SELECT name, address.age FROM address WHERE address = '서울시' OR age >= 30;
SQL
복사

IN 으로 OR 조건을 간단하게 작성

SELECT name, address FROM Address WHERE address = '서울시', OR address = '부산시', OR address = '인천시';
SQL
복사
위의OR 문을 아래로 개선할 수 있다.
SELECT name, address FROM Adress WHERE address IN ('서울시', '부산시', '인천시');
SQL
복사

NULL

특정 컬럼이 NULL 인 레코드를 찾기 위해서는 =NULL 이 아닌 IS NULL 을 써야 한다
SELECT name, phone_nbr FROM Address WHERE phone_nbr IS NULL;
SQL
복사

SELECT 구문은 절차 지향형 언어의 향수

입력을 받고 관련된 처리를 수행 한 뒤에 리턴하는 것.
SELECT 구문도 테이블이라는 입력을 FROM 구로 받아, 특정 출력을 리턴한다
SELECT 구문의 입력과 출력의 자료형은 테이블(관계)다. 입력도 출력도 모두 2차원 표 이외에는 어떤 자료형도 존재하지 않는다.
⇒ 폐쇄성(closure property)

GROUP BY

테이블에서 데이터를 선택 + 합계 또는 평균 등의 집계 연산을 표현
SELECT sex, COUNT(*) FROM Address GROUP BY sex; sex | count --------------| 4| 5
SQL
복사
SQL 의 대표적인 집계 함수
함수 이름
설명
COUNT
레코드 수를 계산
SUM
숫자를 더함
AVG
숫자의 평균을 구함
MAX
최대값을 구함
MIN
최솟값을 구함

HAVING 구

SELECT address, COUNT(*) FROM Address GROUP BY address HAVING COUNT(*) = 1;
SQL
복사
살고 있는 사람수(레코드 수) 가 한 명 뿐인 주소 필드(address)를 선택
WHERE 구가 레코드에 조건을 지정한다면, HAVING 구는 집한에 조건을 지정하는 기능

ORDER BY 구

순서를 지정
SELECT name, phone_nbr, address, sex, age FROM Address ORDER BY age DESC;
SQL
복사
나이순으로 내림차순 정렬
ASC (오름차순)이 기본값 DBMS 의 공통 규칙

뷰와 서브쿼리

SELECT 구문 중에서도 자주 사용하는 것과 거의 사용하지 않는것이 나온다. 자주 사용하는 SELECT 구문은 따로 저장하고 싶을때 View 기능을 사용할 수 있다.
하지만 테이블과 달리 내부에 데이터를 보유하지 않기때문에, SELECT 구문을 저장한 것 뿐이다

뷰 만들기

CREATE VIEW [뷰 이름]([필드이름 1],[필드 이름2] ... ) AS
SQL
복사
CREATE VIEW CountAddress(v_address, cnt) AS SELECT address, COUNT(*) FROM Address GROUP BY address; -------------------- SELECT v_address, cnt FROM CountAddress;
SQL
복사

익명 뷰

뷰에셔데이터를선택 SELECT V_address,⊂nt FROM CountAddress; SELECT v_address, cnt FROM(SELECT address AS v_address, COUNT(*) AS ⊂nt FROM Address GROUP BY address) AS CountAddress;
SQL
복사
이렇게 FROM 구에 직접 지정하는 SELECT 구문을 Subquery 라고 한다.

서브쿼리로 조건 설정

SELECT name FROM Address WHERE name IN (SELECT name FROM Address2);
SQL
복사
Address 2의 결과로 부터 나온 이름 과 일치하는 Address 의 이름

조건분기 CASE문

CASE WHEN address = '서울시' THEN '경기' WHEN address = '인천시' THEN '경기' WHEN address = '부산시' THEN '영남' WHEN address = '속초시' THEN '관동'; WHEN address = '서귀포시' THEN '호남' ELSE NULL AND AS distinct FROM Address;
SQL
복사

집합연산

UNION 합집합

SELECT * FROM Address UNION SELECT * FROM Address2;
SQL
복사
중복 제외
중복 출력을 하려면 UNION ALL
합치려는 테이블 두개가 스키마가 같아야 한다.

INTERSECT 교집합

SELECT * FROM Address INTERSECT SELECT * FROM Address2;
SQL
복사
중복 제외

EXCEPT 차집합

SELECT * FROM Address EXCEPT SELECT * FROM Address2;
SQL
복사
Address - Address2
교환 법칙 미 성립

윈도우 함수

OVER (PARTITON BY address) - 집약없는 그룹화

SELECT address, COUNT(*) OVER (PARTITION BY Address) FROM Adress;
SQL
복사
GROUP BY 와 달리 집약 기능 사용 X

RANK 순위 구하기

SELECT name, age, RANK() OVER (ORDER BY age DESC) AS rnk FROM Adress;
SQL
복사
값이 같을때 순위를 같이 표시하고, 공동 순위를 건너 뛴 만큼 다음 숫자는
DENSE_RANK 를 사용하면 공동순위를 표시

트랜젝션과 갱신

갱신 INSERT

INSERT INTO Person (name, age, nickname) VALUES ('홍길동', 99, 'gil-dong')
SQL
복사
다중갱신
INSERT INTO Person (name, age, nickname) VALUES ('홍길동', 99, 'gil-dong'), ('김두한', 4, 'four-dollar'), ('심영',30,'goza');
SQL
복사

제거 DELETE

DELETE FROM Person;
SQL
복사
테이블의 모든 레코드 제거
DELETE FROM Person WHERE name = '김두한';
SQL
복사
특정 필드의 값을 필터링 해서 제거
일부 필드값만 가진 레코드 모두 제거는 불가능

갱신 UPDATE

UPDATE Person SET name = '아무개' WHERE name = '김두한';
SQL
복사
다중 컬럼 값 갱신
UPDATE Address SET phone_nbr = '080-5848-XXXX', age = 20 WHERE name = '김또깡'
SQL
복사
UPDATE Address SET(phone_nbr, age) = ('080-5848-XXXX', 20) WHERE name = '김또깡'
SQL
복사