[SQL] SQL GROUP 함수
목차 GROUP 함수 GROUP BY와 함께 사용하기 GROUP 함수 집계 함수라고도 하는 SQL GROUP 함수는 행 그룹에 대해 계산을 수행하고 단일 값을 반환합니다. 이러한 함수는 종종 'GROUP BY' 절과 함께 사용되어 각 행 그룹에 대한 계산을 수행합니다. 몇 가지 일반적인 SQL GROUP 함수는 다음과 같습니다. 1. COUNT(): 그룹의 행 수를 반환합니다. SELECT COUNT(*) FROM employees WHERE department_id = 1; 2. SUM(): 행 그룹의 특정 열에 있는 모든 값의 합계를 반환합니다. SELECT department_id, SUM(salary) FROM employees GROUP BY department_id; 3. AVG(): 행 그룹..
2023.04.24
SQL
[SQL] SQL, SQL server 날짜와 시간 데이터 가져오기
목차 날짜와 시간 데이터 유형과 예시 MySQL에서 날짜와 시간 데이터 가져오기 SQL server에서 날짜와 시간 데이터 가져오기 날짜와 시간 데이터 유형과 예시 MySQL에서 날짜와 시간은 다음 데이터 유형을 사용하여 나타낼 수 있습니다. DATE: 시간 정보가 없는 날짜를 나타냅니다. 형식은 'YYYY-MM-DD'입니다. TIME: 날짜 정보가 없는 시간을 나타냅니다. 형식은 'HH:MM:SS'입니다. DATETIME: 날짜 및 시간 정보를 모두 나타냅니다. 형식은 'YYYY-MM-DD HH:MM:SS'입니다. TIMESTAMP: DATETIME과 유사하지만 범위가 '1970-01-01 00:00:01' UTC에서 '2038-01-19 03:14:07' UTC까지입니다. 다음은 MySQL에서 이러한..
2023.04.23
SQL
no image
[SQL] SQL 문자열 함수들과 사용 예시
목차 1 . CONCAT 11. RTRIM 21. REGEXP_REPLACE 2. SUBSTRING 12. LEFT 22. NULL 값을 처리하기 위한 함수 3. LENGTH 13. RIGHT 22-1. ISNULL 4. TRIM 14. REVERSE 22-2. COALESCE 5. UPPER 15. ASCII 6. LOWER 16. CHAR 7. REPLACE 17. STRCMP 8. POSITION 18. CONCAT_WS 9. CHAR_LENGTH 19. SUBSTR_COUNT 10. LTRIM 20. INSTR 문자열 함수 SQL의 문자열 함수는 문자 데이터를 조작하고 처리하는 데 사용됩니다. 연결, 자르기, 대소문자 변환, 하위 문자열 추출 등을 수행할 수 있습니다. 특정 구문은 DBMS(데이터..
2023.04.23
SQL
[SQL] MySQL 서브 쿼리(SUBQUERY)란?
목차 서브 쿼리 사용 예시 유형에 따른 분류 자주 발생하는 실수 서브 쿼리 사용 예시 서브 쿼리는 내부 쿼리의 결과를 기반으로 데이터를 필터링, 검색 또는 조작하는 데 자주 사용되는 다른 쿼리 내에 포함된 쿼리입니다. 서브 쿼리는 SELECT, FROM, WHERE 및 HAVING 절과 같은 SQL 쿼리의 다양한 부분에서 사용할 수 있습니다. 다음은 각 절에서 서브 쿼리를 사용하는 방법에 대한 몇 가지 예입니다. 1. SELECT의 서브 쿼리 SELECT 절의 서브 쿼리를 사용하면 서브 쿼리 결과를 기본 쿼리 결과의 열로 포함할 수 있습니다. SELECT first_name, last_name, (SELECT COUNT(*) FROM orders WHERE orders.customer_id = custo..
2023.04.23
SQL
[SQL] SQL JOIN의 종류와 예시
SQL JOIN 절은 테이블 간의 관련 열을 기반으로 두 개 이상의 테이블에서 행을 결합하는 데 사용됩니다. SQL JOIN에는 INNER JOIN, LEFT JOIN, RIGHT JOIN 및 FULL OUTER JOIN과 같은 여러 유형이 있습니다. JOIN의 유형은 다음과 같습니다. INNER JOIN: 두 테이블에서 일치하는 값을 가진 행을 반환합니다. LEFT JOIN(또는 LEFT OUTER JOIN) 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 반환합니다. 일치하는 항목이 없으면 오른쪽 테이블의 열에 대해 NULL 값이 반환됩니다. RIGHT JOIN(또는 RIGHT OUTER JOIN) 오른쪽 테이블의 모든 행과 왼쪽 테이블의 일치하는 행을 반환합니다. 일치하는 항목이 없으면 왼쪽..
2023.04.23
SQL
[MySQL] MySQL 테이블 관련 절과 명령어(GROUP/OTHER BY, HAVING, 테이블 수정/추가/제거)
목차 테이블(Table)이란? GROUP BY HAVING ORDER BY 테이블 관련 명령어 테이블에 정보 입력하기 테이블(Table)이란? MySQL에서의 테이블은 데이터베이스에서 데이터를 저장하는 논리적인 공간으로, 테이블은 여러 열(Column)과 행(Row)으로 이루어져 있습니다. 각 열은 특정 유형의 데이터를 저장하고, 각 행은 데이터의 인스턴스를 나타냅니다. 즉, 테이블은 데이터의 구조와 레코드를 정의하며, 데이터를 검색, 삽입, 업데이트, 삭제하는 데 사용됩니다. 테이블은 SQL 쿼리를 통해 생성, 수정, 삭제할 수 있으며, 다른 테이블과 JOIN을 사용하여 관련 데이터를 가져올 수도 있습니다. GROUP BY SQL에서 `GROUP BY` 절은 특정 열(들)을 기준으로 데이터를 그룹화하고..
2023.04.23
SQL

[SQL] SQL GROUP 함수

이지IT
|2023. 4. 24. 14:23
반응형

목차

  1. GROUP 함수
  2. GROUP BY와 함께 사용하기

GROUP 함수

집계 함수라고도 하는 SQL GROUP 함수는 행 그룹에 대해 계산을 수행하고 단일 값을 반환합니다. 이러한 함수는 종종 'GROUP BY' 절과 함께 사용되어 각 행 그룹에 대한 계산을 수행합니다. 몇 가지 일반적인 SQL GROUP 함수는 다음과 같습니다.


1. COUNT(): 그룹의 행 수를 반환합니다.

SELECT COUNT(*) FROM employees WHERE department_id = 1;

 

2. SUM(): 행 그룹의 특정 열에 있는 모든 값의 합계를 반환합니다.

SELECT department_id, SUM(salary) FROM employees GROUP BY department_id;

 

3. AVG(): 행 그룹에 대한 특정 열의 평균 값을 반환합니다.

SELECT department_id, AVG(salary) FROM employees GROUP BY department_id;

 

4. MIN(): 행 그룹에 대한 특정 열의 최소값을 반환합니다.

SELECT department_id, MIN(salary) FROM employees GROUP BY department_id;

 

5. MAX(): 행 그룹에 대한 특정 열의 최대값을 반환합니다.

SELECT department_id, MAX(salary) FROM employees GROUP BY department_id;

GROUP BY와 함께 사용하기

6. DISTINCT: SQL GROUP 함수와 함께 사용할 때, DISTINCT 키워드는 계산을 수행하기 전에 지정된 열 내에서 중복 값을 제거합니다. 이는 고유한 값 세트에서 집계 함수를 수행하려는 경우에 유용합니다.

  • SUM과 DISTINCT를 사용한 예시
SELECT SUM(DISTINCT salary) FROM employees WHERE department_id = 1;


7. CUBE: CUBE 연산자는 GROUP BY 절의 확장으로, 그룹화된 열의 모든 가능한 조합에 대한 소계를 생성할 수 있습니다. 이는 다차원 요약 보고서를 생성하는 데 유용합니다. CUBE 연산자는 선택한 열의 값 조합별 집계를 계산합니다.

  • GROUP BY CUBE를 사용한 예시
SELECT department_id, job_title, SUM(salary) 
FROM employees 
GROUP BY CUBE(department_id, job_title);

 

8. ROLLUP: ROLLUP 연산자는 GROUP BY 절의 또 다른 확장으로, 그룹화된 열에 대한 소계와 총계를 생성할 수 있습니다. CUBE와는 달리, ROLLUP은 GROUP BY 절에서 지정된 열을 왼쪽에서 오른쪽으로 이동하면서 계층적 요약을 생성합니다.

  • GROUP BY ROLLUP을 사용한 예시
SELECT department_id, job_title, SUM(salary) 
FROM employees 
GROUP BY ROLLUP(department_id, job_title);


CUBE와 ROLLUP 모두 요약 보고서를 생성하는 데 사용되지만, 서브합계를 생성하는 방법에서 차이가 있습니다. CUBE는 모든 조합에 대한 소계를 생성하는 반면, ROLLUP은 GROUP BY 절의 열 순서를 기반으로 계층적인 소계를 생성합니다.

반응형

'SQL' 카테고리의 다른 글

[MySQL] RANK 함수  (0) 2023.04.24
[SQL] SQL MATH 함수  (0) 2023.04.24
[SQL] SQL, SQL server 날짜와 시간 데이터 가져오기  (0) 2023.04.23
[SQL] SQL 문자열 함수들과 사용 예시  (0) 2023.04.23
[SQL] MySQL 서브 쿼리(SUBQUERY)란?  (0) 2023.04.23
반응형

목차

  1. 날짜와 시간 데이터 유형과 예시
  2. MySQL에서 날짜와 시간 데이터 가져오기
  3. SQL server에서 날짜와 시간 데이터 가져오기

날짜와 시간 데이터 유형과 예시

MySQL에서 날짜와 시간은 다음 데이터 유형을 사용하여 나타낼 수 있습니다.

  • DATE: 시간 정보가 없는 날짜를 나타냅니다. 형식은 'YYYY-MM-DD'입니다.
  • TIME: 날짜 정보가 없는 시간을 나타냅니다. 형식은 'HH:MM:SS'입니다.
  • DATETIME: 날짜 및 시간 정보를 모두 나타냅니다. 형식은 'YYYY-MM-DD HH:MM:SS'입니다.
  • TIMESTAMP: DATETIME과 유사하지만 범위가 '1970-01-01 00:00:01' UTC에서 '2038-01-19 03:14:07' UTC까지입니다.

다음은 MySQL에서 이러한 데이터 유형을 사용하는 몇 가지 예입니다.

-- Select the database to use
USE my_database;

-- Creating a table with date and time columns
CREATE TABLE events (
  id INT AUTO_INCREMENT PRIMARY KEY,
  event_date DATE,
  event_time TIME,
  event_datetime DATETIME,
  event_timestamp TIMESTAMP
);

-- Inserting values into the table
INSERT INTO events (event_date, event_time, event_datetime, event_timestamp)
VALUES ('2023-04-20', '12:30:45', '2023-04-20 12:30:45', '2023-04-20 12:30:45');

-- Querying the table using date and time functions
SELECT * FROM events WHERE DATE(event_datetime) = '2023-04-20';
SELECT * FROM events WHERE TIME(event_datetime) = '12:30:45';
SELECT * FROM events WHERE event_datetime BETWEEN '2023-04-20 12:00:00' AND '2023-04-20 13:00:00';


이러한 데이터 유형 외에도 MySQL은 날짜 및 시간 값 작업을 위한 여러 날짜 및 시간 함수를 제공합니다.

  • NOW(): 현재 날짜와 시간을 반환합니다.
  • CURDATE() 또는 CURRENT_DATE: 현재 날짜를 반환합니다.
  • CURTIME() 또는 CURRENT_TIME: 현재 시간을 반환합니다.
  • DATE(): datetime 식의 날짜 부분을 추출합니다.
  • TIME(): datetime 식의 시간 부분을 추출합니다.
  • DATE_ADD() 및 DATE_SUB(): 날짜에 간격을 더하거나 뺍니다.
  • DATEDIFF(): 두 날짜의 차이를 일 단위로 계산합니다.


다음은 이러한 기능을 사용하는 몇 가지 예입니다.

-- Get the current date and time
SELECT NOW();

-- Get the current date
SELECT CURDATE();

-- Get the current time
SELECT CURTIME();

-- Add 1 day to a date
SELECT DATE_ADD('2023-04-20', INTERVAL 1 DAY);

-- Subtract 1 hour from a datetime
SELECT DATE_SUB('2023-04-20 12:30:45', INTERVAL 1 HOUR);

-- Calculate the difference between two dates in days
SELECT DATEDIFF('2023-04-20', '2023-04-21');

MySQL에서 날짜와 시간 데이터 가져오기

SQL에는 날짜의 일부 추출, 날짜 서식 지정, 날짜 산술 수행과 같은 다양한 용도로 사용할 수 있는 DATE와 관련된 여러 함수가 있습니다. 다음은 일반적으로 사용되는 몇 가지 날짜 함수와 예제입니다.

1. DATE(): datetime 또는 timestamp 값에서 날짜 부분을 추출합니다.

SELECT DATE('2023-04-20 15:30:00');
결과: '2023-04-20'


2. YEAR(): 날짜에서 연도를 추출합니다.

SELECT YEAR('2023-04-20');
결과: 2023


3. MONTH(): 날짜에서 월을 추출합니다.

SELECT MONTH('2023-04-20');
결과: 4


4. DAY(): 날짜에서 일자를 추출합니다.

SELECT DAY('2023-04-20');
결과: 20


5. CURDATE(): 현재 날짜를 반환합니다.

SELECT CURDATE();
결과: '2023-04-23'(오늘 날짜가 2023년 4월 23일이라고 가정)


6. DATEDIFF(): 두 날짜 사이의 날짜 차이를 계산합니다.

SELECT DATEDIFF('2023-04-25', '2023-04-20');
결과: 5


7. DATE_ADD(): 날짜에 지정된 시간 간격을 더합니다.

SELECT DATE_ADD('2023-04-20', INTERVAL 5 DAY);
결과: '2023-04-25'


8. DATE_FORMAT(): 지정된 형식에 따라 날짜 형식을 지정합니다.

SELECT DATE_FORMAT('2023-04-20', '%M %d, %Y');
결과: '2023년 4월 20일'

SQL server에서 날짜, 시간 데이터 가져오기

1. GETDATE() 함수는 MySQL이 아닌 SQL Server에만 해당됩니다. 현재 날짜와 시간을 반환합니다. 이것은 MySQL의 NOW() 함수와 동일합니다.

SELECT GETDATE();


2. DATENAME(datepart, date): 입력 날짜의 지정된 날짜 부분을 나타내는 문자열을 반환합니다. datepart 인수는 year, month, day, weekday, hour, minute 또는 second와 같이 추출할 날짜 부분을 지정하는 문자열입니다.

-- 특정 날짜의 월 이름을 가져오기
SELECT DATENAME(month, '2023-04-20');

-- 특정 날짜의 요일 이름 얻기
SELECT DATENAME(weekday, '2023-04-20');


3. DATEPART(datepart, date): 입력 날짜의 지정된 날짜 부분을 나타내는 정수 값을 반환합니다. DATENAME()과 마찬가지로 datepart 인수는 추출할 날짜 부분을 지정하는 문자열입니다.

-- 특정 날짜의 연도 부분 가져오기
SELECT DATEPART(year, '2023-04-20');

-- 특정 날짜의 날짜 가져오기
SELECT DATEPART(day, '2023-04-20');

-- 특정 날짜 시간의 시간 부분 가져오기
SELECT DATEPART(hour, '2023-04-20 12:30:45');
반응형

'SQL' 카테고리의 다른 글

[SQL] SQL MATH 함수  (0) 2023.04.24
[SQL] SQL GROUP 함수  (0) 2023.04.24
[SQL] SQL 문자열 함수들과 사용 예시  (0) 2023.04.23
[SQL] MySQL 서브 쿼리(SUBQUERY)란?  (0) 2023.04.23
[SQL] SQL JOIN의 종류와 예시  (0) 2023.04.23
반응형

목차

1 . CONCAT   11. RTRIM 21. REGEXP_REPLACE
2. SUBSTRING    12. LEFT 22. NULL 값을 처리하기 위한 함수
3. LENGTH   13. RIGHT      22-1. ISNULL
4. TRIM      14. REVERSE      22-2. COALESCE
5. UPPER  15. ASCII  
6. LOWER         16. CHAR  
7. REPLACE   17. STRCMP  
8. POSITION 18. CONCAT_WS  
9. CHAR_LENGTH 19. SUBSTR_COUNT  
10. LTRIM 20. INSTR  

문자열 함수

SQL의 문자열 함수는 문자 데이터를 조작하고 처리하는 데 사용됩니다. 연결, 자르기, 대소문자 변환, 하위 문자열 추출 등을 수행할 수 있습니다. 특정 구문은 DBMS(데이터베이스 관리 시스템)마다 약간씩 다를 수 있지만 대부분의 기본 문자열 함수는 대부분의 DBMS에서 공통적입니다. 다음은 일반적으로 사용되는 SQL 문자열 함수입니다.

1 . CONCAT(str1, str2, ...): 두 개 이상의 문자열을 연결합니다.

SELECT CONCAT('Hello', ' ', 'World!') AS result;


2. SUBSTRING(str, start, length): 지정된 위치에서 시작하여 지정된 길이로 문자열에서 하위 문자열을 추출합니다.

SELECT SUBSTRING('Hello, World!', 1, 5) AS result;


3. LENGTH(str): 문자열의 길이를 반환합니다.

SELECT LENGTH('Hello, World!') AS result;


4. TRIM([LEADING | TRAILING | BOTH] [chars] FROM str): 문자열의 처음, 끝 또는 양쪽에서 지정된 문자(또는 기본적으로 공백)를 제거합니다.

SELECT TRIM('  Hello, World!  ') AS result;


5. UPPER(str): 문자열을 대문자로 변환합니다.

SELECT UPPER('Hello, World!') AS result;


6. LOWER(str): 문자열을 소문자로 변환합니다.

SELECT LOWER('Hello, World!') AS result;


7. REPLACE(str, search_str, replace_str): 검색 문자열의 모든 항목을 입력 문자열의 대체 문자열로 바꿉니다.

SELECT REPLACE('Hello, World!', 'World', 'SQL') AS result;


8. POSITION(substr IN str): 문자열 내에서 하위 문자열이 처음 나타나는 위치를 반환합니다.

SELECT POSITION('World' IN 'Hello, World!') AS result;


9. CHAR_LENGTH(str) 또는 CHARACTER_LENGTH(str): 문자열의 문자 수를 반환합니다. 이 수는 멀티바이트 문자 집합의 바이트 길이와 다를 수 있습니다.

SELECT CHAR_LENGTH('Hello, World!') AS result;


10. LTRIM(str): 문자열에서 선행 공백을 제거합니다.

SELECT LTRIM('  Hello, World!') AS result;


11. RTRIM(str): 문자열에서 후행 공백을 제거합니다.

SELECT RTRIM('Hello, World!  ') AS result;


12. LEFT(str, n): 문자열의 왼쪽부터 처음 n자를 반환합니다.

SELECT LEFT('Hello, World!', 5) AS result;


13. RIGHT(str, n): 문자열의 오른쪽부터 처음 n자를 반환합니다.

SELECT RIGHT('Hello, World!', 6) AS result;


14. REVERSE(str): 문자열의 문자를 반대로 바꿉니다.

SELECT REVERSE('Hello, World!') AS result;


15. ASCII(str): 문자열에서 첫 번째 문자의 ASCII 값을 반환합니다.

SELECT ASCII('A') AS result;


16. CHAR(ascii_code): 제공된 ASCII 코드에 해당하는 문자를 반환합니다.

SELECT CHAR(65) AS result;


17. STRCMP(str1, str2): 두 문자열을 비교하여 같으면 0, str1이 str2보다 작으면 음수 값, str1이 str2보다 크면 양수 값을 반환합니다.

SELECT STRCMP('Hello', 'World') AS result;


18. CONCAT_WS(separator, str1, str2, ...): 지정된 구분 기호를 사용하여 두 개 이상의 문자열을 연결합니다.

SELECT CONCAT_WS(', ', 'Hello', 'World') AS result;


19. SUBSTR_COUNT(str, substr): 문자열 내 하위 문자열의 발생 횟수를 반환합니다.(SQL에서는 지원하지 않고, Oracle에서 사용됩니다. 대신 3, 7번을 사용하여 비슷한 결과를 얻을 수 있습니다.)

SELECT SUBSTR_COUNT('Hello, World!', 'l') AS result;


20. INSTR(str, substr): 문자열 내에서 하위 문자열이 처음 나타나는 위치를 반환하거나 하위 문자열을 찾을 수 없는 경우 0을 반환합니다.

SELECT INSTR('Hello, World!', 'World') AS result;


21. REGEXP_REPLACE(str, pattern, replacement): 정규식을 사용하여 문자열 내의 패턴 발생을 지정된 대체 문자열로 바꿉니다.

SELECT REGEXP_REPLACE('Hello, World!', '[aeiou]', '') AS result;


22. SQL은 NULL 값을 처리하기 위한 함수를 제공합니다. 이러한 함수는 기본값을 제공하거나 특정 작업을 수행하여 데이터의 NULL 값을 관리하는 데 도움이 됩니다. 다음은 예제와 함께 각 기능에 대한 설명입니다.

 

22-1. ISNULL

ISNULL은 SQL Server 및 MySQL 전용 함수입니다. 두 가지 인수가 필요합니다. 첫 번째 인수가 NULL이면 두 번째 인수를 반환합니다. 첫 번째 인수가 NULL이 아니면 첫 번째 인수를 반환합니다. NULL 값을 기본값으로 바꾸는 데 유용합니다.

예시(SQL server 기준)

SELECT ProductID, ProductName, ISNULL(Price, 0) AS Price
FROM Products;


예시(MySQL 기준)

SELECT ProductID, ProductName, IFNULL(Price, 0) AS Price
FROM Products;


두 예에서 ISNULL 함수는 Price 열의 NULL 값을 0으로 바꿉니다.


22-2. COALESCE

COALESCE는 SQL Server, MySQL, PostgreSQL 및 Oracle과 같은 다양한 DBMS에서 작동하는 보다 일반적인 기능입니다. 여러 인수를 사용하고 NULL이 아닌 첫 번째 인수를 반환합니다. 모든 인수가 NULL이면 NULL을 반환합니다.

SELECT ProductID, ProductName, COALESCE(Price, DiscountedPrice, 0) AS Price
FROM Products;


이 예제에서 COALESCE 함수는 각 행에 대해 Price 열과 DiscountedPrice 열을 확인합니다. Price가 NULL이 아니면 Price를 반환합니다. Price가 NULL이면 DiscountedPrice를 확인합니다. DiscountedPrice도 NULL이면 0을 반환합니다. 이러한 방식으로 COALESCE는 NULL 값을 ISNULL 함수보다 유연하게 관리할 수 있도록 도와줍니다.


 

반응형
반응형

목차

  1. 서브 쿼리 사용 예시
  2. 유형에 따른 분류
  3. 자주 발생하는 실수

서브 쿼리 사용 예시

서브 쿼리는 내부 쿼리의 결과를 기반으로 데이터를 필터링, 검색 또는 조작하는 데 자주 사용되는 다른 쿼리 내에 포함된 쿼리입니다. 서브 쿼리는 SELECT, FROM, WHERE 및 HAVING 절과 같은 SQL 쿼리의 다양한 부분에서 사용할 수 있습니다. 다음은 각 절에서 서브 쿼리를 사용하는 방법에 대한 몇 가지 예입니다.

1. SELECT의 서브 쿼리
SELECT 절의 서브 쿼리를 사용하면 서브 쿼리 결과를 기본 쿼리 결과의 열로 포함할 수 있습니다.

SELECT first_name, last_name,
       (SELECT COUNT(*) FROM orders WHERE orders.customer_id = customers.customer_id)
       AS order_count
FROM customers;


이 쿼리는 고객 테이블에서 first_name 및 last_name 열을 검색하고 각 고객이 주문한 수를 포함하는 열을 추가합니다.


2. FROM의 서브 쿼리
FROM 절의 서브 쿼리를 사용하면 기본 쿼리에서 사용할 임시 테이블 또는 보기를 만들 수 있습니다.

SELECT emp.first_name, emp.last_name, emp.salary
FROM (SELECT * FROM employees WHERE salary > 50000) AS emp
ORDER BY emp.salary DESC;


이 쿼리는 급여가 50,000보다 큰 직원을 포함하는 'emp'라는 임시 테이블에서 first_name, last_name 및 급여 열을 검색합니다.


3. WHERE의 서브 쿼리
WHERE 절의 서브 쿼리를 사용하면 서브 쿼리의 결과를 기반으로 기본 쿼리의 결과를 필터링할 수 있습니다.

SELECT first_name, last_name, salary
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE location = 'New York');


이 쿼리는 뉴욕에 위치한 부서에서 근무하는 직원의 이름, 성, 급여 열을 검색합니다.


4. HAVING의 서브 쿼리
HAVING 절의 서브 쿼리를 사용하면 서브 쿼리 결과를 기반으로 GROUP BY 쿼리 결과를 필터링할 수 있습니다.

SELECT department_id, COUNT(*)
FROM employees
GROUP BY department_id
HAVING COUNT(*) > (SELECT AVG(employee_count) FROM
                  (SELECT department_id, COUNT(*) AS employee_count
                   FROM employees
                   GROUP BY department_id) AS dept_counts);


이 쿼리는 부서_id 및 각 부서의 직원 수를 검색하지만 직원 수가 부서당 평균 직원 수보다 많은 부서만 표시합니다.


5. GROUP BY의 서브 쿼리
일반적으로 GROUP BY 절에서 직접 서브 쿼리를 사용하지 않습니다. 그러나 SELECT, FROM 또는 HAVING 절에서 서브 쿼리를 사용하여 기본 쿼리의 그룹화에 영향을 줄 수 있습니다.

SELECT d.department_name, COUNT(e.employee_id) AS employee_count
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id
WHERE e.salary > (SELECT AVG(salary) FROM employees)
GROUP BY d.department_name;


이 쿼리는 부서_이름과 평균 급여보다 높은 급여를 받는 직원 수를 부서_이름별로 그룹화하여 검색합니다.


6. ORDER BY의 서브 쿼리
ORDER BY 절에서 서브 쿼리를 사용하여 서브 쿼리의 결과를 기반으로 기본 쿼리의 결과를 정렬할 수 있습니다.

SELECT customer_id, first_name, last_name
FROM customers
ORDER BY (SELECT SUM(amount) FROM orders WHERE orders.customer_id = customers.customer_id) DESC;

 

이 쿼리는 고객 테이블에서 customer_id, first_name 및 last_name 열을 검색하여 결과를 각 고객이 소비한 총 금액을 기준으로 내림차순으로 정렬합니다.


7. INSERT의 서브 쿼리
INSERT 문에서 서브 쿼리를 사용하여 다른 테이블의 데이터 또는 쿼리 결과를 새 테이블에 삽입할 수 있습니다.

INSERT INTO high_salary_employees (employee_id, first_name, last_name, salary)
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);


