Search

데이터 조작어 (DQL) + 탐색조건

대분류
DB
소분류
MySQL
수준
기초
태그
SELECT
WHERE
집계함수
GROUP BY
HAVING
ORDER BY
JOIN
EXISTS
최종 편집 일시
2024/10/27 15:43
생성 일시
2024/01/23 00:08
14 more properties

구성요소

기본 문법

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

DISTINCT

통사론
SELECT DISTINCT column1, column2, ... FROM table_name;
SQL
복사
일반 구문
SELECT COUNT(DISTINCT Country) FROM Customers;
SQL
복사
구별 카운트 (다양한 국가 수 반환)
SELECT Count(*) AS DistinctCountries FROM (SELECT DISTINCT Country FROM Customers);
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;
SQL
복사

꿀팁

SELECT FROM WHERE 1=1 -- 이걸 붙히는 이유 => 주석처리하는게 편해서 -- and id > 3 -- 이게 가능 and name LIKE 'name%' ;
SQL
복사

집계함수

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

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; -- 생략가능
SQL
복사
내림차순 DESC
SELECT * FROM 테이블 ORDER BY 컬럼1 DESC;
SQL
복사

조인(JOIN)

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;
SQL
복사
// 도서를 구매하지 않은 고객을 포함하여 고객의 이름과 고객이 주문한 도서의 판매가격 SELECT Customer.name, saleprice FROM Customer LEFT OUTER JOIN Orders ON Customer.custid = Orders.custid;
SQL
복사

부속질의

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

집합 연산

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

EXISTS

원래 단어에서 의미하는 것과 같이 조건에 맞는 튜플이 존재하면 결과에 포함시킴. 즉 부속질의문의 어떤 행이 조건에 만족하면 참임.
NOT EXISTS
부속질의문의 모든 행이 조건에 만족하지 않을 때만 참
// 주문이 있는 고객의 이름과 주소 SELECT name, address FROM Customer cs WHERE EXISTS (SELECT * FROM Orders od WHERE cs.custid = od.custid);
SQL
복사

LIMIT

반환할 레코드 수 지정
SELECT column_name(s) FROM table_name WHERE condition LIMIT number;
SQL
복사

Binary

기본 집계함수들은