SQL

개발일지/Node.js

SQL Injection 방지 - 권장방식에는 다 이유가 있지..

nodejs express 공부를 하고 있는데, 쿼리를 작성하던 중 문득 생각이 들었다. ` SELECT * FROM users WHERE user_id = ? ` mariadb 모듈에는 query 함수가 있는데, 첫 번째 인자로 쿼리 문자열 받고, 두 번째 인자로 쿼리의 플레이스홀더(? 부분)에 해당하는 부분을 배열 형태로 받는다. 세 번째 인자로 콜백함수를 받는다. 여기서 ${} 형태로 작성하면 가독성과 유지보수 측면에서 더 좋지 않나? 라는 생각이 들었다. ` SELECT * FROM users WHERE user_id = ${userId} ` 이런 식으로 작성하고 두 번째 인자를 생략하면 정상적으로 작동된다. 하지만 또 한편으로 드는 생각이 굳이 첫 번째 방식으로 작성하고 두 번째 인자로 배열을 ..

개발일지/웹개발

DB의 종류

방정리를 하는 이유 1. 잘 넣어두기 위해 2. 잘 찾기 위해 DB RDBMS(SQL) 행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사. 장점: 데이터가 정형화 되어 있으므로 데이터의 일관성이나 분석에 용이 단점: 중간에 열을 하나 더하기가 어려울 수 있음 No-SQL (not only-SQL) 딕셔너리 형태로 데이터를 저장해두는 DB 데이터 하나 하나 마다 같은 값을 가질 필요가 없음. 장점: 자유로운 형태의 데이터 적재에 유리 단점: 일관성이 떨어짐

개발일지/DataBase

Substring_Index, Substring, Case

SUBSTRING_INDEX 문자열을 어느 한 기준으로 갈라줄 때 - substring_index(필드값, '기준', 가져 올 부분) (파이썬의 split() 함수와 비슷한 느낌) ex) 이메일 주소에서 아이디 부분만 필요할 때 SELECT SUBSTRING_INDEX(email, '@', 1) from users ex) 이메일 주소에서 도메인 부분만 필요할 때 SELECT SUBSTRING_INDEX(email, '@', -1) from users SUBSTRING 문자열 중 일부분만 필요할 때 - substring(필드값, '시작할 위치', '갯수') (파이썬의 문자열 인덱싱과 비슷한 느낌) (yyyy-mm-dd tt:mm:ss)를 값으로 갖는 필드값에서 ex) mm-dd 만 가져오기 select s..

개발일지/DataBase

with

with절 subquery가 너무 많아서 알아보기 힘들 때 사용 서브쿼리가 많아져서 지저분해 보임 select c.title, a.cnt_checkins, b.cnt_total, (a.cnt_checkins/b.cnt_total) as ratio from ( select course_id, count(distinct(user_id)) as cnt_checkins from checkins group by course_id ) a inner join ( select course_id, count(*) as cnt_total from orders group by course_id ) b on a.course_id = b.course_id inner join courses c on a.course_id = c...

개발일지/DataBase

Union

Union Select를 두 번 할 게 아니라, 한번에 모아서 보고싶을 때 ex) 7월의 자료 select '7월', c1.title, c2.week, count(*) as cnt from courses c1 inner join checkins c2 on c1.course_id = c2.course_id inner join orders o on c2.user_id = o.user_id where o.created_at < '2020-08-01' group by c1.title, c2.week order by c1.title, c2.week 8월의 자료 select '8월', c1.title, c2.week, count(*) as cnt from courses c1 inner join checkins c2..

개발일지/DataBase

Join

Join 여러 정보를 한 눈에 봐야할 때 테이블과 테이블을 하나의 공통된 키값을 기준으로 연결해주는 기능 엑셀의 vlookup과 동일 Join의 종류 1. Left Join 어떤 데이터는 모든 필드가 채워져있지만, 어떤 데이터는 비어있는 필드가 있다. 이를 모두 표시하고 싶을 때 사용 ex) select * from users u left join point_users p on u.user_id = p.user_id; 2.Inner Join 두 테이블에서 모두 가지고 있는 데이터만 출력하고 싶을 때 사용 ex) select * from users u inner join point_users p on u.user_id = p.user_id; 연습 1. inner join을 사용하여 orders 테이블에 u..

개발일지/DataBase

Alias

쿼리가 점점 길어지고 복잡해지게 되면 혼동이 올 수 있다. 그럴때 사용하는 것이 Alias라는 별칭을 지어주는 기능이다. ex) 테이블명 뒤에 붙이는 경우 orders o select * from orders o where o.course_title = '앱개발 종합반' ex) 출력될 필드에 별칭을 붙이는 겨우 count(*) as cnt => Alias(as)를 붙이게 되면 별칭(cnt)로 출력이 되며 호출할 때도 별칭으로 호출할 수 있음. select payment_method, count(*) as cnt from orders o where o.course_title = '앱개발 종합반' group by payment_method

개발일지/DataBase

Group by, Order by

데이터에서 무엇이 궁금할까 ? 데이터 분석 : 쌓여있는 날것의 데이터 => 의미를 갖는 '정보' 로의 변환 데이터 베이스 테이블에 저장된 데이터 : 쌓여있는 날것의 데이터 ex) 가장 많은 Like를 받은 사람의 이름, 전체 신청자 수, 평균 연령 : 의미있는 '정보' '범주 (category)' 각각의 정보가 궁금할 때 ex) 과목별 신청자 평균 연령, 과목별 신청자 수, 성씨별 회원 수 등 동일한 범주의 데이터를 묶어주는 Group by Group by란? 동일한 범주를 갖는 데이터를 하나로 묶어서, 범주별 통계를 내주는 것 ex) 성씨별 회원수를 추출하라 SELECT name, COUNT(*) from users group by name 규칙 select 범주별로 세어주고 싶은 필드명, count(..

개발일지/DataBase

Select 쿼리문, Where 절 연습하기

1. 성이 남씨인 유저의 이메일만 추출하기 SELECT email FROM users WHERE name = '남**' 2. Gmail을 사용하는 2020/07/12~13에 가입한 유저를 추출하기 select * from users where created_at between "2020-07-12" and "2020-07-14" and email like "%gmail.com" 3. Gmail을 사용하는 2020/07/12~13에 가입한 유저의 수를 세기 select count(*) from users where created_at between "2020-07-12" and "2020-07-14" and email like "%gmail.com" 4. naver 이메일을 사용하면서, 웹개발 종합반을 신..

E-room
'SQL' 태그의 글 목록