작성법 순서
SELECT DISTINCT FROM WHERE GROUP BY HAVING
5 6 1 2 3 4
1. FROM 에서 테이블을 지정하고 전체 레코드를 추출한다
2. WHERE에서 조건에 따라 레코드를 축소한다
3. 그룹을 통합한다.
4. 그룹에 조건을 줘 그룹을 축소한다
5. 가져올 데이터를 선택
6. 중복 데이터를 통합한다
SELET [무엇을] FROM 테이블명
가져온다 무엇을 어디에서 테이블명
- SELET * [모든컬럼을] FROM product
- SELET product_id, p_name, p_id FROM product
- SELET p_id AS 상품id, p_name AS 상품명 FROM product
무엇을 별명으로 가져온다
SELECT 컬럼명 FROM 테이블명 WHERE 조건
- SELECT * FROM product WHERE product_name LIKE '약용%'
대소문자 구별은 BINARY , 문자열 일치 여부는 LIKE / NOT LIKE(포함하지 않는 경우)
'약용%' : 맨 앞에 [약용]이 들어간 문자
'%약용%' : [약용]이 들어간 문자
이스케이프 처리 '%100\%%' : 100%가 들어간 문자 찾기
AND = && , OR = || , NOT = =!
- SELECT * FROM customer WHERE not(m_id =1);
customer 테이블에서 m_id가 1이 아닌 컬럼을 가져온다.
- SELECT * FROM customer WHERE product_id IN (1,2,4);
customer 테이블에서 m_id가 1, 2, 4 어느라도 해당되는 컬럼을 가져온다.
- SELECT * FROM customer WHERE NOT IN (1,2,4);
customer 테이블에서 m_id가 1,2,4 어디에도 해당되지 않는 컬럼을 가져온다.
-SELECT DISTINCT pref FROM inquiry ; 중복행 생략하는 컬럼명 앞에 적는다
pref 컬럼을 inquiry테이블에서 중복없이 가져온다.
- SELECT COUNT(*) FROM inquiry ;
전체 레코드의 수를 센다. NULL의 수는 뺀다.
SUM(합계값), MAX(최댓값), MIN(최솟값), AVG(평균값)
- SELET pref, AVG(star) FROM inquiry GROUP BY pref ;
pref의 데이터마다 레코드를 통합해서 각각의 그룹마다 star의 평균값을 꺼낸다.
레코드를 그룹마다 통합하려면 GROUP BY 구를 사용해서 레코드를 그룹화한다.
그룹화하는 컬럼명은 데이터를 그룹별로 집약하기 위한 키워드가 되므로 집약 키라고 부른다.
- SELECT pref, AVG(star) FROM inquiry WHERE star >= 3 GROUP BY pref ;
GROUP BY 가 WHERE구보다 먼저 실행되는 것 기억하기!
SELECT [컬럼명] FROM [테이블명] GROUP BY [컬럼명] HAVING [조건] ;
컬럼명을 테이블명에서 그룹마다 조건을 줘서 가져온다.
WHERE과 HAVING의 차이
WHERE은 그룹화 시행하기 전에 레코드 전체에 대한 조건
HAVING은 그룹에 대해서 조건을 준다.
- SELECT pref, AVG(star) FROM inquiry WHERE age >= 30 GROUP BY pref HAVING AVG(star) >= 4 ;
age가 30 이상인 레코드를 pref 컬럼에서 그룹화하고 , star의 평균값이 4이상인 그룹만 inquiry 테이블에서 가져온다.
같은 결과의 표를 얻는다면 HAVING보다 WHERE에서 조건을 주는게 훨씬 빠르다.
정렬에는 ORDER BY 를 사용한다.
-SELECT * FROM ODER BY product_id ASC ; 오름차순
-SELECT * FROM ODER BY product_id DESC ; 내림차순
-SELECT product_name FROM product ORDER BY stock DESC;
컬럼명 : 소트키 = 정렬키
-SELECT * FROM product ORDER BY price ASC, stock DESC;
정렬하는 기준이 되는 컬럼의 내용이 같은 경우 여러 컬럼명을 콤마로 구분해서 적고 앞에서부터 적힌 순으로 정렬을 실시한다.
price의 가격이 같은 120, 120 인경우 stock의 내림차순으로 정렬이 된다.
-SELECT product_name, stock FROM product ORDER BY 2 DESC;
product 테이블의 product_name과 stock을 stock의 내림차순으로 정렬해서 가져온다.
앞에서 2번째에 지정하고 있는 것은 stock 컬럼이므로 stock의 내림차순으로 정렬된다.
*인 경우에는 테이블의 모든 컬럼을 가져오므로 순서에 맞춰 숫자를 적어주면 된다.
정렬키에는 연산자, 함수도 사용할 수 있다.
-SELECT product_name, stock FROM product ORDER BY stock*price;
NULL은 오름차순에서 처음에 오는 경우가 많다.
그래서 NULL값은 0이나 반대로 매우 큰 값으로 바꿔둔다.
-SELECT * FROM product ORDER BY price IS NULL ASC, price ASC;
price가 null이 아닌 레코드를 정렬하고 그 후에 NULL인 레코드를 정렬하여 NULL의 값을 맨 마지막으로 가져오게 한다.
ODERY BY 구에 의한 정렬은 컴퓨터에 부하가 걸리고 처리시간도 걸리기 때문에 정렬해야 할 때만 사용한다
-> 인덱스를 사용하면 다소 빠른 정렬 시행 가능하다. 인덱스는 책의 마지막에 붙어있는 색인과 같은 것이다.
가져온 레코드 중 첫 0행만 원하는 경우 LIMIT를 사용해서 행 수를 지정한다.
SELECT 컬럼명 FROM 테이블명 LIMIT 행수 ;
SELECT * FROM product ORDER BY price LIMIT 3 ;
테이블의 전체 컬럼을 price의 오름차순으로 정렬, 첫 3행을 가져온다.
SELECT * FROM product LIMIT 3 OFFSET 2 ; = SELECT * FROM product LIMIT 2, 3 ;
시작위치 2에서 첫 3행을 가져온다.
SELECT order_id , price, FROM ~~~~~~~~~~ WHERE price >= (SELECT AVG(price) FROM ~~) ;
서브쿼리 먼저 시행되고 그 다음에 메인쿼리가 실행된다.
<테이블을 세로로 붙이는 UNION>
SELECT * FROM 테이블A UNION SELECT * FROM 테이블B ;
2개의 테이블을 붙이므로 테이블의 컬럼 내용은 같아야한다.
UNION은 중복을 허락하지 않고 테이블을 붙이기 때문에 그대로 붙이려면 UNION ALL을 사용해야한다.
SELECT * FROM 테이블A UNION ALL SELECT * FROM 테이블B ;
<테이블을 가로로 붙이는 JOIN>
FROM 테이블A JOIN 테이블B ON 테이블A.컬럼C = 테이블B.컬럼C ;
SELECT * FROM customer AS a JOIN membertype AS b ON a.membertype_id = b.membertype_id ;
Join은 inner join의 생략형이다.
JOIN / LEFT JOIN(왼쪽 우선시) / RIGHT JOIN(오른쪽 우선시)
OUTER JOIN은 외부결합이라 불린다.
외부결합은 한쪽 테이블 밖에 없는 레코드도 들고온다.
붙이는 레코드가 없으면 NULL 레코드를 붙인다.
'공부중 > SQL' 카테고리의 다른 글
WHERE 1=1, ::연산자, LPAD(), ST_ASTEXT() (0) | 2024.03.25 |
---|
댓글