초보자를 위한 SQL 자가 학습 가이드입니다. 범주 아카이브: SQL에 대한 책 인형을 위한 SQL 프로그래밍 언어

작성자:당신은 찻주전자라고 불렸습니까? 글쎄, 이것은 고칠 수 있다! 모든 사모바르는 한때 찻주전자였습니다! 아니면 모든 프로가 한때 사모바르였습니까? 아니, 또 뭔가 잘못됐어! 대체로 MySQL은 초보자를 위한 것입니다.

인형에게 MySQL이 필요한 이유

삶을 인터넷과 진지하게 연결하려는 경우 "웹"의 맨 처음 단계에서 이 DBMS를 보게 될 것입니다. MySQL은 안전하게 "모든 인터넷" 데이터베이스 관리 시스템이라고 할 수 있습니다. 하나의 다소 심각한 리소스도 그것 없이는 할 수 없으며 각 호스팅의 관리자 패널에 있습니다. 그리고 대부분의 인기 있는 CMS와 자체 제작 엔진도 그녀의 참여로 만들어집니다.

일반적으로 이 플랫폼 없이는 할 수 없습니다. 그러나 그것을 연구하려면 올바른 접근 방식, 올바른 도구, 그리고 가장 중요한 것은 욕망과 인내도 필요합니다. 나는 당신이 후자를 많이 가지고 있기를 바랍니다. 그리고 당신의 두뇌가 끓어오르고 진짜 찻주전자에서처럼 머리에서 증기가 뚝뚝 떨어질 것이라는 사실에 대비하십시오.

그러나 MySQL은 잘못 배우기 시작하는 경우에만 인형에게 너무 어렵습니다. 우리는 그런 실수를 하지 않을 것이며, 처음부터 이 기술에 대한 친분을 쌓을 것입니다.

기본 개념

먼저 이 게시물에서 언급할 기본 개념을 살펴보겠습니다.

데이터베이스(DB)는 DBMS의 주요 구성 단위입니다. 데이터베이스에는 열과 레코드(행)로 구성된 테이블이 포함됩니다. 교차점에 형성된 셀에는 특정 유형의 구조화된 데이터가 포함됩니다.

DBMS(데이터베이스 관리 시스템) - 데이터베이스 관리를 위한 모든 소프트웨어 모듈의 집합입니다.

SQL은 구조화된 쿼리 언어로 개발자가 DBMS의 핵심(서버)과 "통신"하는 데 도움이 됩니다. 모든 프로그래밍 언어와 마찬가지로 SQL에는 고유한 구문, 명령 및 연산자 집합, 지원되는 데이터 유형이 있습니다.

나는 우리가 시작하기에 충분한 이론적 지식을 가지고 있다고 생각합니다. 이론상 부족한 부분은 연습을 통해 "페인트"할 것입니다. 이제 올바른 소프트웨어 도구를 선택하는 일만 남았습니다.

올바른 도구 찾기

초보자를 위한 MySQL 셸의 전체 범위를 거의 "뒤집어서", 나는 이것들이 단순히 존재하지 않는다는 것을 깨달았습니다. DBMS 관리를 위한 모든 소프트웨어 제품에는 이미 설치된 데이터베이스 서버가 필요합니다. 일반적으로 나는 다시 한 번 "스쿠터"를 재발명하지 않기로 결정하고 국내 Denwer 패키지를 선택했습니다. 공식 웹사이트에서 다운로드할 수 있습니다.

DBMS의 모든 구성 요소가 이미 포함되어 있어 초보자가 간단하고 이해하기 쉬운 설치 후 MySQL에 대한 실질적인 지식을 시작할 수 있습니다. 또한 Denwer에는 초보 개발자에게 필요한 몇 가지 다른 도구(로컬 서버, PHP)가 포함되어 있습니다.

첫 번째 단계

모든 것이 자동으로 발생하기 때문에 "신사" 세트의 설치 과정은 설명하지 않겠습니다. 인스탈라를 실행한 후에는 필요한 키를 누르기만 하면 됩니다. MySQL의 더미 버전에 필요한 것입니다.

설치 프로세스가 끝나면 로컬 서버를 시작하고 몇 초 동안 기다리십시오. 그런 다음 브라우저의 주소 표시줄에 localhost를 입력합니다.

페이지에서 "만세, 작동 중입니다!" 그림의 링크 중 하나를 따르십시오. 그런 다음 데이터베이스 관리용 셸인 phpMyAdmin으로 이동합니다.

http://downloads.mysql.com/docs/world.sql.zip 링크를 클릭하면 공식 MySQL 웹사이트에서 샘플 테스트 데이터베이스를 다운로드할 수 있습니다. 다시 phpMyAdmin으로 이동하여 상단의 메인 메뉴에서 "가져오기" 탭으로 이동합니다. 첫 번째 섹션("가져올 파일")의 "현재로 가져오기" 창에서 "컴퓨터 찾아보기" 값을 설정합니다.

탐색기 창에서 다운로드한 예제 데이터베이스가 있는 아카이브를 선택합니다. 메인 창 하단에 있는 "확인"을 클릭하는 것을 잊지 마십시오.

지금은 지정된 매개변수 값을 변경하지 않는 것이 좋습니다. 이로 인해 가져온 소스의 데이터가 잘못 표시될 수 있습니다. phpMyAdmin에서 데이터베이스 압축 알고리즘을 인식할 수 없다는 오류가 발생하면 압축을 풀고 전체 가져오기 프로세스를 처음부터 반복합니다.

모든 것이 잘 되었다면 상단에 import가 성공했다는 프로그램 메시지가 나타나고, DB 목록의 왼쪽에는 다른 하나(단어)가 있습니다.

처리해야 할 작업을 보다 명확하게 상상할 수 있도록 내부에서 구조를 살펴보겠습니다.

초보자를 위한 MySQL 데이터베이스의 이름을 클릭합니다. 구성되는 테이블 목록이 그 아래에 표시됩니다. 그 중 하나를 클릭하십시오. 그런 다음 최상위 메뉴 항목 "구조"로 이동합니다. 기본 작업 영역에는 모든 열 이름, 데이터 유형 및 모든 속성과 같은 테이블 구조가 표시됩니다.

이 튜토리얼은 SQL 언어(DDL, DML)에 대한 "내 기억의 스탬프"와 같은 것입니다. 이것은 나의 직업 활동 과정에서 축적되어 끊임없이 내 머리에 저장되는 정보입니다. 이것은 데이터베이스로 작업할 때 가장 자주 사용되는 저에게 충분한 최소값입니다. 보다 완전한 SQL 구문을 사용해야 하는 경우 일반적으로 인터넷에 있는 MSDN 라이브러리에 도움을 요청합니다. 제 생각에는 모든 것을 머리에 담는 것은 매우 어려운 일이며, 특별히 그럴 필요는 없습니다. 그러나 기본 구성을 아는 것은 매우 유용합니다. 왜냐하면 Oracle, MySQL, Firebird와 같은 많은 관계형 데이터베이스에서 거의 동일한 형식으로 적용할 수 있습니다. 차이점은 주로 데이터 유형에 있으며 세부적으로 다를 수 있습니다. SQL 언어의 기본 구성은 그리 많지 않으며 지속적인 연습으로 빠르게 기억됩니다. 예를 들어, 객체(테이블, 제약 조건, 인덱스 등)를 생성하려면 데이터베이스 작업을 위한 환경(IDE)의 텍스트 편집기만 있으면 충분하며 특정 유형의 데이터베이스(MS SQL, Oracle, MySQL, Firebird 등) 작업. 또한 모든 텍스트가 눈 앞에 있고 예를 들어 인덱스나 제약 조건을 생성하기 위해 수많은 탭을 실행할 필요가 없기 때문에 편리합니다. 데이터베이스에 대한 지속적인 작업으로 스크립트를 사용하여 개체를 만들고 변경하고 특히 다시 만드는 작업은 시각적 모드에서 수행하는 경우보다 몇 배나 빠릅니다. 또한 스크립트 모드(따라서 신중하게)에서는 개체 이름 지정 규칙을 설정하고 제어하기가 더 쉽습니다(내 주관적인 의견). 또한 스크립트는 한 데이터베이스(예: 테스트 데이터베이스)의 변경 사항을 동일한 형식으로 다른(생산적인) 데이터베이스로 전송해야 할 때 사용하기 편리합니다.

SQL 언어는 여러 부분으로 나뉩니다. 여기서는 가장 중요한 두 부분에 대해 설명하겠습니다.
  • DML - 다음 구성을 포함하는 데이터 조작 언어:
    • SELECT - 데이터 선택
    • INSERT - 새 데이터 삽입
    • 업데이트 - 데이터 업데이트
    • DELETE - 데이터 삭제
    • MERGE - 데이터 병합
왜냐하면 저는 실무자입니다. 이 튜토리얼에는 이론이 거의 없으며 모든 구성은 실제 예제와 함께 설명됩니다. 또한 프로그래밍 언어, 특히 SQL은 직접 느끼고 이런 구성을 실행할 때 어떤 일이 발생하는지 이해해야만 실제로 마스터할 수 있다고 생각합니다.

이 튜토리얼은 단계별 원칙을 기반으로 합니다. 그것은 순서대로 그리고 가급적이면 예를 따라 즉시 읽을 필요가 있습니다. 그러나 그 과정에서 명령에 대해 더 자세히 알아야 하는 경우 인터넷에서 특정 검색을 사용하십시오(예: MSDN 라이브러리).

이 자습서를 작성할 때 MS SQL Server 데이터베이스 버전 2014를 사용하여 SSMS(MS SQL Server Management Studio)를 사용한 스크립트를 실행했습니다.

MS SQL Server Management Studio(SSMS)에 대한 간략한 정보

SSMS(SQL Server Management Studio)는 데이터베이스 구성 요소를 구성, 관리 및 관리하기 위한 Microsoft SQL Server용 유틸리티입니다. 이 유틸리티에는 스크립트 편집기(주로 사용할 것)와 서버 개체 및 설정과 함께 작동하는 그래픽 프로그램이 포함되어 있습니다. SQL Server Management Studio의 주요 도구는 사용자가 서버 개체를 보고, 검색하고, 조작할 수 있는 개체 탐색기입니다. 이 텍스트는 Wikipedia에서 부분적으로 차용했습니다.

새 스크립트 편집기를 만들려면 새 쿼리 버튼을 사용합니다.

현재 데이터베이스를 변경하려면 드롭다운 목록을 사용할 수 있습니다.

특정 명령(또는 명령 그룹)을 실행하려면 해당 명령을 선택하고 실행 버튼이나 F5 키를 누릅니다. 현재 편집기에 하나의 명령만 있거나 모든 명령을 실행해야 하는 경우 아무 것도 선택할 필요가 없습니다.

스크립트, 특히 객체(테이블, 열, 인덱스)를 생성하는 스크립트를 실행한 후 변경 사항을 확인하려면 컨텍스트 메뉴에서 적절한 그룹(예: 테이블), 테이블 자체 또는 그 안의 열 그룹을 선택하여 업데이트를 사용하십시오.

사실 이것은 여기에 주어진 예제를 실행하기 위해 알아야 할 전부입니다. 나머지 SSMS 유틸리티는 스스로 배우기 쉽습니다.

약간의 이론

관계형 데이터베이스(RDB, 더 나아가 데이터베이스의 맥락에서)는 상호 연결된 테이블 모음입니다. 대략적으로 말하면 데이터베이스는 데이터가 구조화된 형태로 저장되는 파일입니다.

DBMS - 이러한 데이터베이스를 위한 관리 시스템, 즉 특정 유형의 데이터베이스(MS SQL, Oracle, MySQL, Firebird 등)로 작업하기 위한 도구 세트입니다.

메모
왜냐하면 인생에서 구어체로 우리는 주로 "Oracle DB"라고 말하거나 실제로 "Oracle DBMS"를 의미하는 "Oracle"이라고 말합니다. 이 자습서의 컨텍스트에서 DB라는 용어가 때때로 사용됩니다. 맥락에서 보면 그것이 무엇에 관한 것인지 분명할 것이라고 생각합니다.

테이블은 열의 모음입니다. 열은 필드 또는 열이라고도 할 수 있으며 이러한 단어는 모두 같은 것을 표현하기 위해 동의어로 사용됩니다.

테이블은 RDB의 주요 개체이며 모든 RDB 데이터는 테이블의 열에 한 줄씩 저장됩니다. 문자열, 레코드도 동의어입니다.

