SQL 16

[개발자랑] ERD

2024년 8월 28일 쯤, 프로젝트를 시작했다. 8월 29일 주제를 선정했고8월 30일부터 9월 3일까지는 MIRO를 통한 이벤트 스토밍,9월 5일부터 9월 8일은 요구사항 명세서,9월 10일부터 9월 12일은 ERD를 작성했다.(수업 이외에 시간에 부담없이 조금씩 하다 보니 오래 걸린 것 같다.) 우리 팀이 정한 주제는 개발자를 위한 커뮤니티로, "개발자랑" 이라는 프로젝트명을 붙여주었다.개발 + 자랑,개발자 + 랑 두 가지 의미가 중의적으로 있는게 참 마음에 든다! 이 서비스의 가장 귀여운 점은회원가입 시 성향테스트를 해서 나온 수식어와 희망 직무를 합쳐 별명(?)을 붙여준다는 점이다 ㅎㅎ  아래는 우리 팀에서 작성한 ERD이다. 연관관계를 쪼개고, 게시판도 여러개 있다보니 테이블이 내 기준 정말 ..

SQL(11) INDEX

인덱스란? : 데이터를 좀 더 빠르게 찾을 수 있도록 만든 데이터 구조. - 데이터의 저장(INSERT, UPDATE, DELETE)의 성능을 희생하고, 대신에 데이터의 읽기 속도를 높여 테이블의 동작 속도를 높여준다.- 인덱스가 없어도 데이터베이스를 작동하는데 있어서 문제는 없지만,데이터베이스의 크기가 커지면 커질수록 데이터베이스의 성능을 위해 인덱스가 반드시 필요해진다.인덱스의 특징- 테이블에서 한 개 이상의 속성을 이용하여 인덱스를 생성한다.- 인덱스를 사용하면 매우 빠른 응답 속도를 얻을 수 있고 쿼리의 부하가 줄어들어 시스템 전체 성능이 향상된다.- 데이터베이스에 인덱스를 위한 전체 크기의 10%나 되는 추가적인 공간을 할당해줘야 하고,   잘못 사용할 경우 성능이 오히려 크게 떨어질 수 있다...

SQL(10) VIEW

1. VIEW란?: SELECT 쿼리문을 저장한 객체로, 가상 테이블이라 불린다.- 실질적인 데이터를 물리적으로 저장하는 것이 아니라 논리적으로 저장 2. VIEW의 사용 목적- 보안성- 복잡한 SELECT 구문을 간결하게 작성 가능 3. VIEW 사용하기-- VIEW 생성 (무언가를 생성하려면 DDL 구문 사용)CREATE VIEW hansik AS SELECT menu_code , menu_name , menu_price , category_code , orderable_status FROM tbl_menu WHERE category_code = 4;-- VIEW 조회SELECT * FROM hansik;-- 베이스 테이블의 데이터 변경 -> VIEW의 데이..

SQL(9) 날짜/시간 관련 함수

1. 날짜/시간 관련 함수(1) ADDDATE(), SUBDATE()SELECT ADDDATE('2023-05-31', INTERVAL 30 DAY) -- 30일 뒤의 날짜 반환 , ADDDATE('2023-05-31', INTERVAL 6 MONTH) -- 6개월 뒤의 날짜 반환 , SUBDATE('2023-05-31', INTERVAL 30 DAY) -- 30일 전의 날짜 반환 , SUBDATE('2023-05-31', INTERVAL 6 MONTH); -- 6개월 전의 날짜 반환 (2) ADDTIME(), SUBTIME()SELECT ADDTIME('2023-05-31 09:00:00', '1:0:1') -- 1시간 1초 뒤의 날짜(시간포함)..

SQL(8) 숫자 관련 내장 함수

