SQL 쿼리는 각 부서별로 급여 순위를 매기는 쿼리입니다. 각 부서 내에서 급여가 높은 직원 순으로 순위를 계산하고, 급여가 NULL인 직원은 마지막에 배치되도록 처리합니다.

 

SQL 부서의 급여 순위 NULL LAST : 

SELECT 
    department,
    employee_name,
    salary,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC NULLS LAST) AS rank --설명 ●
FROM 
    employees;

 

  • ROW_NUMBER(): 각 행에 고유한 순차적인 번호를 부여합니다. 동점이 있더라도 건너뛰지 않고 순차적으로 번호를 매깁니다.
  • OVER: 이 함수가 윈도우 함수임을 나타내며, PARTITION BY와 ORDER BY 절을 통해 계산 방식을 지정합니다.
  • PARTITION BY department: department별로 데이터를 그룹화합니다. 즉, 각 부서별로 ROW_NUMBER()가 별도로 계산됩니다.
  • ORDER BY salary DESC: salary를 기준으로 내림차순 정렬합니다. 즉, 급여가 높은 순서대로 번호를 매깁니다.
  • NULLS LAST: NULL 값이 있는 경우, 정렬 시 NULL을 마지막에 배치하도록 합니다. 이는 salary가 NULL인 경우 해당 행이 가장 낮은 순위(가장 나중에)로 처리되도록 합니다.

예시 데이터 

HR John 4000
HR Alice 3500
HR Bob NULL
IT Charlie 5000
IT Eve 4500
IT David 6000

실행 결과

HR John 4000 1
HR Alice 3500 2
HR Bob NULL 3
IT David 6000 1
IT Charlie 5000 2
IT Eve 4500 3

 

 

 

tables :