각 테이블과 해당 열에 대해 이름이 지정되며 이후에 액세스할 수 있습니다.
MS SQL에서 객체 이름(테이블 이름, 열 이름, 인덱스 이름 등)은 최대 128자까지 가능합니다.

참고로- ORACLE 데이터베이스에서 객체 이름의 최대 길이는 30자입니다. 따라서 특정 데이터베이스의 경우 문자 수 제한 내에서 유지하기 위해 개체 이름 지정에 대한 고유한 규칙을 개발해야 합니다.

SQL은 DBMS를 사용하여 데이터베이스에서 쿼리를 실행할 수 있는 언어입니다. 특정 DBMS에서 SQL 언어는 특정 구현(자체 방언)을 가질 수 있습니다.

DDL 및 DML은 SQL 언어의 하위 집합입니다.

  • DDL 언어는 데이터베이스 구조를 만들고 수정하는 데 사용됩니다. 테이블과 링크를 생성/수정/삭제합니다.
  • DML 언어는 테이블 데이터의 조작을 허용합니다. 그녀의 라인과 함께. 테이블에서 데이터를 선택하고, 테이블에 새 데이터를 추가하고, 기존 데이터를 업데이트 및 삭제할 수 있습니다.

SQL에서 사용할 수 있는 주석에는 두 가지 유형이 있습니다(한 줄 및 여러 줄).

한 줄 주석
그리고

/ * 여러 줄 주석 * /

사실 이 정도면 이론상 충분할 것이다.

DDL - 데이터 정의 언어

예를 들어, 프로그래머가 아닌 사람을 위한 일반적인 형식으로 직원에 대한 데이터가 있는 테이블을 생각해 보십시오.

이 경우 테이블의 열에는 인사 번호, 성명, 생년월일, 이메일, 직위, 부서와 같은 이름이 있습니다.

이러한 각 열은 포함된 데이터 유형으로 특징지을 수 있습니다.

  • 인원 수 - 정수
  • 전체 이름 - 문자열
  • 생년월일 - 날짜
  • 이메일 - 문자열
  • 위치 - 문자열
  • 부서 - 문자열
컬럼 타입은 주어진 컬럼이 어떤 종류의 데이터를 저장할 수 있는지를 나타내는 특성입니다.

우선 MS SQL에서 사용되는 다음 기본 데이터 유형만 기억하면 됩니다.

의미 MS SQL 표기법 설명
가변 길이 문자열 varchar (N)
그리고
nvarchar (N)
숫자 N을 사용하여 해당 열에 대해 가능한 최대 행 길이를 지정할 수 있습니다. 예를 들어, "name" 열의 값이 최대 30자를 포함할 수 있다고 말하고 싶다면 이를 nvarchar(30) 유형으로 설정해야 합니다.
varchar와 nvarchar의 차이점은 varchar는 한 문자가 1바이트인 ASCII 형식으로 문자열을 저장하는 반면 nvarchar는 각 문자가 2바이트인 유니코드 형식으로 문자열을 저장한다는 것입니다.
varchar 유형은 필드에 유니코드 문자를 저장할 필요가 없다고 100% 확신하는 경우에만 사용해야 합니다. 예를 들어 varchar를 사용하여 이메일 주소를 저장할 수 있습니다. 일반적으로 ASCII 문자만 포함합니다.
고정 길이 문자열 문자(N)
그리고
엔차(N)
이 유형은 문자열의 길이가 N자 미만인 경우 항상 공백으로 N 길이의 오른쪽으로 채워지고 이 형식으로 데이터베이스에 저장된다는 점에서 가변 길이 문자열과 다릅니다. 데이터베이스에서 정확히 N개의 문자를 차지합니다(여기서 한 문자는 char의 경우 1바이트, nchar의 경우 2바이트). 실제로 이 유형은 거의 사용되지 않으며, 사용하게 되면 주로 char(1) 형식으로 사용됩니다. 필드가 하나의 문자로 정의된 경우.
정수 정수 이 유형을 사용하면 열에 양수와 음수 모두 정수만 사용할 수 있습니다. 참고로(이제 우리와 관련이 없습니다) - int 유형이 허용하는 숫자 범위는 -2 147 483 648에서 2 147 483 647 사이입니다. 일반적으로 이것은 식별자를 설정하는 데 사용되는 기본 유형입니다.
실수 또는 실수 뜨다 간단히 말해서 소수점(쉼표)이 있을 수 있는 숫자입니다.
데이트 데이트 숫자, 월, 연도의 세 가지 구성 요소로 구성된 열에 날짜만 저장해야 하는 경우. 예: 2014년 2월 15일(2014년 2월 15일). 이 유형은 "입원일", "생년월일" 등의 열에 사용할 수 있습니다. 날짜만 수정하는 것이 중요한 경우 또는 시간 구성 요소가 중요하지 않아 폐기할 수 있는 경우 또는 알 수 없는 경우.
시간 시각 이 유형은 시간 데이터만 열에 저장해야 하는 경우 사용할 수 있습니다. 시간, 분, 초 및 밀리초. 예: 17:38: 31.3231603
예를 들어 매일 "항공편 출발 시간"입니다.
날짜와 시간 날짜 시간 이 유형을 사용하면 날짜와 시간을 동시에 저장할 수 있습니다. 예: 15.02.2014 17:38: 31.323
예를 들어 이벤트의 날짜와 시간이 될 수 있습니다.
깃발 조금 이 유형은 "예" / "아니오"와 같은 값을 저장하는 데 편리합니다. 여기서 "예"는 1로 저장되고 "아니오"는 0으로 저장됩니다.

또한 필드 값이 금지되지 않은 경우 지정되지 않을 수 있으며 이를 위해 NULL 키워드가 사용됩니다.

예제를 실행하기 위해 Test라는 테스트 기반을 만들어 보겠습니다.

다음 명령을 실행하여 간단한 데이터베이스(추가 매개변수를 지정하지 않음)를 만들 수 있습니다.

데이터베이스 만들기 테스트
다음 명령을 사용하여 데이터베이스를 삭제할 수 있습니다(이 명령에 매우 주의해야 함).

DROP 데이터베이스 테스트
데이터베이스로 전환하려면 다음 명령을 실행할 수 있습니다.

사용 테스트
또는 SSMS 메뉴 영역의 드롭다운 목록에서 테스트 데이터베이스를 선택합니다. 작업할 때 기지 사이를 전환하는 이 방법을 자주 사용합니다.

이제 데이터베이스에서 공백과 키릴 문자를 사용하여 설명을 있는 그대로 사용하여 테이블을 만들 수 있습니다.

CREATE TABLE [직원] ([인사] int, [이름] nvarchar(30), [생년월일] date, nvarchar(30), [직위] nvarchar(30), [부서] nvarchar(30))
이 경우 이름을 대괄호 [...]로 묶어야 합니다.

그러나 데이터베이스에서는 편의를 위해 모든 개체 이름을 라틴 알파벳으로 지정하고 이름에 공백을 사용하지 않는 것이 좋습니다. MS SQL에서 일반적으로 이 경우 각 단어는 대문자로 시작합니다. 예를 들어 "인사 번호" 필드의 경우 이름을 PersonnelNumber로 설정할 수 있습니다. PhoneNumber1과 같이 이름에 숫자를 사용할 수도 있습니다.

메모에
일부 DBMS에서는 다음과 같은 명명 형식 "PHONE_NUMBER"가 더 바람직할 수 있습니다. 예를 들어 이 형식은 ORACLE DB에서 자주 사용됩니다. 당연히 필드명을 지정할 때 DBMS에서 사용하는 키워드와 일치하지 않는 것이 바람직하다.

이러한 이유로 대괄호 구문을 잊어버리고 [Employees] 테이블을 삭제할 수 있습니다.

DROP TABLE [직원]
예를 들어 직원이 있는 테이블의 이름은 "Employees"로 지정할 수 있고 해당 필드의 이름은 다음과 같이 지정할 수 있습니다.

  • ID - 인사번호(직원 ID)
  • 이름 - 전체 이름
  • 생일 - 생년월일
  • 이메일 - 이메일
  • 직위 - 직위
  • 부서 - 부서
매우 자주 ID라는 단어는 식별자 필드의 이름을 지정하는 데 사용됩니다.

이제 테이블을 생성해 보겠습니다.

CREATE TABLE 직원(ID int, 이름 nvarchar(30), 생일 날짜, 이메일 nvarchar(30), 직위 nvarchar(30), 부서 nvarchar(30))
NOT NULL 옵션을 사용하여 필수 열을 지정할 수 있습니다.

기존 테이블의 경우 다음 명령을 사용하여 필드를 재정의할 수 있습니다.

ID 필드 업데이트 ALTER TABLE 직원 ALTER COLUMN ID int NOT NULL - 이름 필드 업데이트 ALTER TABLE 직원 ALTER COLUMN 이름 nvarchar (30) NOT NULL

메모에
대부분의 DBMS에 대한 SQL 언어의 일반적인 개념은 동일하게 유지됩니다(적어도 내가 작업한 DBMS에 의해 이를 판단할 수 있음). 다른 DBMS에서 DDL의 차이점은 주로 데이터 유형에 있으며(여기서는 이름뿐 아니라 구현 세부 사항도 다를 수 있음) SQL 언어 구현의 세부 사항도 약간 다를 수 있습니다(즉, 명령은 동일하지만 방언에 약간의 차이가있을 수 있습니다. 아아, 그러나 하나의 표준은 없습니다). SQL의 기본 사항을 알면 한 DBMS에서 다른 DBMS로 쉽게 전환할 수 있습니다. 이 경우 새 DBMS에서 명령 구현의 세부 사항만 이해하면 됩니다. 대부분의 경우 간단한 비유로 충분합니다.

테이블 생성 CREATE TABLE 직원(ID int, - ORACLE에서 int 유형은 number(38)에 해당하는(래퍼) 이름 nvarchar2(30), - ORACLE의 nvarchar2는 MS SQL의 nvarchar와 동일합니다. 생일 날짜, 이메일 nvarchar2(30) ), 위치 nvarchar2(30), 부서 nvarchar2(30)); - ID 및 이름 필드 업데이트(여기서 MODIFY(...)는 ALTER COLUMN 대신 사용됨) ALTER TABLE Employees MODIFY(ID int NOT NULL, Name nvarchar2(30) NOT NULL); - PK 추가(이 경우 구성은 MS SQL과 같으며 아래에 표시됩니다.) ALTER TABLE Employees ADD CONSTRAINT PK_Employees PRIMARY KEY(ID);
ORACLE의 경우 varchar2 유형의 구현 측면에서 차이점이 있으며 해당 인코딩은 데이터베이스 설정에 따라 다르며 텍스트는 예를 들어 UTF-8 인코딩으로 저장할 수 있습니다. 또한 ORACLE의 필드 길이는 바이트와 문자로 모두 설정할 수 있습니다. 이 추가 옵션에는 필드 길이 뒤에 지정되는 BYTE 및 CHAR가 사용됩니다. 예를 들면 다음과 같습니다.

NAME varchar2(30 BYTE) - 필드 용량은 30바이트입니다. NAME varchar2(30 CHAR) - 필드 용량은 30자입니다.
ORACLE에서 varchar2(30) 유형을 단순 표시하는 경우 기본적으로 BYTE 또는 CHAR로 사용되는 옵션은 데이터베이스 설정에 따라 다르며 때로는 IDE 설정에서도 설정할 수 있습니다. 일반적으로 때로는 쉽게 혼동될 수 있으므로 ORACLE의 경우 varchar2 유형이 사용되는 경우(예: UTF-8 인코딩을 사용할 때 여기에서 정당화되는 경우가 있음), 명시적으로 CHAR( 일반적으로 문자열의 길이를 문자로 읽는 것이 더 편리하기 때문입니다).

그러나 이 경우 테이블에 이미 일부 데이터가 포함된 경우 명령을 성공적으로 실행하려면 테이블의 모든 행에 있는 ID 및 이름 필드를 채워야 합니다. 예를 들어 이를 보여주고 ID, 직책 및 부서 필드의 테이블에 데이터를 삽입합니다. 이 작업은 다음 스크립트로 수행할 수 있습니다.

INSERT 직원(ID, 직위, 부서) VALUES (1000, N "이사", N "관리"), (1001, N "프로그래머", N "IT"), (1002, N "회계사", N "회계") ), (1003, N "선임 프로그래머", N "IT")
이 경우 INSERT 명령도 오류를 생성합니다. 삽입할 때 필수 이름 필드의 값을 지정하지 않았습니다.
원래 테이블에 이 데이터가 이미 있는 경우 "ALTER TABLE Employees ALTER COLUMN ID int NOT NULL" 명령이 성공적으로 완료되고 "ALTER TABLE Employees ALTER COLUMN Name int NOT NULL" 명령이 오류 메시지를 생성했을 것입니다. , Name 필드에 NULL(지정되지 않은) 값이 있음을 나타냅니다.

