Raspberry Pi_Kor_24.2.5 database SQL


Published Book on Amazon


All of IOT Starting with the Latest Raspberry Pi from Beginner to Advanced – Volume 1
All of IOT Starting with the Latest Raspberry Pi from Beginner to Advanced – Volume 2


출판된 한글판 도서


최신 라즈베리파이(Raspberry Pi)로 시작하는 사물인터넷(IOT)의 모든 것 – 초보에서 고급까지 (상)
최신 라즈베리파이(Raspberry Pi)로 시작하는 사물인터넷(IOT)의 모든 것 – 초보에서 고급까지 (하)


Original Book Contents


24.2.5  database SQL

 

24.2.5.1    database SQL 소개

 

모든 관계형 database에서는 그 내부의 자료를 관리할 때는 SQL(Structured Query Language)이라는 특별한 명령을 이용한다. SQL을 이용하여 database 내에서 자료의 형태와 내용을 정의할 수 있으며, database 안으로 자료를 입력하거나, 입력되어 있는 자료를 수정할 수 있으며, 또한 입력되어 있는 자료를 조회할 수 있다.    

 

database 관리에 필요한 SQL의 주요한 기능은 다음과 같다.

    database 조회         -- SHOW

    database 정의         -- CREATE/DROP DATABASE

    권한 관리               -- GRANT

    table 정의               -- CREATE/CHANGE/DROP TABLE

    table 내용 조회        -- DESCRIBE/EXPLAIN Table

    table 자료 입력        -- INSERT TABLE

    table 자료 수정        -- UPDATE TABle

    table 자료 삭제        -- DELETE TABLE

    table 자료 조회        -- SELECT TABLE

 

우리는 여기서 모든 SQL 기능을 설명하지 않을 것이며, 작동원리를 설명하는데 필요한 최소한의 정도까지만 기능을 소개할 것이다. 추가적인 학습은 별도의 방법을 통해서 학습하기 바란다.

 


 

24.2.5.2    database 정보 조회 - "SHOW" SQL

 

MySQL에서 server 상태에 대한 정보나 database, table 등에 대한 정보를 조회하고자 할 때 "SHOW" 명령을 사용할 수 있다.

 

SHOW  <database-information-object>   ;

 

다음은 "SHOW" 명령에서 처리 가능한 주요한 항목이다.

    SHOW DATABASES [like_or_where]                             -- MySQL database 목록

    SHOW GRANTS FOR user

    SHOW TABLE STATUS [FROM db_name] [like_or_where]  -- table들의 상태 정보

    SHOW [FULL] TABLES [FROM db_name] [like_or_where]  -- table 목록

 

다음은 MySQL에 어떤 database가 있는지를 확인하기 위한 명령이다

 

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

+--------------------+

3 rows in set (0.00 sec)

 

다음은 현재의 database mysql에서 어떤 table들이 있는지를 확인하기 위한 명령이다.

 

mysql> show tables;

+---------------------------+

| Tables_in_mysql           |

+---------------------------+

| columns_priv              |

| db                        |

| event                     |

중략

| time_zone_transition_type |

| user                      |

+---------------------------+

24 rows in set (0.01 sec)


 

24.2.5.3    database 생성   "CREATE DATABASE" SQL

 

MySQL에서 관리하는 모든 자료는 database 내부에 저장된다. 따라서 특정 자료를 저장하고자 하면 반드시 그 자료를 저장할 database가 사전에 생성되어 있어야 한다. MySQL database 시스템에서는 복수 개의 database를 정의하여 동시에 운영할 수 있다.

 

이 작업을 하기 위해서는 database에 대한 "CREATE" privilege가 있어야 한다.    

 

새로운 database를 생성할 때는 다음과 같은 "CREATE DATABASE" 명령을 사용한다

 

CREATE  DATABASE    [IF NOT EXISTS]   <database-name>    [option]

 

[IF NOT EXISTS] 문은 database가 존재하지 않는 경우만 생성 작업을 하고, 있는 경우는 처리를 하지 않음으로써 오류가 발생하지 않도록 하는 것이다.

 

다음은 MySQL에 새로운 database "raspi_db"를 생성하고 그 결과를 다시 조회한 것이다.

 

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

+--------------------+

3 rows in set (0.00 sec)

mysql> create database raspi_db ;

