SELECT name, bookname
FROm customer, orders, book
WHERE book.price >= 20000
AND customer.custid = orders.custid
AND orders.bookid = book.bookid;
root : 관리자
구분 | SQL | 일반 프로그래밍 언어 |
용도 | db에서 데이터 추출하여 문제 해결 | 모든 문제 해결 |
입출력 | 입력 : 테이블 출력 : 테이블 |
모든 형태의 입출력 o |
번역 | DBMS | 컴파일러 |
사용 예 | SELECT * FROM Book; |
int main() (…) |
데이터 정의어 DDL
테이블이나 관계의 구조를 생성
CREATE, ALTER, DROP
데이터 조작어 DML
테이블에 데이터를 검색, 삽입, 수정, 삭제
SELECT, INSERT, DELETE, UPDATE
데이터 제어어 DCL
데이터의 사용 권한 관리
GRANT, REVOKE
SQL문 내부적 실행 순서
FROM → WHERE → SELECT
Section 04. 데이터 정의어
CREATE 문
CREATE TABLE 테이블이름 (
bookid INTEGER PRIMARY KEY,
bookname VARCHAR(20) UNIQUE || NOT NULL,
publisher VARCHAR(20) FOREIGN KEY REFERENCES 책(작가),
price INTEGER DEFAULT 10000 CHECK (price > 1000)
);
테이블명은 고유해야 함
use madang;
CREATE TABLE Book (
bookid INTEGER PRIMARY KEY,
bookname VARCHAR(40),
publisher VARCHAR(40),
price INTEGER
);
CREATE TABLE Customer (
custid INTEGER PRIMARY KEY,
name VARCHAR(40),
address VARCHAR(50),
phone VARCHAR(20)
);
CREATE TABLE Orders (
orderid INTEGER PRIMARY KEY,
custid INTEGER ,
bookid INTEGER ,
saleprice INTEGER ,
orderdate DATE,
FOREIGN KEY (custid) REFERENCES Customer(custid),
FOREIGN KEY (bookid) REFERENCES Book(bookid)
);
복합키 사용하면 나중에 관리 힘들어져서 안 쓰는 게 좋음
ALTER문
DROP문
Section 05. 데이터 조작어 - 삽입, 수정, 삭제
commit : 저장 키워드
Section 03. 데이터 조작어 - 검색
SELECT 문의 기본 문법
SELECT [ALL | DISTINCT] 속성이름, 속성이름2, …
FROM 테이블이름, 테이블이름2, …
[WHERE 검색조건(들)]
[GROUP BY 속성이름]
[HAVING 검색조건(들)]
[ORDER BY 속성이름 [ASC | DESC] ;
where절에 조건으로 사용할 수 있는 술어
술어 | 연산자 | 예 |
비교 | =, <>, <, <=, >, >= | price < 20000 |
범위 | BETWEEN | price BETWEEN 10000 AND 20000 |
집합 | IN, NOT IN | price IN (10000, 20000, 30000) |
패턴 | LIKE | bookname LIKE ‘축구%’ |
NULL | IS NULL, IS NOT NULL | price IS NULL |
복합 조건 | AND, OR, NOT | (price < 20000) AND (bookname LIKE ‘축구의 역사’) |
LIKE
와일드 문자 | 의미 | 예 |
_ | 특정 위치의 1개 문자와 일치 | ‘_구%’ : 두 번째 위치에 ‘구’가 있는 문자열 |
% | 0개 이상의 문자열과 일치 | ‘%축구%’ : 축구를 포함하는 문자열 |
+ | 문자열을 연결 | ‘골프’ + ‘바이블’ : ‘골프 바이블’ |
💡 꼭 문자열 타입의 변수만 쓸 수 있는 건 아니지만 보통 문자열일 때 많이 사용
집계함수와 GROUP BY
SUM, AVG, COUNT, MAX, MIN, SIDDEV, VARIAN ()
💡 where은 집계함수 불가
💡 group by 적는 순서 지키기!!
count(컬럼명) : NULL값을 제외하고 셈
count(*) : NULL값을 포함하여 셈
count(distinct(컬럼명)) : NULL을 제외한 중복되지 않는 값만 count
조인
SELECT name, bookname
FROM customer, orders, book
WHERE book.price >= 20000
AND customer.custid = orders.custid
AND orders.bookid = book.bookid;
조인 문법
명령 문법 설명
명령 | 문법 | 설명 |
일반 조인 | SELECT <속성들> FROM 테이블1, 테이블2 WHERE <조인조건> AND <검색조건>; |
SQL 문에서는 주로 동등 조인 사용. 두 가지 문법 중 하나 사용 |
SELECT <속성들> FROM 테이블1 [t1] INNER JOIN 테이블2 [t2] ON <조인조건> WHERE <검색조건>; |
||
외부 조인 | SELECT <속성들> FROM 테이블1 [LEFT | RIGHT | FULL | OUTER ] JOIN 테이블2 ON <조인조건> WHERE <검색조건>; |
외부 조인은 FROM 절에 조인 종류를 적고, ON을 이용하여 조인조건 명시함 |
부속 질의
SELECT name
FROM customer
WHERE customer.custid in (
SELECT custid
FROM orders
WHERE bookid in (
SELECT bookid
FROM book
WHERE publisher = '대한미디어'
)
);
상관 부속질의(correlated subquery)
상위 부속질의의 튜플 이용하여, 하위 부속질의를 계산
i.e. 상위와 하위 부속질의가 독립적이지 않고 서로 관련 맺고 있음
-- 출판사별로 출판사의 평균 도서 가격보다 비싼 도서
SELECT b1.bookname
FROM book b1
WHERE b1.price > (
SELECT avg(b2.price)
FROM book b2
WHERE b2.publisher = b1.publisher
);
-- 다른 방법으론 안 되는 듯, 많이 쓰임!!
집합 연산
합집합 UNION : ∪
차집합 MINUS : -
교집합 INTERSECT : ∩
-- 대한민국에서 거주하는 고객의 이름과 도서를 주문한 고객의 이름
SELECT name
FROM customer
WHERE address LIKE '대한민국%'
UNION
SELECT name
FROM customer
WHERE custid IN (SELECT custid FROM orders);
-- 고객 이름 = (대한민국 거주하는 고객 이름) ∪ (도서 주문한 고객 이름)
EXISTS
조건에 맞는 튜플이 존재하면 결과에 포함시킴
i.e. 부속질의문의 어떤 행이 조건에 만족하면 참
NOT EXISTS는 부속질의문의 모든 행이 조건에 만족하지 않을 때가 참
-- 주문이 있는 고객의 이름과 주소
SELECT name, address
FROM customer cs
WHERE exists (
SELECT *
FROM orders od
WHERE cs.custid = od.custid
);
'백엔드(Back-End) > DB' 카테고리의 다른 글
[DB] 05. 데이터베이스 프로그래밍 (2) | 2023.10.19 |
---|---|
04. SQL 고급 (1) | 2023.10.18 |
02. 관계 데이터 모델 (1) | 2023.10.18 |
01. Database (0) | 2023.10.18 |