이 쿼리는 평균 급여보다 높은 급여를 받는 직원의 employee_id, first_name, last_name 및 급여 열을 'high_salary_employees'라는 새 테이블에 삽입합니다.


8. UPDATE의 서브 쿼리
UPDATE 문에서 서브 쿼리를 사용하여 쿼리 결과에 따라 테이블을 업데이트할 수 있습니다.

UPDATE employees
SET salary = salary * 1.1
WHERE employee_id IN (SELECT employee_id
                      FROM employees
                      WHERE department_id = (SELECT department_id
                                             FROM departments
                                             WHERE department_name = 'IT'));


이 쿼리는 'IT' 부서 직원의 급여를 10% 인상하여 업데이트합니다. 부질의는 'IT' 부서의 department_id를 찾는 데 사용되며 또 다른 부질의는 해당 부서 직원의 employee_id를 찾는 데 사용됩니다.

이러한 예제는 다양한 SQL 문에서 서브 쿼리를 사용하여 보다 복잡하고 유연한 쿼리를 만드는 방법을 보여줍니다.


유형에 따른 분류

서브 쿼리는 반환하는 값의 유형에 따라 분류할 수 있습니다. 반환 값에 따라 세 가지 기본 유형의 서브 쿼리가 있습니다.

1. 스칼라(Scalar) 서브 쿼리:
스칼라 서브 쿼리는 단일 값(하나의 행과 하나의 열)을 반환합니다. SELECT, WHERE 및 HAVING 절과 같이 단일 값을 반환하는 표현식이 허용되는 모든 곳에서 사용할 수 있습니다.

