SQL1

InSung-Na·2023년 2월 8일
0

Part 05. SQL

목록 보기
1/6
post-thumbnail

📌데이터베이스 정의

DataBase

  • 여러 사람이 공유하여 사용할 목적으로 체계화해 통합, 관리하는 데이터의 집합체

DBMS(DataBase Management System)

  • 사용자와 데이터베이스 사이에서 사용자의 요구에 따라 정보를 생성해주고 데이터베이스를 관리해주는 소프트웨어

관계형 데이터베이스(RDB : Relational Database)

  • 서로간에 관계가 있는 데이터 테이블들을 모아둔 데이터 저장공간

SQL(Structured Query Language)

  • 데이터베이스에서 데이터를 정의, 조작, 제어하기 위해 사용하는 언어

📌SQL의 구성

데이터 정의 언어 (DDL: Data Definition Language)

  • 데이터 구조를 정의하는 언어
  • CREATE, ALTER, DROP 등의 명령어

데이터 조작 언어 (DML: Data Manipulation Language)

  • 데이터를 조작&처리 하는 언어
  • INSERT, UPDATE, DELETE, SELECT 등의 명령어

데이터 제어 언어 (DCL: Data Control Language)

  • 데이터의 보안, 접근성을 제어하는 언어
  • GRANT, REVOKE, COMMIT, ROLLBACK 등의 명령어

1. 데이터 정의어(Data Definition Language)

데이터베이스 생성 및 삭제

DB 조회

SHOW DATABASES;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+

DB 생성

CREATE DATABASE mydb;
mysql> create database mydb;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+
7 rows in set (0.00 sec)

DB 삭제

DROP DATABASE mydb;
mysql> drop database mydb;
Query OK, 0 rows affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+
6 rows in set (0.00 sec)

유저 관리 명령어

데이터베이스 접근

USE mysql
mysql> use mysql;
Database changed

유저 정보 조회

SELECT host, user FROM user;
mysql> select host, user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+

유저 생성

  • localhost : 해당 컴퓨터에서만 사용가능한 유저
  • % : 외부에서도 사용가능한 유저
  • ID 중복 불가능하나, 호스트가 다르면 가능
CREATE USER 'USERNAME'@'HOST' identified by 'password'
mysql> create user 'zero'@'localhost' identified by '1234';
Query OK, 0 rows affected (0.01 sec)

mysql> create user 'zero'@'%' identified by '1234';
Query OK, 0 rows affected (0.01 sec)

mysql> select host, user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | zero             |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
| localhost | zero             |
+-----------+------------------+
6 rows in set (0.00 sec)

유저 삭제

DROP USER 'USERNAME'@'HOST'
mysql> drop user 'zero'@'localhost';
Query OK, 0 rows affected (0.01 sec)

mysql> drop user 'zero'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> select host, user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+
4 rows in set (0.00 sec)

테이블 생성 및 조회

실습환경 구축

create database zerobase default chracter set utf8mb4;
use zerobase;

테이블 생성

CREATE TABLE tablename
(
	columnname datatype,
    columnname datatype,
    ...
)
mysql> create table mytable
    -> (
    ->     id int,
    ->     name varchar(16)
    -> );
Query OK, 0 rows affected (0.02 sec)

테이블 목록조회

SHOW TABLES;
mysql> show tables;
+--------------------+
| Tables_in_zerobase |
+--------------------+
| mytable            |
+--------------------+
1 row in set (0.01 sec)

테이블 상세조회

DESC tablename;
mysql> desc mytable;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(16) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

🔍ALTER문법 : 테이블 수정 및 삭제

테이블 이름 변경

ALTER TABLE tablename
RENAME new_tablename;
mysql> alter table mytable
    -> rename person;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+--------------------+
| Tables_in_zerobase |
+--------------------+
| person             |
+--------------------+
1 row in set (0.00 sec)

컬럼 추가

ALTER TABLE tablename
ADD COLUMN columnname datatype;
mysql> alter table person
    -> add column agee double;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
# 칼럼명 변경 실습을 위한 agee 오타
mysql> desc person;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(16) | YES  |     | NULL    |       |
| agee  | double      | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

컬럼 데이터타입 변경

ALTER TABLE tablename
MODIFY COLUMN columnname datatype;
mysql> alter table mytable
    -> rename person;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+--------------------+
| Tables_in_zerobase |
+--------------------+
| person             |
+--------------------+
1 row in set (0.00 sec)

컬럼 이름과 데이터타입 변경

ALTER TABLE tablename
CHANGE COLUMN old_columnname new_columnname new_datatype;
mysql> alter table person
    -> change column agee age int;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc person;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(16) | YES  |     | NULL    |       |
| age   | int         | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

컬럼 삭제

ALTER TABLE tablename
DROP COLUMN columnname;
mysql> alter table person
    -> drop column age;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc person;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(16) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

테이블 삭제

DROP TABLE tablename;
mysql> drop table person;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
Empty set (0.00 sec)

2. 데이터 조작어(Data Manipulation Language)

🔍insert문법

실습환경 구축

