개발일지/DataBase

개발일지/DataBase

MySQL Null 과 함께 Unique

특정 데이터가 삭제되지 않았을 때는 중복을 허용하지 않고, 삭제(논리)된 경우에는 중복이 가능하게 요청을 받았다. 예를 들어 email이라는 컬럼이 위와 같이 되어야 한다고 하자.'test@test.com'이 이미 사용되고 있다. 그렇다면 더 이상 다른 사용자는 해당 이메일을 사용할 수 없다.  그러나 해당 로우가 삭제되었다면, 즉, deleted_at이 기록된 경우에는 더 이상 email은 존재하지 않는 것으로 간주되어 중복이 가능하도록 설정해야 한다.  그냥 deleted_at과 원하는 컬럼을 묶어서 UNIQUE로 지정하면 되지 않을까?-- email과 deleted_at을 묶어서 유니크로 지정ALTER TABLE usersADD CONSTRAINT UK_email_deleted_at UNIQUE(e..

개발일지/DataBase

Mysql 포트 변경 - MacOs M2

환경 - MacOs (M2) brew를 이용하여 Mysql을 설치하고 사용 중인데, MariaDB를 설치하려고 하니 충돌이 일어나서 사용할 수 없다고 한다. 검색을 해보니 mysql 포트를 변경하거나 완전히 삭제하라고 한다. 1. 터미널을 열고 cd /etc 로 이동 2. sudo nano my.cnf 를 입력 후 [mysqld] 라고 입력된 부분을 찾는다. - (my.cnf가 없을 경우 생성), (mysqld도 마찬가지) 나는 없어서 만듦 3. 아래 사진과 같이 입력 (원하는 포트로 입력할 것) 4. brew services stop mysql, brew services start mysql 명령어를 사용하여 재시작 5. 정상적으로 포트가 변경된 것을 확인 (sudo lsof -i:3307)

개발일지/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

Subquery

Subquery 쿼리 안의 쿼리라는 의미 하위 쿼리의 결과를 상위 쿼리에서 사용하면, SQL 쿼리가 훨씬 간단해짐. Subquery를 사용하지 않아도 원하는 데이터를 얻어낼 수 있겠지만, 더 편하고 간단하게 얻기 위해 사용 1. where 에 들어가는 경우 where 필드명 in (subquery) select u.user_id, u.name, u.email from users u where u.user_id in ( select user_id from orders where payment_method = 'kakaopay' ) 실행 순서 (1) from 실행: users 데이터를 가져와줌 (2) Subquery 실행: 해당되는 user_id의 명단을 뽑아줌 (3) where .. in 절에서 subqu..

개발일지/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(..

E-room
'개발일지/DataBase' 카테고리의 글 목록