Query OK, 1 row affected (0.00 sec)

 

mysql> show databases ;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| raspi_db           |

+--------------------+

4 rows in set (0.00 sec)


 

24.2.5.4    database 삭제 – "DROP DATABASE" SQL

 

더 이상 사용하지 않는 자료를 완전히 제거하기 위해서는 이전에 정의되어 있던 database를 삭제하면 된다. 이럴 때 사용하는 명령이 "DROP DATABASE" 명령이다.

 

이 명령을 사용하면 database가 삭제될 뿐만 아니라 그 속에 포함되어 있던 모든 table table에 저장되어 있던 모든 자료도 함께 삭제된다.

 

이 작업을 하기 위해서는 database에 대한 "DROP" privilege가 있어야 한다.    

 

DROP  DATABASE   [IF EXISTS]    <database-name>   

 

IF EXISTS 문은 database가 존재하는 경우만 삭제작업을 하고, 없는 경우는 처리를 하지 않음으로써 오류가 발생하지 않도록 하는 것이다.

 

다음은 MySQL에 정의되어 있던 database "raspi_db"를 삭제하고 결과를 조회한 것이다.

 

mysql> show databases ;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| raspi_db           |

+--------------------+

4 rows in set (0.00 sec)

mysql> drop database raspi_db ;

Query OK, 0 rows affected (0.02 sec)

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

+--------------------+

3 rows in set (0.00 sec)

 


 

24.2.5.5    DB user 생성 – "CREATE USER"/"DROP USER" SQL

 

MySQL에 접근하는 모든 user는 사전에 생성되고, 적절한 권한이 부여되어 있어야 한다.

 

Database user는 운영체제의 사용자와는 구분되는 user이며, 운영체제와는 독립적으로 database 내에서 자체적으로 정의된다.

 

Database user를 생성하기 위해서는 "CREATE USER" 명령을 사용한다.

 

CREATE USER   

             < 'user-id'@'host-name'  [  IDENTIFIED BY 'password'  ]     >

[ ,< 'user-id'@'host-name'  [  IDENTIFIED BY 'password'  ]     > ] ...

 

database user가 생성되면 database "mysql" table "user"에 해당 내용이 저장된다.

 

새로 생성되는 user-id에 대해서 "IDENTIFIED BY"를 지정하면, user-id를 생성할 때 password를 함께 지정할 수 있고, password가 지정되지 않으면, password가 없는 상태로 user-id가 생성된다.

 

기존의 database user를 삭제하기 위해서는 "DROP USER" 명령을 사용한다.  

 

DROP USER

             < 'user-id'@'host-name' > 

           [ ,< 'user-id'@'host-name' > ]...

 

다음은 database "mysql" table "user"에 대한 정보를 확인한 것이다.

 

mysql> use mysql ;

Database changed

mysql> describe user ;

+------------------------+----------------------------------+------+-----+---------+-------+

| Field                  | Type                             | Null | Key | Default | Extra |

+------------------------+----------------------------------+------+-----+---------+-------+

| Host                   | char(60)                         | NO   | PRI |         |       |

| User                   | char(16)                         | NO   | PRI |         |       |

| Password               | char(41)                         | NO   |     |         |       |

| Select_priv            | enum('N','Y')                    | NO   |     | N       |       |

| Insert_priv            | enum('N','Y')                    | NO   |     | N       |       |

| Update_priv            | enum('N','Y')                    | NO   |     | N       |       |

| Delete_priv            | enum('N','Y')                    | NO   |     | N       |       |

| Create_priv            | enum('N','Y')                    | NO   |     | N       |       |

| Drop_priv              | enum('N','Y')                    | NO   |     | N       |       |

~ 중략

~ 중략

| max_user_connections   | int(11) unsigned                 | NO   |     | 0       |       |

| plugin                 | char(64)                         | YES  |     |         |       |

| authentication_string  | text                             | YES  |     | NULL    |       |

+------------------------+----------------------------------+------+-----+---------+-------+

42 rows in set (0.03 sec)

 

다음은 database "raspi_db"에서 'admin'@'localhost’를 생성한 다음, database "mysql" table "user"에 저장되어 있는 user-id 정보를 확인한 것이다.  해당 user-id가 생성되어 있는 것을 알 수 있다.

 

