2) 특정한 조건의 데이터만 조회하는 <SELECT ... FROM ... WHERE>
기본적인 WHERE 절: 조회하는 결과에 특정한 조건을 줘서 원하는 데이터만 보고 싶을 때 사용
형식 : SELECT 필드_이름 FROM 테이블_이름 WHERE 조건식 ;
예) SELECT * FROM userrbl WHERE name = '김경호' ;
1) 관계 연산자 사용
예) 1970년 이후에 출생하고 신장이 182 이상인 사람의 아이디와 이름 조회
SELECT userID, name FROM USERTBL WHERE birthYear>=1970 and height>=182;
예) 1970년 이후에 출생했거나 , 신장이 182 이상인 사람의 아이디와 이름을 조회
SELECT userID, name FROM USERTBL WHERE birthYear>=1970 or height>=182;
2)BETWEEN ... AND 와 IN() 그리고 LIKE
예)키가 180 ~ 183인 사람의 이름과 키를 조회
SELECT name, height from usertbl where height between 180 and 183;
예) 지역이 '경남' , '전남', '경북' 인 사람의 이름과 키를 조회
SELECT name, height from usertbl where addr in ('경남', '전남','경북');
문자열의 내용을 검색하기 위해서는 LIKE 연사자를 사용할 수 있음
SELECT name, height FROM usertbl WHERE name LIKE '김%';
--맨 첫 번째 글자가 김 으로 시작되지만 뒤에 글자는 상관없음
그리고 한 글자와 매치하기 위해서는 언더바(_)를 사용함
SELECT name, height FROM usertbl WHERE name LIKE '_종신';
3) ANY/ALL/SOME 그리고 서브쿼리(하위쿼리)
김경호보다 키가 크거나 같은 사람의 이름과 키를 출력
SELECT name, height FROM usertbl WHERE height >= 177;
177이라는 키를 직접 써주는 것이 아니라면 서브쿼리 표현
:
SELECT name, height FROM usertbl
WHERE height >= (SELECT height FROM usertbl WHERE name = '김경호'); () 에 표현된 것이 서브쿼리
예) 지역이 '경남' 의 키보다 키가 크거나 같은 사람의 이름과 키를 조회
SELECT name, height FROM usertbl WHERE height >= ANY
(SELECT height FROM usertbl WHERE addr = '경남');
결론적으로 ANY 는 서브쿼리 여러 개의 결과 중 한 가지만 만족해도 되고,
ALL은 서브쿼리의 여러개의 결과를 모두 만족시켜야 함
참고로 SOME은 ANY와 동일한 의미로 사용됨
SELECT name, height FROM usertbl
WHERE heigt = ANY (SELECT height FROM usertbl WHERE addr = '경남')'
이 쿼리문과 동일한 의미의 쿼리문
SELECT name, height FROM usertbl
WHERE heigt IN (SELECT height FROM usertbl WHERE addr = '경남');
4) 원하는 순서대로 정렬하여 출력 : ORDER BY
ORDER BY 절은 결과물에 대해 영향을 미치지는 않지만, 결과가 출력되는 순서를 조절하는 구문
예)먼저 가입한 순서로 회원들의 이름과 가입날짜 조회하기
SELECT name, mDate FROM usertbl ORDER BY mDate;
기본적으로 오름차순(ASC) 으로 정렬됨.
예) 내림차순으로 정렬하기 위해서는 열_이름 뒤에 DESC 적기
SELECT name, mDate FROM usertbl ORDER BY mDate DESC;
예) 키가 큰 순서로 정렬하되 만약 키가 같은 경우에 이름 순으로 정렬해서 나오는 데이터의 이름과 키를 출력
SELECT name, height FROM usertbl ORDER BY height DESC , name ASC;
5) 중복된 것은 하나만 남기는 DISTINCT
회원 테이블에서 회원들이 거주지역이 몇 군데인지 출력하기
SELECT addr FROM usertbl ; > 이 결과는 중복값 나옴 나오는 갯수 10개
SELECT DISTINCT addr FROM usertbl; > 이 결과는 5개
6) 출력하는 개수를 제한하는 LIMIT
USE employees;
SELECT emp_no, hire_date FROM employees
ODER BY hire_date ASC LIMIT 5;
LIMIT절은 'LIMIT 시작, 개수' 또는 'LIMIT 개수 OFFSET 시작' 형식으로도 사용할 수 있음
또는
SELECT emp_no, hire_date FROM employees
ODER BY hire_date ASC LIMIT 0,5;
7) 테이블을 복사하는 CREATE TBLE ... SELECT
· CREATE TABLE ... SELECT 구문은 테이블을 복사해서 사용할 경우에 주로 사용됨
CREATE TABLE 새로운테이블_이름 (SELECT 복사할 열_이름 FROM 기존테이블_이름);
예) CREATE TABLE buytbl2 (SELECT * FROM buytbl);
>테이블 자체를 통으로 복사
필요하다면 지정한 일부 열만 복사할 수도 있음
CREATE TABLE buytbl3 (SELECT userID, prodName FROM buytbl);
3. GROUP BY 및 HAVING 그리고 집계함수
1) GROUP BY : 그룹으로 묶어주는 역할
· 구매 테이블에서 사용자가 구매한 물품의 개수 출력하기
USE sqldb;
SELECT UserID, amount FROM buytbl ORDER BY userID; 를