use zerobase;
create table person(id int, name varchar(16), age int, sex char);
mysql> use zerobase;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> create table person
    -> (
    ->  id int,
    ->  name varchar(16),
    ->  age int,
    ->  sex char
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> desc person;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(16) | YES  |     | NULL    |       |
| age   | int         | YES  |     | NULL    |       |
| sex   | char(1)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

데이터 추가

INSERT INTO tablename (column1, column2, ...)
VALUES (value1, value2, ...);
# 컬럼을 지정하고 해당 컬럼에 데이터 추가
mysql> insert into person (id, name, age, sex)
    -> values (1, '이효리', 43, 'F');
Query OK, 1 row affected (0.01 sec)
# 모든 컬럼에 추가할 때는 지정하지 않아도 무관
mysql> insert into person
    -> values (2, '이상순', 48, 'M');
Query OK, 1 row affected (0.00 sec)

mysql> select * from person;
+------+--------+------+------+
| id   | name   | age  | sex  |
+------+--------+------+------+
|    1 | 이효리 |   43 | F    |
|    2 | 이상순 |   48 | M    |
+------+--------+------+------+
2 rows in set (0.00 sec)

🔍select 문법

데이터 선택

SELECT column1, column2, ...
FROM tablename;
# 특정 컬럼을 지정하여 테이블로부터 조회
mysql> select name, age, sex from person;
+--------+------+------+
| name   | age  | sex  |
+--------+------+------+
| 이효리 |   43 | F    |
| 이상순 |   48 | M    |
+--------+------+------+
2 rows in set (0.00 sec)
# '*'은 모든 것을 의미함
mysql> select * from person;
+------+--------+------+------+
| id   | name   | age  | sex  |
+------+--------+------+------+
|    1 | 이효리 |   43 | F    |
|    2 | 이상순 |   48 | M    |
+------+--------+------+------+
2 rows in set (0.00 sec)

🔍where 문법

조건부여

  • select, update, delete 등의 문법에 조건으로 같이 사용됨
SELECT column1, column2, ...
FROM tablename
WHERE condition;
mysql> select * from person where sex='F';
+------+--------+------+------+
| id   | name   | age  | sex  |
+------+--------+------+------+
|    1 | 이효리 |   43 | F    |
+------+--------+------+------+
1 row in set (0.00 sec)

mysql> select * from person where age<30;
Empty set (0.00 sec)

mysql> select * from person where age>45;
+------+--------+------+------+
| id   | name   | age  | sex  |
+------+--------+------+------+
|    2 | 이상순 |   48 | M    |
+------+--------+------+------+
1 row in set (0.00 sec)

🔍update 문법

데이터 수정

UPDATE tablename
SET column1 = value1, column2 = value2, ...
WHERER condition;
mysql> update person set age=23 where name='이효리';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from person;
+------+--------+------+------+
| id   | name   | age  | sex  |
+------+--------+------+------+
|    1 | 이효리 |   23 | F    |
|    2 | 이상순 |   48 | M    |
+------+--------+------+------+
2 rows in set (0.00 sec)

🔍delete 문법

데이터 삭제

DELETE FROM tablename
WHERE condition;
mysql> delete from person where name='이상순';
Query OK, 1 row affected (0.00 sec)

mysql> select * from person;
+------+--------+------+------+
| id   | name   | age  | sex  |
+------+--------+------+------+
|    1 | 이효리 |   23 | F    |
+------+--------+------+------+
1 row in set (0.00 sec)

3. 데이터 제어어(Data Control Language)

유저 권한 관리

실습환경 구축

create database testdb;
create user 'test_user'@'localhost' identified by '1234';

모든 권한 목록 확인

SHOW GRANTS FOR 'USERNAME'@'HOST';
mysql> show grants for 'test_user'@'localhost';
+-----------------------------------------------+
| Grants for test_user@localhost                |
+-----------------------------------------------+
| GRANT USAGE ON *.* TO `test_user`@`localhost` |
+-----------------------------------------------+
1 row in set (0.00 sec)

특정 DB의 모든 권한 부여

GRANT ALL ON DBNAME.* to 'USERNAME'@'HOST';
mysql> grant all on testdb.* to 'test_user'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'test_user'@'localhost';
+---------------------------------------------------------------+
| Grants for test_user@localhost                                |
+---------------------------------------------------------------+
| GRANT USAGE ON *.* TO `test_user`@`localhost`                 |
| GRANT ALL PRIVILEGES ON `testdb`.* TO `test_user`@`localhost` |
+---------------------------------------------------------------+
2 rows in set (0.00 sec)

새로고침

FLUSH PRIVILEGES;
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

특정 DB의 모든 권한 삭제

REVOKE ALL ON DBNAME.* from 'USERNAME'@'HOST';
mysql> revoke all on testdb.* from 'test_user'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'test_user'@'localhost';
+-----------------------------------------------+
| Grants for test_user@localhost                |
+-----------------------------------------------+
| GRANT USAGE ON *.* TO `test_user`@`localhost` |
+-----------------------------------------------+
1 row in set (0.00 sec)

0개의 댓글