DML (Data Manipulation Language, 데이터 정의어)

- 데이터를 조작하는 언어로 실제 데이터를 조회, 수정, 추가, 삭제하기 위하여 사용되는 언어이다. 사용자가 응용 프로그램과 데이터 베이스 사이에 실질적 데이터 처리를 하기 위하여 주로 사용된다.

 

DML의 유형

- SELECT : 테이블에서 행을 검색한다.

- INSERT : 테이블에 새로운 행을 삽입한다.

- DELETE : 테이블에서 행을 삭제한다.

- UPDATE : 테이블에서 행의 내용을 갱신한다.

 

1. SELECT

SELECT [DISTINCT] [테이블명,] 열이름 [AS 별칭] [,그룹함수(열이름) [AS 별칭]] FROM 테이블명 [,테이블명]
[WHERE 조건] [GROUP BY 열이름1, 열이름2, ...] [HAVING 조건] [ORDER BY [ASC | DESC]];

- DISTINCT : 중복된 튜플(행)이 있으면 첫 번째 한 개만 검색(중복 제거)

- 열이름 : 검색하여 불러올 열 또는 열을 이용한 수식을 지정

    - 모든 열을 지정할 때는 *을 기술, 두 개 이상의 테이블을 대상으로 검색할 때는 테이블명. 열이름으로 표현

- AS : 별칭을 나타내기 위하여 사용. 호출 시 별칭으로 호출

    - GROUP BY, ORDER BY, HAVING에서만 AS로 호출 가능

- FROM : 검색될 데이터들이 포함하는 테이블명을 기술

- WHERE : 검색할 조건

- ORDER BY : 특정 열을 기준으로 정렬하여 검색할 때 사용

    - ASC : 오름차순 (기본값)

    - DESC : 내림차순

 

2. 조건연산자

- 비교 연산자

- 논리 연산자 : NOT, AND, OR

- LIKE 연산자 : 대표 문자를 이용해 지정된 속성의 값이 문자 패턴과 일치하는 열을 검색하기 위해 사용

    - % : 모든 문자를 대표

    - - : 문자 하나를 대표

3. INSERT INTO ~

- 새로운 행을 삽입할 때 사용

INSERT INTO 테이블명 ([열1, 열2, ...]) VALUES (값1, 값2, ...);

 

- 다른 테이블에 데이터를 한 번에 입력

INSERT INTO 테이블명 ([열1, 열2, ...]) SELECT 문

 

- 대응하는 열과 데이터 개수는 같아야 한다.

 

3. DELETE FROM

- 특정 행을 삭제할 때 사용

DELETE FROM 테이블명 [WHERE 조건];

- 모든 행을 삭제할 때는 WHERE절을 생략

- 모든 행을 삭제하더라도 테이블 구조는 남아있음

3. UPDATE SET

- 데이터를 수정할 때 사용

UPDATE 테이블명 SET 열1=값1, 열2=값2, ... [WHERE 조건];

 

'MySQL > 이론' 카테고리의 다른 글

MySQL 이론(1)  (0) 2023.10.19

 

DDL (Date Define Language, 데이터 정의어)

- DB를 구축하거나 수정할 목적으로 사용하는 언어로 DBMS를 통해 사용되며,  SCHEMA, DOMAIN, TABLE, VIEW, INDEX 등을 정의, 변경, 삭제할 때 사용합니다. (CREATE, ALTER TABLE, DROP 등)

 

1. CREATE SCHEMA

CREATE SCHEMA [스키마 이름];

 - '스키마 이름'을 가진 DB 생성

2. CREATE TABLE

CREATE TABLE [테이블 이름] (
  열이름 데이터_타입 [DEFAULT 기본값] [NOT NULL],
  PRIMARY KEY(기본키_열이름),
  UNIQUE(고유키_열이름),
  FOREIGN KEY(외래키_열이름) REFERENCES 기준테이블(기본키_열이름) ON DELETE ON UPDATE,
  CONSTRAINT 제약조건명 CHECK(조건식)
);

*ON DELETE, ON UPDATE 옵션

- NO ACTION : 기준 테이블(기본키)에 변화가 있어도 참조 테이블(외래키)에는 아무런 조치를 하지 않음

- CASCADE : 기준테이블(기본키)의 튜플(행)이 삭제되면 참조 테이블(외래키) 관련 튜플도 모두 삭제되고, 속성이 변경되면 관련 튜플의 속성 값도 모두 변경

- SET DEFAULT : 기준테이블(기본키)의 변화가 있으면 참조 테이블(외래키) 관련 튜플의 속성 값을 기본값으로 변경

- SET NULL : 기준테이블(기본키)의 변화가 있으면 참조 테이블(외래키) 관련 튜플의 속성 값을 NULL값으로 변경

 

