SQL(2) ➡️ 특정한 조건의 데이터만 조회

OlMinJe·2023년 8월 29일

SQL

목록 보기
2/5
post-thumbnail

특정한 조건의 데이터만 조회

1. 기본적인 where절

▶ 조회하는 결과에 특정한 조건을 줘서 원하는 데이터만 보고 싶을 때 사용한다.
✅ 형식

SELECT 필드이름 FROM 테이블이름 WHERE 조건식;

💡 예시

select * from usertbl
where name = '김경호';

2. 관계 연산자의 사용 / 연산자 설명


3. AND, OR, NOT 연산자

🕶️ WHERE 절과 결합 가능하다.

  • AND 연산자는 AND로 구분된 모든 조건이 TRUE이면 레코드를 표시한다.
  • OR 연산자는 OR로 구분된 조건 중 하나라도 TRUE이면 레코드를 표시한다.
  • 조건이 참이 아니면 NOT 연산자가 레코드를 표시한다.

💡 예시
실행결과

SELECT userID, name, birthYear, height
FROM usertbl 
WHERE birthYear >= 1970 AND height >= 182;

-- [1] 예시
SELECT userID, Name, birthYear, height
FROM usertbl 
WHERE birthYear >= 1970 OR height >= 182;

-- [2] 예시
select name, height
from usertbl
where height between 180 and 183; -- 이런식으로 바꿀 수 있다.
-- where height >= 180 and height <= 183;

4. IN() 연산자

  • 이상적인 값의 조회
  • IN()을 사용하면 Where 절에서 여러 값을 지정할 수 있다.

✅ 형식

select column_name
from table_name
where column_name in (select statement)

5. Like() 연산자

  • like 연산자는 where 절에서 열에 지정된 패턴을 검색하는데 사용된다.
  • like 연산자와 함께 사용되는 와일드카드는 두 가지가 있다.
    1. 백분율 기호(%)는 0개, 1개 또는 여러개 문자를 나타냄
    2. 밑줄(_) 기호는 하나의 단일 문자를 나타냄

💡 예시 1

select name, height
from usertbl
where name like '김%'; -- 성이 김으로 시작하는 사람을 출력한다.

💡 예시 2

select name, height
from usertbl
where name like '_종신'; -- 이름이 종신이며 성이 포함된 데이터를 검색한다

주의
%_가 검색할 문자열의 맨 앞에 들어가는 것은 MySQL의 성능에 나쁜 영향을 끼칠 수 있다.


6. ANY/ALL/SOME 그리고 서브쿼리(SubQuery, 하위쿼리)

💡 쿼리 안에 쿼리문 예시

select name, height
from usertbl
where height > (select height from usertbl where name = '김경호');

가. ANY

  • 결과로 논리값을 반환한다.
  • 하위 쿼리 값 중 조건을 충족하는 값이 있으면 True를 반환한다.

✅ 형식

SELECT column_name(s)
FROM table_name
WHERE column_name operator ANY
 (SELECT column_name
 FROM table_name
 WHERE condition);

→ 비교 연산자를 where 절에 사용했을 때
⇒ 결과가 여러 개 나오면 error
⇒ 해결 방법 any를 사용하면 해결할 수 있다.

💡 예시 : 지역이 경남인 사람의 키 이상의 사람을 출력하시오

SELECT name, height FROM usertbl 
WHERE height >= ANY (SELECT height FROM usertbl WHERE addr = '경남');
-- height >= 173 or heigth >= 170이 된다.

"any (서브쿼리)는 in(서브쿼리)와 동일한 의미이다."
💡 예시

select name, height
from usertbl
where height = any (select height from usertbl where addr = '경남');
-- where height in (select height from usertbl where addr = '경남');

나. ALL 연산자

  • 결과로 부울 값을 반환한다.
  • 모든 하위 쿼리 값이 조건을 충족하면 true를 반환한다.
  • SELECT, WHERE 및 HAVING 문과 함께 사용된다.

✅ 형식

SELECT column_name(s)
FROM table_name
WHERE column_name operator ALL
 (SELECT column_name
 FROM table_name
 WHERE condition);
Note : operator는 표준 비교 연산자(=, <>!=, >, >=, < 또는 <=)여야 한다.

and와 비슷하다.

💡 예시

select name, height
from usertbl
where height >= all (select height from usertbl where addr = '경남');
✚ SOME 연산자

💡 예시

select name, height
from usertbl
where height >= some (select height from usertbl where addr = '경남');

다. ORDER BY 연산자

  • 오름차순 또는 내림차순으로 정렬할 떄 사용한다.

💡 예시: 가입한 순서대로 회원 출력 (오름차순)

select name, mDate
from usertbl
order by mDate asc; -- asc 생략 가능(defalut 값)

💡 예시: 가입한 순서대로 회원 출력 (내림차순)

select name, mDate
from usertbl
order by mDate desc;

라. DISTINCT

  • 중복된 것은 하나만 남긴다.
  • select distint문은 고유(다른)값만 반환하는데 사용된다.

