Lecture 04, SQL (1)
2023. 8. 3. 12:32ㆍ2023/데이터베이스개론
반응형
SQL(Structured Query Language)
- 관계형 데이터베이스 표준 언어로서 가장 많이 사용되는 데이터 언어
- System R 이라는 실험용 DBMS를 위한 데이터 언어로 IBM 연구소에서 처음 개발
- 현재는 미국 표준(ANSI)과 국제 표준(ISO) 관계형 데이터베이스 표준 언어로 승인
- ORACLE, MS SQL-Server, MySQL 등 거의 모든 관계형 DBMS가 지원
- SQL을 구성하는 3가지 부속 언어의 분류와 관련 주요 기능
- 현재의 주요 특성과 문법은 1990년대에 거의 완성
- SQL의 기능별 분류
- 데이터 정의어(Data Definition Language)
- DB 구조 정의
- DB 객체 생성, 수정, 삭제 (테이블, 뷰, 인덱스 등)
- 데이터 조작어(Data Manipulation Language)
- DB 데이터 관리
- 입력, 수정, 삭제, 검색
- 데이터 제어어(Data Control Language)
- DB 관리 및 통제
- DB 백업, 복원
- 사용자 등록, 권한 관리
- 데이터 정의어(Data Definition Language)
MySQL
- 세계에서 가장 많이 사용하는 오픈소스 RDBMS, 1995년에 최초 개발
- 처리 속도가 빠르고 설치가 쉬움
- 오라클, MS-SQL Server와 함께 가장 많이 사용하는 DBMS 중 하나
- 2010년에 오라클에 인수되었지만 현재도 오픈소스 정책은 유지
- 기존 개발 인력들이 새롭게 많든 것이 MariaDB
- 장점
- 리눅스, Mac, Windows 등 다양한 플랫폼 사용 가능
- 프로그램이 가벼움
- 단점
- 사용이 다른 상용 제품에 비해 불편함
- MySQL 서버 구동
- 클라이언트 관리 도구인 MySQL 워크벤치를 실행하거나 콘솔창을 사용함
- 대부분의 경우 Super User인 Root 계정을 사용하게 됨
- 실행 예시
- Select version();
- Select user()
Drop database if exists univDB; # 해당 db가 존재한다면 삭제
Create database if not exists univDB; # 해당 db가 존재하지 않는다면 만들기
Create table 학생(
학번 char(4) not null, # null값은 안됨, 문자열 4byte
이름 varchar(20) not null, # null값은 안됨, 문자열 최대 20byte
주소 varchar(50) null default '미정', # null값 가능, 문자열 최대 50byte default 값은 '미정'
학년 int not null, # null값 불가능, 정수형
나이 int null, # null값은 가능, 정수형
성별 char(1) not null, # null값은 불가능, 문자열 1byte
휴대폰번호 char(14) null, # null값 가능, 문자열 14byte
소속학과 varchar(20) null, # null값 가능, 문자열 최대 20byte
Primary key (학번)); # pk는 학번으로 설정
Create table 과목(
과목번호 char(4) not null primary key, # null값 불가, 문자열 4byte, pk 설정
이름 varchar(20) not null, # null값 불가, 문자열 최대 20byte
강의실 char(3) not null, # null값 불가, 문자열 3byte
개설학과 varchar(20) not null, # null 값 불가, 문자열 최대 20byte
시수 int not null); # null 값 불가, 정수형
Create table 수강(
학번 char(6) not null, # null값 불가, 문자열 6byte
과목번호 char(4) not null, # null값 불가, 문자열 4byte
신청날짜 date not null, # null값 불가, 날짜형
중간성적 int null default 0, # null값 가능, 정수형, default 값은 0
기말성적 int null default 0, # null값 가능, 정수형, default 값은 0
평가학점 char(1) null, # null값 가능, 문자형 1byte
Primary key(학번, 과목번호)); # pk는 학번과 과목번호로 설정
INSERT INTO 학생 VALUES('S001', '김연아', '서울 서초', 4, 23, '여', '010-1111-2222', '컴퓨터');
...
INSERT INTO 과목 VALUES('c001', '데이터베이스', '126', '컴퓨터');
...
INSERT INTO 수강 VALUES('s001', 'c002', '2019-09-03', 93, 98, A);
...
- 작업데이터베이스 선택
USE univDB; # 작업대상 데이터베이스 변경
SELECT database(); # 현재 사용 데이터베이스 확인
SHOW TABLES; # univDB 안의 생성 테이블 목록 확인
- SQL 데이터 조작문 기초
- 행 검색
- 테이블로부터 데이터를 검색하기 위해서는 SELECT 문을 사용
- 행 검색
SELECT DISTINCT 소속학과 FROM 학생;
SELECT 이름, 주소 FROM 학생;
SELECT 학번, 이름, 주소, 학년, 나이, 성별, 휴대폰번호, 소속학과
FROM 학생;
SELECT * FROM 학생;
SELECT [DISTINCT/ALL] COL_LIST # 중복제거 or 그냥 다 # 5
FROM TABLE_LIST # 1
[WHERE SEARCH_CONDITION] # 생략 가능, 어디서 가져올 것인가? # 2
[GROUP BY GROUP_STDCOL_LIST] # 생략 가능, 그룹화 할 기준 열 # 3
[HAVING GROUP_CONDITION] # 생략 가능, 조건식이 들어감 # 4
[ORDER BY {SORT_STDCOL [ASC/DESC][,]}^+]; # 6 # 정렬 기준열, 오름차순/내림차순 설정 +는 1회 이상 반복 * 0회 이상 반복
- WHERE절은 참/거짓을 판별할 수 있는 하나의 검색 조건을 define
- 기본 검색 조건식은 보통 열이름, 비교연산자, 상수값의 순서로 정의
- 비교연산자
- =, <>(같지 않다), <, >, ≤, ≥
- 문자나 날짜값은 작은 따옴표로 구분
- 논리연산자 and, or, not
- 비교연산자가 최우선으로 사용되며 not, and, or 순으로 사용
SELECT 이름, 학년, 소속학과, 휴대폰번호 FROM 학생 WHERE (학년 BETWEEN 1 AND 3) OR NOT (소속학과='컴퓨터');
SELECT 이름, 학년, 소속학과, 휴대폰번호
FROM 학생
WHERE (학년>=1 AND 학년<=3) OR NOT (소속학과='컴퓨터');
SELECT 이름, 학년, 소속학과, 휴대폰번호
FROM 학생 WHERE 학년>=2 AND 소속학과='컴퓨터';
- ORDER BY 절은 정렬 기준이 되는 열을 지정
- 여러개의 열을 나열하여 정의할 수 있음
- ASC: 오름차순 / DESC: 내림차순
SELECT 이름, 학년, 소속학과, 휴대폰번호 FROM 학생 WHERE 소속학과='컴퓨터' OR 소속학과='정보통신' ORDER BY 학년 ASC, 이름 DESC;
SELECT *
FROM 학생
ORDER BY 학년 ASC, 이름 DESC;
SELECT *
FROM 학생
ORDER BY 학년 ASC, 이름 DESC
LIMIT 3; # SELECT문 맨 마지막에 넣는 것이 원칙, LIMIT 5, 3은 6번째 행부터 3개
- GROUP BY
- 개별 행이 아닌 행 그룹에 대한 검색을 위해 사용
- 뒤에는 그룹을 분류하는 기준 열을 지정
- FROM 절에 있는 TABLE을 GROUP BY 기준으로 나눔
- GROUP BY 절에서 그룹화한 기준열은 SELECT 절에도 define되어야 결과의 의미를 구별할 수 있음
SELECT 성별, MAX(나이) AS '최고 나이', MIN(나이) AS '최저 나이' FROM 학생 GROUP BY 성별;
SELECT 나이, COUNT(*) AS '나이별 학생수'
FROM 학생
WHERE 나이>=20 AND 나이<30
GROUP BY 나이;
- HAVING
- GROUP BY절을 통해 생성된 그룹 중 특정 조건을 만족하는 그룹만으로 검색을 제한함
- WHERE 절은 행에 대한 ‘검색_조건식’을 define
- HAVING 절은 행 그룹에 대한 ‘그룹_조건식’을 define
SELECT 학년, COUNT(*) AS '학년별 학생수'
FROM 학생
GROUP BY 학년
HAVING COUNT(*) >= 2;
- 집계함수
- 실제 테이블 저장 값이 아닌 행의 개수 또는 특정 열의 값의 평균을 구하는 질의가 필요한 경우를 위해 사용
- 각 열에 대한 기본 통계 결과를 반환함
- COUNT(COL): 특정 열 값의 개수 또는 행의 개수
- MAX(COL): 특정 열 값 중 최대값
- MIN(COL): 특정 열 값 중 최소값
- SUM(COL): 특정 열 값의 합계
- AVG(COL): 특정 열 값의 평균
SELECT COUNT(*)
FROM 학생;
SELECT COUNT(학번)
FROM 학생;
SELECT COUNT(*) AS 학생수1, COUNT(주소) AS 학생수2, COUNT(DISTINCT 주소) AS 학생수3
FROM 학생; # AS를 이용하면 집계함수를 이용한 새로운 테이블이 만들어질 때 각 COLUMN의 이름을 지어줄 수 있음
SELECT AVG(나이) '여학생 평균나이'
FROM 학생
WHERE 성별='여';
- LIKE 문자 연산자
- 부분 문자열(substring) 포함 여부를 검색하기 위해 WHERE절 ‘검색_조건식’에 사용되는 비교 연산자
- 검색 문자열 값을 정확히 모르거나 일부만 알고있는 경우
- LIKE를 사용하기 위해서는 와일드카드를 사용해야 함
_ 문자열 중 특정 위치에 1개의 모든 문자를 허용 % 문자열 중 임의 위치에 0개 이상의 모든 문자(열)를 허용 - 예시
검색 일치 검색 불일치 LIKE ‘_ook’ book, look good, books, ook LIKE ‘9_7_5’ 98765, 91715, 9a7b5 975, 98754 LIKE ‘%k’ book, milk, ok, k books LIKE ‘b%k’ book, bblack, bk kbkbk, bbooks
SELECT 학번, 이름, 주소
FROM 학생
WHERE 주소 LIKE '%서울%'
ORDER BY 학년 DESC;
SELECT 학번, 이름
FROM 학생
WHERE 이름
LIKE '이__';
- null값 검사하기
- = 비교 연산자 사용 불가
- IS NULL 과 IS NOT NULL만 사용 가능함
SELECT 이름, 휴대폰번호 FROM 학생 WHERE 휴대폰번호 IS NULL;
- UNION 연산자
- 여러 SELECT 명령문의 검색 결과를 결합
- 결과 테이블에서 자동으로 중복 행을 제거한 나머지 행들을 반환
- MySQL에서 INTERSECT와 EXCEPT 또는 MINUS 연산자를 지원하지 않음
SELECT 학번 FROM 학생 WHERE 성별='여' UNION SELECT 학번 FROM 수강 WHERE 평가학점='A';
- IN 연산자
- 나열된 값들 중 하나라도 일치하는 경우 참을 반환
- NOT IN은 나열된 값들 중 어떤 값도 일치하지 않을 경우 참 반환
- 여러 값들과의 반복 비교를 위해 = 기호를 나열할 필요 없이 한꺼번에 표현하도록 함
SELECT 이름
FROM 학생
WHERE 학번 IN ('s001', 's003', 's004');
SELECT 이름
FROM 학생
WHERE 학번='s001' or 학번='s003' or 학번='s004';```
- JOIN
- WHERE 절에서 복합적으로 조건식을 구성
- JOIN 명을 통해 테이블을 결합한 후 조건식을 구성
- FROM 절에 명세한 조인 대상 테이블 개수 N-1개의 조인 조건식이 필요함
SELECT 열_리스트
FROM 조인테이블_리스트
WHERE 조인조건식
AND 검색조건식
SELECT 열_리스트
FROM 테이블이름1{[INNER] JOIN 테이블이름2 ON 조인조건식}+ WHERE 검색 조건
- CROSS JOIN
- 조인조건식 없이 이루어진 조인
- 관계대수의 카티션 프로덕트 연산을 적용한 결과(두 테이블을 곱한 결과)를 반환
- 대부분의 행이 의미 없는 기계적인 결합
SELECT *
FROM 학생, 수강;
SELECT *
FROM 학생 CROSS JOIN 수강;
- EQUI JOIN
- 조인조건식에 = 연산자를 사용하는 동등 조건에 의한 조인
- 두 테이블 행들 사이의 의미 있는 조합만을 검색
- 크로스 조인의 결과 테이블 중 의미없는 조합을 제외하고 관계대수의 동등조인 연산을 적용
SELECT * FROM 학생, 수강
WHERE 학생.학번=수강.학번;
SELECT * FROM 학생
JOIN 수강 ON 학생.학번=수강.학번;
SELECT 학생.학번, 이름, 과목번호, 중간성적+(중간성적*0.1) AS 변환중간성적
FROM 학생, 수강
WHERE 학생.학번=수강.학번 AND 과목번호='c002';
SELECT 학생.학번, 이름, 과목번호, 중간성적+(중간성적*0.1) AS 변환중간성적
FROM 학생 JOIN 수강 ON 학생.학번=수강.학번
WHERE 과목번호='c002';
SELECT 학생.`학번`, 학생.이름, 수강.과목번호
FROM 학생, 수강, 과목
WHERE 학생.학번=수강.학번 AND 수강.과목번호=과목.과목번호 AND 과목.이름='정보보호';
SELECT 학생.`학번`, 학생.이름, 수강.과목번호
FROM (학생 JOIN 수강 ON 학생.학번=수강.학번) JOIN 과목 ON 수강.과목번호=과목.과목번호
WHERE 과목.이름='정보보호';
반응형
'2023 > 데이터베이스개론' 카테고리의 다른 글
Lecture 05, Table, View, Index (0) | 2023.08.24 |
---|---|
Lecture 04, SQL (2) (0) | 2023.08.04 |
Lecture 03, 데이터모델의 구성요소(2) (0) | 2023.06.25 |
Lecture 03, 데이터모델의 구성요소(1) (0) | 2023.06.25 |
Lecture 02, 데이터베이스의 구조 (0) | 2023.06.25 |