SELECT first_name, last_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);


이 예에서 서브 쿼리는 모든 직원의 평균 급여(단일 값)를 반환하고 기본 쿼리는 평균보다 급여가 높은 직원을 검색합니다.



2. 행(Row) 서브 쿼리
행 서브 쿼리는 여러 열이 있는 단일 행을 반환합니다. =, <>, >, <, >= 및 <=와 같이 전체 행을 비교하는 비교 연산자에 사용할 수 있습니다.

SELECT first_name, last_name, salary
FROM employees
WHERE (employee_id, salary) = (SELECT employee_id, MAX(salary) FROM employees);


이 쿼리는 급여가 가장 높은 직원을 검색합니다. 서브 쿼리는 employee_id 및 최대 급여가 포함된 단일 행을 반환한 다음 기본 쿼리의 각 행과 비교합니다.



3. 테이블(Table) 서브 쿼리
테이블 서브 쿼리는 테이블(여러 행 및 여러 열)을 반환합니다. FROM, WHERE 및 HAVING 절은 물론 IN, EXISTS 및 NOT EXISTS 연산자와 함께 사용할 수 있습니다.

SELECT first_name, last_name, salary
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE location = 'New York');


이 쿼리는 뉴욕에 위치한 부서에서 근무하는 직원을 검색합니다. 서브 쿼리는 뉴욕의 부서에 대한 부서_id가 포함된 테이블을 반환하며 이는 기본 쿼리의 WHERE 절에서 사용됩니다.


