지금으로부터 10년 전, 고등학교때 SQL문법을 처음 배웠을때 정리했던 기록입니다.
그 당시에 나름대로 재미를 느껴서 스스로 만들었던 자료입니다.
원본 테이블 정보가 남아있지 않아서 어떤 부분은 이해하기 어려울 수도 있지만
SQL 문법을 까먹을 때마다 참고용으로 보기 좋아서 이번 기회에 블로그에 남겨두려고 합니다.
MS Access 프로그램 기준입니다.
지금은 sql 수업에서 MySQL을 기준으로 학습하고 있는데,
문법이 같은 부분도 있고 조금 다른 부분도 있더라구요. (와일드카드, distinct위치 등)
참고부탁드립니다!
데이터 베이스 SQL 쿼리문 정리
[ 새 테이블 만들기 ]
CREATE table 주문(생산 품목 varchar(10), 수량 int, 단가 int, 고객번호 varchar(5) )
컬럼명과 자료형 입력
[ 기본 공식 ]
SELECT 필드 명1, 필드 명2 ... AS 이름바꿈
FROM 테이블 명
WHERE "조건" AND(OR) “조건”
GROUP BY 그룹핑할 조건
HAVING 조건
ORDER BY 기준
중복제거: distinct, 오름 내림차순: asc, desc
select distinct sno, cno
from enrol
where midterm >= 90
order by sno desc, cno asc
select문 중간에 글자 넣기
select sno, '중간시험= ' , midterm +3
from enrol
where cno = "C312"
JOIN
두 개 테이블 조인하기 (JOIN)
과목번호 'C413'에 등록한 학생의 이름, 학과, 성적을 검색하라
select student.sname, student.dept, enrol.grade
from enrol, student
where cno = "C413" and student.sno = enrol.sno
다른 조인 방법 (INNER JOIN)
SELECT student.sname, student.dept, enrol.grade
FROM student inner join enrol on student.sno = enrol.sno
WHERE cno = "C413"
# join on / join using / natural join 등의 문법도 활용 가능
자기 자신 테이블과의 조인 (SELF JOIN)
SELECT s1.sno as 학번1, s2.sno as 학번2
FROM student s1, student s2
WHERE s1.dept = s2.dept and s1.sno < s2.sno
SELECT e1.sno , e2.sno
FROM enrol e1, enrol e2
WHERE e1.grade = e2.grade
AND e1.sno < e2.sno
집계 함수
count: 값의 개수
sum: 값의 총계 (조건 별 합계는 sum() - where 필요함)
avg: 평균값
max: 최대값
min: 최소값
학생수 세기
- count(*)의 처리대상은 행(투플)의 집합이고 그 결과는 그 집합에 속하는 행(투플)의 수이다.
- 이때 중복된 행도 함께 포함된다.
SELECT count(*) as 학생수
FROM student
평균, 합계 구하기
SELECT avg(midterm) as 평균점수, sum(midterm) as 중간합, sum(final) as 기말총합, avg(final) as 기말평균
FROM enrol
WHERE cno = "C413"
SELECT cno, avg(final) as 기말평균
FROM enrol
GROUP BY cno
--과목끼리 묶음
GROUP BY, HAVING (조건)의 활용
SELECT cno, avg(final) as 기말평균
FROM enrol
GROUP BY cno
HAVING count(cno) >= 3 (과목수 3개 이상)
- group by는 논리적으로 from절에 있는 테이블을 group by절에 명세된 열의 값별로 분할한다.
물론 그렇다고 DB내에서 물리적으로 분할 되는 것 아님.
서브쿼리
[ 부속질의어(subquery) ]
- select 안에 또 select
- 즉, 다른 질의어에 중첩되어 사용된 검색문.
- 조인하지 않고 합침
예시1) C413에 등록하지 않은 학생
SELECT sname
FROM student
WHERE sno not in (
select sno
from enrol
where cno = "C413" )
예시2) '홍길동'이란 이름만 단서, 같은학과 사람찾기
SELECT name, dept
FROM student
WHERE dept in (
select dept
from student
where name ="홍길동")
와일드카드
[ 문자 스트링 검색 LIKE 프레디킷 ]
- 확실하지 않은 것은 *로 표시
- 글자수는 C___(3글자 일때 언더바 3개)
예시) C로 시작하는 과목명을 듣는 사람은?
SELECT cno as 과목번호 , cname as 과목명
from course
where cno like 'C*'
+) mysql 와일드 카드는 '*'대신 %사용
UNION
union은 합집합의 개념, 사용되면 결과 내 테이블에서의 중복되는 투플은 제거된다.
유의할 점: 데이터 필드명과 데이터 형식이 일치해야 함.
예시) 3학년이거나 과목 C324에 등록한 학생의 학번을 검색하라.
select sno
from student
where year = '3'
union
select sno
from enrol
where cno = 'C324'
DML
[ 데이터 갱신, 삽입, 삭제 ]
업데이트( 컴퓨터과 과목의 학점(credit)을 1씩 증가시켜라.)
update course
set credit = credit + 1 (열이름 = 산술식)
where dept = "컴퓨터"
삽입
insert
into student
values (600,"박상현","1","컴퓨터")
삭제
delete
from student
where sno = 100
select문 중간에 글자 넣기를 돌리면 이런식으로 나온다