all_tables 현재 사용자가 접근할 수 있는 모든 테이블에 대한 정보를 제공합니다. 테이블 이름, 소유자, 테이블 공간 등이 포함됩니다.
user_tables 현재 사용자가 소유한 모든 테이블에 대한 정보를 제공합니다. 테이블 이름, 테이블 공간, 파티션 정보 등이 포함됩니다.
dba_tables 데이터베이스 내의 모든 테이블에 대한 정보를 제공합니다. 테이블 이름, 소유자, 테이블 공간 등이 포함됩니다.
all_tab_columns 현재 사용자가 접근할 수 있는 모든 테이블의 열(컬럼)에 대한 정보를 제공합니다. 컬럼 이름, 데이터 타입, NULL 허용 여부 등이 포함됩니다.
user_tab_columns 현재 사용자가 소유한 테이블의 열에 대한 정보를 제공합니다. 컬럼 이름, 데이터 타입, 기본값, NULL 허용 여부 등이 포함됩니다.
dba_tab_columns 데이터베이스 내의 모든 테이블의 열에 대한 정보를 제공합니다. 컬럼 이름, 데이터 타입, NULL 허용 여부 등이 포함됩니다.
all_views 현재 사용자가 접근할 수 있는 모든 뷰에 대한 정보를 제공합니다. 뷰 이름, 소유자, 정의된 텍스트 등이 포함됩니다.
user_views 현재 사용자가 소유한 모든 뷰에 대한 정보를 제공합니다. 뷰 이름, 정의된 텍스트 등이 포함됩니다.
dba_views 데이터베이스 내의 모든 뷰에 대한 정보를 제공합니다. 뷰 이름, 소유자, 정의된 텍스트 등이 포함됩니다.
all_schemas 현재 사용자가 접근할 수 있는 모든 스키마에 대한 정보를 제공합니다. 스키마의 이름, 소유자 등이 포함됩니다.
user_schemas 현재 사용자가 소유한 스키마에 대한 정보를 제공합니다. 스키마의 이름, 소유자 등이 포함됩니다.
dba_schemas 데이터베이스 내의 모든 스키마에 대한 정보를 제공합니다. 스키마의 이름, 소유자 등이 포함됩니다.
all_constraints 현재 사용자가 접근할 수 있는 테이블의 제약 조건에 대한 정보를 제공합니다. 제약 조건의 이름, 유형, 적용된 테이블 등이 포함됩니다.
user_constraints 현재 사용자가 소유한 테이블의 제약 조건에 대한 정보를 제공합니다. 제약 조건의 이름, 유형, 적용된 테이블 등이 포함됩니다.
dba_constraints 데이터베이스 내의 모든 테이블의 제약 조건에 대한 정보를 제공합니다. 제약 조건의 이름, 유형, 적용된 테이블 등이 포함됩니다.
all_triggers 현재 사용자가 접근할 수 있는 트리거에 대한 정보를 제공합니다. 트리거 이름, 테이블 이름, 상태 등이 포함됩니다.
user_triggers 현재 사용자가 소유한 트리거에 대한 정보를 제공합니다. 트리거 이름, 테이블 이름, 상태 등이 포함됩니다.
dba_triggers 데이터베이스 내의 모든 트리거에 대한 정보를 제공합니다. 트리거 이름, 테이블 이름, 상태 등이 포함됩니다.
all_sequences 현재 사용자가 접근할 수 있는 시퀀스에 대한 정보를 제공합니다. 시퀀스 이름, 현재 값, 증가 값 등이 포함됩니다.
user_sequences 현재 사용자가 소유한 시퀀스에 대한 정보를 제공합니다. 시퀀스 이름, 현재 값, 증가 값 등이 포함됩니다.
dba_sequences 데이터베이스 내의 모든 시퀀스에 대한 정보를 제공합니다. 시퀀스 이름, 현재 값, 증가 값 등이 포함됩니다.
all_indexes 현재 사용자가 접근할 수 있는 인덱스에 대한 정보를 제공합니다. 인덱스 이름, 테이블 이름, 유니크 여부 등이 포함됩니다.
user_indexes 현재 사용자가 소유한 인덱스에 대한 정보를 제공합니다. 인덱스 이름, 테이블 이름, 유니크 여부 등이 포함됩니다.
dba_indexes 데이터베이스 내의 모든 인덱스에 대한 정보를 제공합니다. 인덱스 이름, 테이블 이름, 유니크 여부 등이 포함됩니다.
all_users 데이터베이스 내의 모든 사용자에 대한 정보를 제공합니다. 사용자 이름, 계정 상태, 기본 테이블 공간 등이 포함됩니다.
dba_users 데이터베이스 내의 모든 사용자에 대한 정보를 제공합니다. 사용자 이름, 계정 상태, 기본 테이블 공간 등이 포함됩니다.

Oracle Database에서 ALL_, USER_, DBA_ 뷰들은 데이터베이스 메타데이터에 접근하기 위한 강력한 도구입니다. 각각의 뷰는 사용자가 접근할 수 있는 정보의 범위에 따라 ALL_ (접근 가능), USER_ (사용자 소유), DBA_ (관리자 전체)로 구분됩니다.

1. 인덱스 생성

기본 : 기본 인덱스는 하나의 열에 대한 인덱스입니다. 데이터베이스에서 CREATE INDEX 문을 사용하여

생성할 수 있습니다.

복합 : 복합 인덱스는 두 개 이상의 열에 대한 인덱스입니다. 복합 인덱스는 여러 열에 대해 쿼리를 최적화하는 데

유용합니다.

유니크 인덱스 : 유니크 인덱스는 인덱스가 설정된 열의 값이 중복되지 않도록 보장합니다.

프라이머리 키 : 프라이머리 키는 기본적으로 유니크 인덱스입니다. 테이블의 기본 키를 정의하면 자동으로 유니크 인덱스가 생성됩니다.

 

2. 인덱스 생성 및 관리 예제

다음은 실제 데이터베이스에서 인덱스를 생성하고 관리하는 예제입니다.

-- 테이블 생성
CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    department VARCHAR(50),
    salary DECIMAL(10, 2)
);

-- 단일 열 인덱스 생성
CREATE INDEX idx_department ON employees (department);

-- 복합 인덱스 생성
CREATE INDEX idx_name_salary ON employees (name, salary);

-- 유니크 인덱스 생성
CREATE UNIQUE INDEX idx_unique_name ON employees (name);