자주 발생하는 실수

1. 서브쿼리 중첩이 올바르지 않은 경우

-- 올바른 구문
SELECT * FROM orders WHERE order_id IN (SELECT order_id FROM order_items WHERE product_id = 100);

-- 잘못된 구문 (괄호가 누락됨)
SELECT * FROM orders WHERE order_id IN SELECT order_id FROM order_items WHERE product_id = 100);

 

2. 상관 서브쿼리 사용이 잘못된 경우

-- 비효율적인 상관 서브쿼리
SELECT o.* FROM orders o WHERE EXISTS (SELECT 1 FROM order_items oi WHERE o.order_id = oi.order_id AND oi.product_id = 100);

-- 더 효율적인 JOIN
SELECT o.* FROM orders o JOIN order_items oi ON o.order_id = oi.order_id WHERE oi.product_id = 100;


3. EXISTS 또는 NOT EXISTS를 적절하게 사용하지 않는 경우

-- 비효율적인 방법
SELECT * FROM orders WHERE (SELECT COUNT(*) FROM order_items WHERE order_id = orders.order_id) > 0;

-- 더 효율적인 방법
SELECT * FROM orders WHERE EXISTS (SELECT 1 FROM order_items WHERE order_id = orders.order_id);


4. 집계 및 비집계 식을 혼합하여 사용하는 경우