mysql> create user  'admin'@'localhost identified by  'xxxxxx'   ;

Query OK, 0 rows affected (0.00 sec)

mysql> use mysql ;

Database changed

mysql> select Host, User from user ;

+-----------------+------------------+

| Host            | User             |

+-----------------+------------------+

| 127.0.0.1       | root             |

| ::1             | root             |

| localhost       | admin            |

| localhost       | debian-sys-maint |

| localhost       | pi               |

| localhost       | root             |

+-----------------+------------------+

7 rows in set (0.01 sec)


 

24.2.5.6    user 권한 관리 – "GRANT"/"REVOKE" SQL

 

MySQL에서 하는 모든 작업에 대해서는 사전에 해당 권한이 부여되어 있어야 한다. 사용자 "root"는 모든 권한이 사전에 부여되어 있다.

 

새로운 권한을 부여할 때는 "GRANT" 명령을 사용하고, 권한을 박탈할 때는 "REVOKE" 명령을 사용한다.

 

GRANT

       priviage_type [(column_list)]        

[ ,priviage_type [(column_list)]] ...

    ON [ TABLE  | FUNCTION  | PROCEDURE ]   

< *  | *.*  | db_name.*  | db_name.tbl_name  | tbl_name  | db_name.routine_name  >

    TO    < 'user-id'@'host-name'  [ IDENTIFIED BY 'password'  ]  >

  [ ,< 'user-id'@'host-name'  [ IDENTIFIED BY 'password'  ]  > ] ...

REVOKE

             priviage_type [(column_list)]

      [ ,priviage_type [(column_list)]] ...

    ON [ TABLE  |  FUNCTION  | PROCEDURE ]

< *  | *.*  | db_name.*  | db_name.tbl_name  | tbl_name  | db_name.routine_name  >

    FROM   < 'user-id'@'host-name'

               [ ,< 'user-id'@'host-name' > ]...

 

권한이 적용되는 database table 등을 지정할 때 wildcard(*)를 사용할 수 있다. wildcard가 지정되면, 조건에 맞는 모든 object에 대해서 적용되는 것을 의미한다.

 

"GRANT" 명령에서 해당 database 내에서 정의되지 않은 user-id가 지정될 경우, 임의로 user를 생성하는 것에 대한 특별한 제한규정이 없으면, 새로운 user-id를 생성하고, user-id에 대해서 권한을 부여한다. 새로 생성되는 user-id에 대해서 "IDENTIFIED BY"를 지정하여 user-id를 생성할 때 password를 함께 지정할 수 있고, password가 지정되지 않으면, password가 없는 상태로 user-id가 생성된다.


 

"host_name"을 지정할 때 이름의 일부에 wildcard(%)를 사용하면, 해당 조건을 만족하는 모든 경우에 권한이 적용된다는 의미이다. 다음을 예를 참조하라

    %.com                  -- 'xxx.com' 형태의 모든 host에 적용된다.

    %.example.net        -- 'xxxx.example.net' 형태의 모든 host에 적용된다.

 

"GRANT" "REVOKE" 명령에서 사용할 있는 privileges type은 다음과 같다.

 

Privilege

Meaning and Grantable Levels

ALL [PRIVILEGES]

Grant all privileges at specified access level except GRANT OPTION

ALTER

Enable use of ALTER TABLE. Levels: Global, database, table.

ALTER ROUTINE

Enable stored routines to be altered or dropped. Levels: Global, database, procedure.

CREATE

Enable database and table creation. Levels: Global, database, table.

CREATE ROUTINE

Enable stored routine creation. Levels: Global, database.

CREATE TEMPORARY TABLES

Enable use of CREATE TEMPORARY TABLE. Levels: Global, database.

CREATE USER

Enable use of CREATE USER, DROP USER, RENAME USER, and REVOKE ALL PRIVILEGES. Level: Global.

CREATE VIEW

Enable views to be created or altered. Levels: Global, database, table.

DELETE

Enable use of DELETE. Level: Global, database, table.

DROP

Enable databases, tables, and views to be dropped. Levels: Global, database, table.

EXECUTE

Enable the user to execute stored routines. Levels: Global, database, table.

GRANT OPTION

Enable privileges to be granted to or removed from other accounts. Levels: Global, database, table, procedure, proxy.

INDEX

