-
초급 (4)SELECT, SELECT 1;, GROUP BY(강제사항), Group Function, SELECT 1;, INSERT, '', ORDER BYDB/SQL 2021. 8. 27. 12:26
---
https://youtube.com/playlist?list=PLyQR2NzLKOCb-i7xCOQVU_yomhvHRteDy
이거 보는 중
---
리스트는 INSERT가 먼저지만 강의내용보면 INSERT보다 SELECT가 순서상 먼저.
SELECT는 영상이 두개, (26/27)가 예전
*, DISTINCT
WHERE, <, AND
ORDER BY, DESC
COUNT(*) : DISTINCT만 했을 때 어떤 것들이 중복 됐는지 알고 싶을 때, GROUP BY와 함께 써줘야 한다
HAVING : GROUP BY랑 같이 쓰는 WHERE절과 같다
---
(11/27) 새로 찍은 SELECT 영상
SELECT문은
SELECT절과 FROM절로 구성됨. --메뉴얼 보면 FROM도 필수는 아니던데
+ 조건에 따라 WHERE, GROUP BY, ORDER BY절이 함께함.
SELECT 뒤에 특정 컬럼1, 컬럼2 이런식으로 쉼표로 연결하고 / 전부 보려면 * 를 씀
WHERE COUNTRY='England';
WHERE RANKING < 11; //TOP10
WHERE TITLE LIKE 'M%'; //M으로 시작하는, '%M'는 끝에, '%M%'는 어디든
GROUP BY, HAVING COUNT(*)
GROUP BY로 묶고, COUNT(*)로 세주고, 거기서 조건을 또 걸 땐 HAVING
(▽GROUP BY + 그룹 함수 를 쓴 것)
SELECT COUNT(*), DEPARTMENT_ID FROM EMPLOYEES GROUP BY DEPARTMENT_ID;
: 이런식으로 쓰고 count같은 집계할 함수를 추가해서 활용. 부서별로 몇명씩 있느냐 이런 느낌?
SELECT COUNTRY, COUNT(*) FROM BILLBOARD_CHARTS GROUP BY COUNTRY;
: 각각 몇개씩 있는지가 나옴
SELECT COUNTRY, COUNT(*) FROM BILLBOARD_CHARTS GROUP BY COUNTRY HAVING COUNT(*) > 1;
: 한곡 초과인 애들만 나옴
ASTERISK는 라틴어로 별. * 를 뜻함
SELECT * FROM BILLBOARD_CHARTS ORDER BY RANKING DESC; //RANKING에서 내림차순
SELECT문을 자유자재로 구사하면, 쿼리의 절반 이상이다. CRUD중 젤 중요함.
---
▽
근데 위에 GROUP BY 설명으로는 너무 원리를 모르겠잖아 갑자기 뭔가 뚝딱 된 느낌이야
각각 키워드가 어떤 기능을 하길래 있길래 저렇게 결과가 나오는거야??
-
SELECT COUNTRY FROM BILLBOARD_CHARTS GROUP BY COUNTRY;
그룹화, SELECT로 COUNTRY컬럼을 가져올거고, GROUP BY 뒤의 COUNTRY는 이 컬럼의 값으로 그룹화를 함. 똑같은 애들끼리 묶는(중복제거처럼 보임. 근데 그 안의 걔네들의 다른 컬럼값들은 남아있는거지)
한줄로 돼 있지만
뭉치
뭉치
뭉치 같은 느낌
SELECT COUNTRY GROUP BY COUNTRY하면 그룹이 한줄로 표현돼 있어도 사실 여러줄인 것
이고 그 여러줄의 레코드에 대해 총 몇갠지, COUNTRY말고 다른 컬럼들의 정보를 이용 하는 등의 통계적인 걸 기대할 수 있겠지 평균이라든지
-
SELECT(조회)에 있는건 GROUP BY 로 반드시 있어야함. 왜냐면
실제 데이터는 이렇게 생겼는데
SELECT에 있는걸 GROUP BY 안하니까 같은 SupplierID에 CategoryID가 다른 여러개가 있을 수 있는데 이 정보를 표시를 못해줘, 다시 말해서 GROUP BY SupplierID로 뭉쳐줬는데 그건 한칸이고 CategoryID는 여러개일 수도 있는데 표시할 방법이 없어.
둘다 해주면 무슨 원리인지는 모르겠는데 SupplierID로 뭉쳐줬어도 한칸이 되지 않고 실제 데이터를 표시해준다
논리적으로는 https://finepiz.tistory.com/60 에 있듯이 각각의 컬럼을 그룹화하면 A컬럼 3개, B컬럼 2개로 그룹화가 됐으면 총 6개의 레코드가 생겨. 두개를 그룹화를 한것의 직관이 두개를 경우의 수 따져서 그룹화 시킨 거야
또 예를 들면
만약 성별(값이 남, 여 인 레코드가 있다), 지역(값이 서울, 경기 인 레코드가 있다) 이라고 하면
남/서울, 남/경기, 여/서울, 여/경기
처럼 이렇게 그룹이 가능한 모든 경우가 그룹이 됨. 각각의 그룹은 같지 않잖아
SELECT SupplierID FROM [Products]; - 77행
SELECT CategoryID FROM [Products] group by CategoryID; - 8행
SELECT SupplierID FROM [Products] group by SupplierID; - 29행SELECT SupplierID, CategoryID FROM [Products] group by SupplierID; - 29행
SELECT(조회)에 있는건 GROUP BY 로 반드시 있어야 한다는 것. 이게 시스템적으로 강제해놨다는 설명을 본 것 같아
---
GROUP BY에 있는건 SELECT에 없어도 됨. 이건 그냥 ▽그렇게 묶어놨을 뿐 그게 뭔진 안봐도 되잖아 보면 좋지만
둘다 SELECT, GROUP BY한 상태에서 한쪽 컬럼만 보여주는 것
---
그럼 GROUP BY 한 집단에 대해 통계적인 것도 보고 싶겠지
수업에 나온 COUNT(*)도 그런 것
Group Function, 그룹 함수라고 하는 것이다!
같은건 검색된 여러 행을 이용하여 통계정보를 계산하는 함수
> 예를들어 select count(컬럼1) from employees; 이런식임. 이 컬럼 값이 몇개냐, 이런 명령어는 null을 제외한 값이 몇개냐 이럴 때 씀.
> COUNT(*)는 SELECT * FROM 했을 때 조회된 '행'이 몇개인지 = COUNT(1) --1과 컬럼을 하는건 null 포함(*) 안포함(컬럼) 차이
어차피 모든 레코드에는 그 컬럼 값이 있을테니 그 컬럼만 세도 똑같다. 근데 없을 때도 있잖아? 그게 NULL이고 얘가 끼면 다르다구~
▽select 뒤에 오는게 레코드를 출력할지 말지 검사할건데 1이면 다 출력인게 같으면 참이게 프로그래밍 해놓고 참이면 출력하라 뭐 이런연산인가? 1은 항상 참이니까 다 출력하고, 근데 1+1 하면 2 나오잖아 에잇
- COUNT함수는 집계 함수라서 GROUP BY 절과 함께 사용 가능
> 일단 https://finepiz.tistory.com/129 이거보면 from > where > group by > having > select > order by 이기 때문에 group by가 먼저 실행 돼
> GROUP BY [컬럼] 와 같이 쓰면? 어떤 [컬럼]의 값이 똑같은 애들끼리 묶어놨고(하나의 레코드로), 그 똑같은 애들의 여러가지 정보가 있을것. 걔네들의 행의 수, 평균, 최대값 등등.. 그럼 그 하나의 레코드에 컬럼을 count(*)처럼 만들어서 정보를 볼 수 있다
> COUNT(컬럼)은 SELECT 컬럼 * FROM 했을 때 그 컬럼의 값이 NULL인 행은 카운트 안함.
> HAVING절에는 조건으로 사용 가능(ex.HAVING COUNT(*) > 2;). WHERE절에는 COUNT() 사용 못함
select count(*), FIRST_NAME from employees;
select count(first_name), first_name from employees;
> 둘이 결과가 같다. ㅇㅋ? Price컬럼은 그냥 select * from Products했을 때 첫 레코드에 있는 Price값을 뱉는듯
> 근데 oracle같은데서 해봤더니 에러야, 조회된 행이 몇개인지를 물은것과 저 컬럼에 있는 모든 값을 가져오려 했기 때문이겠지
--하나는 한 행을 뱉고 하나는 전부 뱉는데 이걸 표로 어떻게 표시하냐~ 이건가
select count(*), FIRST_NAME from employees GROUP BY FIRST_NAME;
> 이건 또 에러가 아닌데,
1단계 select FIRST_NAME FROM employees;
2단계 select FIRST_NAME FROM employees GROUP BY FIRST_NAME;
3단계 select count(*), FIRST_NAME from employees GROUP BY FIRST_NAME;인 것. 2단계는 그룹화를 시킨 다음, 그룹 함수를 쓰기 준비완료 상태라고 보면 되겠네
3단계는 2단계에서 생략된것을 가시화 하는 것이겠군. 그룹이 나눠졌는데? 그게 원래는 몇행씩 나왔냐!
COUNT(DISTINCT 컬럼이름) : 컬럼값 중복제거 후 컬럼의 값 건수를 반환(같게 하면 다 한개만 나오고 : 뭔말 뭘 같게?)
> select count(DISTINCT JOB_ID), FIRST_NAME from employees GROUP BY FIRST_NAME;
: 이거 오류 아니야. 이런식으로 쓰겠네
: FIRST_NAME이 같은 애들끼리 묶고, job_id DISTINCT하고, COUNT. 김씨의 job_id의 종류가 몇개냐?겠네 김씨들의 직업은 몇개인가요
댓글에 group by 하면 select 절에 distinct 는 빼도 되는거죠? > 네~ 맞습니다! 라네 --같은 경우를 말하는거겠지? : 뭔말 뭐가 같아?
https://project-notwork.tistory.com/25
중복제거에선 같은데
GROUP BY는 고유값 기준 각각의 연산결과를 가져올 수 있어
---
▽아까 위에서 봤던 COUNT(1)의 의미가 뭔지
SELECT 1 FROM TOPIC; 이건 달라.
table 의 데이터수 만큼의 1의 행을 만들어 낸다.
1은 TRUE의 다른 말인데, 그래서 보통 WHERE 절의 (NOT) EXISTS 안의 내포 SELECT 문으로 사용된다 (▽WHERE절 안에 SELECT문을 쓴다는 거겠지)
논리식으로 사용될 때는 존재유무가 중요하기 때문에 보다 간단하게 사용하려면 SELECT 1 FROM TABLE을 사용
▽컬럼이름이 변순가 그래서 select 1 이고
MSSQL보니까 SELECT Name from sys.databases; 해보면
이래
https://finepiz.tistory.com/595
여기에도
여기서 1+1은 count(*)하는 거랑 같은 것 아니냐??
https://lemon-coke.tistory.com/15
여기 보니까 SELECT 1 해놓고 뒤에 WHERE로 조건을 쓴 다음에 조건을 만족하면 1을 한개 반환하는데 그 목적으로 쓰이나봐
그렇게 쓰이지만? 내가 궁금한건? 저렇게 테이블 레코드 수 만큼 왜 1을 반환하는 것이며 어떻게 생겼길래(원래 컬럼 이름 들어가야 하는자리에 말이야), 연산은 왜 되는거고..
---
(10/27)
INSERT
이 강의 처음에 이전 시간에 했다는걸 말하는데 그게 위의 select 이전 강의
INSERT INTO [테이블명] VALUES (전체 컬럼에 대해 순서대로 넣어야함);
또는
INSERT INTO [테이블명] (컬럼1, 컬럼2...) VALUES (해당값1, 해당값2..)
: 컬럼에 골라 넣을 수 있음, NULLABLE이 아닌건 꼭 넣어야. 아직 데뷔 하지 않은 그룹을 넣을 땐 데뷔년도, 데뷔앨범 같은 컬럼을 넣을 수 없어
디벨로퍼에서 테이블 이름 써져있는거 컨트롤 누르고 클릭하면 디스크립션(데이터 타입 등)이 나옴. NULLABLE NO면 NULL이면 안된다는 것. 얘네말곤 비어있어도 된다
▽숫자는 그냥쓰고, 문자는 ''로 감싼다.
NUMBER에 ''로 감싼 숫자 가능, ''로 감싼 문자 불가능
VARCHAR2에 안 감싼 숫자 가능, 숫자를 ''해서 넣어도 되고 연산도 가능하다 오라클이 알아서 변환해준대
---
(12/27)
ORDER BY
특정 컬럼으로 정렬하는건데, 여러개로 정렬할 수도 있다
데이터 양이 많은 테이블에서 ORDER BY 를 남발하게 되면 소트부하가 발생. 꼭 필요할 때만 써야해
> ORDER BY 에 자주 등장하는 컬럼을 INDEX로 설정을 해둬도 성능에 유리.
SELECT * FROM IDOL_MEMBER ORDER BY BIRTHDAY ASC;
ASC는 default, 생략을 해도 같음. DESC 하면 내림차순
근데? 내림차순에선 NULL값이 맨 위에 나옴
.
NULL을 맨 끝으로 보내고 싶으면
SELECT * FROM IDOL_MEMBER ORDER BY REAL_NAME DESC NULLS LAST;
하면 NULL이 맨 끝으로 감.
ASC에선 NULL이 가장 아래로 가는게 default
SELECT * FROM IDOL_MEMBER ORDER BY REAL_NAME NULLS FIRST;
하면 NULL이 맨 처음으로 옴.
두개의 컬럼으로 정렬
SELECT * FROM IDOL_MEMBER ORDER BY GROUP_NAME, REAL_NAME DESC;
이런식
컬럼명을 표시해도 되는데 SELECT절에 나오는 순서의 숫자로 표현하기도함.
SELECT * FROM TOPIC ORDER BY 4; ▽이러면 SELECT절에 네번째 오는걸로 정렬된다고
근데 이 방법은 지양한다. 왜냐면
SELECT절에 나오는 컬럼의 순서가 바뀔수도 있고
코드의 가독성이 떨어짐.
'DB > SQL' 카테고리의 다른 글
스피드퀴즈 (0) 2021.11.19 초급 (5)INNER JOIN, OUTER JOIN, COUNT&GROUP BY, OUTER JOIN, ANSI JOIN (0) 2021.09.02 초급 (3)계정, 권한, session, resource, 테이블 (0) 2021.08.26 초급 (2)용어 정리, tuple, domain, relation, entity, PKFKUK (0) 2021.08.25 초급 (1)설치(계정&권한, C##&CDBPDB, 도커), 샘플데이터, 연습사이트 (0) 2021.08.25