-- 잘못된 방법
SELECT product_id, COUNT(order_id), order_id FROM order_items GROUP BY product_id;

-- 올바른 방법
SELECT product_id, COUNT(order_id) FROM order_items GROUP BY product_id;


5. 서브쿼리가 단일 행을 예상하는데 여러 행이 반환되는 경우

-- 잘못된 방법
SELECT * FROM orders WHERE order_id = (SELECT order_id FROM order_items WHERE product_id = 100);

-- 올바른 방법
SELECT * FROM orders WHERE order_id IN (SELECT order_id FROM order_items WHERE product_id = 100);


6. 조인이 더 적절한 경우에 서브쿼리를 사용하는 경우

-- 비효율적인 서브쿼리
SELECT * FROM orders WHERE order_id IN (SELECT order_id FROM order_items WHERE product_id = 100);

-- 더 효율적인 JOIN
SELECT o.* FROM orders o JOIN order_items oi ON o.order_id = oi.order_id WHERE oi.product_id = 100;


7. 모호한 열 참조

-- 잘못된 방법
SELECT * FROM orders o, order_items oi WHERE o.order_id = oi.order_id AND product_id = 100;

-- 올바른 방법 (가독성을 위해 테이블 별칭 사용)
SELECT * FROM orders o, order_items oi WHERE o.order_id = oi.order_id AND oi.product_id = 100;