1. 숫자 관련 내장 함수(1) ABS(숫자) : 절댓값 반환SELECT ABS(-123); -- 123 (2) CEILING, FLOOR, ROUND(숫자): 올림, 내림, 반올림SELECT CEILING(1234.56), FLOOR(1234.56), ROUND(1234.56); -- 1235, 1234, 1235 (3) CONV(숫자, 원래진수, 변환진수): 원래진수로 표현된 숫자를 변환진수로 변환SELECT CONV('A', 16, 10), CONV('A', 16, 2), CONV(1010, 2, 8);-- 10 1010 12 (4) MOD(숫자1, 숫자2): 숫자1을 숫자2로 나눈 몫SELECT MOD(75, 10), 75%10, 75 MOD 10; -- 5 5 5 (5) POW(..

SQL(7) 문자열 관련 내장 함수

1. 문자열 관련 함수(1) ASCII(아스키 코드), CHAR(숫자)SELECT ASCII('A'), CHAR(65); (2) Bit, Char, Byte 수- 한글값은 3byte이다. SELECT BIT_LENGTH('pie'), CHAR_LENGTH('pie'), LENGTH('pie'); (3) CONCAT(문자열1, 문자열2, ...), CONCAT_WS(구분자, 문자열1, 문자열2, ...)- 문자열을 이어준다.- CONCAT_WS는 문자열 사이에 구분자를 넣어서 이어준다.SELECT CONCAT('호랑이', '기린', '토끼');SELECT CONCAT_WS(',', '호랑이', '기린', '토끼'); # 첫번째 매개변수가 구분자가 된다. (4) ELT(숫자, 문자열1, 문자열2,...): ..

SQL 실습(6)

* 실습은 앞의 SQL(2) 게시물에서 이용한 데이터베이스를 이용해 진행했다. -- Q2. 서브쿼리를 이용하여 영업부인 직원들의 사원번호, 직원명, 부서코드, 급여를 출력하세요.-- 참고. 영업부인 직원은 부서명에 ‘영업’이 포함된 직원임SELECT emp_id, emp_name, dept_code, salaryFROM employee WHERE dept_code IN (SELECT dept_id FROM department WHERE dept_title LIKE '%영업%' ); -- Q3. 서브쿼리와 JOIN을 이용하여 영업부인 직원들의 사원번호, 직원명, 부서명, 급여를 출력하세요.SELECT a.emp_id, a..

SQL 실습(5) 중첩된 집계함수 에러, 인라인뷰 서브쿼리 에러

* 실습은 앞의 SQL(2) 게시물에서 이용한 데이터베이스를 이용해 진행했다.  # 문제 1. 부서별 직원 급여의 총합 중 가장 큰 액수를 출력하세요. 아래는 내가 처음 작성한 코드이다.SELECT MAX(SUM(a.salary))FROM employee a JOIN department b ON a.dept_code = b.dept_idGROUP BY b.dept_title; 이 코드를 실행하면 에러가 뜨는데,그 이유는 MAX(SUM(a.salary))가 중첩된 집계 함수이기 때문이다.SQL은 일반적으로 하나의 집계 함수 안에 또 다른집계 함수를 사용할 수 없다.따라서 서브쿼리를 이용해서 먼저 각 부서별 급여 총합을 계산하고, MAX()로 최댓값을 찾아야 한다.  그래서 수정해 본 코드다.SELECT M..

SQL 실습(4)

* 실습은 앞의 SQL(2) 게시물에서 이용한 데이터베이스를 이용해 진행했다. -- Q1. 재직 중이고 휴대폰 마지막 자리가 2인 직원 중 -- 입사일이 가장 최근인 직원 3명의 사원번호, 직원명, 전화번호, 입사일, 퇴직여부를 출력하세요.-- 참고. 퇴사한 직원은 퇴직여부 컬럼값이 ‘Y’이고, 재직 중인 직원의 퇴직여부 컬럼값은 ‘N’SELECT emp_id, emp_name, phone, hire_date, ent_ynFROM employeeWHERE ent_yn = 'N' AND phone LIKE '%2'ORDER BY hire_date DESCLIMIT 3; # LIMIT는 SELECT문의 결과 집합에서 반환할 행의 개수를 제한한다.-- Q2. 재직 중인 ‘대리’들의 직원명, 직급명, 급여, 사..

SQL 실습(3)

* 실습은 앞의 SQL(1) 게시물에서 이용한 데이터베이스를 이용해 진행했다. # Q1. 상위 카테고리 코드가 null이 아닌 카테고리의 카테고리 코드와 카테고리명을 출력하세요. 단, 카테고리명을 기준으로 내림차순 정렬하여 출력하세요.SELECT category_code, category_nameFROM tbl_categoryWHERE ref_category_code IS NOT NULLORDER BY category_name DESC;# Q2. 메뉴명에 '밥'이 포함되고, 가격이 20,000원 이상 30,000원 이하인 메뉴의 메뉴명과 가격을 출력하세요.SELECT menu_name, menu_priceFROM tbl_menuWHERE menu_name LIKE '%밥%' AND (menu_price..