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;
'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 |
댓글