8. 서로 다른 DBMS 간의 호환성 문제

-- PostgreSQL-specific 구문 (LIMIT)
SELECT * FROM orders LIMIT 10;

-- SQL Server-specific 구문 (TOP)
SELECT TOP 10 * FROM orders;

조사하면서 느끼는 것은 SQL 들어간 것들은 다 MySQL인줄 알았는데 SQL sever가 따로 있고, PostgreSQL도 다른거고.. 결국 SQL이 Structured Query Language의 앞자를 딴 것처럼 결국 하나의 언어고 C와 C+, C++처럼 각자의 스타일로 녹여냈다는 걸 알게되고 있습니다. 참 어렵네요.

반응형

[SQL] SQL JOIN의 종류와 예시

이지IT
|2023. 4. 23. 19:23
반응형

SQL JOIN 절은 테이블 간의 관련 열을 기반으로 두 개 이상의 테이블에서 행을 결합하는 데 사용됩니다. SQL JOIN에는 INNER JOIN, LEFT JOIN, RIGHT JOIN 및 FULL OUTER JOIN과 같은 여러 유형이 있습니다.

JOIN의 유형은 다음과 같습니다.

  • INNER JOIN: 두 테이블에서 일치하는 값을 가진 행을 반환합니다.

  • LEFT JOIN(또는 LEFT OUTER JOIN)
    왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 반환합니다. 일치하는 항목이 없으면 오른쪽 테이블의 열에 대해 NULL 값이 반환됩니다.

  • RIGHT JOIN(또는 RIGHT OUTER JOIN)
    오른쪽 테이블의 모든 행과 왼쪽 테이블의 일치하는 행을 반환합니다. 일치하는 항목이 없으면 왼쪽 테이블의 열에 대해 NULL 값이 반환됩니다.

  • FULL OUTER JOIN
    왼쪽 또는 오른쪽 테이블에 일치하는 항목이 있으면 모든 행을 반환합니다. 일치하는 항목이 없으면 일치하지 않는 테이블의 열에 대해 NULL 값이 반환됩니다.


