BACK_END/SQL

250218_ SQL SELECT 문

minquu 2025. 2. 18. 22:26
반응형

SELECT 문 

 - 특정 칼럼 값을 찾아서 보여주는 명령어

 


기본적인 SELECT 문

-- grade 목록을 보여주고, 스코어가 A 인 것만
SELECT subject 
FROM grade
WHERE score = 'A';

SELECT 다음은 보여줄 컬럼 이름 -> *는 전부

FROM 뒤는 테이블 

WHERE 뒤는 조건

 


DISTINCT

-- 중복된 데이터는 병합해서 보여줌
SELECT DISTINCT subject 
FROM grade;

중복된 데이터를 하나로 묶여서 보여주는 키워드

 


BETWEEN AND

SELECT * FROM product_test WHERE price BETWEEN 2000 AND 4000;

BETWEEN A AND B : A와 B 사이의 값 조건부 

 


IN

SELECT * FROM product_test WHERE price IN (2000, 3000, 4000);

칼럼이 특정 값만

 


LIKE

-- LIKE : 찾는 것 - 'C', 'c' 대 소문자 구별함 / % 뒤에 있으면 시작하는 것 % 앞에 있으면 끝나는 것
SELECT * FROM product_test WHERE name LIKE('C%');
SELECT * FROM product_test WHERE name LIKE('%Y');

-- LIKE %% : name이 A를 포함
SELECT * FROM product_test WHERE name LIKE '%A%';

LIKE 특정 값이 포함 되어 있는지 확인

C%  - C로 시작하는 것

%C  - C 로 끝나는 것

%C% - C를 포함 하는 것들

 


IS NULL

-- is null : null 값 확인
SELECT * FROM product_test WHERE price is null;

NULL 것만..

 


GROUP BY

-- GROUP BY : 특정 칼럼을 그룹 별로 묶는 것
SELECT position, COUNT(position), SUM(salary)
FROM company_test
GROUP BY position;

특정 칼럼을 그룹으로 묶여서 표현

-- GROUP BY 여러개 묶기
SELECT position, department, SUM(salary) AS "급여 합계"
FROM company_test
GROUP BY position, department;

여러개를 묶여서도 가능 

AS 는 보여질 때 칼럼의 이름을 보여줌

 


COUNT 

-- COUNT : 특정 칼럼의 갯수를 세주는 것
SELECT COUNT(*) FROM company_test;

숫자를 카운터 해주는 것

 


GROUP BY ~  HAVING ~

-- HAVING : 그룹에 대한 조건 지정 / 그룹핑 된 것 중에서 6000 이상만 
SELECT position, department, SUM(salary) AS "급여 합계"
FROM company_test
GROUP BY position, department
HAVING SUM(salary) >= 6000;

그룹을 묶은 것에 대한 조건문

 


ORDER BY

-- ORDER BY : 속성 값 정렬 / ASC 오름 차순, DESC 내림 차순
SELECT * FROM grade ORDER BY name ASC;		 -- 오름 차순
SELECT * FROM grade ORDER BY name DESC;		 -- 내림 차순

정렬 해주는 것

ASC - 오름 차순

DESC - 내림 차순

 


교차 조인

-- 교차 조인 (CROSS JOIN) 3 * 4 = 12 / 단순학게 SELECT 하면 모든 행이 조합되서 나옴
select * from book_test, book_price_test;

 


INNER JOIN ~ ON ~

-- INNER JOIN
SELECT A.booknumber, A.bookname, B.bookprice
FROM book_test A
INNER JOIN book_price_test B
ON A.booknumber = B.booknumber;

A 와 B 테이블을 합쳐주는 것 

ON 이하는 조건 부

 


LEFT OUTER JOIN ~ ON ~

-- A 기준으로 B를 붙여주는데 A기준이기 때문에 A는 전부 보여주고, B에는 A에 있는 공통 튜플들만 보여준다.
SELECT A.booknumber, A.bookname, B.bookprice, B.booknumber
FROM book_test A
LEFT OUTER JOIN book_price_test B
ON A.booknumber = B.booknumber;

A LEFT OUTER JOIN B : A 에 (LEFT) B 테이블을 붙이는 것 

ON 이하는 조건 부

 


RIGHT OUTER JOIN ~ ON ~

-- B 기준으로 A를 붙여주는데 B기준이기 때문에 AB는 전부 보여주고, A에는 B에 있는 공통 튜플들만 보여준다.
SELECT A.booknumber, A.bookname, B.bookprice, B.booknumber
FROM book_test A
RIGHT OUTER JOIN book_price_test B
ON A.booknumber = B.booknumber;

A RIGHT OUTER JOIN B : B 에 (RIGHT) A 테이블을 붙이는 것

ON 이하는 조건 부

 


서브쿼리 : SQL 문 안에 SQL 문 추가

-- 서브 쿼리 : SQL 안에 포함된 SQL문
-- FROM 절 안에 들어가는 서브쿼리
SELECT MAX(bookprice) as 가격
FROM book_price_test A,
(SELECT booknumber FROM book_test WHERE bookname = '자료구조') B
WHERE A.booknumber = B.booknumber;
-- WHERE 절 안에 들어가는 서브쿼리
SELECT MAX(bookprice)
FROM book_price_test
WHERE booknumber IN (SELECT booknumber 
						FROM book_test
						WHERE bookname = '자료구조');

 


UNION 

-- UNION 중복 행이 제거 된 후, 모두 합쳐주는 것
SELECT name
FROM emp_test
WHERE sal <= 2000
UNION
SELECT name
FROM emp_test
WHERE sal >= 1500;

-- UNION ALL 중복 행이 제거를 안하고, 모두 합쳐주는 것
SELECT name
FROM emp_test
WHERE sal <= 2000
UNION ALL
SELECT name
FROM emp_test
WHERE sal >= 1500;

 

INTERSECT : 공통적으로 존재하는 결과 (중복된 것만) 반환 / mySQL 미지원

MINUS : 첫 쿼리는 있고, 두 번째는 없는 것 / mySQL 미지원

https://lannstark.tistory.com/46

 

MySQL 교집합과 차집합

MySQL에서는 INTERSECT와 MINUS 연산을 지원하지 않는다. 어떻게 하면 다른 쿼리를 같은 효과를 낼 수 있는지 알아보자..! INTERSECT SELECT emp_no FROM dept_emp WHERE dept_no = 'd001' INTERSECT SELECT emp_no FROM dept_emp WHER

lannstark.tistory.com

 -> MY SQL 대체문

반응형

'BACK_END > SQL' 카테고리의 다른 글

250220 _ SQL  (0) 2025.02.20
250219_ SQL  (0) 2025.02.19
250217 _ MY SQL  (0) 2025.02.17