-- 인덱스 삭제
DROP INDEX idx_department ON employees;

 

3. 요약

  • 단일 열 인덱스: 하나의 열에 대한 인덱스입니다.
  • 복합 인덱스: 두 개 이상의 열에 대한 인덱스입니다.
  • 유니크 인덱스: 열의 값이 중복되지 않도록 보장합니다.
  • 클러스터드 인덱스: 기본 키가 클러스터드 인덱스 역할을 합니다.
  • 인덱스 삭제: 필요하지 않은 인덱스는 삭제할 수 있습니다.

인덱스는 쿼리 성능을 크게 향상시킬 수 있지만, 데이터베이스의 삽입, 업데이트, 삭제 작업에 영향을 미칠 수 있으므로 신중하게 설계하고 관리해야 합니다.

'DBMS > mysql' 카테고리의 다른 글

Mysql auto_increment와 primary key 설정  (0) 2024.08.10
Mysql 백틱(``)  (0) 2024.08.10

1. 기존 칼럼 id를 AUTO_INCREMENT와 기본 키로 설정 (테이블 이름이 변경된 후)

ALTER TABLE `mytable` MODIFY `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY;

 

2. 기존 기본 키 칼럼 id에 AUTO_INCREMENT 추가 (테이블 이름이 변경된 후)

ALTER TABLE `mytable` MODIFY `id` INT NOT NULL AUTO_INCREMENT;

 

3. 새로운 칼럼 new_id를 추가하고 AUTO_INCREMENT와 기본 키 설정 (테이블 이름이 변경된 후)

ALTER TABLE `mytable` ADD COLUMN `new_id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;

 

 

 

설명:

  • ADD COLUMN: 새로운 칼럼을 테이블에 추가합니다.
  • AUTO_INCREMENT: 새 칼럼에 자동 증가 속성을 설정합니다.
  • PRIMARY KEY: 새 칼럼을 기본 키로 설정합니다.
  • FIRST: 새 칼럼을 테이블의 첫 번째 위치로 이동시킵니다. 이 옵션은 선택적입니다.

'DBMS > mysql' 카테고리의 다른 글

Mysql Index 인덱스 생성 및 관리  (0) 2024.08.10
Mysql 백틱(``)  (0) 2024.08.10

예약어 및 특수 문자 사용 방지:

  • SQL에서 예약어나 특수 문자가 포함된 열 이름, 테이블 이름 등을 사용할 때 백틱을 사용하여 구문 오류를 방지할 수 있습니다. 예를 들어, my_table라는 이름의 테이블을 생성하려면 다음과 같이 백틱을 사용합니다.

백틱 사용 예

  1. 테이블 및 열 생성:
    • 백틱을 사용하여 테이블과 열을 정의할 때:
CREATE TABLE `my_table` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(100)
);

 

   2. 쿼리에서 백틱 사용:

  • 데이터 조회 및 조작 시 백틱을 사용하여 테이블 및 열 이름을 감쌉니다:
  • 예약어를 테이블이나 열 이름으로 사용할 때 백틱을 사용합니다.
SELECT `id`, `name` FROM `my_table` WHERE `id` = 1;

 

다른 데이터베이스 시스템에서의 차이점

  • MySQL: 백틱을 사용하여 식별자를 감쌉니다.
  • PostgreSQL: 백틱 대신 큰따옴표(")를 사용합니다.
  • SQL Server: 대괄호([])를 사용하여 식별자를 감쌉니다.
--mysql 

CREATE TABLE `my_table` (
    `column1` INT,
    `column2` VARCHAR(50)
);

--postgresql

CREATE TABLE "my_table" (
    "column1" INT,
    "column2" VARCHAR(50)
);

-- sqlserver

CREATE TABLE [my_table] (
    [column1] INT,
    [column2] VARCHAR(50)
);

 

'DBMS > mysql' 카테고리의 다른 글

Mysql Index 인덱스 생성 및 관리  (0) 2024.08.10
Mysql auto_increment와 primary key 설정  (0) 2024.08.10

+ Recent posts