이름 필드에 값을 추가하고 데이터를 다시 입력합니다.


또한 NOT NULL 옵션은 새 테이블을 생성할 때 직접 사용할 수 있습니다. CREATE TABLE 명령의 컨텍스트에서.

먼저 다음 명령을 사용하여 테이블을 삭제해 보겠습니다.

DROP TABLE 직원
이제 필수 열 ID 및 이름이 있는 테이블을 생성해 보겠습니다.

CREATE TABLE 직원(ID int NOT NULL, 이름 nvarchar(30) NOT NULL, 생일 날짜, 이메일 nvarchar(30), 직위 nvarchar(30), 부서 nvarchar(30))
열 이름 뒤에 NULL을 쓸 수도 있습니다. 즉, NULL 값(지정되지 않음)이 허용되지만 이 특성이 기본적으로 가정되기 때문에 필요하지 않습니다.

반대로 채우기 위해 기존 열을 선택 사항으로 만들어야 하는 경우 다음 명령 구문을 사용합니다.

ALTER TABLE 직원 ALTER COLUMN 이름 nvarchar (30) NULL
또는 간단히:

ALTER TABLE 직원 ALTER COLUMN 이름 nvarchar (30)
또한 이 명령을 사용하여 필드 유형을 다른 호환 가능한 유형으로 변경하거나 길이를 변경할 수 있습니다. 예를 들어 이름 필드를 50자로 확장해 보겠습니다.

ALTER TABLE 직원 ALTER COLUMN 이름 nvarchar (50)

기본 키

테이블을 생성할 때 각 행에 대해 고유한 고유한 열 또는 열 집합이 있는 것이 바람직합니다. 레코드는 이 고유한 값으로 고유하게 식별될 수 있습니다. 이 값을 테이블의 기본 키라고 합니다. 직원 테이블의 경우 이러한 고유 값은 ID 열("직원 직원 번호" 포함 - 우리의 경우 이 값이 각 직원에 대해 고유하고 반복할 수 없는 경우에도 마찬가지임)이 될 수 있습니다.

다음 명령을 사용하여 기존 테이블에 대한 기본 키를 만들 수 있습니다.

ALTER TABLE 직원 ADD CONSTRAINT PK_Employees 기본 키(ID)
여기서 "PK_Employees"는 기본 키를 담당하는 제약 조건의 이름입니다. 일반적으로 "PK_" 접두사는 기본 키의 이름을 지정하는 데 사용되며 그 뒤에 테이블 이름이 옵니다.

기본 키가 여러 필드로 구성된 경우 이러한 필드는 쉼표로 구분하여 괄호 안에 나열해야 합니다.

ALTER TABLE table_name ADD CONSTRAINT 제약_이름 PRIMARY KEY(field1, field2, ...)
MS SQL에서 기본 키에 포함된 모든 필드는 NOT NULL이어야 합니다.

또한 기본 키는 테이블을 생성할 때 직접 결정할 수 있습니다. CREATE TABLE 명령의 컨텍스트에서. 테이블을 삭제해 보겠습니다.

DROP TABLE 직원
그런 다음 다음 구문을 사용하여 생성해 보겠습니다.

CREATE TABLE 직원(ID int NOT NULL, 이름 nvarchar(30) NOT NULL, 생일 날짜, 이메일 nvarchar(30), 직위 nvarchar(30), 부서 nvarchar(30), CONSTRAINT PK_Employees 기본 키(ID) - 결국 PK를 설명합니다. 필드 제한)
생성 후 테이블에 데이터를 입력합니다.

INSERT 직원(ID, 직책, 부서, 이름) VALUES(1000, N "감독", N "관리", N "Ivanov I.I."), (1001, N "프로그래머", N "IT", N " Petrov PP " ), (1002, N" 회계사 ", N" 회계 ", N" Sidorov SS "), (1003, N" 수석 프로그래머 ", N" IT ", N" Andreev A. A.")
테이블의 기본 키가 한 열의 값으로만 ​​구성된 경우 다음 구문을 사용할 수 있습니다.

CREATE TABLE 직원(ID int NOT NULL CONSTRAINT PK_Employees PRIMARY KEY, - 필드의 특성으로 지정 이름 nvarchar(30) NOT NULL, 생일 날짜, 이메일 nvarchar(30), 직위 nvarchar(30), 부서 nvarchar(30))
사실 제약 조건의 이름은 생략할 수 있으며, 이 경우 시스템 이름이 할당됩니다(예: "PK__Employee__3214EC278DA42077").

CREATE TABLE 직원(ID int NOT NULL, 이름 nvarchar(30) NOT NULL, 생일 날짜, 이메일 nvarchar(30), 직위 nvarchar(30), 부서 nvarchar(30), PRIMARY KEY(ID))
또는:

CREATE TABLE 직원(ID int NOT NULL 기본 키, 이름 nvarchar(30) NOT NULL, 생일 날짜, 이메일 nvarchar(30), 직위 nvarchar(30), 부서 nvarchar(30))
그러나 영구 테이블에 대한 제약 이름을 항상 명시적으로 지정하는 것이 좋습니다. 명시적으로 지정되고 이해할 수 있는 이름으로 지정하면 나중에 조작하기가 더 쉬워집니다. 예를 들어 삭제할 수 있습니다.