[튜플-행 / 열-속성 / 릴레이션-테이블 / 스키마-데이터베이스]

 

3. CREATE VIEW

CREATE VIEW [뷰 이름] AS SELECT문;

- 뷰를 정의하는 명령문으로 열이름을 기술하지 않으면 SELECT문의 열이름이 자동으로 사용된다.

4. CREATE INDEX

CREATE [UNIQUE] INDEX [인덱스 이름] ON [테이블 이름](열이름 [ASC | DESC]);

- 인덱스를 정의하는 명령문

* UNIQUE

- 사용된 경우 : 중복 값이 없는 열로 인덱스를 생성

- 사용되지 않은 경우 : 중복 값을 허용하는 열로 인덱스를 생성

* 정렬 여부 지정

- ASC : 오름차순 정렬, 기본값

- DESC : 내림차순 정렬

5. ALTER TABLE

ALTER TABLE [테이블 이름] ADD  열이름 데이터타입 [DEFAULT 기본값]; (추가)
ALTER TABLE [테이블 이름] ALTER  열이름 [SET DEFAULT 기본값]; (수정)
ALTER TABLE [테이블 이름] DROP COLUMN 열이름; (삭제)

- 테이블에 대한 정의를 변경하는 명령문

6. DROP

DROP SCHEMA [스키마 이름];
DROP TABLE [테이블 이름];
DROP VIEW[뷰이름];
DROP INDEX[인덱스이름];

- 스키마, 기본 테이블, 뷰 테이블, 인덱스를 제거

 

*CREATE TABLE + DROP TABLE = CREATE OR REPLACE TABLE

- 테이블 생성 시 같은 이름을 가진 테이블이 존재하지 않으면 생성, 같은 이름을 가진 테이블이 존재하면 삭제 후 생성

'MySQL > 이론' 카테고리의 다른 글

MySQL 이론(2)  (0) 2023.10.25

<form id="search_form">

<table class="topTable">

<tr>

<td style="width:15%;">

<input type="checkbox" id="joinCheck" name="joinCheck" value="0" ${param.joinCheck eq '0'? "checked" : "" } onclick="joinChk()">

<label for="joinCheck" style="font-size:5px; position:relative; top:-1.5px;">참가가능만 보기</label>

</td>

<td style="width:15%;">

<select id="sortField" name="sortField" onchange="orders(this.value)">

<option value="postDateDESC" ${param.sortField eq 'postDate DESC'? "selected" : "" }>최신순</option>

<option value="postDate" ${param.sortField eq 'postDate'? "selected" : "" }>작성일자순</option>

<option value="title" ${param.sortField eq 'title'? "selected" : "" }>제목순</option>

</select>

</td>

<td>

<select id="searchField" name="searchField">

<option value="title" ${param.searchField eq 'title'? "selected" : "" }>제목</option>

<option value="content" ${param.searchField eq 'content'? "selected" : "" } >내용</option>

<option value="m_name" ${param.searchField eq 'm_name'? "selected" : "" } >산이름</option>

<option value="id" ${param.searchField eq 'id'? "selected" : "" }>작성자</option>

</select>

<div id="textSearch">

<input type="text" name="searchWord" id="search" placeholder="검색" value="${not empty param.searchWord? param.searchWord : '' }" >

<button class="btn" style="height: 38px;"><i class="fa-solid fa-magnifying-glass i-con"></i></button>

</div>

</td>

</tr>

</table>

</form>

-- 게시판 기본 형태 구성 --

 

<table class="boardList">

<c:choose>

<c:when test="${empty boardLists }" >

<tr class="zero"><td colspan="8">등록 된 게시물이 없습니다.</td></tr>

</c:when>

<c:otherwise>

-- boardList에 내용이 없으면 "등록된 게시물이 없습니다." --

 

<c:forEach items="${boardLists }" var="b">

<tr style="border-top:1px solid darkgray">

<td width="4%">${b.mate_num }.</td>

<td width="10%">${b.m_name }</td>

<td rowspan="2" style="font-size:18px; height:55px;"><a class="link" href='./MateBoardView${ph.sc.getQueryString(ph.sc.page) }&num=${b.mate_num }&nickName=${b.nickName }'>${b.title }</a></td>

<fmt:formatDate value="${today }" type="date" pattern="yyyy-MM-dd" var="now"/>

<fmt:formatDate value="${b.postDate }" type="date" pattern="yyyy-MM-dd" var="post"/>

<c:choose>

<c:when test="${now eq post }">

<td colspan="4"><fmt:formatDate value="${b.postDate }" type="time" pattern="HH:mm" /></td>

<td rowspan="2" width="1%" style="font-size:5px; ${b.joinCheck eq 0? "background-color:rgba(48, 102, 71, 0.9)" : "background-color:rgba(241, 105, 81, 0.9)"}"></td>

</c:when>

<c:otherwise>

