SQL(Mysql)

이수현·2022년 6월 8일
0

TIL

목록 보기
22/23

SQL(Structured Query Language)

데이터베이스에서 데이터를 조작하거나 조회하기 위해 사용하는 표준 언어.
절차나 기술하는 것이 아닌 조건을 기술하여 작성한다.

DML(Data Manipulation Language)

INSERT

// 로우 삽입
INSERT INTO tbl_name (col1,col2) VALUES(14,15);

// 아래 두 쿼리문은 동일하다.
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3), (4,5,6), (7,8,9);
INSERT INTO tbl_name (a,b,c) VALUES ROW(1,2,3), ROW(4,5,6), ROW(7,8,9);

UPDATE

// 로우 수정
UPDATE [TABLE] SET id = id + 1 [WHERE조건];

UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;

DELETE

// 로우 삭제
DELETE FROM [TABLE] [WHERE조건]

// 조건 삭제
DELETE FROM somelog WHERE user = 'jcole'
ORDER BY timestamp_column LIMIT 1;

SELECT

우선 공식문서에 나와있는 SELECT문의 모든 옵션을 살펴보자.

SELECT
    [ALL | DISTINCT | DISTINCTROW ]
    [HIGH_PRIORITY]
    [STRAIGHT_JOIN]
    [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
    [SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr] ...
    [into_option]
    [FROM table_references
      [PARTITION partition_list]]
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]
    [HAVING where_condition]
    [WINDOW window_name AS (window_spec)
        [, window_name AS (window_spec)] ...]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [into_option]
    [FOR {UPDATE | SHARE}
        [OF tbl_name [, tbl_name] ...]
        [NOWAIT | SKIP LOCKED]
      | LOCK IN SHARE MODE]
    [into_option]

into_option: {
    INTO OUTFILE 'file_name'
        [CHARACTER SET charset_name]
        export_options
  | INTO DUMPFILE 'file_name'
  | INTO var_name [, var_name] ...
}

SELECT 문은 기본적으로 테이블의 로우 중에서 원하는 컬럼이나 모든 컬럼의 값을 선택하여 출력? 하는 데 사용하는 명령문이다. FROM 뒤에 적힌 테이블을 기준으로 하며 WHERE문이 존재한다면 테이블에서 WHERE문 뒤에 적힌 조건을 만족하는 로우들 중에서 값을 출력?한다.

SELECT name, age, address FROM user;
SELECT * FROM user WHERE age=20;

JOIN

[출처: https://developpaper.com/mysql-foundation-04-query/]

JOIN은 데이터베이스 내의 여러 테이블에서 가져온 로우를 조합하여 하나의 테이블이나 결과 집합으로 표현해 준다. 보통 SELECT와 함께 자주 사용된다.

SELECT columns
FROM table1 
INNER JOIN table2
ON table1.column = table2.column;

GROUP BY

HAVING

SUB QUERY

DDL(Data Definition Language)

// 데이터베이스 생성
CREATE DATABASE justgram_2
[OPTION]
DEFAULT CHARACTER SET utf8 
DEFAULT COLLATE utf8_general_ci;

// 테이블 생성
CREATE TABLE user
(
id int NOT NULL AUTO_INCREMENT PRIMARY KEY, 
user_id varchar(100) NOT NULL UNIQUE, 
password varchar(100) NOT NULL,
name varchar(100) NOT NULL, 
nickname varchar(100) NOT NULL, 
email varchar(100) NOT NULL, 
phone_number varchar(100) NOT NULL, 
profile_image_url varchar(2000), 
created_at timestamp NOT NULL default current_timestamp,
updated_at timestamp NOT NULL default current_timestamp ON UPDATE current_timestamp
);

CREATE TABLE feed(
id int NOT NULL AUTO_INCREMENT PRIMARY KEY, 
user_id int NOT NULL,
content varchar(2000), 
created_at timestamp NOT NULL default current_timestamp, 
updated_at timestamp NOT NULL default current_timestamp ON UPDATE current_timestamp, 
FOREIGN KEY(user_id) REFERENCES user(id) ON DELETE CASCADE
);

ALTER TABLE table_name
ADD column_name datatype;

ALTER TABLE table_name
MODIFY COLUMN column_name datatype;

ALTER TABLE table_name
DROP COLUMN column_name;

ALTER TABLE table_name
MODIFY COLUMN column_name datatype;
  • CREATE [DATABASE명] 명령어로 데이터베이스 생성
  • DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; 옵션으로 테이블 생성할 때, 기본 인코딩을 UTF8로 설정
  • CREATE TABLE [TABLE명]([COLUMN명 데이터타입 [DEFAULT 값 | 제약조건]) 명령어로 테이블 생성
  • NOT NULL : 해당 컬럼값 NULL 입력 방지
  • AUTO_INCREMENT : 로우가 생성될 때마다 자동으로 증가되게 설정
  • PRIMARY KEY : 해당 컬럼을 로우 식별자로 설정
  • DEFAULT CURRENT_TIMESTAMP [ON UPDATE CURRENT TIMESTAMP] : 로우가 생성될 때 기본값으로 현재 시간 설정(괄호 안 옵션이 있다면 로우가 변경될 때마다 현재 시간으로 변경)
  • FOREIGN KEY(user_id) REFERENCES [TABLE명](id) [ON DELETE CASCADE] : 해당 테이블 생성문에서 user_id가 TABLE명의 id를 참조하는 제약 조건을 설정하는 예제이다. 뒤 옵션으로 ON DELETE CASCADE를 부여하면 참조 테이블의 로우를 삭제할 경우 연결된 테이블의 로우가 함께 삭제된다. 연결된 데이터를 한 번에 지울 수 있어 데이터 관리가 편리해지고 일관성을 유지할 수 있다.(ON UPDATE CASCADE 옵션도 존재한다)
  • ALTER TABLE [TABLE명] OPTION : 테이블에 필드를 추가, 삭제, 수정할 때 사용한다. 옵션이 많기 때문에 아래 사이트를 참고하면 좋다.
    https://dev.mysql.com/doc/refman/8.0/en/alter-table.html

DCL(Data Control Language)

-- 사용자 권한 부여 명령어
GRANT 권한종류 ON 대상 TO 계정명 IDENTIFIED BY 암호 [WITH GRANT OPTION];

예제)
-- 모든 권한을 가진 계정 생성
GRANT ALL ON *.* TO test@localhost IDENTIFIED BY "test1";

-- 특정 데이터베이스에 조회권한을 가진 계정 생성
GRANT SELECT ON test.* TO test@localhost IDENTIFIED BY "test1";

-- GRANT로 계정생성 후 아래의 명령어를 실행해야 적용됩니다. 
FLUSH privileges;

-- 권한 해제 명령어
REVOKE insert, update, create ON [DB명.테이블명] TO [user@host];

-- 전체 권한 해제 명령어
REVOKE ALL ON [DB명.테이블명] TO [user@host];

-- 작업한 결과를 물리적 디스크로 저장하고, 조작 작업이 완료됨을 사용자에게 알려주는 명령어
COMMIT;

-- 작업했던 내용을 원래의 상태로 복구하기 위한 명령어
ROLLBACK;

0개의 댓글