이제 본격적으로 SQL에 대해 알아보도록 하겠습니다.
SQL은 Structured Query Language 의 약자로 RDBMS(관계형데이터베이스)를 기반에서 DBMS와 Data를 다루는 언어의 일종입니다.

한글로는 구조화된 질의언어라고 표현하며 RDB서버를 대상으로 SQL을 구문을 전달하면 관련한 요청한 정보에 대해 SQL서버에서
요청 정보를 처리하고 결과값을 반환해주는 DB Programming언어입니다.

백엔드 개발자라면 주로 하는일이 데이터 처리를 담당하는 일이므로 반드시 SQL 언어에 대한 이해가 필요하며
시스템 규모가 크고 테이블이 많고 관계나 구조가 복잡하고 데이터가 많아질수록 SQL에 대한 필요성이 많아 집니다. 


1)SQL의 유형
SQL구문은 아래와 같이 3가지 유형의 SQL언어 유형으로 나뉩니다.

DDL(Data Definition Language) : 데이터 정의 언어
-테이블을 생성하는 Create구문이 대표적인 DDL언어 유형입니다.
-각종 DB객체(Table,Column,View,SP,Funtion) 를 생성/수정/삭제하는 SQL구문이 DDL에 해당합니다.(Create..., Alter..,Drop..)


DQL(Data Query Language) :  데이터 검색어
-데이터를 조회하는 SQL로 보통 쿼리(Query)구문이라고 말하는 조회성 sql구문을 말합니다.
-SELECT 구문이 이에 해당합니다.

DML(Data Manipulation Language) : 데이터 조작 언어
-테이블의 데이터를 조작할때 사용하는 SQL구문으로
-INSERT, UPDATE,DELETE 등의 SQL 구문이 대표적입니다.


DCL(Data control Language)  :데이터 제어 언어
-DB서버나 DB에 대한 접근 사용자 계정 추가 및 권한부여,암호설정,로그인등을 다루는 SQL구문입니다.
-Grant 구문등을 이용한 테이블 접근 권한제어등이 이에 해당합니다.


일반적인 백엔드 개발자라면 DDL/DQL/DML 정도는 반드시 그용도와 기초 사용법은 알고 있어야하며
DB관리자(DBA)나 시스템 관리자라면 DB서버/DATABASE 제어 관리를 위해 DCL 영역에 대한 이해도 필요합니다. 


2) SQL(Structured Query Language)
구조화된 질의 언어라고 표현하며  데이터 베이스 대상 데이터 처리 및 관리를 위한 언어
SQL TYPE: DDL(데이터정의어),DML(데이터 조작어),DCL(데이터 제어어)
SQL구문은  해당 구문 마지막에 ; 세미콜론을 찎어 SQL구문의 마지막을 DB서버에 알려야합니다.
SQL도 언어이기때문에  글로벌 표준 SQL 언어포맷을  ANSI-SQL 이라 하며 되도록 SQL 사용시 되도록 ANSI-SQL 사용을 권장드립니다.


3) C/R/U/D SQL : 데이터를 직접 다루는 SQL = DML(데이터 조작어)+DQL
CREATE : 테이블 데이터 등록 SQL 구문, INSERT INTO 테이블명 (컬럼1,컬럼2) VALUES (값1,값2);
READ : 테이블 데이터 조회 SQL구문 : SELECT * FROM 테이블명 WHERE 조건절 ;
UPDATE :테이블 데이터 수정 SQL구문:  UPDATE 테이블명  SET  컬럼명 =‘값’,컬럼명='값' WHERE 조건절;
DELETE : 테이블 데이터 삭제 SQL구문: DELETE 테이블명 WHERE 조건절;


4) CRUD QUERY 실습
-RDBMS에 사용하는 질의 언어 = SQL = 국제표준 SQL  ANSI-SQL 이라 하며
-Workbench를 오픈하고 edu_community DB를 선택(더블클릭)합니다.

-상단 Create New SQL Tab 아이콘을 클릭해 SQL쿼리 Editor창을 오픈합니다.
-순차적으로 아래 SQL구문을 한줄씩 작성하고 해당줄을 선택한후 상단 메뉴 번개표시 (Execute)버튼을 클릭해 선택한 SQL구문을 실행하고 그결과를 확인해봅니다.

아래 내용들을 한줄씩 카피 또는 타이핑 후 해당줄을 선택하고 실행하면서 해당 SQL구문의 사용법을 익혀보시기 바랍니다.


#이것은 SQL 인라인 주석입니다.

/*

-이것은 SQL블럭주석입니다.

-SELECT * FROM member;

*/


#SQL 쿼리 Editor에서 사용하는 기본 DB를 edu_community로 지정합니다.
#워크벤치에서 DB명을 더블클릭해 볼드체로 변경하는것도 동일한 기능제공
USE edu_community;

#member 테이블의 전체컬럼(*) 데이터 조회
SELECT * FROM member;


#Step1)Create Data -데이터 등록/SQL INSERT 쿼리 학습
#INSERT INTO 'DB명'.'테이블명'(컬럼1,컬럼2,...)VALUES(컬럼1의등록값, 컬럼2의값..);
#now()함수는 MySQL서버에서 제공하는 쿼리 실행시 해당일시정보를 조회하는 시스템 함수입니다.

