SQL 쿼리 핵심 정리
정리. 수알치 오상문
[ 목차 ]
- select
- as
- where
- group by
- order by
- join ... on
- function
- SELECT
SQL의 SELECT 문은 데이터베이스에서 데이터를 검색하는 데 사용됩니다.
1. 기본 SELECT 문
SELECT column1, column2, ...
FROM table_name;
column1, column2, ...: 선택할 열 이름
table_name: 데이터를 가져올 테이블 이름
아래는 users 테이블에서 name과 age 열을 선택하는 쿼리입니다.
SELECT name, age
FROM users;
2. 모든 열 선택
*를 사용하면 테이블의 모든 열을 선택합니다.
SELECT *
FROM table_name;
아래는 users 테이블의 모든 열을 선택하는 쿼리입니다.
SELECT *
FROM users;
3. 중복 제거
DISTINCT 키워드를 사용하면 중복된 행을 제거하고 고유한 값만 반환합니다.
SELECT DISTINCT column1, column2, ...
FROM table_name;
아래는 users 테이블에서 중복된 age 값을 제거하고 고유한 age 값만 선택하는 쿼리입니다.
SELECT DISTINCT age
FROM users;
4. 조건부 선택 (WHERE 절)
WHERE 절을 사용하면 특정 조건을 만족하는 행만 선택할 수 있습니다.
SELECT column1, column2, ...
FROM table_name
WHERE condition;
아래는 users 테이블에서 age가 25 이상인 사용자 이름과 이메일을 선택하는 쿼리입니다.
SELECT name, email
FROM users
WHERE age >= 25;
5. 정렬 (ORDER BY 절)
ORDER BY 절을 사용하면 특정 열을 기준으로 결과를 정렬할 수 있습니다. ASC는 오름차순 (기본값), DESC는 내림차순 정렬을 의미합니다.
SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC|DESC];
아래는 users 테이블에서 age를 기준으로 내림차순으로 정렬하여 이름과 나이를 선택하는 쿼리입니다.
SELECT name, age
FROM users
ORDER BY age DESC;
6. 별칭 (AS)
AS 키워드를 사용하면 열 이름에 별칭을 부여하여 결과를 더 읽기 쉽게 만들 수 있습니다.
SELECT column1 AS alias1, column2 AS alias2, ...
FROM table_name;
아래는 users 테이블에서 name 열을 이름으로, age 열을 나이로 별칭을 부여하여 선택하는 쿼리입니다.
SELECT name AS 이름, age AS 나이
FROM users;
7. LIMIT
LIMIT 키워드를 사용하면 반환되는 행의 개수를 제한할 수 있습니다.
SELECT column1, column2, ...
FROM table_name
LIMIT number;
아래는 users 테이블에서 처음 10명의 사용자의 이름과 나이를 선택하는 쿼리입니다.
SELECT name, age
FROM users
LIMIT 10;
SELECT 문은 SQL 쿼리에서 가장 기본적인 문법이며, 다양한 옵션과 함께 사용하여 원하는 데이터를 효율적으로 검색할 수 있습니다. 단, 데이터베이스 시스템에 따라 지원하는 기능과 문법이 다를 수 있습니다.
- AS
쿼리에서 AS는 열이나 테이블에 별칭을 부여하는 데 사용됩니다. AS를 사용하면 쿼리 결과를 더 읽기 쉽게 만들거나, 복잡한 쿼리에서 임시 이름을 사용할 수 있습니다.
1. 열 별칭 (Column Alias)
목적: 쿼리 결과로 반환되는 열의 이름을 변경합니다.
사용법: SELECT column_name AS alias_name FROM table_name;
SELECT
first_name AS 이름,
last_name AS 성
FROM employees;
employees 테이블에서 first_name 열을 "이름"으로, last_name 열을 "성"으로 바꿔서 결과를 반환합니다.
2. 테이블 별칭 (Table Alias)
목적: 복잡한 쿼리에서 테이블 이름을 간략하게 표현합니다.
사용법: SELECT ... FROM table_name AS alias_name;
예제:
SELECT
e.first_name,
d.department_name
FROM employees AS e
JOIN departments AS d ON e.department_id = d.department_id;
employees 테이블에 "e"라는 별칭을, departments 테이블에 "d"라는 별칭을 부여했습니다.
이렇게 하면 테이블 이름을 간략하게 사용할 수 있어 코드가 더 간결해집니다.
3. 주의
별칭은 쿼리 결과에서만 유효하며, 실제 테이블이나 열 이름은 변경되지 않습니다.
별칭에 공백이나 특수 문자를 포함하려면 따옴표로 묶어야 합니다.
예: SELECT first_name AS "이 름" FROM employees;
- WHERE
SQL의 WHERE 절은 SELECT, UPDATE, DELETE 문에서 특정 조건을 만족하는 행만 선택하거나 수정하는 데 사용됩니다.
WHERE 절은 SQL 쿼리에서 매우 중요한 부분이며, 다양한 조건과 연산자를 활용하여 원하는 데이터를 효율적으로 검색하고 수정할 수 있습니다.
데이터베이스 시스템에 따라 지원하는 연산자와 함수 종류가 다를 수 있습니다.
1. SELECT 문에서의 WHERE 절
users 테이블에서 age가 25 이상인 사용자의 이름과 이메일을 검색하는 쿼리입니다.
SELECT name, email
FROM users
WHERE age >= 25;
2. UPDATE 문에서의 WHERE 절
users 테이블에서 id가 10인 사용자의 age를 30으로 변경하는 쿼리입니다.
UPDATE users
SET age = 30
WHERE id = 10;
3. DELETE 문에서의 WHERE 절
users 테이블에서 age가 20 미만인 사용자를 삭제하는 쿼리입니다.
DELETE FROM users
WHERE age < 20;
4. WHERE 절과 함께 사용 가능한 연산자
= (같음)
!= 또는 <> (같지 않음)
> (크다)
< (작다)
>= (크거나 같음)
<= (작거나 같음)
BETWEEN a AND b (a와 b 사이의 값)
LIKE (패턴 일치)
IN (값 목록 중 하나)
IS NULL (NULL 값)
5. WHERE 절과 함께 사용 가능한 논리 연산자
AND (모든 조건이 참일 때)
OR (하나 이상의 조건이 참일 때)
NOT (조건이 거짓일 때)
6. 복합 조건 예제
users 테이블에서 age가 20대이고 city가 'Seoul'인 사용자를 검색하는 쿼리입니다.
SELECT *
FROM users
WHERE age BETWEEN 20 AND 29
AND city = 'Seoul';
7. LIKE 연산자 예제
users 테이블에서 name이 '김'으로 시작하는 사용자를 검색하는 쿼리입니다.
SELECT *
FROM users
WHERE name LIKE '김%';
- GROUP BY
SQL에서 GROUP BY는 데이터를 특정 기준에 따라 그룹화하고, 각 그룹에 대한 집계 함수(예: COUNT, SUM, AVG 등)를 적용하여 결과를 요약하는 데 사용됩니다.
SELECT department_id, COUNT(*) AS 직원_수
FROM employees
GROUP BY department_id;
employees 테이블에서 department_id를 기준으로 데이터를 그룹화합니다.
각 그룹별로 직원 수를 계산하여 "직원_수"라는 별칭으로 보여줍니다.
SQL
SELECT department_id, AVG(salary) AS 평균_연봉
FROM employees
WHERE hire_date >= '2023-01-01'
GROUP BY department_id
HAVING AVG(salary) > 5000;
employees 테이블에서 hire_date가 2023년 1월 1일 이후인 직원들을 대상으로 합니다.
department_id를 기준으로 그룹화하여 각 부서별 평균 연봉을 계산합니다.
평균 연봉이 5000 이상인 부서만 결과를 보여줍니다. (HAVING 절 사용)
GROUP BY 절은 WHERE 절 뒤에, HAVING 절 앞에 위치합니다.
HAVING 절은 GROUP BY 절과 함께 사용되며, 그룹에 대한 조건을 지정합니다.
부서별로 그룹으로 하고 가장 입사일이 빠른 순서로 정렬
SELECT department_id, MIN(hire_date) AS earliest_hire_date
FROM employees
GROUP BY department_id
ORDER BY earliest_hire_date;
SELECT department_id, MIN(hire_date) AS earliest_hire_date: 부서 ID와 각 부서의 가장 빠른 입사일을 선택합니다. MIN(hire_date)는 가장 빠른 입사일을 찾아줍니다.
ORDER BY earliest_hire_date: earliest_hire_date (가장 빠른 입사일)를 기준으로 결과를 오름차순으로 정렬합니다.
이 쿼리는 각 부서별로 가장 먼저 입사한 직원의 입사일을 보여줍니다.
만약 가장 먼저 입사한 직원의 모든 정보를 알고 싶다면, 추가적인 조인이나 서브쿼리를 사용해야 합니다.
- ORDER BY
SQL의 ORDER BY 절은 SELECT 문의 결과를 특정 열을 기준으로 정렬하는 데 사용됩니다. 데이터를 오름차순(기본값) 또는 내림차순으로 정렬할 수 있습니다.
SELECT 열1, 열2, ...
FROM 테이블명
ORDER BY 열 이름 [ASC|DESC];
열 이름: 정렬 기준으로 사용할 열 이름
ASC: 오름차순 정렬 (기본값)
DESC: 내림차순 정렬
예제 1: 단일 열 정렬 (오름차순)
users 테이블에서 age 열을 기준으로 오름차순으로 정렬된 결과를 반환합니다.
SELECT id, name, age
FROM users
ORDER BY age;
예제 2: 단일 열 정렬 (내림차순)
users 테이블에서 age 열을 기준으로 내림차순으로 정렬된 결과를 반환합니다.
SELECT id, name, age
FROM users
ORDER BY age DESC;
예제 3: 여러 열 정렬
users 테이블에서 city 열을 기준으로 오름차순 정렬하고, 같은 city 내에서는 age 열을 기준으로 내림차순 정렬된 결과를 반환합니다.
SELECT id, name, age, city
FROM users
ORDER BY city ASC, age DESC;
예제 4: SELECT 목록에 없는 열로 정렬
users 테이블에서 id 열을 기준으로 정렬된 결과를 반환합니다. id 열은 SELECT 목록에 없지만 ORDER BY 절에서 사용할 수 있습니다.
SELECT name, age
FROM users
ORDER BY id;
ORDER BY 절은 SELECT 문의 마지막에 위치합니다.
여러 열을 기준으로 정렬할 때, 먼저 지정한 열이 우선 순위를 가집니다.
- JOIN ... ON
SQL JOIN은 두 개 이상의 테이블을 결합하여 데이터를 검색하는 데 사용됩니다. JOIN의 종류에는 INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN 등이 있습니다.
1. INNER JOIN
두 테이블 모두에서 일치하는 값을 가진 행만 반환합니다. 기본 조인 방식입니다.
SELECT *
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;
2. LEFT JOIN
왼쪽 테이블의 모든 행과 오른쪽 테이블에서 일치하는 행을 반환합니다. 오른쪽 테이블에 일치하는 행이 없으면 NULL 값을 반환합니다.
SELECT *
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id;
3. RIGHT JOIN
오른쪽 테이블의 모든 행과 왼쪽 테이블에서 일치하는 행을 반환합니다. 왼쪽 테이블에 일치하는 행이 없으면 NULL 값을 반환합니다.
SELECT *
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.id;
4. FULL OUTER JOIN
두 테이블의 모든 행을 반환합니다. 일치하는 행이 없으면 NULL 값을 반환합니다.
SELECT *
FROM employees
FULL OUTER JOIN departments ON employees.department_id = departments.id;
5. 추가 예제
SELECT e.name AS employee_name, d.name AS department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.id
WHERE d.location = 'New York';
employees 테이블과 departments 테이블을 department_id를 기준으로 INNER JOIN하고, departments 테이블의 location이 'New York'인 행만 반환합니다.
참고
JOIN은 WHERE 절과 함께 사용하여 조건을 추가할 수 있습니다.
- Function (Built-in Functions and User-defined Function)
SQL 함수는 특정 작업을 수행하고 결과를 반환하는 코드 블록입니다. 함수는 내장 함수와 사용자 정의 함수로 나눌 수 있습니다.
1. 내장 함수 (Built-in Functions)
SQL 언어 자체에서 제공하는 함수로, 문자열 처리, 숫자 계산, 날짜/시간 처리 등 다양한 기능을 수행합니다.
1.1. 문자열 함수
UPPER(string): 문자열을 대문자로 변환합니다.
LOWER(string): 문자열을 소문자로 변환합니다.
LENGTH(string): 문자열의 길이를 반환합니다.
SUBSTRING(string, start, length): 문자열의 일부분을 추출합니다.
CONCAT(string1, string2): 두 문자열을 연결합니다.
SELECT UPPER('hello world'); -- HELLO WORLD 출력
SELECT LENGTH('sql function'); -- 12 출력
SELECT SUBSTRING('database', 5, 4); -- base 출력
1.2. 숫자 함수
ROUND(number, decimals): 숫자를 지정된 소수점 자릿수로 반올림합니다.
TRUNCATE(number, decimals): 숫자를 지정된 소수점 자릿수로 자릅니다.
ABS(number): 숫자의 절댓값을 반환합니다.
SQRT(number): 숫자의 제곱근을 반환합니다.
RAND(): 0과 1 사이의 난수를 생성합니다.
SELECT ROUND(3.14159, 2); -- 3.14 출력
SELECT TRUNCATE(3.14159, 2); -- 3.14 출력
SELECT ABS(-10); -- 10 출력
1.3. 날짜/시간 함수
NOW(): 현재 날짜와 시간을 반환합니다.
DATE(datetime): 날짜/시간 값에서 날짜 부분만 추출합니다.
TIME(datetime): 날짜/시간 값에서 시간 부분만 추출합니다.
YEAR(datetime): 날짜/시간 값에서 연도 부분을 추출합니다.
MONTH(datetime): 날짜/시간 값에서 월 부분을 추출합니다.
SELECT NOW(); -- 현재 날짜 및 시간 출력
SELECT DATE('2023-10-26 12:30:00'); -- 2023-10-26 출력
SELECT YEAR('2023-10-26 12:30:00'); -- 2023 출력
2. 사용자 정의 함수 (User-defined Functions)
사용자가 직접 정의하는 함수로, 특정 작업을 수행하는 코드를 포함합니다. 사용자 정의 함수는 SQL 문 내에서 호출하여 사용할 수 있습니다. 단, 데이터베이스 시스템에 따라 사용자 정의 함수를 만드는 방법과 문법이 다를 수 있습니다.
-- 두 숫자를 더하는 함수
CREATE FUNCTION add(a INT, b INT)
RETURNS INT DETERMINISTIC
BEGIN
DECLARE sum INT;
SET sum = a + b;
RETURN sum;
END;
-- 함수 호출
SELECT add(5, 3); -- 8 출력
'DBMS,데이터베이스' 카테고리의 다른 글
PostgreSQL, AI 시대에도 강력한 이유는? 벡터 DB, 하이브리드 DB (0) | 2025.02.15 |
---|---|
ERwin 7.3 평가판 무료 다운로드 및 설치 (0) | 2024.08.04 |
SQLite 데이터베이스는 99.9%의 웹사이트에 완벽하다 (0) | 2024.05.18 |
데이터베이스 ACID (0) | 2023.12.10 |
SQLAlchemy ORM에서 DBMS 현재 시간 가져오기 (0) | 2023.08.11 |