ALTER TABLE 직원 DROP CONSTRAINT PK_Employees
그러나 이러한 짧은 구문은 제한 이름을 지정하지 않고 사용 후 삭제되는 임시 데이터베이스 테이블(임시 테이블 이름이 # 또는 ##로 시작)을 생성할 때 사용하는 것이 편리합니다.

요약하자면

지금까지 다음 명령에 대해 살펴보았습니다.
  • 테이블 생성 table_name(필드 및 해당 유형의 열거, 제한 사항) - 현재 데이터베이스에 새 테이블을 만드는 데 사용됩니다.
  • 드롭 테이블 table_name - 현재 데이터베이스에서 테이블을 삭제하는 역할을 합니다.
  • 테이블 변경 table_name 컬럼 변경 column_name… - 열 유형을 업데이트하거나 해당 설정을 변경하는 데 사용됩니다(예: NULL 또는 NOT NULL 특성 지정).
  • 테이블 변경 table_name 제약 조건 추가제약 이름 기본 키(field1, field2, ...) - 기존 테이블에 기본 키를 추가합니다.
  • 테이블 변경 table_name 제약 조건 삭제 constraint_name - 테이블에서 제약 조건을 제거합니다.

임시 테이블에 대해 조금

MSDN에서 발췌. MS SQL Server에는 로컬(#)과 글로벌(##)의 두 가지 유형의 임시 테이블이 있습니다. 로컬 임시 테이블은 처음 생성되는 즉시 SQL Server 인스턴스에 대한 연결이 종료될 때까지 생성자에게만 표시됩니다. 사용자가 SQL Server 인스턴스에서 연결을 끊으면 로컬 임시 테이블이 자동으로 삭제됩니다. 전역 임시 테이블은 이러한 테이블이 생성된 후 연결 세션 동안 모든 사용자가 볼 수 있으며 이러한 테이블을 참조하는 모든 사용자가 SQL Server 인스턴스에서 연결을 끊으면 삭제됩니다.

임시 테이블은 tempdb 시스템 데이터베이스에 생성됩니다. 그것들을 생성함으로써 우리는 기본 기반을 어지럽히지 않습니다. 그렇지 않으면 임시 테이블은 일반 테이블과 완전히 동일하며 DROP TABLE 명령을 사용하여 삭제할 수도 있습니다. 로컬(#) 임시 테이블이 더 일반적으로 사용됩니다.

CREATE TABLE 명령을 사용하여 임시 테이블을 생성할 수 있습니다.

CREATE TABLE #Temp(ID int, 이름 nvarchar(30))
MS SQL의 임시 테이블은 일반 테이블과 유사하므로 DROP TABLE 명령을 사용하여 직접 삭제할 수도 있습니다.

DROP TABLE #Temp

또한 SELECT ... INTO 구문을 사용하여 임시 테이블(일반 테이블 자체와 같은)을 만들고 쿼리에서 반환된 데이터로 즉시 채울 수 있습니다.

SELECT ID, 이름 INTO #Temp FROM 직원

메모에
임시 테이블의 구현은 DBMS마다 다를 수 있습니다. 예를 들어, ORACLE 및 Firebird DBMS에서 임시 테이블의 구조는 데이터 저장의 세부 사항을 나타내는 CREATE GLOBAL TEMPORARY TABLE 명령으로 미리 정의되어 있어야 하며, 사용자는 기본 테이블 중에서 이를 보고 다음과 같이 작업할 수 있습니다. 일반 테이블과 함께.

데이터베이스 정규화 - 하위 테이블(참조 도서)로 분할 및 관계 정의

현재 직원 테이블은 직위 및 부서 필드에 사용자가 주로 오류가 많은 텍스트를 입력할 수 있다는 단점이 있습니다. 한 직원은 단순히 "IT"를 부서로 지정하고 두 번째 직원은 예를 들어 , 세 번째 "IT"에서 "IT 부서"를 입력합니다. 결과적으로 사용자가 의미한 바가 명확하지 않습니다. 이 직원들은 같은 부서의 직원입니까, 아니면 사용자가 자신에 대해 설명하고 3개의 다른 부서에 속하는 직원입니까? 또한 이 경우 각 부서의 컨텍스트에서 직원 수를 표시해야 하는 일부 보고서의 데이터를 올바르게 그룹화할 수 없습니다.

두 번째 단점은 이 정보의 저장 용량과 중복입니다. 각 직원에 대해 부서의 전체 이름이 표시되며 부서 이름의 각 문자를 저장하려면 데이터베이스에 공간이 필요합니다.

세 번째 단점은 예를 들어 "프로그래머"라는 직책의 이름을 "주니어 프로그래머"로 변경해야 하는 경우와 같이 직위의 제목이 변경되는 경우 이러한 필드를 업데이트하는 복잡성입니다. 이 경우 위치가 "프로그래머"와 동일한 테이블의 각 행을 변경해야 합니다.

이러한 단점을 피하기 위해 데이터베이스의 소위 정규화가 적용되어 하위 테이블, 참조 테이블로 분할됩니다. 이론의 정글에 들어가서 정규형이 무엇인지 공부할 필요는 없으며 정규화의 본질을 이해하면 충분합니다.

2개의 테이블 "Positions" 및 "Departments"를 생성해 보겠습니다. 첫 번째 테이블은 Positions, 두 번째 테이블은 각각 ​​Departments입니다.

CREATE TABLE 위치(ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Positions PRIMARY KEY, 이름 nvarchar(30) NOT NULL) CREATE TABLE 부서(ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Departments PRIMARY KEY, Name0n ) NULL이 아님)
여기서 우리는 ID 열의 데이터가 1부터 1단계, 즉 1단계로 자동으로 번호가 매겨진다는 새로운 IDENTITY 옵션을 사용했습니다. 새 레코드를 추가할 때 1, 2, 3 등의 값이 순차적으로 할당됩니다. 이러한 필드를 일반적으로 자동 증분이라고 합니다. IDENTITY 속성이 있는 하나의 필드만 테이블에 정의할 수 있으며 일반적으로 이러한 필드는 반드시 그런 것은 아니지만 해당 테이블의 기본 키입니다.

메모에
다른 DBMS에서 카운터가 있는 필드의 구현은 고유한 방식으로 수행될 수 있습니다. 예를 들어 MySQL에서 이러한 필드는 AUTO_INCREMENT 옵션을 사용하여 정의됩니다. 이전의 ORACLE 및 Firebird에서 이 기능은 SEQUENCE를 사용하여 에뮬레이트될 수 있었습니다. 그러나 내가 아는 한 ORACLE은 이제 GENERATED AS IDENTITY 옵션을 추가했습니다.

직원 테이블의 직책 및 부서 필드에 기록된 현재 데이터를 기반으로 이 테이블을 자동으로 채우겠습니다.

직원 테이블의 위치 필드에서 고유 값으로 위치 테이블의 이름 필드 채우기 INSERT Positions (Name) SELECT DISTINCT Position FROM Employees WHERE Position IS NOT NULL - 위치가 지정되지 않은 레코드 삭제
Department 테이블에 대해서도 동일한 작업을 수행해 보겠습니다.

부서 삽입(이름) SELECT DISTINCT 부서 FROM 직원 WHERE 부서가 NULL이 아님
이제 Positions 및 Departments 테이블을 열면 ID 필드에 대해 번호가 매겨진 값 세트가 표시됩니다.

SELECT * FROM 위치

SELECT * FROM 부서

이 표는 이제 직책과 부서를 지정하기 위한 참고서의 역할을 합니다. 이제 작업 및 부서 ID를 참조합니다. 우선, 식별자 데이터를 저장하기 위해 Employees 테이블에 새 필드를 만들어 보겠습니다.

위치 ID에 대한 필드 추가 ALTER TABLE Employees ADD PositionID int - 부서 ID에 대한 필드 추가 ALTER TABLE Employees ADD DepartmentID int
참조 필드의 유형은 참조와 동일해야 하며 이 경우 int입니다.

또한 하나의 명령으로 테이블에 여러 필드를 한 번에 추가할 수 있으며 필드를 쉼표로 구분하여 나열할 수 있습니다.

ALTER TABLE 직원 ADD PositionID int, DepartmentID int
이제 이 필드에 대한 링크(참조 제약 조건 - FOREIGN KEY)를 작성하여 사용자가 참조 책에 있는 ID 값 중 없는 값을 이 필드에 쓸 수 없도록 합니다.

ALTER TABLE 직원 ADD CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES 직책(ID)
그리고 두 번째 필드에 대해서도 동일한 작업을 수행합니다.

ALTER TABLE 직원 ADD CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(DepartmentID) REFERENCES 부서(ID)
이제 사용자는 해당 디렉토리의 ID 값만 이 필드에 입력할 수 있습니다. 따라서 새 부서나 직위를 사용하려면 먼저 해당 디렉토리에 새 레코드를 추가해야 합니다. 왜냐하면 위치 및 부서는 이제 하나의 단일 사본으로 디렉토리에 저장되며 이름을 변경하려면 디렉토리에서만 변경하면 됩니다.

참조 제약 조건의 이름은 일반적으로 복합 이름이며 접두사 "FK_"로 구성되며 테이블 이름이 뒤에 오고 밑줄 뒤에 참조 테이블의 식별자를 참조하는 필드 이름이 있습니다.

식별자(ID)는 일반적으로 링크에만 사용되는 내부 값이며 거기에 저장되는 값은 대부분의 경우 절대적으로 무관하므로 발생하는 숫자 시퀀스에서 구멍을 제거하려고 할 필요가 없습니다. 예를 들어 참조 도서에서 레코드를 삭제한 후 테이블 작업 중.

ALTER TABLE 테이블 ADD CONSTRAINT 제약 조건_이름 FOREIGN KEY(field1, field2, ...) REFERENCES reference_table(field1, field2, ...)
이 경우 "dir_table" 테이블에서 기본 키는 여러 필드(field1, field2, ...)의 조합으로 표시됩니다.

실제로, 이제 디렉터리의 ID 값으로 PositionID 및 DepartmentID 필드를 업데이트해 보겠습니다. 이를 위해 DML UPDATE 명령을 사용하겠습니다.

UPDATE e SET PositionID = (SELECT ID FROM Positions WHERE Name = e.Position), DepartmentID = (SELECT ID FROM Departments WHERE Name = e.Department) FROM 직원 e
쿼리를 실행하여 어떤 일이 발생했는지 봅시다.

SELECT * FROM 직원

즉, PositionID 및 DepartmentID 필드는 직원 테이블의 Position 및 Department 필드가 필요하지 않은 식별자가 있는 직책 및 부서에 해당하여 채워집니다. 다음 필드를 삭제할 수 있습니다.

ALTER TABLE 직원 DROP COLUMN 직위, 부서
이제 테이블은 다음 형식을 얻었습니다.

SELECT * FROM 직원

ID 이름 생일 이메일 위치ID 부서ID
1000 이바노프 I.I. 없는 없는 2 1
1001 페트로프 P.P. 없는 없는 3 3
1002 시도로프 S.S. 없는 없는 1 2
1003 Andreev A.A. 없는 없는 4 3

저것들. 결과적으로 우리는 중복 정보의 저장을 없앴습니다. 이제 직책 및 부서 번호로 참조 테이블의 값을 사용하여 이름을 고유하게 결정할 수 있습니다.

SELECT e.ID, e.Name, p.Name PositionName, d.Name DepartmentName FROM 직원 e LEFT JOIN 부서 d ON d.ID = e.DepartmentID LEFT JOIN 직위 p ON p.ID = e.PositionID

개체 검사기에서 이 테이블에 대해 생성된 모든 개체를 볼 수 있습니다. 여기에서 이러한 개체로 다양한 조작을 수행할 수 있습니다(예: 개체 이름 바꾸기 또는 삭제).

테이블이 자신을 참조할 수 있다는 점도 주목할 가치가 있습니다. 재귀 링크를 만들 수 있습니다. 예를 들어 직원이 있는 테이블에 다른 ManagerID 필드를 추가해 보겠습니다. 이 필드는 이 직원이 종속된 직원을 가리킵니다. 필드를 생성해 보겠습니다.

ALTER TABLE 직원 ADD ManagerID int
이 필드에는 NULL이 허용되며, 예를 들어 직원 위에 상사가 없는 경우 필드는 비어 있습니다.

이제 Employees 테이블에 FOREIGN KEY를 생성해 보겠습니다.

ALTER TABLE 직원 ADD CONSTRAINT FK_Employees_ManagerID FOREIGN KEY(ManagerID) REFERENCES 직원(ID)
이제 다이어그램을 만들고 테이블 간의 관계가 어떻게 보이는지 살펴보겠습니다.

결과적으로 다음 그림이 표시되어야 합니다(Employees 테이블은 Position 및 Depertments 테이블에 연결되어 있으며 자신을 참조하기도 함).

마지막으로 참조 키에는 참조 테이블에서 참조하는 레코드를 삭제하거나 업데이트할 때 동작하는 방법을 알려주는 ON DELETE CASCADE 및 ON UPDATE CASCADE 추가 옵션이 포함될 수 있습니다. 이러한 옵션이 지정되지 않으면 다른 테이블의 링크가 있는 레코드에 대한 참조 테이블의 ID를 변경할 수 없으며 참조하는 모든 행을 삭제할 때까지 참조에서 해당 레코드를 삭제할 수 없습니다. 이 레코드를 업데이트하거나 이 줄의 링크를 다른 값으로 업데이트합니다.

예를 들어 FK_Employees_DepartmentID에 대해 ON DELETE CASCADE 옵션을 사용하여 테이블을 다시 생성해 보겠습니다.

DROP TABLE 직원 CREATE TABLE 직원(ID int NOT NULL, 이름 nvarchar(30), 생일 날짜, 이메일 nvarchar(30), PositionID int, DepartmentID int, ManagerID int, CONSTRAINT PK_Employees 기본 키(ID), CONSTRAINT FK_Employees_DepartmentID FOREIGN ) REFERENCES 부서(ID) ON DELETE CASCADE, CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Positions(ID), CONSTRAINT FK_Employees_ManagerID FOREIGN KEY(ManagerID) REFERENCES Positions ID(ID), EmploySERT Name "19550219", 2,1, NULL), (1001, N "Petrov PP", "19831203", 3,3,1003), (1002, N "Sidorov SS", "19760607", 1,2,1000) , (1003, N "Andreev AA", "19820417", 4,3,1000)
Departments 테이블에서 ID가 3인 부서를 삭제해 보겠습니다.

ID = 3인 부서 삭제
직원 테이블의 데이터를 살펴보겠습니다.

SELECT * FROM 직원

ID 이름 생일 이메일 위치ID 부서ID 관리자 ID
1000 이바노프 I.I. 1955-02-19 없는 2 1 없는
1002 시도로프 S.S. 1976-06-07 없는 1 2 1000

보시다시피 부서 3의 데이터도 직원 테이블에서 삭제되었습니다.

ON UPDATE CASCADE 옵션은 유사하게 작동하지만 조회의 ID 값이 업데이트될 때 작동합니다. 예를 들어 작업 디렉터리에서 위치 ID를 변경하면 직원 테이블의 DepartmentID가 디렉터리에서 지정한 새 ID 값으로 업데이트됩니다. 그러나 이 경우에는 단순히 이것을 입증하는 것이 불가능할 것입니다. 왜냐하면 Departments 테이블의 ID 열에는 IDENTITY 옵션이 있어 다음 요청을 실행할 수 없습니다(부서 ID 3을 30으로 변경).

업데이트 부서 SET ID = 30 WHERE ID = 3
가장 중요한 것은 ON DELETE CASCADE 및 ON UPDATE CASCADE 2가지 옵션의 본질을 이해하는 것입니다. 나는 매우 드물게 이러한 옵션을 사용하며 참조 제약 조건에서 사용하기 전에 신중하게 생각하는 것이 좋습니다. 실수로 조회 테이블에서 레코드를 삭제하면 큰 문제가 발생하고 연쇄 반응이 발생할 수 있습니다.

부서 3을 복원합시다.

IDENTITY 값 추가/변경 권한 부여 SET IDENTITY_INSERT Departments ON INSERT Departments (ID, Name) VALUES (3, N "IT") - IDENTITY 값 추가/변경 금지 SET IDENTITY_INSERT Departments OFF
TRUNCATE TABLE 명령을 사용하여 Employees 테이블을 완전히 정리합시다.

TRUNCATE TABLE 직원
그리고 다시 이전 INSERT 명령을 사용하여 데이터를 다시 로드합니다.

INSERT 직원(ID, 이름, 생일, PositionID, DepartmentID, ManagerID) VALUES(1000, N "Ivanov I.I.", "19550219", 2,1, NULL), (1001, N "Petrov P.P." , "19831203", 3 ,3,1003), (1002, N "Sidorov SS", "19760607", 1,2,1000), (1003, N "Andreev AA", "19820417", 4,3,1000)

요약하자면

현재 몇 가지 DDL 명령이 우리 지식에 추가되었습니다.
  • 필드에 IDENTITY 속성 추가 - 이 필드를 테이블에 대해 자동으로 채워지도록(카운터 필드) 만들 수 있습니다.
  • 테이블 변경 table_name 추가하다 list_of_fields_with_characteristics - 테이블에 새 필드를 추가할 수 있습니다.
  • 테이블 변경 table_name 칼럼 삭제 list_of_field - 테이블에서 필드를 삭제할 수 있습니다.
  • 테이블 변경 table_name 제약 조건 추가제약 이름 외래 키(필드) 참조 reference_table(필드) - 테이블과 참조 테이블 간의 관계를 정의할 수 있습니다.

기타 제한 사항 - UNIQUE, DEFAULT, CHECK

UNIQUE 제약 조건을 사용하면 지정된 필드 또는 필드 집합의 각 행에 대한 값이 고유해야 한다고 말할 수 있습니다. 직원 테이블의 경우 이메일 필드에 이러한 제한을 부과할 수 있습니다. 값이 아직 정의되지 않은 경우 이메일에 값을 미리 채우세요.

직원 SET 이메일 업데이트 = " [이메일 보호됨]"WHERE ID = 1000 업데이트 직원 SET 이메일 =" [이메일 보호됨]"WHERE ID = 1001 업데이트 직원 SET 이메일 =" [이메일 보호됨]"WHERE ID = 1002 업데이트 직원 SET 이메일 =" [이메일 보호됨]"위치 ID = 1003
이제 이 필드에 고유성 제약을 부과할 수 있습니다.

ALTER TABLE 직원 ADD CONSTRAINT UQ_Employees_Email UNIQUE(이메일)
이제 사용자는 여러 직원에 대해 동일한 이메일을 입력할 수 없습니다.

고유성 제약 조건은 일반적으로 다음과 같이 이름이 지정됩니다. 먼저 접두사 "UQ_"가 오고 그 다음 테이블 이름이 오고 밑줄 다음에 이 제약 조건이 적용되는 필드 이름이 옵니다.

따라서 필드 조합이 테이블 행의 컨텍스트에서 고유해야 하는 경우 쉼표로 구분하여 나열합니다.

ALTER TABLE 테이블 이름 ADD CONSTRAINT 제약 이름 UNIQUE(필드1, 필드2, ...)
필드에 DEFAULT 제약 조건을 추가하여 새 레코드를 삽입할 때 이 필드가 INSERT 명령의 필드 목록에 나열되지 않는 경우 대체될 기본값을 설정할 수 있습니다. 이 제한은 테이블을 생성할 때 직접 설정할 수 있습니다.

직원 테이블에 새 약속 날짜 필드를 추가하고 이름을 HireDate로 지정하고 이 필드의 기본값이 현재 날짜라고 가정하겠습니다.

ALTER TABLE 직원 ADD HireDate 날짜 NOT NULL DEFAULT SYSDATETIME()
또는 HireDate 열이 이미 있는 경우 다음 구문을 사용할 수 있습니다.

ALTER TABLE 직원은 HireDate에 대해 DEFAULT SYSDATETIME()을 추가합니다.
여기에서는 제약 조건의 이름을 지정하지 않았습니다. DEFAULT의 경우 이것이 그렇게 중요하지 않다고 생각했습니다. 하지만 화기애애하게 하면 게으르지 않고 평범한 이름을 지어야 한다고 생각합니다. 이것은 다음과 같이 수행됩니다.

ALTER TABLE 직원 ADD CONSTRAINT DF_Employees_HireDate DEFAULT SYSDATETIME() FOR HireDate
이 열은 이전에 존재하지 않았기 때문에 각 레코드에 추가될 때 현재 날짜 값이 HireDate 필드에 삽입됩니다.

새 레코드를 추가할 때 명시적으로 설정하지 않으면 현재 날짜도 자동으로 삽입됩니다. 열 목록에 지정되지 않습니다. 추가된 값 목록에서 HireDate 필드를 지정하지 않고 예를 들어 이를 보여드리겠습니다.

INSERT 직원(ID, 이름, 이메일) VALUES(1004, N "Sergeev S.S.", " [이메일 보호됨]")
무슨 일이 있었는지 보자:

SELECT * FROM 직원

ID 이름 생일 이메일 위치ID 부서ID 관리자 ID 고용 날짜
1000 이바노프 I.I. 1955-02-19 [이메일 보호됨] 2 1 없는 2015-04-08
1001 페트로프 P.P. 1983-12-03 [이메일 보호됨] 3 4 1003 2015-04-08
1002 시도로프 S.S. 1976-06-07 [이메일 보호됨] 1 2 1000 2015-04-08
1003 Andreev A.A. 1982-04-17 [이메일 보호됨] 4 3 1000 2015-04-08
1004 세르게예프 S.S. 없는 [이메일 보호됨] 없는 없는 없는 2015-04-08

CHECK 제약 조건은 필드에 삽입된 값을 확인해야 할 때 사용됩니다. 예를 들어 직원의 ID(식별자)인 직원 번호 필드에 이 제한을 적용해 보겠습니다. 이 제약 조건을 사용하여 직원 수는 1000에서 1999 사이의 값을 가져야 한다고 가정해 보겠습니다.

ALTER TABLE 직원 ADD CONSTRAINT CK_Employees_ID CHECK(ID BETWEEN 1000 AND 1999)
제약 조건의 이름은 일반적으로 동일하며 먼저 접두사 "CK_"가 오고 그 다음 테이블 이름과 이 제약 조건이 적용되는 필드 이름이 옵니다.

제약 조건이 작동하는지 확인하기 위해 잘못된 항목을 삽입해 보겠습니다(해당 오류가 표시되어야 함).

INSERT 직원(ID, 이메일) VALUES(2000, " [이메일 보호됨]")
이제 삽입된 값을 1500으로 변경하고 레코드가 삽입되었는지 확인합니다.

INSERT 직원(ID, 이메일) VALUES(1500, " [이메일 보호됨]")
이름을 지정하지 않고 UNIQUE 및 CHECK 제약 조건을 만들 수도 있습니다.

ALTER TABLE 직원 ADD UNIQUE(이메일) ALTER TABLE 직원 ADD CHECK(ID BETWEEN 1000 AND 1999)
그러나 이것은 좋은 방법이 아니며 제약 조건의 이름을 명시적으로 지정하는 것이 좋습니다. 나중에 알아내려면 더 어려울 것입니다. 개체를 열어서 무엇을 담당하는지 확인해야 합니다.

좋은 이름을 사용하면 제한에 대한 많은 정보를 이름으로 직접 인식할 수 있습니다.

따라서 이러한 모든 제한 사항은 테이블을 생성할 때 이미 존재하지 않는 경우 즉시 생성할 수 있습니다. 테이블을 삭제해 보겠습니다.

DROP TABLE 직원
그리고 하나의 CREATE TABLE 명령으로 생성된 모든 제한 사항을 사용하여 이를 다시 생성합니다.

CREATE TABLE 직원(ID int NOT NULL, 이름 nvarchar(30), 생일 날짜, 이메일 nvarchar(30), PositionID int, DepartmentID int, HireDate 날짜 NOT NULL DEFAULT SYSDATETIME(), - DEFAULT의 경우 CONSTRAINT PK_Employees PRIMARY KEY 예외가 발생합니다. (ID), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(DepartmentID) REFERENCES 부서(ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES 직위(ID), CONSTRAINT UQ_Employees_Email) UNIQUEQUE(Email)

INSERT 직원(ID, 이름, 생일, 이메일, PositionID, DepartmentID) VALUES(1000, N "Ivanov I.I.", "19550219", " [이메일 보호됨]", 2,1), (1001, N" Petrov P.P. "," 19831203 "," [이메일 보호됨]", 3,3), (1002, N" S.S. "," 19760607 "," [이메일 보호됨]", 1,2), (1003, N" Andreev A.A. "," 19820417 "," [이메일 보호됨]",4,3)

PRIMARY KEY 및 UNIQUE 제약 조건을 생성할 때 생성되는 인덱스에 대한 정보

위 스크린샷에서 볼 수 있듯이 PRIMARY KEY 및 UNIQUE 제약 조건을 생성할 때 동일한 이름(PK_Employees 및 UQ_Employees_Email)을 가진 인덱스가 자동으로 생성됩니다. 기본적으로 기본 키에 대한 인덱스는 CLUSTERED로 생성되고 다른 모든 인덱스에 대해서는 NONCLUSTERED로 생성됩니다. 모든 DBMS에 클러스터형 인덱스의 개념이 있는 것은 아닙니다. 테이블에는 하나의 CLUSTERED 인덱스만 있을 수 있습니다. CLUSTERED - 테이블 레코드가 이 인덱스에 따라 정렬됨을 의미하며 이 인덱스가 모든 테이블 데이터에 직접 액세스할 수 있다고 말할 수도 있습니다. 이것은 말하자면 테이블의 주요 인덱스입니다. 더 대략적으로는 테이블에 볼트로 고정된 인덱스입니다. 클러스터형 인덱스는 쿼리를 최적화하는 데 도움이 되는 매우 강력한 도구입니다. 지금은 이 점을 염두에 두십시오. 클러스터형 인덱스가 기본 키가 아니라 다른 인덱스에 사용되도록 지정하려면 기본 키를 생성할 때 NONCLUSTERED 옵션을 지정해야 합니다.

ALTER TABLE 테이블 이름 ADD CONSTRAINT 제약 이름 PRIMARY KEY NONCLUSTERED(필드1, 필드2, ...)
예를 들어 PK_Employees 제약 조건 인덱스는 클러스터되지 않고 UQ_Employees_Email 제약 조건 인덱스는 클러스터링됩니다. 우선 다음 제한 사항을 제거합니다.

ALTER TABLE 직원 DROP CONSTRAINT PK_Employees ALTER TABLE 직원 DROP CONSTRAINT UQ_Employees_Email
이제 CLUSTERED 및 NONCLUSTERED 옵션을 사용하여 생성해 보겠습니다.

ALTER TABLE 직원 ADD CONSTRAINT PK_Employees 기본 키 비클러스터형(ID) ALTER TABLE 직원 ADD CONSTRAINT UQ_Employees_Email 고유 클러스터형(이메일)
이제 Employees 테이블에서 가져온 후 클러스터된 UQ_Employees_Email 인덱스에 따라 레코드가 정렬된 것을 볼 수 있습니다.

SELECT * FROM 직원

ID 이름 생일 이메일 위치ID 부서ID 고용 날짜
1003 Andreev A.A. 1982-04-17 [이메일 보호됨] 4 3 2015-04-08
1000 이바노프 I.I. 1955-02-19 [이메일 보호됨] 2 1 2015-04-08
1001 페트로프 P.P. 1983-12-03 [이메일 보호됨] 3 3 2015-04-08
1002 시도로프 S.S. 1976-06-07 [이메일 보호됨] 1 2 2015-04-08

이전에는 PK_Employees 인덱스가 클러스터형 인덱스인 경우 기본적으로 레코드가 ID별로 정렬되었습니다.

하지만 이 경우 클러스터형 인덱스의 본질을 보여주는 예시일 뿐입니다. 대부분의 경우 ID 필드에 의해 직원 테이블에 대한 쿼리가 수행되며 경우에 따라 자체적으로 참조 도서 역할을 할 수 있습니다.

조회의 경우 일반적으로 클러스터형 인덱스를 기본 키에 구축하는 것이 좋습니다. 요청에서 우리는 종종 디렉토리 식별자를 참조하여 이름(Position, Department)을 얻습니다. 여기에서 클러스터형 인덱스가 테이블의 행에 직접 액세스할 수 있다는 위에서 썼던 것을 기억합니다. 따라서 추가 오버헤드 없이 모든 열의 값을 얻을 수 있습니다.

가장 자주 샘플링된 필드에 클러스터형 인덱스를 적용하는 것이 유리합니다.

때때로 서로게이트 필드에 의해 테이블에 키가 생성되는데, 이 경우 더 적합한 인덱스를 위해 CLUSTERED 인덱스 옵션을 저장하고 서로게이트 기본 키를 생성할 때 NONCLUSTERED 옵션을 지정하는 것이 유용합니다.

요약하자면

이 단계에서 우리는 "ALTER TABLE table_name ADD CONSTRAINT constraint_name ..." 형식의 명령으로 생성되는 가장 단순한 형태의 모든 유형의 제약 조건에 대해 알게 되었습니다.
  • 기본 키- 기본 키;
  • 외래 키- 링크를 설정하고 데이터의 참조 무결성을 제어합니다.
  • 독특한- 독창성을 만들 수 있습니다.
  • 확인하다- 입력된 데이터의 정확성을 허용합니다.
  • 기본- 기본값을 설정할 수 있습니다.
  • "" 명령을 사용하여 모든 제한을 제거할 수 있다는 점도 주목할 가치가 있습니다. 테이블 변경 table_name 제약 조건 삭제제약명 ".
또한 인덱스의 주제에 대해 부분적으로 다루었고 클러스터의 개념을 분석했습니다( 클러스터) 및 비클러스터형( 비클러스터) 인덱스.

독립형 인덱스 생성

여기서 자립은 PRIMARY KEY 또는 UNIQUE 제약 조건에 대해 생성되지 않은 인덱스를 나타냅니다.

다음 명령을 사용하여 필드별 인덱스를 만들 수 있습니다.

CREATE INDEX IDX_Employees_Name ON 직원(이름)
또한 여기에서 CLUSTERED, NONCLUSTERED, UNIQUE 옵션을 지정할 수 있으며 각 개별 필드 ASC(기본값) 또는 DESC에 대한 정렬 방향을 지정할 수도 있습니다.

CREATE UNIQUE NONCLUSTERED INDEX UQ_Employees_EmailDesc ON 직원(이메일 DESC)
비클러스터형 인덱스를 생성할 때 NONCLUSTERED 옵션을 해제할 수 있습니다. 기본값이며 명령에서 CLUSTERED 또는 NONCLUSTERED 옵션의 위치를 ​​나타내기 위해 여기에 표시됩니다.

다음 명령으로 인덱스를 삭제할 수 있습니다.

DROP INDEX IDX_Employees_Name ON 직원
제약 조건과 같은 단순 인덱스는 CREATE TABLE 명령 컨텍스트에서 생성할 수 있습니다.

예를 들어 테이블을 다시 삭제해 보겠습니다.

DROP TABLE 직원
그리고 하나의 CREATE TABLE 명령으로 생성된 모든 제약 조건과 인덱스를 사용하여 다시 생성합니다.

CREATE TABLE 직원(ID int NOT NULL, 이름 nvarchar(30), 생일 날짜, 이메일 nvarchar(30), PositionID int, DepartmentID int, HireDate 날짜 NOT NULL CONSTRAINT DF_Employees_HireDate DEFAULT SYSDATETIME(), ManagerID int, KEY)PRIMPK_Employees CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(DepartmentID) REFERENCES 부서(ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES 직책(ID), CONSTRAINT FK_Employees_ManagerID_9Employee IN WE 이름 EN K(ID000)
마지막으로 직원을 테이블에 삽입해 보겠습니다.

INSERT 직원(ID, 이름, 생일, 이메일, PositionID, DepartmentID, ManagerID) VALUES(1000, N "Ivanov I.I.", "19550219", " [이메일 보호됨]", 2,1, NULL), (1001, N" Petrov P.P. "," 19831203 "," [이메일 보호됨]", 3,3,1003), (1002, N" S.S. "," 19760607 "," [이메일 보호됨]", 1,2,1000), (1003, N" Andreev A.A. "," 19820417 "," [이메일 보호됨]",4,3,1000)
또한 INCLUDE에서 값을 지정하여 비클러스터형 인덱스에 값을 포함할 수 있다는 점에 유의해야 합니다. 저것들. 이 경우 INCLUDE 인덱스는 클러스터형 인덱스와 다소 비슷하지만 이제 인덱스가 테이블에 볼트로 고정되지 않고 필요한 값이 인덱스에 볼트로 고정됩니다. 따라서 이러한 인덱스는 SELECT(선택 쿼리)의 성능을 크게 향상시킬 수 있습니다. 나열된 모든 필드가 인덱스에 있는 경우 테이블에 액세스할 필요가 전혀 없을 수 있습니다. 그러나 이것은 자연스럽게 인덱스의 크기를 증가시킵니다. 나열된 필드의 값은 색인에서 중복됩니다.

MSDN에서 발췌.인덱스 생성을 위한 일반 명령 구문

생성 [고유] [클러스터형 | NONCLUSTERED] INDEX 인덱스 이름 ON (열 [ASC | DESC] [, ... n]) [INCLUDE (열 이름 [, ... n])]

요약하자면

인덱스는 데이터 검색(SELECT) 속도를 높일 수 있지만 인덱스는 테이블 데이터 수정 속도를 느리게 합니다. 각 수정 후에 시스템은 특정 테이블에 대한 모든 인덱스를 다시 작성해야 합니다.

각 경우에 최적의 솔루션인 황금 평균을 찾아 샘플링 성능과 데이터 수정이 모두 적절한 수준에 있도록 하는 것이 좋습니다. 인덱스 생성 전략 및 인덱스 수는 테이블의 데이터가 변경되는 빈도와 같은 여러 요인에 따라 달라질 수 있습니다.

DDL 결론

보시다시피, DDL은 언뜻 보기에 그렇게 복잡하지 않습니다. 여기서는 세 개의 테이블만 사용하여 거의 모든 기본 구성을 보여줄 수 있었습니다.

가장 중요한 것은 본질을 이해하는 것이고 나머지는 실천의 문제입니다.

SQL이라는 멋진 언어로 행운을 빕니다.

내 블로그 사이트에 오신 것을 환영합니다. 오늘은 초보자를 위한 SQL 쿼리에 대해 알아보겠습니다. 일부 웹마스터는 질문이 있을 수 있습니다. 왜 SQL을 배우는가? 당신은 그것을 할 수 없습니다?

이것이 전문적인 인터넷 프로젝트를 만드는 데 충분하지 않다는 것이 밝혀졌습니다. Sql은 데이터베이스 작업과 WordPress용 애플리케이션을 만드는 데 사용됩니다. 쿼리를 사용하는 방법을 자세히 살펴보겠습니다.

그것은 무엇입니까

Sql은 구조화된 쿼리 언어입니다. 데이터 유형을 정의하고 데이터에 대한 액세스를 제공하며 단기간에 정보를 처리하도록 설계되었습니다. 그것은 당신이 인터넷 프로젝트에서 보고 싶은 구성 요소나 어떤 종류의 결과를 설명합니다.

간단히 말해서 이 프로그래밍 언어를 사용하면 데이터베이스에 정보를 추가, 수정, 검색 및 표시할 수 있습니다. mysql의 인기는 데이터베이스를 기반으로 동적 인터넷 프로젝트를 생성하는 데 사용된다는 사실에 기인합니다. 따라서 기능적인 블로그를 개발하려면 이 언어를 배워야 합니다.

할 수 있는 것

SQL 언어는 다음을 허용합니다.

  • 테이블 생성;
  • 변경 수신 및 저장 다른 데이터;
  • 정보를 블록으로 결합합니다.
  • 데이터를 보호합니다.
  • 액세스 요청을 만듭니다.

중요한! SQL을 다루면 모든 복잡성의 WordPress용 애플리케이션을 작성할 수 있습니다.

어떤 구조

데이터베이스는 Excel 파일로 표시할 수 있는 테이블로 구성됩니다.

그녀는 이름, 열 및 일부 정보가 포함된 행을 가지고 있습니다. SQL 쿼리를 사용하여 이러한 테이블을 만들 수 있습니다.

당신이 알아야 할 것은


Sql을 배울 때 하이라이트

위에서 언급했듯이 쿼리는 테이블로 구성된 데이터베이스에 새 정보를 처리하고 입력하는 데 사용됩니다. 각 줄은 별도의 항목입니다. 그럼 데이터베이스를 생성해 보겠습니다. 이렇게 하려면 다음 명령을 작성하십시오.

데이터베이스 'bazaname' 생성

따옴표 안에 데이터베이스 이름을 라틴어로 작성하십시오. 그녀에게 의미 있는 이름을 지어 보세요. "111", "www" 등과 같은 베이스를 만들지 마십시오.

데이터베이스를 생성한 후 다음을 설치합니다.

SET 이름 'utf-8'

이는 사이트의 콘텐츠가 올바르게 표시되기 위해 필요합니다.

이제 테이블을 생성합니다.

CREATE TABLE '바자 이름'. '테이블' (

id INT (8) NOT NULL AUTO_INCREMENT 기본 키,

로그 VARCHAR(10),

VARCHAR(10) 전달,

날짜 DATE

두 번째 줄에는 세 가지 속성을 작성했습니다. 그들이 의미하는 바를 보자:

  • NOT NULL 속성은 셀이 비어 있지 않음을 의미합니다(이 필드는 필수임).
  • AUTO_INCREMENT 값 - 자동 완성;
  • PRIMARY KEY는 기본 키입니다.

정보를 추가하는 방법

생성된 테이블의 필드를 값으로 채우려면 INSERT 문을 사용합니다. 다음 코드 줄을 작성합니다.

INSERT INTO '테이블'

(로그인, 패스, 날짜) VALUES

('바사', '87654321',' 2017-06-21 18:38:44 ');

괄호 안에는 열의 이름이 표시되고 다음에는 값이 표시됩니다.

중요한! 열 이름과 의미의 순서를 관찰하십시오.

정보 업데이트 방법

이렇게 하려면 UPDATE 명령을 사용하십시오. 특정 사용자의 비밀번호를 변경하는 방법을 알아보겠습니다. 다음 코드 줄을 작성합니다.

UPDATE '테이블' SET 패스 = '12345678' WHERE id = '1'

이제 비밀번호 '12345678'을 변경하십시오. "id" = 1인 행에서 변경이 이루어집니다. WHERE 명령을 작성하지 않으면 특정 행이 아닌 모든 행이 변경됩니다.

"책을 구입하는 것이 좋습니다. 입문자를 위한 SQL ". 도움을 받아 데이터베이스를 단계별로 전문적으로 작업할 수 있습니다. 모든 정보는 단순한 것부터 복잡한 것까지 구성되어 있으며 잘 받아들여질 것입니다.

항목을 삭제하는 방법

잘못 작성했다면 DELETE 명령으로 수정하십시오. 업데이트와 동일하게 작동합니다. 다음 코드를 작성합니다.

DELETE FROM '테이블' WHERE ID = '1'

정보를 가져오는 중

데이터베이스에서 값을 검색하려면 SELECT 명령을 사용합니다. 다음 코드를 작성합니다.

SELECT * FROM '테이블' WHERE id = '1'

이 예에서는 테이블에서 사용 가능한 모든 필드를 선택합니다. 이것은 명령에 별표 "*"를 쓰는 경우에 발생합니다. 샘플 값을 선택해야 하는 경우 다음과 같이 작성합니다.

SELECT 로그, FROM 테이블 WHERE id = '1' 전달

데이터베이스 작업 능력만으로는 충분하지 않다는 점에 유의해야 합니다. 전문적인 인터넷 프로젝트를 만들려면 데이터베이스의 데이터를 페이지에 추가하는 방법을 배워야 합니다. 이렇게 하려면 PHP 웹 프로그래밍 언어에 익숙해져야 합니다. 이것은 당신을 도울 것입니다 Mikhail Rusakov의 강의실 과정 .


테이블 떨어뜨리기

DROP 요청과 함께 발생합니다. 이렇게 하려면 다음 줄을 작성하십시오.

DROP 테이블 테이블;

특정 조건에 따라 테이블에서 레코드 출력

다음과 같은 코드를 고려하십시오.

SELECT id, country, city FROM table WHERE people> 150000000

인구가 1억 5천만이 넘는 국가의 기록이 표시됩니다.

협회

Join을 사용하여 여러 테이블을 함께 연결할 수 있습니다. 작동 방식은 이 비디오를 더 자세히 참조하십시오.

PHP와 MySQL

인터넷 프로젝트를 생성할 때 문의를 하는 것은 흔한 일임을 다시 한 번 강조하고 싶습니다. PHP 문서에서 사용하려면 다음 절차를 따르십시오.

  • mysql_connect() 명령을 사용하여 데이터베이스에 연결합니다.
  • mysql_select_db()를 사용하여 필요한 데이터베이스를 선택하십시오.
  • mysql_fetch_array()를 사용하여 요청을 처리합니다.
  • mysql_close() 명령으로 연결을 닫습니다.

중요한! 데이터베이스 작업은 어렵지 않습니다. 가장 중요한 것은 요청을 올바르게 작성하는 것입니다.

초보 웹마스터는 생각할 것입니다. 이 주제에 대해 무엇을 읽을까요? Martin Graber의 책을 추천하고 싶습니다. 단순한 필사자를 위한 SQL ". 초보자에게 모든 것이 명확하도록 작성되었습니다. 참고서로 활용하세요.

그러나 이것은 이론입니다. 실제 상황은 어떻습니까? 실제로 인터넷 프로젝트는 생성되어야 할 뿐만 아니라 Google과 Yandex의 TOP에 올라와야 합니다. 비디오 코스 " 웹사이트 제작 및 홍보 ».


비디오 지시

아직 질문이 있으신가요? 온라인 비디오를 더 자세히 보십시오.

결론

따라서 SQL 쿼리 작성을 처리하는 것은 보기보다 어렵지 않지만 모든 웹마스터가 수행해야 합니다. 이것은 위에서 설명한 비디오 과정에 도움이 될 것입니다. 구독 내 VKontakte 그룹 새롭고 흥미로운 정보의 출현에 대해 가장 먼저 알게 됩니다.

대부분의 최신 웹 애플리케이션은 일반적으로 이라는 언어를 사용하여 데이터베이스와 상호 작용합니다. SQL. 운 좋게도 이 언어는 배우기 매우 쉽습니다. 이 글에서는 간단한 SQL 요청하고 이를 사용하여 상호 작용하는 방법을 배웁니다. MySQL 데이터베이스.

뭐가 필요하세요?

SQL(구조적 쿼리 언어) 다음과 같은 데이터베이스 관리 시스템과 상호 작용하도록 특별히 설계된 언어 MySQL, 오라클, SQLite 및 기타 ... 수행하기 위해 SQL 이 기사의 요청에 따라 설치하는 것이 좋습니다. MySQL 로컬 컴퓨터에. 또한 나는 사용하는 것이 좋습니다 phpMyAdmin 시각적 인터페이스로.

이 모든 것이 모두의 사랑을 받는 덴버에서 가능합니다. 나는 모든 사람들이 그것이 무엇인지, 어디서 얻을 수 있는지 알아야한다고 생각합니다. :). 할 수있다그렇지 않으면 WAMP 또는 MAMP를 사용하십시오.

덴버에는 빌트인 MySQL 콘솔. 우리는 그것을 사용할 것입니다.

데이터베이스 생성:데이터베이스 생성

이것이 우리의 첫 번째 요청입니다. 추가 작업을 위해 첫 번째 데이터베이스를 만들 것입니다.

먼저, 열기 MySQL 콘솔 및 로그인. 을위한왤케 기본 암호는 비어 있습니다. 즉, 아무것도 :). 을위한 MAMP는 "루트"입니다. 덴버의 경우 명확히 해야 합니다.

로그인 후 다음 줄을 입력하고 클릭입력하다:

데이터베이스 생성 my_first_db;

다른 언어와 마찬가지로 쿼리 끝에 세미콜론(;)이 추가됩니다.

SQL의 명령도 참조하십시오. 대소문자를 구분합니다. 우리는 그것들을 큰 글자로 씁니다.

옵션 만: 문자 집합그리고 대조

설치를 원하시면문자 집합 및 데이터 정렬은 다음 명령을 작성하십시오.

CREATE DATABASE my_first_db 기본 문자 설정 utf8 COLLATE utf8_general_ci;

에서 지원되는 문자 집합 목록을 찾습니다. MySQL.

데이터베이스 표시:모든 데이터베이스 나열

이 명령은 사용 가능한 모든 데이터베이스를 표시하는 데 사용됩니다.

데이터베이스 삭제:데이터베이스 삭제

이 쿼리를 사용하여 기존 DB를 삭제할 수 있습니다.

이 명령은 경고 없이 실행되므로 주의하십시오. 데이터베이스에 데이터가 포함되어 있으면 모두 삭제됩니다.

사용:데이터베이스 선택

기술적으로 이것은 쿼리가 아니라 연산자이며 끝에 세미콜론이 필요하지 않습니다.

그것은 MySQL에게 알려줍니다 현재 세션에 대한 기본 데이터베이스를 선택합니다. 이제 테이블을 만들고 데이터베이스로 다른 작업을 수행할 준비가 되었습니다.

데이터베이스의 테이블이란 무엇입니까?

DB의 테이블을 다음과 같이 나타낼 수 있습니다.엑셀 파일.

그림과 같이 테이블에는 열 이름, 행 및 정보가 있습니다. 을 통해 SQL 쿼리, 우리는 그러한 테이블을 만들 수 있습니다. 또한 정보를 추가, 읽기, 업데이트 및 삭제할 수 있습니다.

테이블 생성: 테이블 생성

이 쿼리를 사용하여 데이터베이스에 테이블을 만들 수 있습니다. 죄송합니다, 문서 MySQL 이 문제에 대해 초보자에게는 명확하지 않습니다. 이러한 유형의 쿼리 구조는 매우 복잡할 수 있지만 쉬운 것부터 시작하겠습니다.

다음 쿼리는 2개의 열이 있는 테이블을 생성합니다.

CREATE TABLE 사용자(사용자 이름 VARCHAR(20), create_date DATE);

들여쓰기를 위한 탭과 여러 줄에 쿼리를 작성할 수 있습니다.

첫 번째 줄은 간단합니다. "users"라는 테이블을 생성하기만 하면 됩니다. 다음으로 쉼표로 구분된 괄호 안에 모든 열의 목록이 있습니다. 각 열 이름 뒤에는 VARCHAR 또는 DATE와 같은 정보 유형이 있습니다.

VARCHAR(20)은 열이 문자열 유형이고 길이가 최대 20자임을 의미합니다. DATE는 "YYYY - MM-DD" 형식으로 날짜를 저장하는 데 사용되는 정보 유형이기도 합니다.

기본 키( 기본 키시간)

다음 쿼리를 실행하기 전에 기본 키가 될 "user_id"에 대한 열도 포함해야 합니다. PRIMARY KEY는 테이블의 각 행을 식별하는 데 사용되는 정보로 생각할 수 있습니다.

CREATE TABLE 사용자(user_id INT AUTO_INCREMENT PRIMARY KEY, 사용자 이름 VARCHAR(20), create_date DATE);

지능 32비트 정수 유형(숫자와 같은)을 만듭니다.자동 증가 새로운 가치를 자동으로 생성 ID 새로운 정보 행을 추가할 때마다 이것은 선택 사항이지만 전체 프로세스를 더 쉽게 만듭니다.

이 열은 정수 값일 필요는 없지만 가장 일반적으로 사용됩니다. 기본 키의 존재도 선택 사항이지만 데이터베이스의 아키텍처 및 성능을 위해 권장됩니다.

쿼리를 실행해 보겠습니다.

쇼 테이블:모든 테이블 표시

이 쿼리를 사용하면 데이터베이스에 있는 테이블 목록을 가져올 수 있습니다.

설명:테이블 구조 표시

이 쿼리를 사용하여 기존 테이블의 구조를 표시할 수 있습니다.

열은 모든 속성과 함께 표시됩니다.

드롭 테이블:테이블 삭제

DROP DATABASES와 마찬가지로 이 쿼리는 경고 없이 테이블과 해당 내용을 삭제합니다.

테이블 변경: 테이블 변경

이 쿼리는 테이블에 더 많은 변경 사항을 적용할 수 있기 때문에 복잡한 구조를 포함할 수도 있습니다. 몇 가지 예를 살펴보겠습니다.

(마지막 단계에서 테이블을 삭제했다면 테스트를 위해 다시 생성)

열 추가

ALTER TABLE 사용자 ADD 이메일 VARCHAR(100) AFTER 사용자 이름;

SQL의 가독성이 좋기 때문에 자세히 설명하는 것은 무의미하다고 생각합니다. "사용자 이름" 다음에 새 열 "이메일"을 추가합니다.

열 삭제

또한 매우 쉬웠습니다. 경고 없이 데이터를 삭제할 수 있으므로 이 쿼리는 주의해서 사용하십시오.

추가 실험을 위해 방금 제거한 열을 복구합니다.

열 변경

때때로 열의 속성을 변경하고 싶을 수 있으며 이를 위해 완전히 삭제할 필요는 없습니다.

이 쿼리는 사용자 열의 이름을 "user_name"으로 바꾸고 해당 유형을 VARCHAR(20)에서 VARCHAR(30)으로 변경했습니다. 이러한 변경은 테이블의 데이터를 변경하지 않아야 합니다.

끼워 넣다: 테이블에 정보 추가

다음 쿼리를 사용하여 테이블에 몇 가지 정보를 추가해 보겠습니다.

보시다시피 VALUES()에는 쉼표로 구분된 값 목록이 포함되어 있습니다. 모든 값은 단일 열에 있습니다. 그리고 값은 테이블 생성 시 정의한 컬럼의 순서로 되어 있어야 합니다.

PRIMARY KEY 필드의 첫 번째 NULL 값은 "user_id"로 명명됩니다. 컬럼에 AUTO_INCREMENT 속성이 있기 때문에 ID가 자동으로 생성되도록 하기 위해서입니다. 정보가 처음 추가될 때 ID는 1이 됩니다. 다음 행은 2, 등등...

대체 옵션

행을 추가하기 위한 또 다른 쿼리 옵션이 있습니다.

이번에는 VALUES 대신 SET 키워드를 사용하며 괄호가 없습니다. 몇 가지 뉘앙스가 있습니다.

열을 건너뛸 수 있습니다. 예를 들어 "user_id"에 값을 할당하지 않았으며 기본값은 AUTO_INCREMENT 값입니다. VARCHAR 열을 생략하면 빈 줄이 추가됩니다.

각 열은 이름으로 참조해야 합니다. 이 때문에 이전 버전과 달리 임의의 순서로 언급될 수 있습니다.

대체 옵션 2

여기 또 다른 옵션이 있습니다.

다시 말하지만, 열 이름에 대한 참조가 있으므로 임의의 순서로 값을 제공할 수 있습니다.

LAST_INSERT_ID()

이 요청을 사용하여 현재 세션의 마지막 행에 대해 AUTO_INCREMENT였던 ID를 가져올 수 있습니다.

지금 ()

이제 쿼리에서 MySQL 함수를 사용하는 방법을 보여줄 시간입니다.

NOW() 함수는 현재 날짜를 표시합니다. 따라서 새 행을 삽입할 때 열 날짜를 현재 날짜로 자동 설정하는 데 사용할 수 있습니다.

1개의 경고를 받았지만 무시합니다. 그 이유는 NOW()도 임시 정보를 표시하는 데 사용되기 때문입니다.

선택하다: 테이블에서 데이터 읽기

테이블에 정보를 추가하면 거기에서 읽는 방법을 배우는 것이 논리적일 것입니다. 여기에서 SELECT 쿼리가 도움이 될 것입니다.

다음은 테이블을 읽는 가장 간단한 SELECT 쿼리입니다.

이 경우 별표(*)는 테이블에서 모든 필드를 요청했음을 의미합니다. 특정 열만 원하는 경우 쿼리는 다음과 같이 표시됩니다.

질환어디

대부분의 경우 모든 열에 관심이 있는 것이 아니라 일부 열에만 관심이 있습니다. 예를 들어 사용자 "nettuts"의 이메일 주소만 필요하다고 가정해 보겠습니다.

WHERE를 사용하면 쿼리에서 조건을 설정하고 세부적으로 선택할 수 있습니다.

하나의 등호(=)는 프로그래밍에서와 같이 2개가 아니라 같음을 위해 사용됩니다.

비교를 사용할 수도 있습니다.

AND 또는 OR을 사용하여 조건을 결합할 수 있습니다.

숫자 값은 따옴표로 묶지 않아야 합니다.

에 ()

이는 여러 값을 샘플링하는 데 유용합니다.

처럼

"와일드카드" 요청을 할 수 있습니다.

% 기호는 와일드카드로 사용됩니다. 즉, 무엇이든 그 자리에 있을 수 있습니다.

질환주문

어떤 기준으로 결과를 정렬하고 싶다면

기본 순서는 ASC(낮은 것에서 높은 것)입니다. 반대의 경우 DESC가 사용됩니다.

한계 ... 오프셋 ...

얻을 수 있는 결과의 수를 제한할 수 있습니다.

LIMIT 2는 처음 2개의 결과만 가져옵니다. LIMIT 1 OFFSET 2는 처음 2개 이후에 1개의 결과를 얻습니다. LIMIT 2, 1은 동일함을 의미합니다(먼저 상쇄된 다음 제한에 주의하십시오).

업데이트: 테이블의 정보 변경

이 쿼리는 테이블의 정보를 변경하는 데 사용됩니다.

대부분의 경우 특정 열을 수정하려는 경우가 많기 때문에 WHERE 절과 함께 사용됩니다. WHERE 절이 없으면 변경 사항이 모든 행에 영향을 미칩니다.

LIMIT를 사용하여 수정해야 하는 행 수를 제한할 수도 있습니다.

삭제: 테이블에서 정보 제거

UPDATE와 마찬가지로 이 쿼리는 WHERE와 함께 사용됩니다.

테이블의 내용을 삭제하려면 다음과 같이 간단하게 수행할 수 있습니다.

사용자로부터 삭제

그러나 사용하는 것이 더 낫습니다.자르다

이 쿼리는 삭제 외에도 값을 재설정합니다.자동 증가 행을 다시 추가하면 카운트가 0부터 시작됩니다.삭제 그렇지 않고 카운트다운이 계속됩니다.

낮은 값 및 특수 단어 비활성화

문자열 값

일부 문자는 비활성화해야 합니다(탈출하다 ) 또는 문제가 있을 수 있습니다.

이를 위해 백슬래시가 사용됩니다.(\).

특수 단어

MySQL부터 많은 특별한 단어가 있습니다 (선택 또는 업데이트 ), 사용 시 오류를 방지하려면 따옴표를 사용해야 합니다. 그러나 일반적인 인용문은 아니지만 이러한(`).

즉, "삭제 ", 다음과 같이 해야 합니다.

결론

끝까지 읽어주셔서 감사합니다. 이 기사가 도움이 되었기를 바랍니다. 아직 끝나지 않았다! 계속됩니다:).

나는 초보자를 위한 SQL 기사의 무료 번역을 당신의 주의에 제시합니다.

점점 더 많은 최신 웹 응용 프로그램이 일반적으로 언어를 사용하여 데이터베이스와 상호 작용합니다. SQL... 운 좋게도 이 언어는 배우기 매우 쉽습니다. 이 기사에서는 SQL 쿼리의 기본 사항과 쿼리가 데이터베이스와 상호 작용하는 방법을 배우기 시작할 것입니다. MySQL.

필요한 것

SQL(Structured Query Language)은 다음과 같은 관계형 데이터베이스 관리 시스템(DBMS)과 상호 작용하도록 설계된 언어입니다. MySQL, 오라클, SQLite다른 사람. 이 기사의 SQL 쿼리를 실행하려면 다음을 설치했다고 가정합니다. MySQL... 나는 또한 사용하는 것이 좋습니다 phpMyAdmin를 위한 시각적 표시 도구로 MySQL.

다음 응용 프로그램을 사용하면 쉽게 설치할 수 있습니다. MySQL그리고 phpMyAdmin컴퓨터에:

  • Windows용 WAMP
  • Mac용 MAMP

명령줄에서 쿼리 실행을 시작하겠습니다. 왤케이미 콘솔에 포함되어 있습니다. MySQL... 을위한 맘프, 이것을 읽어야 할 수도 있습니다.

CREATE DATABASE: 데이터베이스 생성

우리의 첫 번째 요청입니다. 작업할 데이터베이스를 생성하겠습니다.

먼저 콘솔을 엽니다. MySQL그리고 로그인. 을위한 왤케, 기본적으로 빈 암호가 사용됩니다. 을위한 맘프암호는 "루트"여야 합니다.

로그인 후 이 요청을 입력하고 입력하다:

데이터베이스 생성 my_first_db;

세미콜론(;)은 코드의 줄 끝과 마찬가지로 쿼리 끝에 추가됩니다.

또한 키워드 데이터베이스 생성의 모든 키워드와 같이 대소문자를 구분하지 않습니다. SQL... 그러나 더 나은 가독성을 위해 대문자로 작성합니다.

참고: 문자 집합 및 데이터 정렬

기본 문자 집합 및 데이터 정렬 순서를 설정하려면 다음과 유사한 쿼리를 사용합니다.

CREATE DATABASE my_first_db 기본 문자 설정 utf8 COLLATE utf8_general_ci;

지원되는 문자 집합 및 데이터 정렬 목록은 다음에서 찾을 수 있습니다. MySQL.

SHOW DATABASES: 모든 데이터베이스 목록

이 쿼리는 모든 데이터베이스를 표시하는 데 사용됩니다.

DROP DATABASE: 데이터베이스 삭제

이 쿼리를 사용하여 기존 데이터베이스를 삭제할 수 있습니다.

이 쿼리는 경고를 표시하지 않으므로 주의하십시오. 데이터베이스에 테이블과 데이터가 있으면 쿼리는 즉시 모든 테이블을 삭제합니다.

엄밀히 말하면 이것은 요청이 아닙니다. "연산자"이며 끝에 세미콜론이 필요하지 않습니다.

그는 알린다 MySQL기본 데이터베이스를 선택하고 세션이 끝날 때까지 작업해야 합니다. 이제 이 데이터베이스에 테이블과 나머지를 만들 준비가 되었습니다.

데이터베이스 테이블이란 무엇입니까?

데이터베이스의 테이블은 일반 테이블이나 구조화된 데이터가 있는 csv 파일로 생각할 수 있습니다.

이 예에서와 같이 테이블에는 행 이름과 데이터 열이 있습니다. SQL 쿼리를 사용하여 이 테이블을 만들 수 있습니다. 또한 데이터를 추가, 읽기, 수정 및 삭제할 수 있습니다.

CREATE TABLE: 테이블 생성

이 쿼리를 사용하여 데이터베이스에 테이블을 만들 수 있습니다. 죄송합니다. 문서 MySQL새로운 사용자에게 그다지 친숙하지 않습니다. 이 쿼리의 구조는 매우 복잡할 수 있지만 간단한 것부터 시작하겠습니다.

다음 쿼리는 두 개의 열이 있는 테이블을 만듭니다.

CREATE TABLE 사용자(사용자 이름 VARCHAR(20), create_date DATE);

여러 줄에 쿼리를 작성하고 사용할 수 있습니다. 들여쓰기용.

첫 번째 줄은 간단합니다. 라는 테이블을 생성합니다. 사용자... 또한 대괄호 안에는 테이블의 열이 쉼표로 구분되어 나열됩니다. 각 열 이름 뒤에는 데이터 유형이 옵니다. 예를 들면 바르차르또는 데이트.

바르차르 (20)열이 문자열 유형이고 길이가 20자를 초과할 수 없음을 의미합니다. 데이트- "YYYY-MM-DD" 형식으로 날짜를 저장하기 위한 데이터 유형.

기본 키

이 쿼리를 실행하기 전에 열을 삽입해야 합니다. user_id, PRIMARY KEY가 됩니다. 너무 자세히 설명하지 않고 기본 키를 테이블의 각 데이터 행을 인식하는 방법으로 생각할 수 있습니다.

요청은 다음과 같이 됩니다.

CREATE TABLE 사용자(user_id INT AUTO_INCREMENT PRIMARY KEY, 사용자 이름 VARCHAR(20), create_date DATE);

지능- 32비트 정수 유형(숫자). 자동 증가데이터 행이 추가될 때마다 자동으로 새 ID 번호를 생성합니다. 필수는 아니지만 함께 사용하면 더 편리합니다.

가장 일반적인 데이터 유형이지만 이 열은 정수가 아닐 수 있습니다. 기본 키 열은 선택 사항이지만 데이터베이스의 성능과 아키텍처를 개선하는 데 사용하는 것이 좋습니다.

쿼리를 실행해 보겠습니다.

SHOW TABLES: 모든 테이블 목록

쿼리를 통해 현재 데이터베이스의 모든 테이블 목록을 가져올 수 있습니다.

EXPLAIN: 테이블 구조 표시

이 쿼리를 사용하여 기존 테이블의 구조를 확인합니다.

결과적으로 필드(열) 및 해당 속성이 표시됩니다.

DROP TABLE: 테이블 삭제

또한 데이터베이스 삭제, 이 쿼리는 경고 없이 테이블과 해당 내용을 삭제합니다.

ALTER TABLE: 테이블 수정

이러한 쿼리는 테이블을 여러 번 변경할 수 있으므로 복잡할 수 있습니다. 몇 가지 간단한 예를 살펴보겠습니다.

가독성 덕분에 SQL, 이 요청은 자명합니다.

제거도 간단합니다. 쿼리는 주의해서 사용하세요. 데이터는 경고 없이 삭제됩니다.

필드를 다시 추가합시다 이메일, 나중에 여전히 필요합니다.

ALTER TABLE 사용자 ADD 이메일 VARCHAR(100) AFTER 사용자 이름;

때로는 열의 속성을 변경해야 할 수도 있습니다. 삭제하고 다시 만들 필요는 없습니다.

이 요청은 필드의 이름을 바꿉니다. 사용자 이름 V 사용자 이름유형을 다음에서 변경합니다. 바르차르 (20)바르차르 (30)... 이러한 변경 사항은 테이블의 데이터에 영향을 미치지 않습니다.

INSERT: 테이블에 데이터 추가

쿼리를 사용하여 테이블에 레코드를 추가해 보겠습니다.

보시다시피, 값()쉼표로 구분된 값 목록을 포함합니다. 문자열 값은 작은따옴표로 묶습니다. 값은 테이블이 생성될 때 지정된 순서대로 있어야 합니다.

첫 번째 값은 없는기본 키의 경우 이름을 지정한 필드 user_id... 필드가 다음으로 표시되기 때문에 모두 자동 증가 id가 자동으로 생성됩니다. 데이터의 첫 번째 행은 1의 ID를 갖습니다. 추가될 다음 행은 2입니다. 이런 식으로 계속됩니다.

대체 구문

다음은 문자열을 삽입하는 또 다른 구문입니다.

이번에는 키워드를 사용했습니다. 세트대신에 가치... 몇 가지 사항을 살펴보겠습니다.

  • 열은 생략할 수 있습니다. 예를 들어 필드에 값을 할당하지 않았습니다. user_id로 표시되어 있기 때문에 자동 증가... 유형이 있는 필드에 값을 할당하지 않는 경우 바르차르, 기본적으로 빈 문자열 값을 사용합니다(테이블을 만들 때 다른 기본값이 지정되지 않은 경우).
  • 각 열은 이름으로 참조할 수 있습니다. 따라서 필드는 이전 구문과 달리 임의의 순서가 될 수 있습니다.

대체 구문 번호 2

여기 또 다른 예가 있습니다.

이전과 마찬가지로 이름으로 필드를 참조할 수 있으며 순서에 관계없이 이동할 수 있습니다.

이 쿼리를 사용하여 마지막으로 삽입된 행의 ID를 가져옵니다.

지금 ()

기능을 사용하는 방법을 보여줄 시간입니다 MySQL요청에.

기능 지금 ()현재 날짜를 반환합니다. 유형 필드에 현재 날짜를 자동으로 추가하는 데 사용합니다. 데이트.

에서 경고를 받았습니다. MySQL그러나 이것은 그렇게 중요하지 않습니다. 그 이유는 기능이 지금 ()실제로 시간 정보를 반환합니다.

우리는 필드를 만들었습니다 create_date날짜만 포함할 수 있고 시간은 포함할 수 없으므로 데이터가 잘렸습니다. 대신에 지금 ()우리는 사용할 수 요일()현재 날짜만 반환하지만 최종 결과는 동일합니다.

SELECT: 테이블에서 데이터 검색

분명히 우리가 작성한 데이터는 읽을 수 있을 때까지 쓸모가 없습니다. 구출 요청이 온다 선택하다.

요청을 사용하는 가장 간단한 예 선택하다테이블에서 데이터를 읽으려면:

별표(*)는 테이블의 모든 열을 가져오려는 것을 의미합니다. 특정 열만 가져와야 하는 경우 다음과 같이 사용합니다.

대부분의 경우 우리는 전체가 아닌 특정 행만 얻고자 합니다. 예를 들어 사용자의 이메일 주소를 가져오자 그물.

IF 조건과 유사합니다. WHERE를 사용하면 쿼리에서 조건을 설정하고 원하는 결과를 얻을 수 있습니다.

단일 기호(=)는 프로그래밍에서 사용하는 이중 기호(==)가 아니라 등식 조건에 사용됩니다.

다른 조건을 사용할 수도 있습니다.

그리고그리고 또는조건을 결합하는 데 사용됩니다.

숫자 값은 따옴표로 묶을 필요가 없습니다.

에 ()

여러 값과 비교하는 데 사용됩니다.

처럼

검색을 위한 템플릿을 설정할 수 있습니다.

퍼센트 기호(%)는 패턴을 지정하는 데 사용됩니다.

ORDER BY 절

결과가 정렬되어 반환되도록 하려면 이 조건을 사용하십시오.

기본 순서는 ASC(오름차순). 추가하다 DESC역순으로 정렬합니다.

한계 ... 오프셋 ...

반환되는 행 수를 제한할 수 있습니다.

제한 2처음 두 줄을 사용합니다. 한계 1 오프셋 2처음 두 줄 다음에 한 줄을 사용합니다. 한계 2, 1동일한 것을 의미하며 첫 번째 숫자만 오프셋이고 두 번째 숫자는 줄 수를 제한합니다.

업데이트: 테이블의 데이터 업데이트

이 쿼리는 테이블의 데이터를 업데이트하는 데 사용됩니다.

대부분의 경우에 와 함께 사용 어디특정 라인을 업데이트합니다. 만약 조건이 어디지정하지 않으면 변경 사항이 모든 행에 적용됩니다.

변경 가능한 문자열을 제한하려면 다음을 사용할 수 있습니다. 한계.

DELETE: 테이블에서 데이터 삭제

또한 , 이 쿼리는 종종 조건과 함께 사용됩니다. 어디.

테이블 자르기

테이블에서 콘텐츠를 제거하려면 다음과 같은 쿼리를 사용합니다.

사용자로부터 삭제

더 나은 성능 사용을 위해 .

또한 필드 카운터를 재설정합니다. 자동 증가, 따라서 새로 추가된 행의 id는 1과 같습니다. 이것은 일어나지 않으며 카운터는 계속 성장할 것입니다.

이스케이프 문자열 값 및 특수 단어

문자열 값

일부 문자는 이스케이프해야 하거나 문제가 있을 수 있습니다.

이스케이프에는 백슬래시(\)가 사용됩니다.

이것은 보안상의 이유로 매우 중요합니다. 모든 사용자 데이터는 데이터베이스에 쓰기 전에 이스케이프되어야 합니다. V PHP mysql_real_escape_string() 함수 또는 준비된 명령문을 사용하십시오.

특수 단어

부터 MySQL다음과 같은 많은 예약어 선택하다또는 혼동을 방지하려면 열 및 테이블 이름을 따옴표로 묶습니다. 또한 일반 따옴표가 아닌 백틱(`)을 사용해야 합니다.

어떤 이유로 인해 :

결론

기사 읽어주셔서 감사합니다. 그 언어를 보여줄 수 있었으면 좋겠어 SQL매우 기능적이고 배우기 쉽습니다.