Enable indexes to be created or dropped. Levels: Global, database, table.

INSERT

Enable use of INSERT. Levels: Global, database, table, column.

LOCK TABLES

Enable use of LOCK TABLES on tables for which you have the SELECT privilege. Levels: Global, database.

PROCESS

Enable the user to see all processes with SHOW PROCESSLIST. Level: Global.

REFERENCES

Enable foreign key creation. Levels: Global, database, table, column.

RELOAD

Enable use of FLUSH operations. Level: Global.

SELECT

Enable use of SELECT. Levels: Global, database, table, column.

SHOW DATABASES

Enable SHOW DATABASES to show all databases. Level: Global.

SHOW VIEW

Enable use of SHOW CREATE VIEW. Levels: Global, database, table.

SHUTDOWN

Enable use of mysqladmin shutdown. Level: Global.

SUPER

Enable use of other administrative operations such as CHANGE MASTER TO, KILL, PURGE BINARY LOGS, SET GLOBAL, and mysqladmin debug command. Level: Global.

TRIGGER

Enable trigger operations. Levels: Global, database, table.

UPDATE

Enable use of UPDATE. Levels: Global, database, table, column.

USAGE

Synonym for "no privileges"

 

아래는 "GRANT" 명령을 실행하기 전의 상태를 확인한 것이다.

 

mysql> show grants for 'pi'@'localhost' ;

ERROR 1141 (42000): There is no such grant defined for user 'pi' on host 'localhost'

 

pi@localhost 계정에 대해서 권한을 부여하면서 암호를 함께 지정하는 "GRANT" 명령을 실행한 다음, 다시 권한 부여상태를 조회해 본 것이다. 지정한 권한 내용을 확인할 수 있다.  

 

mysql> grant all on  *.*  to 'pi'@'localhost' identified by 'xxxxxx' ;

Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'pi'@'localhost' ;

+--------------------------------------------------------------------------------+

| Grants for pi@localhost                                                                                            |

+--------------------------------------------------------------------------------+

| GRANT ALL PRIVILEGES ON *.* TO 'pi'@'localhost' IDENTIFIED BY PASSWORD '*9817606F8D7B598221D07445C7A03B71A6E83239' |

+--------------------------------------------------------------------------------+

1 row in set (0.01 sec)


 

24.2.5.7    table 생성   "CREATE TABLE" SQL

 

MySQL에서 관리하는 모든 자료는 database 내부에 있는 특정 table에 저장된다. 따라서 자료를 저장하고자 하면, database 내부에 반드시 그 자료를 저장할 특정 table이 사전에 생성되어 있어야 한다.

 

table 생성 작업을 하기 전에는 반드시 "use" 명령으로 database가 지정되어 있어야 한다이 작업을 하기 위해서는 table에 대한 "CREATE" 권한이 있어야 한다.    

 

새로운 table를 생성할 때는 다음과 같은 "CREATE TABLE" 명령을 사용한다

 

CREATE  TABLE     [IF NOT EXISTS]   <table-name>  

(

<col_name>  <data_type>  [NOT NULL  |  NULL]  [DEFAULT default_value]

             [AUTO_INCREMENT]  [UNIQUE [KEY]  |  [PRIMARY] KEY]    ,

<col_name>  <data_type> [NOT NULL  |  NULL]  [DEFAULT default_value]

             [AUTO_INCREMENT]  [UNIQUE [KEY]  |  [PRIMARY] KEY]    ,

<col_name>  <data_type> [NOT NULL  |  NULL]  [DEFAULT default_value]

             [AUTO_INCREMENT]  [UNIQUE [KEY]  |  [PRIMARY] KEY]

)

 

"IF NOT EXISTS" 문은 table이 존재하지 않는 경우만 생성 작업을 하고, 있는 경우는 처리를 하지 않음으로써 오류가 발생하지 않도록 하는 것이다.

 

column에서 사용할 수 있는 주요 data type은 다음과 같다.

    BIT[(length)]

    INT[(length)] [UNSIGNED] [ZEROFILL]

    INTEGER[(length)] [UNSIGNED] [ZEROFILL]

    REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]

    FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]

    DECIMAL[(length[,decimals])] [UNSIGNED] [ZEROFILL]

    NUMERIC[(length[,decimals])] [UNSIGNED] [ZEROFILL]

    DATE

    TIME

    TIMESTAMP

    DATETIME

    YEAR

    CHAR[(length)]

    VARCHAR(length)

    BLOB

 

