데이터베이스/MySQL

데이터 조작어 (검색)

MellowHoney 2024. 4. 1. 02:47
728x90
반응형

구성요소

기본 문법

SELECT [ALL┃DISTINCT] 속성이름(들)      // 찾는다.
FROM 	      테이블이름(들) [테이블 별명] // <테이블>에서
[WHERE        검색조건(들)]             // 조건에 맞는
[GROUP BY    속성이름]                 // <속성>으로 묶여있는
[HAVING       검색조건(들)]            // <GROUP>에서 조건에 맞는
[ORDER BY    속성이름 [ASC┃DESC]]      // 오름차순/내림차순 정렬
---------------------------------------------------------------
[ ] : 대괄호 안의 SQL 예약어들은 선택적으로 사용한다.
| : 선택 가능한 문법들 중 한 개를 사용할 수 있다.

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 '축구의 역사')
  • 와일드 문자
와일드 문자  의미  사용 예
+ 문자열을 연결 ‘골프 ’ + ‘바이블’ : ‘골프 바이블’
% 0개 이상의 문자열과 일치 ‘%축구%’ : 축구를 포함하는 문자열
[ ] 1개의 문자와 일치 ‘[0-5]%’ : 0-5 사이 숫자로 시작하는 문자열
[^] 1개의 문자와 불일치 ‘[^0-5]%’ : 0-5 사이 숫자로 시작하지 않는 문자열
_ 특정 위치의 1개의 문자와 일치 ‘_구%’ : 두 번째 위치에 ‘구’가 들어가는 문자열
  • 예시
// 축구에 관한 도서 중 가격이 20,000원 이상인 도서
SELECT	*
FROM	Book
WHERE	bookname LIKE '%축구%' AND price >= 20000;

집계함수

집계 함수 문법 사용 예
SUM SUM([ALL DISTINCT] 속성이름)
AVG AVG([ALL DISTINCT] 속성이름)
COUNT COUNT({[[ALL DISTINCT] 속성이름]
MAX MAX([ALL DISTINCT] 속성이름)
MIN MIN([ALL DISTINCT] 속성이름)

GROUP BY & HAVING

GROUP BY <속성> GROUP BY로 투플을 그룹으로 묶은 후 SELECT 절에는 GROUP BY에서 사용한 <속성>과 집계함수만 나올 수 있음
• 맞는 예
SELECT         custid, SUM(saleprice)
FROM          Orders
GROUP BY    custid;
• 틀린 예
SELECT         bookid, SUM(saleprice)
/* SELECT 절에 bookid 속성이 올 수 없다 */
FROM          Order
GROUP BY    custid;
HAVING <검색조건> WHERE 절과 HAVING 절이 같이 포함된 SQL 문은 검색 조건이 모호해질 수 있음.
HAVING 절은
① 반드시 GROUP BY 절과 같이 작성해야 하고
WHERE 절보다 뒤에 나와야 함.
③ <검색조건>에는 SUM, AVG, MAX, MIN, COUNT와 같은 집계함수가 와야 함.
• 맞는 예
SELECT         custid, COUNT(*) AS 도서수량
FROM          Orders
WHERE         saleprice >= 8000
GROUP  BY   
custid
HAVING        COUNT(*) >= 2;
• 틀린 예
SELECT          custid, COUNT(*) AS 도서수량
FROM           Orders
HAVING        COUNT(*) >= 2 /* 순서가 틀렸다 */
WHERE          saleprice >= 8000
GROUP BY      custid;

ORDER BY

  • 오름차순 ASC
SELECT * FROM 테이블 ORDER BY 컬럼1 ASC; //생략가능
  • 내림차순 DESC
SELECT * FROM 테이블 ORDER BY 컬럼1 DESC;

조인

  • 2개의 테이블 합체
명령 문법
일반 조인 SELECT <속성들>
FROM 테이블1, 테이블2
WHERE <조인조건> AND <검색조건>
SELECT <속성들>
FROM 테이블1 INNER JOIN 테이블2
ON <조인조건>
WHERE <검색조건>
SQL 문에서는 주로 동등조인을 사용함.
두 가지 문법 중 하나를 사용할 수 있음.
외부 조인 SELECT <속성들>
FROM 테이블1
{LEFT | RIGHT | FULL [OUTER]}
JOIN 테이블2
ON <조인조건>
WHERE <검색조건>
외부조인은 FROM 절에 조인 종류를적고 ON을 이용하여 조인조건을 명시함.
  • 예제
// 가격이 20,000원인 도서를 주문한 고객의 이름과 도서의 이름
SELECT	Customer.name, Book.bookname
FROM    	Customer, Orders, Book
WHERE   	Customer.custid = Orders.custid AND Orders.bookid = Book.bookid AND Book.price = 20000;
// 도서를 구매하지 않은 고객을 포함하여 고객의 이름과 고객이 주문한 도서의 판매가격
SELECT	Customer.name, saleprice
FROM    Customer LEFT OUTER JOIN Orders 
                      ON Customer.custid = Orders.custid;

부속질의

  • SQL 내의 또 다른 SQL 문
// 가장 비싼 도서의 이름
SELECT	  bookname
FROM    	Book
WHERE     price = (SELECT MAX(price)
            	     FROM Book );
// 대한미디어에서 출판한 도서를 구매한 고객의 이름
SELECT name
FROM   Customer
WHERE  custid IN (SELECT custid
						      FROM   Orders
                  WHERE  bookid IN (SELECT bookid
                                    FROM   Book
                                    WHERE  publisher='대한'));

집합 연산

  • 합집합 UNION
{고객 이름} = {대한민국에 거주하는 고객 이름} ∪ {도서를 주문한 고객 이름}
// 대한민국에서 거주하는 고객의 이름과 도서를 주문한 고객의 이름

SELECT name
FROM	 Customer
WHERE  address LIKE '대한민국%'
UNION  
SELECT name
FROM	 Customer
WHERE	 custid IN (SELECT custid FROM Orders);
  • 차집합 MINUS
// 대한민국에서 거주하는 고객의 이름에서 도서를 주문한 고객의 이름 빼고 
SELECT name
FROM	 Customer
WHERE  address LIKE '대한민국%' AND name NOT IN 
       (SELECT name
			  FROM	 Customer
			  WHERE  custid IN 
               (SELECT custid 
                FROM Orders));
  • 교집합 INTERSECT
// 대한민국에서 거주하는 고객 중 도서를 주문한 고객의 이름
SELECT name
FROM	 Customer
WHERE  address LIKE '대한민국%' AND name IN 
       (SELECT name
			 FROM	   Customer
			 WHERE	 custid IN 
               (SELECT custid 
                FROM Orders));

EXISTS

  • 원래 단어에서 의미하는 것과 같이 조건에 맞는 튜플이 존재하면 결과에 포함시킴. 즉 부속질의문의 어떤 행이 조건에 만족하면 참임.

NOT EXISTS

  • 부속질의문의 모든 행이 조건에 만족하지 않을 때만 참
// 주문이 있는 고객의 이름과 주소
SELECT name, address
FROM 	 Customer cs
WHERE  EXISTS (SELECT *
	             FROM  Orders od
	             WHERE cs.custid = od.custid);
반응형