기초 SQL 학습 2일차
❇️ 오늘 배운 내용
1. 테이블 불러오기와 조건문 달기
2. 패턴 검색, 정렬하기, 출력값 제한하기
3. 연산하는 열 만들기
주요 개념
정규 표현식 REGEXP
SELECT * FROM | WHERE | ORDER BY | GROUP BY | DISTINCT | LIKE |
Char | VarChar | int | HAVING | Desc | LIMIT |
is null | is not null | offset |
/*
*/
--
오전 강의
수업의 목표는
SQL 마스터 시키기 X
문법 자유자재로 술술 쓰기 X
SQL 구문 읽었을 때 적당히 이해 O
뭐 있었는지 찾아보고 아맞다 하고 적용하는 수준 O
| sql 기본 문법 - select, where
SELECT * FROM (테이블명) : 테이블 불러오기
WHERE 조건문 달기
Desc는 내림차순의 약어기도 하지만 테이블 정보 요약 describe의 약어기도 함.
논리 연산자 and / or / not
- 테이블 불러오기 세팅
테이블 안불러와지면 옆에 탭에서 내가 불러오려는 것이 어느 위치에 있는지 확인하고
저거 위에 로컬호스트2, 성동 버튼 있지, 그거 눌러서 체크하기.
SYS은 시스템이라는 뜻. 마이SQL 시스템 상에서 알아서 만들어놓은 데이터베이스들.
제대로 데이터가 안가져와지거나 뭐 로딩 뜨거나 여튼 그러면 우클릭 - 새로고침 ㅇㅇ
기본 문법
💠 기본 규칙
- 모든 문장은 ;(세미 콜론)로 종료되어야 함.
- 커서 두고 컨+엔터 해서 그 부분 실행
- SQL 구문은 대소문자를 구변하리자 않지만,
- SQL키워드 (SELECT, FROM, WHERE)는 주로 대문자를 사용하라.
테이블명, 칼럼 이름은 소문자로 작성하는것을 권장.
💠 필수 : SELECT * FROM (테이블명)
SELECT 테이블의 특정 열 (모두 가져오기 = *) FROM 테이블명
*은 테이블의 모든 컬럼명을 지칭하는 약자. 아스타라고 부름.
셀렉트 프랑은 필수 그 자체. 꼭 넣어야 함.
💠 필수 아닌 것
WHERE 절은 파이썬의 IF문 같은 것. WHERE이 없으면 테이블의 모든 걸 가져온다.
ORDER BY: 정렬. 파이썬의 오덜바이와 거의 같다. 쿼리를 실행한 다음 오더바이로 정렬~
GROUP BY: 그룹핑하여 합계, 평균 등을 하기. 파이썬의 그룹바이와 거의 같다.
그외 HAVING(그룹핑된 것에 조건을 줄 때), DISTINCT(중복 제거)
*** 여기 중에 몰라도 되는 것 없음.
*** 순서도 잘 지켜야 해서 문법 다시 보고 체크할 일 있을 것임.
💠 주석
/*
주석
*/
-- 한줄 주석
중간에 작성한 내용을 주석 안에 가두고 싶으면
그냥 위에 /* 쓰셈 그럼 밑에 있는 부분 바로 가둬짐
끝에만 */로 닫으면 됨!
단축키 컨 \ (역슬래쉬) <- 안되더라 사실확인 필요
헐~ 어제 따로 찾아보려고 한 건데 대박 유용하다!
컨 / 가 주석이었음. 대신 드래그한 모든줄이 한줄 주석 처리됨.
블럭주석 단축키
블럭인데도 한줄한줄 한줄주석 처리하는 단축키
- 자료형
소수점 저장 자료형이 뭐랬지?
파이썬에선 문자열이 스트링이었음
용량 아끼기 위해 주로 '가변 길이 문자형'을 쓰긴 함.
char를 varchar로 변환할 때 공백이 남아있는 경우가 많을텐데 trim()으로 공백 제거하는 거 나중에 배울 거이.ㅁㅁ
테이블 불러와서 정보 보기 - SELECT * FROM, Desc
-- 테이블의 모든 열 불러오기
SELECT * FROM sample21;
-- 테이블의 특정 열 불러오기
-- SELECT 열1, 열2 FROM 테이블명;
SELECT no, name FROM sample21;
-- 테이블 구조 알아보기
Desc sample21;
여러번 하면 여러번 뽑아짐~
💠 Desc 테이블명;
테이블의 구조를 볼 수 있다.
파이썬의 info() 같은 역할.
- field: 열의 이름
- type: 이 열의 타입
- null : null이 있을 수도 있다 yes (null이 하나라도 있다는 뜻 x)
- key: 이 컬럼이 키냐 아니냐
- default: 아무것도 안넣고 생성했을 때 기본적인 내용이 뭐가 되느냐
- 예) 현재 시간 열이면 로우 생성할 때 생성된 시간을 자동 입력되도록 설정해줄 수도 있는 거임.
💠참고 : 테이블 입력하면 뒤에 붙는 한글자는 뭐예요?
샘플21 엔터 쳐서 자동완성 했더니 같이 입력된 S는 뭐냐!
뭐냐면 디비버의 편리한 기능임. 샘플21가 자주 불러오는 테이블이구나 하고 약어 붙여준 거임.
이제 S 쳐도 샘플21 불러와줌.
유용한 점.
1. 테이블 2개씩 쓸 때 - join이나 참조 할 때... 테이블명 일일이 안적어도 열을 소환할 수 있어짐.
s.name 하면 아 샘플 테이블에 있는 name 열이구나 함. c.name 하면 아 커스터머 테이블에 있는 name 열이구나 하는 거고.
2. 이 테이블 안에 열 이름이 뭐였는지 기억 안나잖아? 그럼 s. 이러면 열들이 뜸. 간편~
WHERE 문
where문 안에는 열, 연산자, 상수가 들어가는데
나중에는 상수를 구하는 셀렉트가 들어갈 도 있음.
where 안에 들어간 조건 "no=2"를 나눠보면
조건 | ||
no=2 | ||
no | = | 2 |
열 이름 | 연산자 | 상수 |
- where 코드 예시
-- 넘버가 2번인 행을 가져오라.
select * from sample21 s
where no = 2;
-- 붙여써도 됨.
select * from sample21 s where no = 2;
-- 2번 외에 다 데리고 오라.
select * from sample21 s where no <> 2;
-- 박준용씨 정보 가져오라. 문자열 상수니까 "" 주의!!
select * from sample21 s where name = "박준용";
/*
널값 찾기
where birthday = null 안됨
*/
-- 이거 둘다 NULL 값 찾아짐.
select * from sample21 where birthday is null;
select * from sample21 where isnull(birthday);
-- NULL 값이 아닌 것 찾기
select * from sample21 where birthday is not null;
- null값 찾기
* NULL 값 데이터 불러올 때 빈 값을 NULL로 처리할 것이냐 공백으로 만들 것이냐 옵션 있는데
공백을 NULL로 치환 옵션을 체크하고 가져와야 이게 됨.
* 열 ㅇㅇ에서 null값이 아닌 행을 찾기
where ㅇㅇ is not null
* 열 ㅇㅇ에서 null값인 행을 찾기
where ㅇㅇ is null
where isnull(ㅇㅇ)
*헷갈리지 마셈 이거 아님
where ㅇㅇ = null
(파이썬은 이거 되던가)
조건을 조합하는 논리 연산자
-
이거 왜 전부 다 나왔게¿¿
양쪽 조건식 조합할 때 조건식 제대로 안넣고 0이 아닌 값 들어가면 컴퓨터가 모두 TRUE로 인식함。
TRUE라고 써있는 거라고 인식해서 음 다 트루인 거 뽑으면 되나보군。 하면 됨
모든 열에 2가 들어가는데 특정한 열을 지정 안해서 다 불러온거냐、 했는데 그게 아니었다는 것~
그러니까 조건문 쓸 땐 잘 지정하셈.
-
원래 AND를 먼저 취급하기 때문에, OR로 먼저 계산하고 싶으면 괄호를 꼭 써서 우선순위를 명시해줘야 함.
\ | AND | OR |
검색 가능한 것 | 모든 조건을 만족하는 행 | 연결된 조건식 중 하나라도 만족하는 행 |
한글 로 따지자면 | 및 | 또는 |
연산해서 계산할 수 있는 것 | 교집합 | 합집합 |
-
💠NOT 연산자
NOT 연산자는 오른쪽에만 항목을 지정하는 ‘단항 연산자’
오른쪽에 지정한 조건식의 반대값을 반환합니다.
not 안에 조건문 쓰려면 괄호 쳐야 됨.
-- 논리 연산자 --
select * from sample24;
-- a 열이 0이 아니면서 b 열이 0이 아닌 것
select * from sample24
where a <> 0 and B <> 0;
-- a 열이 0이 아니거나 b 열이 0이 아닌 것
select * from sample24
where a <> 0 OR B <> 0;
-- (a 열이 0이거나 b 열이 0인 것)이 아닌 것 = a나 b가 0 아닌 것
select * from sample24
where not (a = 0 OR B = 0);
-- a열이 0이 아니거나 b열이 0인 것
select * from sample24
where not a = 0 OR B = 0;
-- 괄호로 안묶으면 A가 0이 아닌 게 아니거나(0이거나) B가 0 아닌 것을 뽑음.
select * from sample24
where not a <> 0 OR B <> 0;
-- (a 열이 0이 아니거나 b 열이 0이 아닌 것)이 아닌 것 = a나 b가 0인 것
select * from sample24
where not (a <> 0 OR B <> 0);
-- 문제풀이 실습!! --
-- 직원 정보 불러오기
select * from employee e;
-- 직원들 중에 리포트투가 입력된 애들 불러오기
select * from employee e
where e.reportsto is not null;
-- 직원 중에 스태프 불러오기
select * from employee
where Title = "IT STAFF";
-- 직원 중에 스태프랑 매니저 불러오기
select * from employee
where Title = "IT STAFF" or Title = 'IT Manager';
- 타 테이블 참조해서 검색하는 문제
/* 타 테이블에서 찾기!
트랙 테이블에 장르 아이디와 장르 테이블에 있는 장르 아이디를 연결해서,
장르 테이블의 장르 이름 열을 트랙 테이블에서 검색하는데 활용해라.
장르가 록이거나 재즈인 음악(트랙 테이블에 없는 것)을 트랙 테이블에서 검색해라.
*/
-- 걍 장르 테이블 불러서 재즈의 장르 아이디를 확인하는 게 쉽게 하는 법임.
-- 너무 많아서 찾기 어려우면 WHERE NAME = "ROCK" or 해서 검색하면 됨.
-- 단 이 방법은 연관 테이블, 연결키를 알 수 있을 때임. (사실 관계도 보면 되긴 함.)
select * from Track;
select * from genre g ;
-- 록이 1 재즈가 2
select * from track
where GenreId = 1 OR GenreId = 2
order by TrackId;
-- 해보고 있는 방법 : 타 테이블 검색하는 조건 달기. 응~ 안 배우고는 너무 어려워~
select * from track
where (select g.name from genre g) = "ROCK";
-- 동기 수강생이 join 써서 했다는 얘기 듣고 검색해서 해본 것
select * from track T
left join genre g on T.GenreId = G.GenreId ;
-- 합치긴 합쳤는데 장르 아이디가 중복해서 생김. 이거 어째 함?
- JOIN 써서 합치면 된다는데 ... 합치고 트랙 테이블만 뽑으면 원래대로 보임. 합친 거 저장하는 방법은?
- select * from track
join genre g ; 이건 단순 합치기임.
- full outer join 이건 MYSQL에 없대
https://easyitwanner.tistory.com/273
뭐 근데 조인 담주에 배울테니까 ㄱㅊ겠지!
타테이블 참조도 곧 배우겠지!
오후 강의
| sql 기본 문법 - like, order by, limit
like -
- like 술어 - 패턴 검색할 때 씀.
where LastName like '%N'
라스트 네임 열에서 N으로 끝나는 행을 찾아라.
where 열 이름 like '표현식'
메타문자
사실 중간일치는 맨끝 맨뒤에 위치한 것도 다 찾아줌.
당연함 %SQL이기도 하니까...
전방일치 후방일치는 꼭 그것만 찾아줌.
-- like 술어 : 패턴 검색
select * from sample25;
-- 맨앞이 SQL인 거 찾기
select * from sample25
where text like 'sql%';
-- 중간이 SQL인 거 찾기
select * from sample25
where text like '%sql%';
-- 맨끝이 SQL인 행을 넣어주기
insert into sample25 (no, text)
value (5, '입문 sql');
-- 실수로 넘버 없이 중복 입력된 행 3개 삭제
delete from sample25
where isnull(NO);
-- 이것도 됨
delete from sample25
where no is null;
-- 결과 확인
select * from sample25 ;
-- 맨끝이 SQL인 거 찾기
select * from sample25
where text like '%sql';
-- INSERT 할 때 열 하나만 입력해도 가능. 다 지정안해도 오류 안남.
insert into sample25 (text)
value ('내 심장의 색깔은 블랙 100%');
-- 맨앞에 %가 들어가는 거 넣기.
insert into sample25 (text)
value ('%000');
-- 중간이든 어디든 %가 들어가기만 한 거 다 찾기
select * from sample25
where text like '%\%%';
-- 와일드카드인 %를 찾는 시도들
select * from sample25
where text like '%\%';
select * from sample25
where text like '%%\%%';
-- 이거 세개 각각 어떤 결과가 왜 나오는지 파악해야 함. 아직 잘... 헷갈림 ㅎ
-- 문자열 표현할 때 쓰는 ''를 검색할때 쓰는 방법
insert into sample25 (no, text)
value (4, 'it''s sql time');
select * from sample25
where text like 'it''s';
select * from sample25
where text like 'it''s%';
💠복잡한 패턴을 검색하려면?
정규 표현식 REGEXP
(엑셀 서식 규칙이랑 문법은 많이 다르겠지만 대충 그런 느낌이겠지)
개발자들도 어려워하니까 이런 게 있다고만 알고 챗지피티한테 해달라 하셈.
- order by
- ORDER BY 정렬
SELECT 열명 FROM 테이블 WHERE 조건식 ORDER BY 열명 #오름차순, asc 생략
SELECT 열명 FROM 테이블 WHERE 조건식 ORDER BY 열명 desc #내림차순
SELECT 열명 FROM 테이블 WHERE 조건식 ORDER BY 열명 , 열명, 열명 #열 이름 뒤에 desc 붙여도 됨
/*
오더 바이 실습
*/
select * from sample31;
-- 오름차순 정렬
select * from sample31
order by age;
-- 내림차순 정렬
select * from sample31
order by age desc;
-- 이건 안됨
select * from sample31
order by age descendant;
select * from sample32 s
order by a , b desc;
파이썬에선
orderby(ascending = True) 였던 거 같음
복수의 열을 ,(콤마)를 통해 지정하면, 먼저 온 열부터 정렬하고 값이 같은 부분은 다음 열을 통해서 정렬하게 됩니다.
delete from sample25
where isnull(NO);
FROM 생략해도 된다더니 안됨
- 변수 데이터 타입 바꾸기
이건 왜 그럴까, 숫자로 되어 있는 게 아니기 때문임.
varchar 라서 안됐던 거니까(왜)
int 로 바뀌어야 함.
바꾸는 법1. 테이블 옵션에서 바꾼다.
오른쪽 하단의 세이브 클릭
바꾸는 법2. 열 옵션에서 바꾼다.
바꾸는 법3. ALTER TABLE 함수를 쓴다.
alter table 데이터베이스.테이블명
modify column 열 이름 - 데이터 타입 - null
alter table seongdong.sample311
modify column a int null;
이건 근데 외워야 하고 복잡하니까 걍... 디비버가 제공하는 옵션에서 바꾸삼!
null은 또 무슨 의미인거?
- limit 출력되는 행수 제한하기
SELECT 명령문에서 결과값으로 반환되는 행을 제한할 수 있습니다.
* SELECT 열명 FROM 테이블명 LIMIT 행수 [OFFSET 시작행]
헷갈리지 말 것이, 딱 n개만 나오게 하는 게 아니라 n개 이상 나오지 말라고 제한선 끄어주는 거임.
행이 15개인 거에서 10개 제한 걸어두고 다 뽑으면 10개까지만 나오겠지만
조건 걸어서 뽑으면 5개까지만 나올 수도 있단 거임.
파이썬에선 head()임. 위에 몇개 난오게 하는 거. (head 말고 또 무슨 함수 있었지)
-- INSERT INTO 삽입 구문
INSERT INTO 테이블명 (칼럼1, 칼럼2, 칼럼3 ...)
VALUE (값1, '값2', '값3' ...)
-- DELETE FROM 삭제 구문
mysql이랑 포스트? 뭐 이런 거에만 limit 씀.
오라클은 rownum <= n / sql 서버에서는 top n 쓰면 됨. 참고!
- 연산하기
- 프로덕트 선정
delete
다양한 툴과 언어를 쓰다보면, 단축키와 문법이 달라서 헷갈릴텐데
실무자분들은 이걸 어떻게 정리하고 계신가요? 멘토님께서는 어떻게 하세요?
저는 몸으로 부딪혀봅니다.
자주 쓰는 건 자바, 학생들에게 가르칠 때 쓰는 건 파이썬과 sql 같은 건데요.
그러다 보니 가끔 print인지 printf인지 헷갈립니다. 그래도 저는 뭐가 있는지 아니까 다 입력해보고
그때그때 검색해서 제대로 된 걸 찾아봅니다.
여담
💠 검색해볼 것
- 디비버 사용팁
- 디비버 단축키
- 엑셀, 파이썬, SQL 자료형 비교 자료 (용어, 비슷한 것, 다른 점 등)
+ 자료형 보는 함수/명령어 - MYSQL 문장 드래그 등의 이동 단축키
노션, 일반 마크다운, 워드나 한컴 등의 문서, 파이썬(주피터), 엑셀에서도 이런 기본적인 게 속도 엄청 올림.
다 찾아보고 비교하는 자료 만들면 좋다.
예를 들어 노션은 한글자라도 선택하고 컨A하면 그 문장 전체 선택됨.
컨 쉬 하면 위아래로 옮겨짐. (드래그 안해도 됨)
MYSQL도 컨쉬하면 그 문장 단락이 위아래로 옮겨짐.
워드나 한컴은 컨쉬가 그 문장 전체 선택임. - 소수점 저장 자료형이 뭐랬지?
- ㅇㅇ = null 파이썬은 조건에서 = 널값으로 되던가? isna()는 알겟는데
- INSERT INTO 에서 VALUES와 VALUE의 차이는...? VALUE 해도 여러개 되긴 하던데
VALUES는 여러 행 넣을 때인가
CTRL+ALT+Insert | 현재 행 복사 |
알트 + 위 아래 | 위문장 아래문장 전체 선택 (찾았따!) |
💠구문을 대문자로 쓰라고 했는데 계속 소문자로 바뀌어요!
그거 디비버가 우리 도와주려고 노오력 하는 거임.
디비버가 우리 도와주려고 노력하는 거 목록
- 테이블 약어 별명 지어줌
- 대소문자 바꿔줌.
- " 따움표 치면 닫는 " 쳐줌.
- 입력하려는 함수 자동으로 떠서 엔터치면 그게 됨.
- 조건식에서 내가 찾으려는 값이 "IT Staff" 소문자여도 "IT STAFF" 이케만 쳐도 찾아줌.
💠강사님이 추천해주신 데이터분석에 도움되는 유튜버 둘.
카일스쿨
https://www.youtube.com/@kyleschool/featured
데이터리안
https://www.youtube.com/c/Datarian_
[회고]
각각의 내용을 비교하는 자료를 다 만들면 옵시디언에 넣어야지.
나는 저번 글에도 썼었는데
#청년취업사관학교 #데이터분석가 #데이터분석가부트캠프 #DA교육 #데이터분석교육 #실무프로젝트 #실무경험 #취업포트폴리오 #포트폴리오 #취업연계교육 #코멘토 #모비니티
'새싹 데이터 분석 교육 (24.05.13~24.08.16) > TIL' 카테고리의 다른 글
[성동2기 전Z전능 데이터 분석가] 0709 (1) | 2024.07.09 |
---|---|
[성동2기 전Z전능 데이터 분석가] 0708 (미완) (1) | 2024.07.08 |
[성동2기 전Z전능 데이터 분석가] 0704 (미완) (0) | 2024.07.08 |
[성동2기 전Z전능 데이터 분석가] 0624 (0) | 2024.06.24 |
[성동2기 전Z전능 데이터 분석가] 0621 (1) | 2024.06.23 |