다음은 JOIN 절을 사용하기 위한 기본 구문입니다.

SELECT column1, column2, ...
FROM table1
JOIN_TYPE JOIN table2
ON table1.column_name = table2.column_name;


1. INNER JOIN

SELECT employees.first_name, employees.last_name, departments.department_name
FROM employees
INNER JOIN departments
ON employees.department_id = departments.department_id;


이 쿼리는 "department_id" 열을 사용하여 "employees" 및 "departments" 테이블 간에 INNER JOIN을 수행하여 부서 이름과 함께 직원의 성과 이름을 검색합니다.

2. LEFT JOIN

SELECT employees.first_name, employees.last_name, departments.department_name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.department_id;


이 쿼리는 직원이 어떤 부서에도 할당되지 않은 경우에도 부서 이름과 함께 모든 직원의 성과 이름을 검색합니다.

3. RIGHT JOIN

SELECT employees.first_name, employees.last_name, departments.department_name
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.department_id;


이 쿼리는 부서에 직원이 없더라도 해당 부서에 속한 직원의 성과 이름과 함께 모든 부서 이름을 검색합니다.

4. FULL OUTER JOIN

FULL OUTER JOIN은 MySQL에서 지원되지 않습니다. 그러나 이를 지원하는 데이터베이스(예: PostgreSQL, SQL Server, Oracle)에서 구문은 다음과 같습니다.

SELECT employees.first_name, employees.last_name, departments.department_name
FROM employees
FULL OUTER JOIN departments
ON employees.department_id = departments.department_id;


이 쿼리는 직원이 부서에 할당되지 않았거나 부서에 직원이 없는 경우에도 모든 직원의 이름과 성을 부서 이름과 함께 검색합니다.

JOIN 절의 특정 구현은 사용 중인 DBMS(예: MySQL, PostgreSQL, SQL Server, Oracle, SQLite)에 따라 다를 수 있습니다.


CROSS JOIN과 SELF JOIN

1. CROSS JOIN

데카르트 JOIN이라고도 하는 CROSS JOIN은 첫 번째 테이블의 각 행을 두 번째 테이블의 각 행과 결합하여 두 테이블의 데카르트 곱을 생성하는 JOIN 작업 유형입니다. 테이블 JOIN에는 조건이 필요하지 않습니다. CROSS JOIN의 결과 집합에는 JOIN되는 두 테이블의 행 수를 곱한 것과 동일한 행 수가 있습니다.

1) 테이블 예시

1 번 테이블

id name
1 A
2 B

2 번 테이블

id color
1 Red
2 Green

 

2) 테이블1과 테이블2 사이의 CROSS JOIN

SELECT * FROM Table1 CROSS JOIN Table2;

 

3) Output

id name id color
1 A 1 Red
1 A 2 Green
2 B 1 Red
2 B 2 Green


2. SELF JOIN


SELF JOIN은 일반 JOIN 작업이지만 단일 테이블에 적용됩니다. SELF JOIN을 수행하려면 테이블에 대한 별칭을 생성하고 이 별칭을 사용하여 JOIN 조건에서 동일한 테이블을 참조해야 합니다. SELF JOIN은 관련 열을 기반으로 동일한 테이블의 행을 결합하려는 경우에 사용됩니다.

1) 테이블 예시

id name manager_id
1 Alice NULL
2 Bob 1
3 Carol 1
4 Dave 2


2) 직원과 해당 관리자를 찾기 위한 SELF JOIN

SELECT e1.name AS Employee, e2.name AS Manager
FROM employees e1
INNER JOIN employees e2 ON e1.manager_id = e2.id;

 

3) Output

Employee Manager
Bob Alice
Carol Alice
Dave Bob

 

반응형
반응형

목차

  1. 테이블(Table)이란?
  2. GROUP BY
  3. HAVING
  4. ORDER BY
  5. 테이블 관련 명령어
  6. 테이블에 정보 입력하기

테이블(Table)이란?

MySQL에서의 테이블은 데이터베이스에서 데이터를 저장하는 논리적인 공간으로, 테이블은 여러 열(Column)과 행(Row)으로 이루어져 있습니다. 각 열은 특정 유형의 데이터를 저장하고, 각 행은 데이터의 인스턴스를 나타냅니다. 즉, 테이블은 데이터의 구조와 레코드를 정의하며, 데이터를 검색, 삽입, 업데이트, 삭제하는 데 사용됩니다. 테이블은 SQL 쿼리를 통해 생성, 수정, 삭제할 수 있으며, 다른 테이블과 JOIN을 사용하여 관련 데이터를 가져올 수도 있습니다.


GROUP BY

SQL에서 `GROUP BY` 절은 특정 열(들)을 기준으로 데이터를 그룹화하고, 그룹별로 집계 함수를 적용하여 결과를 반환하는 데 사용됩니다. 집계 함수에는 `SUM`, `COUNT`, `AVG`, `MIN`, `MAX` 등이 포함됩니다.

예를 들어, 다음과 같은 `sales` 테이블이 있다고 가정해 보겠습니다.

 product_id sale_date quantity
1 2023-01-01 5
1 2023-01-02 3
2 2023-01-01 7
2 2023-01-03 2
3 2023-01-01 8


각 제품별로 총 판매량을 계산하려면 다음과 같이 `GROUP BY` 절을 사용할 수 있습니다.

SELECT product_id, SUM(quantity) as total_sales
FROM sales
GROUP BY product_id;


이 쿼리의 결과는 다음과 같습니다.

product_id total_sales
1 8
2 9
3 8

`GROUP BY` 절은 여러 열을 그룹화하는 데도 사용할 수 있습니다. 예를 들어, 제품별로 월별 판매량을 계산하려면 다음과 같이 작성할 수 있습니다.

SELECT product_id, EXTRACT(MONTH FROM sale_date) as sale_month, SUM(quantity) as total_sales
FROM sales
GROUP BY product_id, sale_month;

 