다음에서 database "raspi_db" 내에 새로운 table "employee"를 생성할 것이다. 다음은 각 column에 대한 data type이다.

    id                         -- INT                          -- PRIMARY KEY, AUTO_INCREMENT

    name                     -- VARCHAR(50)

    birth                      -- DATE

    position_code          -- CHAR(10)

    dept_code               -- CHAR(10)

    manager_name        -- VARCHAR(50)

    sales                      -- DECIMAL(10,0)

    salary_rate              -- NUMERIC(6,2)

 

다음은 table을 생성하고 show 명령으로 결과를 확인한 것이다.

 

mysql> create table  employee 

(  id            INT PRIMARY KEY  AUTO_INCREMENT ,   

   name           VARCHAR(50)                 ,   

   birth         DATE                        ,   

   position_code  CHAR(04)                    ,   

   dept_code     CHAR(04)                     ,   

   manager_name         VARCHAR(50)                  ,   

   sales         DECIMAL(10,0)                ,   

   salary        NUMERIC(5,0)

 );

Query OK, 0 rows affected (0.03 sec)

mysql> show tables ;

+--------------------+

| Tables_in_raspi_db |

+--------------------+

| employee           |

+--------------------+

1 row in set (0.00 sec)


 

24.2.5.8    table 삭제 – "DROP TABLE" SQL

 

더 이상 사용하지 않는 자료를 완전히 제거하기 위해서는 이전에 정의되어 있던 table를 삭제하면 된다. 이럴때 사용하는 명령이 "DROP TABLE" 명령이다.

 

이 명령을 사용하면 table이 삭제되면서 그 속에 포함되어 있던 모든 자료도 함께 삭제된다. 이 작업을 하기 위해서는 table에 대한 "DROP" privilege가 있어야 한다.    

 

DROP   TABLE  [IF EXISTS]    < table -name>   

 

"IF EXISTS" 문은 table이 존재하는 경우만 삭제작업을 하고, 없는 경우는 처리를 하지 않음으로써 오류가 발생하지 않도록 하는 것이다.

 

다음은 database "raspi_db"에 정의되어 있던 table "employee_new"를 삭제하고 그 결과를 다시 조회한 것이다.

 

mysql> show tables ;

+--------------------+

| Tables_in_raspi_db |

+--------------------+

| employee           |

| employee_new       |

+--------------------+

2 rows in set (0.00 sec)

 

mysql> drop table employee_new ;

Query OK, 0 rows affected (0.02 sec)

 

mysql> show tables ;

+--------------------+

| Tables_in_raspi_db |

+--------------------+

| employee           |

+--------------------+

1 row in set (0.01 sec)

 


 

24.2.5.9    table 정보 조회 – "EXPLAIN SQL"/"DESCRIBE" SQL

 

특정 database 내에 있는 table에 대한 정보를 조회하고자 할 때 "DESCRIBE" 명령이나 "EXPLAIN" 명령을 사용할 수 있다.

 

<DESCRIBE | DESC | EXPLAIN>     <table-name>  [col_name]

 

"SHOW" 명령으로 table 관련 정보를 조회할 수 있다. 다음을 참조하기 바란다.

    SHOW CREATE TABLE

    SHOW TABLE STATUS

    SHOW INDEX

 

다음은 "raspi_db"에 정의되어 있는 "employee" table에 대한 내용을 확인해 본 결과이다. 해당 table에 정의되어 있는 각 field에 대한 상세한 정보가 표시되는 것을 확인할 수 있다.

 

mysql> desc employee ;

+---------------+---------------+------+-----+---------+----------------+

| Field         | Type          | Null | Key | Default | Extra          |

+---------------+---------------+------+-----+---------+----------------+

| id            | int(11)       | NO   | PRI | NULL    | auto_increment |

| name          | varchar(50)   | YES  |     | NULL    |                |

| birth         | date          | YES  |     | NULL    |                |

| position_code | char(4)       | YES  |     | NULL    |                |

| dept_code     | char(4)       | YES  |     | NULL    |                |

| manager_name  | varchar(50)   | YES  |     | NULL    |                |

