소개
현) 디프렌즈 대표
현) 마이크로소프트 공인 강사
전) 마이크로소프트 데이터플랫폼 MVP
전) 씨퀄로 수석 컨설턴트
전) 웹타임교육센터 전임강사
전) 푸르덴셜생명보험 정보시스템 책임
[강의분야]
데이터베이스 개발자, 운영자 과정
데이터베이스 쿼리 튜닝 및 최적화 과정
파이썬, 데이터 전처리, 시각화 과정
파이썬 기반 데이터 분석, 머신러닝 과정
[저서]
디비로 누리는 특별한 세상, SQL Server 개발편
디비로 누리는 특별한 세상, SQL Server 운영편
이장래와 함께하는 SQL Server 운영과 개발 등
강의
전체3수강평
- 자세한 설명 감사합니다.
dyko
2024.03.28
1
- 이장래 강사님 수업은 믿고 들었는데, 역시나 최곱니다 :)
deeir
2024.03.19
1
- good!!
beomseok
2024.03.03
1
게시글
질문&답변
2024.04.27
컬럼 안 공백 문자열 제외
와~ 다행입니다. 밤새내 어찌 되었나 궁금했습니다^^ 공백 문자 제거에 대해 예제를 만들어보았습니다. 다음과 같이 REPLACE() 함수를 사용해 변경하면 됩니다. -- 테이블 만들기 CREATE TABLE Test ( col1 int, col2 varchar(100) ); -- 데이터 추가 INSERT INTO Test VALUES(1, ' 홍 길동 '); INSERT INTO Test VALUES(2, ' 일지 매'); INSERT INTO Test VALUES(3, ' 강 우 동 '); -- 확인 SELECT * FROM Test; /* '1', ' 홍 길동 ' '2', ' 일지 매' '3', ' 강 우 동 ' */ -- 공백 제거 UPDATE Test SET col2 = REPLACE(col2, ' ', ''); -- 확인 SELECT * FROM Test; /* '1', '홍길동' '2', '일지매' '3', '강우동' */ 질문 감사합니다~
- 1
- 1
- 41
질문&답변
2024.04.26
USING 조인 질문드립니다.
안녕하세요? 제가 질문을 제대로 이해있는지 모르겠네요. 다음과 같이 예제를 만들어 봤습니다. 혹시 원하시는 것이 아니면 다시 질문해 주세요. -- 테이블 만들기 CREATE TABLE fruits ( num int, fruit_list varchar(100) ); CREATE TABLE fruit_price ( fruit_name varchar(100), price int ); -- 데이터 추가 INSERT INTO fruits VALUES(1, '사과와당근'); INSERT INTO fruits VALUES(2, '배와딸기'); INSERT INTO fruits VALUES(3, '수박과도마토'); INSERT INTO fruit_price VALUES('사과', 8000); INSERT INTO fruit_price VALUES('딸기', 2000); INSERT INTO fruit_price VALUES('당근', 1500); INSERT INTO fruit_price VALUES('파인애플', 7000); -- 쿼리 SELECT f1.num, f1.fruit_list, f2.fruit_name, f2.price FROM fruits AS f1 INNER JOIN fruit_price AS f2 ON REGEXP_LIKE(f1.fruit_list, f2.fruit_name); /* '1', '사과와당근', '사과', '8000' '2', '배와딸기', '딸기', '2000' '1', '사과와당근', '당근', '1500' */ 질문해 주셔서 감사합니다~
- 0
- 2
- 64
질문&답변
2024.04.13
JOIN함수 질문입니다.
안녕하세요? 우선 두 쿼리문의 결과는 대부분 같습니다. 첫 번째 쿼리문, 즉 제가 강의에서 다룬 쿼리문은 ANSI SQL 표준을 따르는 명시적 조인 방식입니다. JOIN 구문을 사용함으로써 어떤 테이블이 어떻게 조인되는지 명확하게 표현됩니다. 조인의 조건이 ON 절에 명시적으로 표현되어 있어서, 나중에 쿼리를 수정하거나 디버깅할 때 좋습니다. 그리고 명시적 조인은 조인 조건을 빼먹는 실수를 방지해줍니다. 예를 들면 CROSS JOIN을 피할 수 있습니다. 두 번째 쿼리문은 비명시적 조인 방식을 사용합니다. 조인 조건이 WHERE 절에 명시되어 있습니다. 짧고 간결하게 작성될 수 있으며, 일부 오래된 데이터베이스 시스템 또는 간단한 쿼리에 적합할 수 있습니다. 하지만 대부분의 쿼리에서는 WHERE 절 내의 조인 조건과 필터 조건이 섞여 가독성이 저하될 수 있습니다. 또한 조인이 WHERE 절에 섞여 있어, 나중에 쿼리를 수정하거나 확장하는데 어려움을 겪을 수 있습니다. 그리고 조인 조건을 잘못 작성하거나 빼먹는 경우가 발생할 수 있으며, 이는 예기치 않은 CROSS JOIN으로 이어질 수 있습니다. 그래서 명시적 조인을 사용하는 첫 번째 쿼리 방식이 요즘의 SQL 작성법에 더 적합합니다. 이 방식은 쿼리의 의도를 분명히 하고, 가독성 및 유지보수성을 높여줍니다. 대부분의 데이터베이스 시스템과 SQL 표준에서는 명시적 조인을 권장하고 있습니다. 따라서, 저는 첫 번째 쿼리 사용을 강력히 추천합니다. 하지만, SQLD에서 다루는 쿼리문은 예전 방식의 쿼리문입니다. 그리고 ORACLE 데이터베이스를 기준으로 합니다. 저는 이게 마음에 들지 않습니다. 왜 특정 제품을 기준으로 시험을 보는지 모르겠어요. 아뭏든 SQLD 시험을 목표로 한다면, 적절하지 않더라도, SQLD 관련 책의 내용을 중심으로 공부하셔야 합니다. 하지만 실무에서는 첫 번째 방법을 사용하기를 다시 한번 권고합니다. 무슨 뜻인지 아시겠지요?^^ 질문해 주셔서 감사합니다~
- 1
- 1
- 45
질문&답변
2024.04.07
ELT 함수와 FIELD함수 질문입니다.
안녕하세요? 말씀하신 대로 ‘ELT() 함수는 지정한 위치의 값을 반환하는 함수’입니다. 그래서 ELT(1, ’상’, ‘중’, ‘하’)로 하면 ‘상’, ‘중’, ‘하’ 중 첫 번째 값인 ‘상’이 반환되고, ELT(2, ’상’, ‘중’, ‘하’)로 하면 ‘중’이 반환됩니다. NTILE(3) OVER(ORDER BY salary DESC)은 3등분한 결과를 반환하므로 1, 2, 3 중 하나를 반환하게 됩니다. 만일 NTILE(3) OVER(ORDER BY salary DESC) 구문이 1을 반환하면 ELT(NTILE(3) OVER(ORDER BY salary DESC), ’상’, ‘중’, ‘하’)은 ELT(1, ’상’, ‘중’, ‘하’)과 같이 되어 ‘상’이 반환됩니다. 질문에서 ‘지정 위치 숫자도 없고’ 라고 하셨는데, ELT()함수 맨 앞에 사용된 NTILE() 함수 부분이 위치 숫자를 반환해 줍니다. 또한 말씀하신 대로 ‘FIELD() 함수는 위치를 반환하는 함수’입니다. ORDER BY FIELD(dept_id, 'MKT', 'HRD', 'SYS') 구문에서 FIELD() 함수가 사용된 FIELD(dept_id, 'MKT', 'HRD', 'SYS') 부분은 dept_id 열의 값이 ‘MKT’ 이면 1, ‘HRD’이면 2, ‘SYS’이면 3을 반환합니다. 이렇게 반환된 1, 2, 3 숫자를 기준으로 정렬하라고 ORDER BY 문에 사용한 것입니다. 즉, dept_id 열의 값 'MKT', 'HRD', 'SYS' 를 각각 1, 2, 3이라고 간주하고 정렬하라는 의미로 해석할 수 있습니다. 혹시 이해가 안되는 부분이 있으면 다시 질문해 주시기 바랍니다. 질문해 주셔서 감사합니다~
- 0
- 1
- 53
질문&답변
2024.04.01
뷰 변경 질문입니다.
안녕하세요? 뷰를 처음에 만들 때는 CREATE VIEW 문으로 만듭니다. 이미 만들어진 뷰가 있다면 CREATE VIEW 문으로 같은 이름의 뷰를 만들 수 없습니다. 같은 이름의 뷰가 있을 때, 그 뷰의 쿼리문을 수정하고자 할 때는 ALTER VIEW 또는 CREATE OR REPLACE VIEW 문을 사용해야 합니다. DROP 하고 다시 CREATE 해도 되지만, 이렇게 되면 해당 뷰에 대해 설정되었던 권한도 제거되므로, 다시 권한 설정을 해야할 수도 있습니다. 그러므로 기존 뷰를 수정할 때는 ALTER VIEW 또는 CREATE OR REPLACE VIEW 문을 사용하기를 권고합니다. 혹시 다른 내용을 질문한 것이라면, 다시 한번 질문해 주세요. "VIEW를 선언할 때(CREATE VIEW) 당시의 코드로 돌아가서, 해당 코드에서 수정한 다음 실행을 해보니 덮어쓰기가 안 되더라구요." 이 부분이 명확히 이해갸 되지 않기 때문입니다. 질문 앞부분에 "ALTER VIEW 혹은 CREATE OR REPLACE VIEW를 쓴다고 하셨습니다." 이렇게 쓰신 것은 뷰를 변경하는 방법을 이미 알고 계신다 생각되기 때문입니다. 아뭏든 덮어쓰려면 ALTER VIEW 또는 CREATE OR REPLACE VIEW 문을 사용해야 합니다. 질문해 주셔서 감사합니다~
- 0
- 2
- 67