💡 예시: 회원 테이블에서 회원지의 거주지를 알아본다(중복값 제거)

select distinct addr from usertbl;

마. limit

  • 수천 개의 레코드가 있는 큰 테이블에서 유용하다
  • 불러올 테이블의 값을 제한한다.

✅ 형식

SELECT column_name(s)
FROM table_name
WHERE condition
LIMIT number; -- LIMIT start_index, quntity
-- start_index : 레코드의 0부터 시작하는 인데스 번호
-- quntity : 수량

바. 테이블을 복사하는 CREATE TABLE ... SELECT

💡 예시 1

use sqldb;
select * from buytbl;

-- 테이블 복사하기
create table buytbl1 (select * from buytbl);

-- 복사해서 생성한 테이블 출력하기
select * from buytbl1;

-- 원하는 값만 복사하고 싶을 때 조건을 추가하여 사용할 수 있다
create table buytbl2 (select userId, prodName from buytbl);
select * from buytbl2;

💡 예시 2

desc buytbl;
desc buytbl1;

🤔 해당 코드를 전체 실행 시켰을 경우 알 수 있는 것
➡️ primary key와 같은 값은 복사되지 않는다

7. GROPUP BY 및 HAVING 그리고 집계함수

GROUP BY 문은 종종 결과 집합을 하나 이상의 열로 그룹화하기 위해
집계 함수(COUNT(), MAX(), MIN(), SUM(), AVG())와 함께 사용된다.

select userId, SUM(amount) as sumAmount
from buytbl
group by userId
order by userId;
as 를 사용하여 이름 설정 집계함수

예시 1️⃣

-- 전체 구매자가 구매한 물품의 개수
SELECT AVG(amount) AS '평균 구매 개수' FROM buytbl

예시 2️⃣

-- 각 사용자별로 한 번 구매 시 물품 갯수의 평균을 구해보자.
SELECT userID, AVG(amount) AS '평균 구매 개수' FROM buytbl GROUP BY userID;

예시 3️⃣

--가장 큰 키와 가장 작은 키의 회원 이름과 키를 출력하는 쿼리를 만들어보자.
SELECT name, MAX(height), MIN(height) FROM usertbl;

예시 4️⃣

--원하가장 큰 키와 가장 작은 키는 나왔으나, 이름은 하나뿐이라서 어떤 것에 해당하는지 않 수 없다. 
--GROUP BY를 활용해 보자.
SELECT name, MAX(height), MIN(height) FROM usertbl GROUP BY Name;

예시 5️⃣

--역시 원하는 결과가 아니다. 그냥 모두 다 왔다. 이 경우 서브쿼리 조합을 하는 것이 제일 수월하다.
SELECT name, height
 FROM usertbl 
 WHERE height = (SELECT MAX(height)FROM usertbl) 
 OR height = (SELECT MIN(height)FROM usertbl) ;

예시 6️⃣

-- 휴대폰이 있는 사용자의 수를 카운트 하자.
SELECT COUNT(*) FROM usertbl;

예시 7️⃣

--전체 회원인 10명이 나온다. 휴대폰이 있는 회원만 휴대폰 열 이름(mobile1)을 지정해야 한다. 
--그럴 경우 NULL값을 제외하고 카운트를 한다.
SELECT COUNT(mobile1) AS ‘휴대폰이 있는 사용자’ FROM usertbl;

우히 예시 끝~

가. HAVING 절

  • Group by 절에서 집계 함수를 사용할 수 없기 때문에 만들어졌다.
  • Group by 절에 추가적인 조건을 부여하고 싶을 때 사용한다.
-- ☝🏻sum()을 사용하여 사용자별 총 구매액 구하기
select userID  as '사용자', sum(price*amount) as '총구매액'
from buytbl
group by userID;

-- ✌🏻이 중 총 구매 액이 1,000 이상인 사용자를 조회하기 위해 where절을 사용
select userID as '사용자', sum(price*amount) as '총구매액'
from buytbl
where sum(price*amount) > 1000 -- 에러 발생: 1111 / where 절에 집계함수를 사용했기 때문이다.
group by userID;

-- 🫵🏻 where절을 having으로 바꿔서 출력해보기
select userId as '사용자', sum(price*amount) as '총구매액'
from buytbl
group by userID
having sum(price*amount) > 1000; 

✦ 중요!! having 절은 group by절 다음에 나와야 한다.

-- 위의 예시를 총 구매액이 작은 사용자로부터로 변경
select userId as '사용자', sum(price*amount) as '총구매액'
from buytbl
group by userID
having sum(price*amount) > 1000
order by sum(price*amount);

나. Rollup

  • group by 절과 함께 with rollup 문을 사용한다.
-- rollup을 사용하여 총합 또는 중간 합계를 계산해본다.
select groupName, SUM(price * amount) as '비용'
from buytbl
group by groupName
with rollup ;
샤랄라 결과
profile
큐트걸

0개의 댓글