| sales         | decimal(10,0) | YES  |     | NULL    |                |

| salary        | decimal(5,0)  | YES  |     | NULL    |                |

+---------------+---------------+------+-----+---------+----------------+

8 rows in set (0.01 sec)

 

mysql>

 

 

 

 


 

24.2.5.10  table 자료 입력 – "INSERT" SQL

 

database 내에 있는 특정 table에 자료를 입력하고자 할 때 "INSERT" 명령을 사용한다.

 

INSERT  INTO  <table-name> 

(   < col_name >      ,   < col_name >       ,   < col_name >          )

VALUES

(  {expr | DEFAULT}   ,   {expr | DEFAULT}     ,   {expr | DEFAULT}        )  

INSERT  INTO  <table-name> 

SET  < col_name >  = {expr | DEFAULT}                      ,

      < col_name >  = {expr | DEFAULT}          ,

       < col_name >  = {expr | DEFAULT}  

 

다음에서 "raspi_db"에 정의되어 있는 "employee" table에 자료를 입력해 보도록 하겠다.

 

mysql> INSERT  INTO  employee  

   SET   name            = "John"   ,

         birth           = "1960-05-17",

         position_code   = "11111",

         dept_code       = "E1000",

         manager_name    = "Mike",

         sales           = "300000",

       salary          = "600000" ;

Query OK, 1 row affected, 3 warnings (0.01 sec)

mysql> select * from employee ;

+----+------+------------+---------------+-----------+--------------+--------+--------+

| id | name | birth      | position_code | dept_code | manager_name | sales  | salary |

+----+------+------------+---------------+-----------+--------------+--------+--------+

|  1 | John | 1960-05-17 | 1111          | E100      | Mike         | 300000 |  99999 |

|  2 | John | 1960-05-17 | 1111          | E100      | Mike         | 300000 |  99999 |

|  3 | John | 1960-05-17 | 1111          | E100      | Mike         | 300000 |  99999 |

+----+------+------------+---------------+-----------+--------------+--------+--------+

1 rows in set (0.00 sec)

mysql>  

 

위 사례는 입력 작업을 3회 실시한 후, 해당 table에서 자료를 조회하는 "select" 명령을 실행한 것이다. 모두 3개의 자료가 입력되어 있는 것을 확인할 수 있고, 각각의 자료에 대한 "id" column을 보면 입력작업에서 특별한 값을 지정하지 않았지만 자동으로 순차적으로 번호가 부여되어 있는 것을 알 수 있다.  


 

24.2.5.11  table 자료 조회 – "SELECT" SQL

 

database 내에 있는 특정 table의 자료를 조회하고자 할 때 "SELECT" 명령을 사용한다.

 

SELECT

    [ ALL | DISTINCT | DISTINCTROW ] 

< col_name | expression >  [, < col_name | expression > ...]

[ FROM        < tbl_name [[AS] alias]    [ table_join_reference  ] >

 [ WHERE         < col_name  < comparison-operator > expression >  [ < logical-operator > 

                    < col_name  < comparison-operator > expression >  ] ]

 

    [ GROUP BY { col_name | expr | position }    [ASC | DESC], ...]

 [ HAVING      < col_name  < comparison-operator > expression >  [ < logical-operator > 

                    < col_name  < comparison-operator > expression >  ] ]

 

    [ ORDER BY { col_name | expr | position }    [ASC | DESC], ...]  ]

 

    SELECT column

조회하고자 하는 column을 지정한다.

"*" 라고 지정하면 모든 column을 의미한다.

여러 개의 column이 있으면 ","로 구분한다

 

    FROM

조회하고자 하는 table을 지정한다.

 

    WHERE

조회하고자 하는 자료의 조건을 지정하는 것이다

통상 column에 대한 조건을 지정한다

ex) name  = "Mike"

      sales  < "30000"

 

    GROUP BY

지정한 column 조합에 대해서 동일한 키 값을 가지는 경우에는 하나로 처리한다. 여러 개의 column을 지정할 수 있다.


 

    HAVING

GROUP BY를 사용하는 경우에 GROUP에 대한 조건을 지정하는 것이다.  

 

    ORDER BY

