✉️ 모든 문제 및 내용의 출처는 수제비 정보처리기사 실기 교재에 있습니다.
이름 | 나이 | 성별 | 주소 |
---|---|---|---|
홍길동 | 20 | 남 | 경기도 |
임꺽정 | 59 | 남 | 전라도 |
유관순 | 35 | 여 | 경상도 |
나혜석 | 41 | 여 | 충청도 |
이순신 | 33 | 남 | 강원도 |
SELECT 이름 FROM 고객
WHERE 나이 BETWEEN 50 AND 59
AND 성별 = '남';
CREATE TABLE 테이블명
(
컬럼명 데이터타입 PRIMARY KEY, -- 기본키 설정
컬럼명 데이터타입 FOREIGN KEY REFERENCES 참조테이블(기본키), -- 외래키 설정
컬럼명 데이터타입 UNIQUE,
컬럼명 데이터타입 NOT NULL,
컬럼명 데이터타입 CHECK(조건식) -- 제약 조건 설정
컬럼명 데이터타입 DEFAULT 값
);
-- 실제 예시
CREATE TABLE Employees
(
EmployeeID INT PRIMARY KEY,
DepartmentID INT FOREIGN KEY REFERENCES Departments(DepartmentID),
FirstName VARCHAR(50) NOT NULL,
LastName VARCHAR(50) NOT NULL,
Email VARCHAR(100) UNIQUE,
Salary DECIMAL(10,2) CHECK(Salary >= 0),
HireDate DATE DEFAULT GETDATE()
);
- EmployeeID
- INT 데이터 유형으로 기본 키로 설정
- DepartmentID
- INT 데이터 유형으로 외래 키로 설정
- Departments 테이블의 DepartmentID를 참조함.
- FirstName, LastName
- 각각 최대 길이가 50인 VARCHAR 데이터 유형으로 설정되며 NOT NULL 제약 조건이 적용됨.
- Email
- 최대 길이가 100인 VARCHAR 데이터 유형으로 설정, 고유해야함(UNIQUE 제약 조건).
- Salary
- 최대 10자리의 숫자
- 소수점 둘째 자리까지 포함하는 DECIMAL 데이터 유형으로 설정
- Salary가 0보다 작을 수 없도록 CHECK 제약 조건이 적용됨
- HireDate
- DATE 데이터 유형으로 설정
- GETDATE() 함수를 사용하여 현재 날짜를 기본값으로 설정
CREATE TABLE 사람
(
이름 VARCHAR(10)
성별 CHAR(1) CHECK(성별='M' OR 성별='F)
);
-- BirthDate 컬럼은 DATE 데이터 유형으로 설정되며 NOT NULL 제약 조건 적용
ALTER TABLE Employees ADD BirthDate DATE NOT NULL;
-- 사원 테이블에 VARCHAR(11) 타입으로 전화번호라는 컬럼을 추가한다면?
ALTER TABLE 사원 ADD 전화번호 VARCHAR(11);
이름 | 전공 | 생년월일 |
---|---|---|
이완용 | 일본어학과 | 580607 |
박영효 | 일본어학과 | 610612 |
기철 | 몽골어학과 | 840101 |
안중근 | 국문학과 | 790902 |
SELECT DISTINCT 전공 FROM 학생;
이름 | 전공 | 학번 |
---|---|---|
이완용 | 일본어학과 | 580607 |
박영효 | 일본어학과 | 610612 |
기철 | 몽골어학과 | 840101 |
안중근 | 국문학과 | 790902 |
SELECT 학번 FROM 학생
WHERE 이름 LIKE '이%';
SELECT 주소 FROM 학생 WHERE 주소 IS NOT NULL;
CREATE VIEW 사원뷰 AS -- CREATE VIEW 뷰이름 AS
SELECT 사번,이름 FROM 사원 -- [조회쿼리];
WHERE 성별 = 'M';
다음은 테이블 및 컬럼명에 대한 명세이다.
사원명이 홍길동, 나이가 24, 급여가 300인 직원을 직원 테이블에 삽입하는 쿼리
- 테이블명 : EMPLOYEE(직원 테이블)
- 칼럼명 : NAME(사원명), AGE(나이), SALARY(급여)
INSERT INTO EMPLOYEE(NAME, AGE, SALARY)
VALUES('홍길동', 24, 300);
조인 조건으로 ON을 사용
예시) [학생정보] 테이블과 [학과정보] 테이블을 조인하려고 한다. 밑줄 친 곳을 채워 알맞은 쿼리를 작성하시오.
SELECT A.칼럼1, A.칼럼2, ..., B.칼럼1, B.칼럼2, ...
FROM 테이블1 A [INNER] JOIN 테이블2 B
ON 조인조건
[WHERE 검색조건];
SELECT A.칼럼1, A.칼럼2, ..., B.컬럼1, B.칼럼2, ...
FROM 테이블1 A LEFT [OUTER] JOIN 테이블2 B
ON 조인조건
[WHERE 검색조건];
-- 예시
다음과 같이 도서와 도서가격이라는 테이블이 있다.
책 번호 컬럼을 기준으로 Left Outher Join을 하여 [결과] 테이블과 같이 나오는 쿼리
[도서]
| 책번호 | 책명 |
| 111 | 운영체제 |
| 222 | 자료구조 |
| 555 | 컴퓨터구조 |
[도서가격]
| 책번호 | 가격 |
| 111 | 20,000 |
| 222 | 25,000 |
| 333 | 10,000 |
| 444 | 15,000 |
[결과]
| 책번호 | 책명 | 책번호 | 가격 |
| 111 | 운영체제 | 111 | 20,000 |
| 222 | 자료구조 | 222 | 25,000 |
| 555 | 컴퓨터구조 | NULL | NULL |
-- 답
SELECT A.책번호, A.책명, B.책번호, B.가격
FROM 도서 A LEFT JOIN 도서가격 B
ON A.책번호 = B.책번호;
SELECT A.칼럼1, A.칼럼2, ..., B.컬럼1, B.칼럼2, ...
FROM 테이블1 A RIGHT [OUTER] JOIN 테이블2 B
ON 조인조건
[WHERE 검색조건];
SELECT A.칼럼1, A.칼럼2, ..., B.컬럼1, B.칼럼2, ...
FROM 테이블1 A FULL [OUTER] JOIN 테이블2 B
ON 조인조건
[WHERE 검색조건];
SELECT 컬럼1, 컬럼2, ...
FROM 테이블1 CROSS JOIN 테이블2
같은 테이블을 조인하는 경우임!
같은 테이블명을 쓰고 별칭만 A, B와 같이 다르게 함.
검색 조건 추가 시 ➡️조인된 값에서 ➡️ 해당 조건에 맞는 결과만 출력되도록 설정
SELECT A.칼럼1, A.칼럼2, ..., B.칼럼1, B.칼럼2, ...
FROM 테이블1 A [INNER] JOIN 테이블1 B
ON 조인조건
[WHERE 검색조건];
관리자(DBA)가 사용자에게 데이터베이스에 대한 권한을 부여하는 명령어
GRANT 권한 ON 테이블 TO 사용자;
ex) 관리자가 사용자 장길산에게 '학생' 테이블에 대해 UPDATE 할 수 있는 권한 부여
GRANT UPDATE ON 학생 TO 장길산;
관리자(DBA)가 사용자에게 부여했던 권한을 회수하기 위한 명령어
REVOKE 권한 ON 테이블 FROM 사용자;
ex) 관리자가 사용자 장길산에게 '학생' 테이블에 대해 UPDATE 할 수 있는 권한을 회수
REVOKE UPDATE ON 학생 FROM 장길산;
오름차순 : ASC
내림차순 : DESC
# 21년 2회
# [학생] 테이블을 이용해 이름이 이로 시작하는 학생들에 대해 내림차순 정렬
SELECT * FROM 학생
WHERE 이름 LIKE DESC ORDER BY 이름 "이%";
# 22년 1회
# 점수에 대해 내림차순 하는 SQL
SELECT NAME, SCORE
FROM 성적
ORDER BY SCORE DESC;
# 성적 테이블의 이름, 과목, 성적을 성적순(내림차순)으로 출력하는 쿼리
#(성적 테이블의 칼럼은 이름, 과목, 성적 이 3개가 전부이니, *도 무방)
SELECT * FROM 성적
ORDER BY 성적 DESC;
데이터 조회 : 컬럼이 패턴에 포함된 경우 데이터 조회할 때 LIKE 문 사용
% : 0개 이상의 문자열과 일치
[] : 1개 이상의 문자열과 일치
[^] : 1개의 문자와 불일치
_ : 특정 위치의 1개의 문자와 일치
-- 예시)
-- '이'로 시작하는 사람 검색
WHERE 이름 LIKE '이%';
-- '이'로 끝나는 사람 검색
WHERE 이름 LIKE '%이';
-- '이'가 들어가는 사람 검색
WHERE 이름 LIKE '%이%';
-- '이'로 시작되고 '이' 뒤에 1글자만 있는 사람 검색
WHERE 이름 LIKE '이_';
-- '이'로 시작되고 '이' 뒤에 2글자만 있는 사람 검색
WHERE 이름 LIKE '이__';
-- '이*신'이라는 사람 검색
WHERE 이름 LIKE '이_신';
SELECT * FROM 학생
WHERE 이름 LIKE DESC ORDER BY 이름 "이%";
-----------------------------------------------------------------------------------
# % 사용
# 특정 문자열이 포함된 경우
SELECT * FROM 테이블명 WHERE 컬럼명 LIKE '%특정문자열%';
# 특정 패턴으로 시작하는 경우
SELECT * FROM 테이블명 WHERE 컬럼명 LIKE '특정패턴%';
# 특정 패턴으로 끝나는 경우
SELECT * FROM 테이블명 WHERE 컬럼명 LIKE '%특정패턴';
# 특정 패턴으로 시작하고 끝나는 경우
SELECT * FROM 테이블명 WHERE 컬럼명 LIKE '특정패턴%특정패턴';
# 특정 문자로 시작하거나 끝나는 경우
SELECT * FROM 테이블명 WHERE 컬럼명 LIKE '특정문자%' OR 컬럼명 LIKE '%특정문자';
-----------------------------------------------------------------------------------
# [ ] 사용
# 컬럼명이 'a', 'b', 'c' 중 하나와 일치하는 모든 데이터를 조회
SELECT * FROM 테이블명 WHERE 컬럼명 LIKE '[abc]';
-----------------------------------------------------------------------------------
# [^] 사용
# 컬럼값이 'axyz', 'aexyz', 'afxyz'와 같이 'a'로 시작하고
# 그 뒤에 'b', 'c', 'd' 중 어느 것도 오지 않는 모든 데이터를 조회
SELECT * FROM 테이블명 WHERE 컬럼명 LIKE 'a[^bcd]xyz%';
-----------------------------------------------------------------------------------
# _ 사용
# 컬럼값이 'a12xyz', 'aABxyz', 'a_#xyz'와 같이 'a'로 시작하고
# 그 다음 두 자리에 어떤 문자가 오든 상관 없는 모든 데이터를 조회
SELECT * FROM 테이블명 WHERE 컬럼명 LIKE 'a__xyz%';
조인 + 패턴에 포함된 데이터 조회 문제
SELECT COUNT(*) CNT FROM SOO CROSS JOIN JEBI
WHERE SOO.NAME LIKE JEBI.RULE;
SELECT 과목이름, MIN(점수) AS 최소점수, MAX(점수) AS 최대점수
GROUP BY 과목이름
HAVING AVG(점수) >= 90;
이름 | 과목 | 성적 |
---|---|---|
문무왕 | 프로그래밍 | 4.5 |
문무왕 | 알고리즘 | 4.5 |
장보고 | 알고리즘 | 3.5 |
장보고 | 자료구조 | 4.5 |
SELECT 이름 FROM 학생
GROUP BY 이름
HAVING AVG(성적) > 4.0;
SELECT 학과, COUNT(학과) AS 학과별튜플수 FROM 학생
GROUP BY 학과;
EMPNO > 100
SAL ≥ 3000
둘의 AND 연산
EMPNO = 200
- 위의 2개의 AND 연산으로 나온 EMPNO 200과 OR연산으로 인해 들어가는 EMPNO 200은 같기 때문에 200만 해당
- (만약, OR EMPNO = 300 이었다면? → OR 연산에 의해 앞의 2개의 AND 연산에 의해 나온 EMPNO = 200과 함께 2로 카운트 될 것!)
따라서 결과는 1
답 : ALL
예시
학교명 | 학년 | 인원 |
---|---|---|
A | 1 | 51 |
A | 2 | 29 |
A | 3 | 15 |
B | 1 | 33 |
B | 2 | 44 |
B | 3 | 72 |
학교명 | 학년 | 인원 |
---|---|---|
A | 1 | 51 |
A | 2 | 29 |
A | 3 | 15 |
A | 95 | |
B | 1 | 33 |
B | 2 | 44 |
B | 3 | 72 |
B | 149 | |
244 |
SELECT 학교명, 학년, SUM(인원) AS 인원 FROM 학교
GROUP BY RULLUP(학교명, 학년);
데이터베이스를 사용한 온라인 분석 처리 용도로 사용하기 위해서 표준 SQL에 추가된 함수
SELECT 함수명(파ㅇ라미터)
OVER ([PARTITION BY 컬럼1, ...])
[ORDER BY 컬럼A, ...]
FROM 테이블명
다음은 학생 테이블이다. 윈도 함수를 이용하여 결과 테이블과 동일하게 나오도록 쿼리 작성
[학생]
| 이름 | 점수 |
| --- | --- |
| 장길산 | 100 |
| 임꺽정 | 100 |
| 홍길동 | 90 |
| 김철수 | 80 |
| 한유리 | 70 |
[결과]
| 이름 | 점수 | 등수 |
| --- | --- | --- |
| 장길산 | 100 | 1 |
| 임꺽정 | 100 | 1 |
| 홍길동 | 90 | 2 |
| 김철수 | 80 | 3 |
| 한유리 | 70 | 4 |
SELECT 이름, 점수, DENSE_RANK() OVER(ORDER BY 점수 DESC)
AS 등수
FROM 학생;