본문 바로가기
백엔드(Back-End)/DB

03. SQL 기초

by 기딩 2023. 10. 18.
728x90
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;

 

테이블명은 고유해야 함

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
);

 

728x90

'백엔드(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