조회된 자료의 정렬 순서를 지정하는 것이다.

 

    FROMtable_join_ reference

    [ INNER | CROSS] JOIN               tbl_name [[AS] alias]       < join_expr>

    STRAIGHT_JOIN                       tbl_name [[AS] alias]       < join_expr>  

    {LEFT|RIGHT} [OUTER] JOIN         tbl_name [[AS] alias]       < join_expr>  

 

여기서 <join_expr> < ON conditional_expr | USING (column_list) >의 형식이다.

 

    logical-operator

 

Name

Description

AND, &&

Logical AND

NOT, !

Negates value

||, OR

Logical OR

XOR

Logical XOR

 

    comparison-operator

 

Name

Description

<=>

NULL-safe equal to operator

=

Equal operator

>=

Greater than or equal operator

Greater than operator

<=

Less than or equal operator

Less than operator

!=, <>

Not equal operator

IS NULL

NULL value test

IS NOT NULL

NOT NULL value test

ISNULL( )

Test whether the argument is NULL

IS

Test a value against a boolean

IS NOT

Test a value against a boolean

BETWEEN ... AND ...

Check whether a value is within a range of values

NOT BETWEEN ... AND ...

Check whether a value is not within a range of values

LIKE

Simple pattern matching

NOT LIKE

Negation of simple pattern matching

IN( )

Check whether a value is within a set of values

NOT IN( )

Check whether a value is not within a set of values

INTERVAL( )

Return the index of the argument that is less than the first argument

GREATEST( )

Return the largest argument

LEAST( )

Return the smallest argument

 

다음은 table "employee"의 모든 column에 대한 자료를 조회한 것이다. 모든 column을 표시하기 위해서 "*"을 사용하였다.

 

mysql> select * from employee ;

+----+-------+------------+---------------+-----------+--------------+--------+--------+

| id | name  | birth      | position_code | dept_code | manager_name | sales  | salary |

+----+-------+------------+---------------+-----------+--------------+--------+--------+

|  1 | John  | 1960-05-17 | 1111          | E100      | Mike         | 300000 |  99999 |

|  2 | John  | 1960-05-17 | 1111          | E100      | Mike         | 300000 |  99999 |

|  3 | John  | 1960-05-17 | 1111          | E100      | Mike         | 300000 |  99999 |

|  4 | John  | 1960-05-17 | 1111          | E100      | Mike         | 300000 |  99999 |

|  5 | Bill  | 1960-05-17 | 4444          | E400      | Anderson     | 500000 |  99999 |

|  6 | James | 1970-05-17 | 6666          | D100      | Anderson     | 300000 |  99999 |

+----+-------+------------+---------------+-----------+--------------+--------+--------+

6 rows in set (0.01 sec)

mysql>  


 

다음은 table "employee"의 일부 column만 선택하고, "WHERE" 조건으로 하나의 column에 대한 조건을 지정하여 처리한 경우이다.  

 

mysql> select id, name, sales from employee where  id >= 3;

+----+-------+--------+

| id | name  | sales  |

+----+-------+--------+

|  3 | John  | 300000 |

|  4 | John  | 300000 |

|  5 | Bill  | 500000 |

|  6 | James | 300000 |

+----+-------+--------+

4 rows in set (0.00 sec)

mysql>

 

다음은 table "employee"의 일부 column만 선택하고, "WHERE" 조건으로 두개의 column에 대한 조건을 지정하여 처리한 경우이다

 

mysql> select id, name, sales from employee where  id >= 3 and sales=300000 ;

+----+-------+--------+

| id | name  | sales  |

+----+-------+--------+

|  3 | John  | 300000 |

|  4 | John  | 300000 |

|  6 | James | 300000 |

+----+-------+--------+

3 rows in set (0.01 sec)

mysql>


 

24.2.5.12  table 자료 변경 – "UPDATE" SQL

 

database 내에 있는 특정 table의 자료를 변경하고자 할 때 "UPDATE" 명령을 사용한다.

 

UPDATE  table_name

SET  < col_name >  = {expr | DEFAULT}                     ,

     < col_name >  = {expr | DEFAULT}         ,

     < col_name >  = {expr | DEFAULT}  

[ WHERE  < col_name  < comparison-operator > expression >  [ < logical-operator > 

           < col_name  < comparison-operator > expression >  ] ]    

 

    SET column

수정하고자 하는 column을 지정한다.