INSERT INTO `edu_community`.`member` (email, member_password, name, profile_img_path, telephone, entry_type_code,use_state_code, birth_date, entry_date) VALUES ('test1@test.co.kr', 'fsedsd112dfsfs', '사용자1', 'http://test.co.kr/images/member/sample1.png', '010-1111-1234', '1', '1', '700522', now());

#ALLOW NULL 컬럼(널을 허용하는 컬럼에 값을 지정하지 않으면 NULL상태로 데이터가 조회됩니다. )
#아래 INSERT구문에는 전화번호와 생년월일 컬럼을 지정하지 않고 해당값도 등록하지 않았습니다.
INSERT INTO `edu_community`.`member` (email, member_password, name, profile_img_path, entry_type_code, use_state_code, entry_date) VALUES ('test2@test.co.kr', 'fsedsd112dfsfs', '사용자2', 'http://test.co.kr/images/member/sample2.png', '1', '1', now());

SELECT * FROM member;

#아래 INSERT구문을 실행시켜 테스트 데이터를 생성하세요.

INSERT INTO `edu_community`.`member` (email, member_password, name, profile_img_path, telephone, entry_type_code, use_state_code, birth_date, entry_date) VALUES ('test3@test.co.kr', 'fsedsd112dfsfs', '사용자3', 'http://test.co.kr/images/member/sample3.png', '010-3333-1234', '1', '1', '810522', now());

INSERT INTO `edu_community`.`member` (email, member_password, name, profile_img_path, telephone, entry_type_code, use_state_code, birth_date, entry_date) VALUES ('test4@test.co.kr', 'fsedsd112dfsfs', '강창훈', 'http://test.co.kr/images/member/sample4.png', '010-3333-1235', '1', '1', '710522', '2024-05-10');

INSERT INTO `edu_community`.`member` (email, member_password, name, profile_img_path, telephone, entry_type_code, use_state_code, birth_date, entry_date) VALUES ('test5@test.co.kr', 'fsedsd112dfsfs', '강민서', 'http://test.co.kr/images/member/sample5.png', '010-4444-4444', '1', '1', '720522', '2024-06-10');

INSERT INTO `edu_community`.`member` (email, member_password, name, profile_img_path, telephone, entry_type_code, use_state_code, birth_date, entry_date) VALUES ('test6@test.co.kr', 'fsedsd112dfsfs', '강현서', 'http://test.co.kr/images/member/sample6.png', '010-4444-5555', '1', '1', '730522', '2024-07-10');


#Step2)Read Data -데이터 조회/SQL SELECT 구문 기본 예시 
#모든 컬럼 조회 
#SELECT 컬럼지정 또는 *(모든컬럼) FROM 테이블명 WHERE 조건절 ORDER BY 정렬방식;
SELECT * FROM member; 

#Where 조건절을 이용해 email 컬럼에 해당값과 일치하는 모든 데이터 컬럼 조회
SELECT * FROM member WHERE email='test1@test.co.kr';

#지정된 컬럼의 AND조합으로 두개 컬럼조건이 일치하는건만 조회
SELECT * FROM member WHERE entry_type_code = 1 AND name='강창훈';

#조건절내 두개의 컬럼중 하나만 일치해도 조회함
SELECT * FROM member WHERE entry_type_code = 1 OR use_state_code= 0;

#조건절에 해당한 데이터 목록중 해당 지정한 컬럼값들만 조회하기
SELECT member_id,email,name,telephone FROM member WHERE member_id >= 3;

#지정한 컬럼의 해당 값과 일치하는 모든 로우 조회(OR조건과 동일)
SELECT * FROM member WHERE name IN('사용자1','사용자3','강민서');

#패턴매칭 조회조건으로 특정 텍스트로 시작하거나 포함되어 있거나 끝나는 조건으로 값을 조회하고 싶을떄 사용
#패턴매칭  %가  가로 시작하는 모든항목, %가% 가가 포함된 모든데이터 가%가로 끝나는 모든 데이터
SELECT * FROM member WHERE name Like '%강%'; 

# 회원정보를 조회하는데 member_id 컬럼값으로 내림차순(큰값으로 시작해서 낮은값 순으로 출력) 정렬하기 6,5,4,3,2,1
SELECT * FROM member ORDER BY member_id DESC;

# 회원정보를 조회하는데 member_id 컬럼값으로 오름차순(작은값으로 시작해서 큰값 순으로 출력) 정렬하기 1,2,3,4,5,6
SELECT * FROM member ORDER BY member_id ASC;



#Step3) Update Data - 데이터 수정 / UPDATE SQL 구문학습
#회원번호 1번인 사용자의 이름과 프로필 이미지경로 값을 변경하기
#UPDATE 테이블명 SET 변경컬럼='변경값',변경컬럼2='변경값' WHERE 조건 

UPDATE member SET name='강창훈0',profile_img_path='http://naver.com/images/test.png' WHERE member_id=1;
SELECT * FROM member WHERE member_id=1;

#member_id 2보다 큰 모든 사용자의 가입상태코드를 0으로 변경
UPDATE member SET use_state_code=0 WHERE member_id > 2;


#Step4) Delete Data -데이터 삭제/ DELETE SQL 구문
#특정 메일주소 사용자 로우 데이터를  삭제하기
#DELETE FROM 테이블명 WHERE 조건절
SELECT * FROM member;
DELETE FROM member WHERE email='test4@test.co.kr';
SELECT * FROM member; 


지금까지 간단한 데이터 등록/조회/수정/삭제(CRUD) SQL구문을 실습해보았습니다.
수고 많으셨습니다.