본문 바로가기
SQL

SELECT...FROM

by hallojih 2021. 11. 16.

SELECT 문

SELECT

   FROM

   WHERE

   GROUP BY

   HAVING
   ORDER BY

 

 

SELECT   열 이름
FROM   테이블이름

WHERE   조건

 

 

SELECT * FROM 테이블명; // 해당 테이블의 모든 열을 보여줘라

SELECT * FROM db명.테이블명; // 해당 db 안의 해당 테이블을 보여줘라

 

SELECT 특정 열 이름 FROM db명; // 모든 열이 아닌 특정 열만 보여주기

SELECT 특정 열 이름, 열이름, 열이름; FROM db명; // 특정 열 여러개 보여주기

 

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

SELECT * FROM usertbl WHERE name = '김경호';

 

관계연산자

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

SELECT userID, Name FROM usertbl WHERE birthYear >= 1970 OR height >= 182;

 

SELECT name, height FROM usertbl WHERE height >= 180 AND height <= 183;

SELECT name, height FROM usertbl WHERE height BETBEEN 180 AND 183;

 

SELECT name, height FROM usertbl WHERE name LIKE '김%';

SELECT name, height FROM usertbl WHERE name LIKE '_종신';

 

 

서브쿼리

SELECT name, height FROM usertbl WHERE height > 177;

그런데 이 177이라는 키를 직접 써주는 것이 아니라 이것도 쿼리를 통해서 사용하려는 것이다.

SELECT name, height FROM usertbl

   WHERE height > (SELECT height FROM usertbl WHERE Name = '김경호');

(주의할 점!)

위의 서브커리문에서는 김경호가 한 명이었다. 하지만 아래와 같이 경남 지역에 사는 사람이 여러 명일 경우?

SELECT nema, height FROM usertbl

   WHERE height >= (SELECT height FROM usertbl WHERE addr = '경남');

여기서  (SELECT height FROM usertbl WHERE addr = '경남'); 가 173과 170 두 개의 값을 반환한다.

따라서 오류 발생.

 

=> ANY 문을 쓰자!

SELECT name, height FROM usertbl

   WHERE height >= ANY (SELECT height FROM usertbl WHERE addr = '경남');

키가 173보다 크거나 같은사람, 170보다 크거나 같은사람이 모두 출력될 것이다. 결국 키가 170보다 크거나 같은 사람이 해당된다.

 

 

 

ORDER BY

: 원하는 순서대로 정렬하여 출력, 결과물에 대해 영향을 미치지 않지만 결과가 출력되는 순서를 조절하는 구문이다.

 

SELECT name, mDate FROM usertbl ORDER BY mDate;

가입한 순서대로 출력, 기본적으로 오름차순으로 정렬된다,

(내림차순?) DESC

SELECT name, mDate From usertbl ORDER BY mDate DESC;

(여러 개로 정렬)

SELECT name, height FROM usertbl ORDER BY height DESC, name ASC;

: 키 큰 순서대로 정렬하되 만약 키가 같을 경우에 이름 순으로 정렬 

 

 

DISTICT

: 중복된 것을 하나만 남기는 구문, 중복된 것을 하나씩만 보여줌

SELECT addr FROM usertbl;

 

 

LIMIT

쿼리문 밑에

LIMIT 5;

: 5건 출력됨

LIMIT 0, 5;

: 0번째부터 5개가 출력 (LIMIT 5 OFFSET 0)과 동일

 

 

CREATE TALBE buytbl2 (SELECT * FROM buytbl);

: SELECT 문의 결과가 buytbl2로 만들어짐

 

 

 

GROUP BY

SELECT userID, SUM(amount) FROM buytbl GROUP BY userID;

 

 

 

집계함수

SUM() 외에 GROUP BY 함수와 함께 자주 사용됨

AVG()

MIN()

MAX()

COUNT()

 

SELECT userID, AVG(amount) AS '평균 구매 개수' FROM buytbl GROUP BY userID;

 

 

 

가장 큰 키와 가장 작은 키의 회원 이름과 키를 출력하는 쿼리

SELECT name, MAX(height), MIN(height) FROM usertbl;

: 한 명 밖에 안나옴

SELECT name MAX(height), MIN(height) FROM usertbl GROUP BY Name;

: 잘못나옴

=> 어떻게? 서브쿼리와 조합!

SELECT name, height

   FROM usertbl

   WHERE height = (SELECT MAX(height) FROM usertbl)

   OR height = (SELECT MIN(height) FROM usertbl);

 

 

 

휴대폰이 있는 사용자의 수를 카운트

SELECT COUNT(*) FROM usertbl;

: 모든 회원이 전부 나온다

=> SELECT COUNT(mobile1) AS '휴대폰이 있는 사용자' FROM usertbl;

 

 

 

HAVING 절

사용자별 총 구매액 구하기

SELECT userID AS '사용자', SUM(price*amount) AS '총 구매액'

   FROM buytbl

   GROUP BY userID;

 

이 중에서  구매액이 1000 이상인 사용자에게만 사은품을 증정하고 싶다면?

WHERE절?

SELECT userID AS '사용자', SUM(price*amount) AS '총 구매액'

   FROM buytbl

   WHERE SUM(price*amount) > 1000

   GROUP BY userID;

=> 안됨.   ; GROUP function과 관련된 것은 HAVING 절을 써야한다!

SELECT userID AS '사용자', SUM(price*amount) AS '총 구매액'

   FROM buytbl

   GROUP BY userID

   HAVING SUM(price*amount) > 1000;

 

총 구매액이 적은 사용자부터 나타내려면? ORDER BY

SELECT userID AS '사용자', SUM(price*amount) AS '총 구매액'

   FROM buytbl

   GROUP BY userID

   HAVING SUM(price*amount) > 1000

   ORDER BY SUM(price*amount);

 

 

 

ROLLUP

: 분류별로

SELECT num, groupName, SUM(price* amount) AS '비용'

   FROM buytbl

   GROUP BY groupName, num

   WITH ROLLUP; //groupName에 따라 rollup해줌

자주 사용 안함

 

 

 

 

 

 

USE 구문

USE   데이터베이스_이름;

 

 

 

 

SHOW DATABASES; //db 들 모두 보여주기

SHOW TABLE STATUS; // 테이블들의 상태 보여주기

 

DESCRIBE employees; // 테이블에 대한 정보가 나옴

 

SELECT first_name, gender FROM employees;

 

728x90
반응형

'SQL' 카테고리의 다른 글

데이터 변경을 위한 SQL 문  (0) 2021.11.16
DML, DDL, DCL  (0) 2021.11.16
트리거  (0) 2021.11.15
Stored Procedure  (0) 2021.11.15
Non-Unique Key Lookup  (0) 2021.11.15

댓글