<td colspan="4">${post }</td>

<td rowspan="2" width="1%" style="font-size:5px; ${b.joinCheck eq 0? "background-color:rgba(48, 102, 71, 0.9)" : "background-color:rgba(241, 105, 81, 0.9)"}"></td>

</c:otherwise>

</c:choose>

-- boardList에 내용이 있으면 forEach문을 통해 하나씩 반복 출력 --

 

</tr>

<tr class="last">

<td width="3%"><img style="width:50%;" src="https://img.icons8.com/?size=512&id=12438&format=png"></td>

<td width="3%" style="cursor:pointer;" onClick="location.href='./yourpage?id=${b.id}'">${b.nickName }</td>

<td width="3%"><img style="width:70%;" src="https://img.icons8.com/?size=512&id=lJUgtSWOeJR9&format=png"></td>

<td width="3%">${b.viewCount }</td>

<td width="3%"><img style="width:67%;" src="https://img.icons8.com/?size=512&id=38977&format=png"></td>

<td width="3%">${b.commentCount }</td>

</tr>

</c:forEach>

</c:otherwise>

</c:choose>

</table>

 

<table class="bottomTable">

<tr>

<td colspan="7" class="write-btn">

<button class="bttn" onclick="location.href='./MateBoardWrite${ph.sc.getQueryString(ph.sc.page) }'"><i class="fa-solid fa-pen i-con"></i>글쓰기</button>

</td>

</tr>

</table>

 

<table class="myTable" style="background-color: #f9f9f9;">

<tr class="header">

<th colspan="7" style="text-align: center; height:40px;" >

<c:if test="${ph.showPrev }" >

<a href ="<c:url value='/MateBoardList${ph.sc.getQueryString(ph.beginPage-1)}'/>" >&laquo;</a>

</c:if>

<c:forEach var="i" begin="${ph.beginPage }" end="${ph.endPage }">

<c:choose>

<c:when test="${not empty sortField}" >

<a class='${ph.sc.page==i? "check" : "" }' href="<c:url value='./MateBoardList${ph.sc.getQueryString(i) }${not empty joinCheck? "&joinCheck=0" : "" }&sortField=${sortField }' />">${i }</a>

</c:when>

<c:otherwise>

<a class='${ph.sc.page==i? "check" : "" }' href="<c:url value='./MateBoardList${ph.sc.getQueryString(i) }${not empty joinCheck? "&joinCheck=0" : "" }' />">${i }</a>

</c:otherwise>

</c:choose>

</c:forEach>

<c:if test="${ph.showNext }" >

<a href ="<c:url value='/MateBoardList${ph.sc.getQueryString(ph.endPage+1)}'/>" >&raquo;</a>

</c:if>

</th>

</tr>

-- 페이지 이동 구현 -- 

 

</table>

'JAVA > 실습' 카테고리의 다른 글

자바 게시판 만들기(1) 페이지 핸들러  (0) 2023.09.12
[JAVA] 틱택토 게임  (0) 2023.09.10

public class PageHandler {

private SearchCondition sc;

public final int naviSize = 10; // page navigation size

private int totalCnt; // 게시물의 총 갯수

private int totalPage; // 전체 페이지의 갯수

private int beginPage; // 화면에 보여줄 첫 페이지

private int endPage; // 화면에 보여줄 마지막 페이지

private boolean showNext = false; // 이후를 보여줄지의 여부. endPage==totalPage이면, showNext는 false

private boolean showPrev = false; // 이전을 보여줄지의 여부. beginPage==1이 아니면 showPrev는 false

 

public PageHandler(int totalCnt, Integer page) {

this(totalCnt, new SearchCondition(page, 10));

}

 

public PageHandler(int totalCnt, Integer page, Integer pageSize) {

this(totalCnt, new SearchCondition(page, pageSize));

}

 

public PageHandler(int totalCnt, SearchCondition sc) {

this.totalCnt = totalCnt;

this.sc = sc;

 

doPaging(totalCnt, sc);

}

 

private void doPaging(int totalCnt, SearchCondition sc) {

this.totalPage = (int)Math.ceil(totalCnt/(double)sc.getPageSize());

this.sc.setPage(Math.min(sc.getPage(), totalPage)); // page가 totalPage보다 크지 않게

this.beginPage = (this.sc.getPage() -1) / naviSize * naviSize + 1; // 11 -> 11, 10 -> 1, 15->11. 따로 떼어내서 테스트

this.endPage = Math.min(beginPage + naviSize - 1, totalPage);

this.showPrev = beginPage!=1;

this.showNext = endPage!=totalPage;

}

'JAVA > 실습' 카테고리의 다른 글

자바 게시판 만들기(2) 게시판 구현  (0) 2023.09.12
[JAVA] 틱택토 게임  (0) 2023.09.10

+ Recent posts