여러 개의 column이 있으면 ","로 구분한다

DEFAULT를 지정하면 해당 column의 자료 유형에 따라 default값이 지정된다.

 

    WHEREcomparison-operator          -- SELECT의 설명을 참조한다.

    WHERElogical-operator                -- SELECT의 설명을 참조한다.

 

다음은 table "employee"의 일부 자료를 조회한 것이다

 

mysql> select * from employee where id <= 3 ;

+----+----------+------------+---------------+-----------+--------------+--------+--------+

| id | name     | birth      | position_code | dept_code | manager_name | sales  | salary |

+----+----------+------------+---------------+-----------+--------------+--------+--------+

|  1 | John     | 1960-05-17 | 1111          | E100      | Mike         | 300000 |  99999 |

|  2 | John     | 1960-05-17 | 1111          | E100      | Mike         | 300000 |  99999 |

|  3 | John     | 1960-05-17 | 1111          | E100      | Mike         | 300000 |  99999 |

+----+----------+------------+---------------+-----------+--------------+--------+--------+

 


 

다음은 table "employee"에서 "id" column "1"인 자료의 "name" 값을 수정하고, 위의 자료를 다시 조회한 것이다. "id" column "1"인 자료에서 "name" 값이 변경되어 있는 것을 알 수 있다.   

 

mysql> update employee set name = "Davinchi" where id = 1 ;

Query OK, 1 row affected (0.01 sec)

Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from employee where id <= 3 ;

+----+----------+------------+---------------+-----------+--------------+--------+--------+

| id | name     | birth      | position_code | dept_code | manager_name | sales  | salary |

+----+----------+------------+---------------+-----------+--------------+--------+--------+

|  1 | Davinchi | 1960-05-17 | 1111          | E100      | Mike         | 300000 |  99999 |

|  2 | John     | 1960-05-17 | 1111          | E100      | Mike         | 300000 |  99999 |

|  3 | John     | 1960-05-17 | 1111          | E100      | Mike         | 300000 |  99999 |

+----+----------+------------+---------------+-----------+--------------+--------+--------+


 

24.2.5.13  table 자료 삭제 – "DELETE" SQL

 

database 내에 있는 특정 table의 자료를 삭제하고자 할 때 "DELETE" 명령을 사용한다.

 

DELETE  FROM   table_name

[ WHERE  < col_name  < comparison-operator > expression > [ < logical-operator > 

< col_name  < comparison-operator > expression >  ] ]    

 

    WHEREcomparison-operator          -- SELECT의 설명을 참조한다.

    WHERElogical-operator                -- SELECT의 설명을 참조한다.

 

다음은 table "employee"의 일부 자료를 조회한 것이다

 

mysql> select * from employee where id <= 3 ;

+----+----------+------------+---------------+-----------+--------------+--------+--------+

| id | name     | birth      | position_code | dept_code | manager_name | sales  | salary |

+----+----------+------------+---------------+-----------+--------------+--------+--------+

|  1 | Davinchi | 1960-05-17 | 1111          | E100      | Mike         | 300000 |  99999 |

|  2 | John     | 1960-05-17 | 1111          | E100      | Mike         | 300000 |  99999 |

|  3 | John     | 1960-05-17 | 1111          | E100      | Mike         | 300000 |  99999 |

+----+----------+------------+---------------+-----------+--------------+--------+--------+

3 rows in set (0.01 sec)

 

다음은 table "employee"에서 "id" column의 값이 "3"인 자료를 삭제하고, 위의 자료를 다시 조회한 것이다. "id" column "3"인 자료가 삭제된 것을 확인할 수 있다

 

mysql> delete employee where id = 3 ;

Query OK, 1 row affected (0.01 sec)

Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from employee where id <= 3 ;

+----+----------+------------+---------------+-----------+--------------+--------+--------+

| id | name     | birth      | position_code | dept_code | manager_name | sales  | salary |

+----+----------+------------+---------------+-----------+--------------+--------+--------+

|  1 | Davinchi | 1960-05-17 | 1111          | E100      | Mike         | 300000 |  99999 |

|  2 | John     | 1960-05-17 | 1111          | E100      | Mike         | 300000 |  99999 |

+----+----------+------------+---------------+-----------+--------------+--------+--------+

2 rows in set (0.01 sec)

 


 

Leave a Reply