SELECT USERID, sum(amount) FROM buytbl GROUP BY userID; 로 그룹화 시켜서 표현
SELECT userID AS '사용자 아이디' , sum(amount) AS '총 구매 개수' FROM buytbl GROUP BY useID;
SELECT userID AS '사용자 아이디' , sum(price*amount) AS '총 구매 액' FROM buytbl GROUP BY userID;
2) 집계 함수
· AVG() : 평균을 구함
· MIN() : 최소값 구함
· MAX() : 최대값 구함
· COUNT() : 행의 개수를 셈
· COUNT(DISTINCT) : 행의 개수를 셈(중복은 1개만 인정)
· STDEV() : 표준편차를 구함
· VAR_SAMP() : 분산을 구함
예) 전체 구매자가 구매한 물품의 개수의 평균을 구하기
SELECT userID , AVG(amount) AS ' 평균 구매 개수' FROM buytbl;
예) 각 사용자 별로 한 번 구매 시 물건을 평균 몇 개 구매했는지 평균을 구하기 (GROUP BY 사용)
SELECT userID , AVG(amount) AS ' 평균 구매 개수' FROM buytbl GRUOP BY userID;
예)usertbl에서 가장 큰 키와 가장 작은 키의 회원 이름과 키를 출력
SELECT name, height FROM usertbl
WHERE height = (SELECT MAX(height) FROM usertbl)
OR height = (SELECT MIN(height) FROM usertbl);
예) 휴대폰이 있는 사용자 수 더하기
SELECT COUNT(mobile1) AS '후대폰 있는 사용자' FROM usertbl;
3) HAVING 절
예) 집계함수를 적용해서 사용자별 총 구매액에 대한 쿼리문
SELECT userID AS '사용자' , SUM(price * amount) AS '총 구매액'
FROM buytbl GROUP BY userID;
그런데 이 중에서 총 구매액이 1000 이상인 사용자에게만 사은품을 증정하고 싶다면
SELECT userID AS '사용자' , SUM(price * amount) AS ' 총 구매액'
FROM buytbl WHERE SUM(price * amount) > 1000 GROUP BY userID;
> 오류가 난다
그럼
SELECT userID AS '사용자' , SUM(price * amount) AS ' 총 구매액'
FROM buytbl GROUP BY userID HAVING SUM(price * amount) >1000;
>HAVING 절 이용해서 하자
4) ROLL UP
총합 또는 중간 합계가 필요하다면 GROUP BY절과 함께 WITH ROLLUP문 사용하면 됨
SELECT num , groupName , SUM(price * amount) AS '비용'
FROM buytbl GROUP BY groupName, num WITH ROLLUP;
'MySQL' 카테고리의 다른 글
| MySQL_Connection 창 (0) | 2024.09.10 |
|---|---|
| MySQL_비교연산자, 논리연산자 (0) | 2024.09.09 |
| MySQL_MySQL (0) | 2024.09.09 |
| MySQL_NoSQL (0) | 2024.09.09 |
| MySQL 기본문법 (4) | 2024.09.09 |