이 예제에서는 `EXTRACT` 함수를 사용하여 `sale_date`에서 월 정보를 추출하고, 그룹화에 사용했습니다.


HAVING

`HAVING` 절은 `GROUP BY` 절과 함께 사용되며, 그룹화된 결과에 대해 조건을 적용하여 필터링할 때 사용됩니다. 일반적으로 `HAVING` 절은 `GROUP BY` 절 다음에 위치하며, 집계 함수를 포함한 조건을 지정할 수 있습니다.

다음은 `sales` 테이블을 이용한 예시입니다.

 product_id sale_date quantity
1 2023-01-01 5
1 2023-01-02 3
2 2023-01-01 7
2 2023-01-03 2
3 2023-01-01 8


제품별로 총 판매량이 7개 이상인 경우만 조회하려면 `GROUP BY` 절과 `HAVING` 절을 함께 사용하면 됩니다.

SELECT product_id, SUM(quantity) as total_sales
FROM sales
GROUP BY product_id
HAVING total_sales >= 7;


이 쿼리의 결과는 다음과 같습니다.

product_id total_sales
2 9
3 8


여기서 `HAVING` 절은 그룹화된 결과에서 `total_sales`가 7 이상인 것만 선택하도록 지정하고 있습니다. `HAVING` 절에 집계 함수를 직접 사용하는 것도 가능합니다.

SELECT product_id, SUM(quantity) as total_sales
FROM sales
GROUP BY product_id
HAVING SUM(quantity) >= 7;


이 예제에서도 동일한 결과가 반환됩니다.


ORDER BY

SQL의 "ORDER BY" 절은 하나 이상의 열을 기준으로 쿼리 결과를 오름차순 또는 내림차순으로 정렬하는 데 사용됩니다. 기본적으로 정렬은 오름차순으로 수행됩니다. 결과를 내림차순으로 정렬하려면 "DESC" 키워드를 사용할 수 있습니다. 예를 들어, 총 판매량이 7개 이상인 제품을 판매량 기준으로 내림차순 정렬하려면 다음과 같이 작성할 수 있습니다.

SELECT product_id, SUM(quantity) as total_sales
FROM sales
GROUP BY product_id
HAVING total_sales >= 7
ORDER BY total_sales DESC;


결과는 다음과 같습니다.

product_id total_sales
2 9
3 8

이 쿼리는 제품별로 그룹화하고(`GROUP BY`), 총 판매량이 7 이상인 것만 선택(`HAVING`)한 후, 총 판매량 기준으로 내림차순 정렬(`ORDER BY`)합니다.

`HAVING` 절에 직접 집계 함수를 사용하는 경우에도 `ORDER BY` 절을 추가할 수 있습니다.
SELECT product_id, SUM(quantity) as total_sales
FROM sales
GROUP BY product_id
HAVING SUM(quantity) >= 7
ORDER BY total_sales DESC;

이 예제에서도 동일한 결과가 반환됩니다.

테이블 관련 명령어

SQL에서 테이블을 관리하는 주요 작업은 테이블 생성, 수정, 삭제입니다. 아래에서 각 작업에 대한 설명과 예시를 제공하겠습니다.

1. 테이블 생성 (CREATE TABLE):
테이블을 생성하려면 CREATE TABLE 문을 사용하고, 열 이름과 데이터 유형을 지정해야 합니다. 기본 키와 외래 키 등의 제약 조건도 추가할 수 있습니다.

예시:

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    email VARCHAR(100) UNIQUE,
    hire_date DATE
);


2. 테이블 수정 (ALTER TABLE):
테이블을 수정하려면 ALTER TABLE 문을 사용하고, 열을 추가, 삭제 또는 수정할 수 있습니다. 제약 조건도 변경할 수 있습니다.

예시 1(열 추가):

ALTER TABLE employees
ADD phone_number VARCHAR(20);


예시 2(열 수정):

ALTER TABLE employees
MODIFY email VARCHAR(150) UNIQUE;


예시 3(열 삭제):

ALTER TABLE employees
DROP COLUMN phone_number;


3. 테이블 삭제 (DROP TABLE):
테이블을 삭제하려면 DROP TABLE 문을 사용합니다. 이 작업은 되돌릴 수 없으므로 주의하세요.

예시:

DROP TABLE employees;


이러한 명령은 데이터베이스 관리 시스템(DBMS)에서 테이블 구조를 관리할 수 있게 해줍니다. 어떤 작업을 수행할지 결정할 때에는 데이터 요구 사항과 목표를 고려해야 합니다.


테이블에 정보 입력하기

SQL에서 검색 결과를 기존 테이블에 입력하거나 새로운 테이블을 생성하며 입력하는 방법은 다음과 같습니다.

1. 기존 테이블에 검색 결과를 입력하기 (INSERT INTO SELECT):
INSERT INTO SELECT 문을 사용하여 검색 결과를 기존 테이블에 추가할 수 있습니다. 이 방법을 사용하려면 원본 테이블에서 검색된 열과 대상 테이블의 열이 일치해야 합니다.

예시:

INSERT INTO target_table (column1, column2, column3)
SELECT column1, column2, column3
FROM source_table
WHERE condition;


2. 새로운 테이블을 생성하며 검색 결과를 입력하기 (CREATE TABLE AS SELECT):
CREATE TABLE AS SELECT 문을 사용하여 검색 결과를 새 테이블에 입력할 수 있습니다. 이 작업은 원본 테이블에서 검색된 데이터를 기반으로 새로운 테이블을 생성하며, 구조와 인덱스는 복사되지 않습니다.

예시:

CREATE TABLE new_table
AS
SELECT column1, column2, column3
FROM source_table
WHERE condition;


이러한 방법을 사용하여 SQL 쿼리를 기반으로 기존 테이블에 데이터를 추가하거나 새 테이블을 생성할 수 있습니다. 어떤 방법을 사용할지는 요구 사항과 목표에 따라 결정하게 됩니다.

반응형