sql >> データベース >  >> RDS >> Mysql

初心者のためのMySQL/MariaDBを学ぶ–パート1

    この記事では、データベース(スキーマとも呼ばれます)、テーブル(データ型を含む)を作成する方法を示し、データ操作言語を実行する方法を説明します。 ( DML MySQL上のデータを使用した操作 / MariaDB サーバー。

    以前に1)を持っていることを前提としています Linuxシステムに必要なパッケージをインストールし、 2) 実行されたmysql_secure_installation データベースサーバーのセキュリティを向上させるため。そうでない場合は、以下のガイドに従ってMySQL/MariaDBサーバーをインストールしてください。

    1. Linuxシステムに最新のMySQLデータベースをインストールする
    2. Linuxシステムに最新のMariaDBデータベースをインストールする

    簡潔にするために、 MariaDBを参照します この記事全体を通してのみですが、ここで概説されている概念とコマンドは MySQLに適用されます 同様に。

    パート1初心者向けのMySQL/MariaDBを学ぶ パート2 :MySQLとMariaDBのいくつかの関数の使用方法を学ぶ

    データベース、テーブル、および許可ユーザーの作成

    ご存知のように、データベースは、組織化された情報のコレクションとして簡単に定義できます。特に、 MariaDB はリレーショナルデータベース管理システム( RDBMS )そして、構造クエリ言語を使用してデータベースの操作を実行します。さらに、MariaDBではデータベースとスキーマという用語を同じ意味で使用していることに注意してください。

    永続的な情報をデータベースに保存するには、テーブルを使用します データの行を格納します。多くの場合、2つ以上のテーブルが何らかの方法で相互に関連付けられます。これは、リレーショナルデータベースの使用を特徴付ける組織の一部です。

    新しいデータベースの作成

    BooksDBという名前の新しいデータベースを作成するには 、次のコマンドでMariaDBプロンプトを入力します(ルートMariaDBユーザーのパスワードを入力するように求められます):

    [[email protected] ~]# mysql -u root -p
    Enter password: 
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 2
    Server version: 10.1.14-MariaDB MariaDB Server
    
    Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]> CREATE DATABASE BookstoreDB;
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [(none)]> 
    

    データベースが作成されたら、少なくとも2つのテーブルを作成する必要があります。ただし、最初にデータ型の概念を調べてみましょう。

    MariaDBデータ型の紹介

    前に説明したように、テーブル 永続的な情報を保持するデータベースオブジェクトです。各テーブルは2つ以上のフィールド(とも呼ばれます)で構成されます )そのようなフィールドが格納できる特定のデータ型(情報の種類)の。

    MariaDBで最も一般的なデータ型は次のとおりです(公式のMariaDBオンラインドキュメントで完全なリストを参照できます):

    数値:
    1. ブール値 0はfalseと見なされ、その他の値はtrueと見なされます。
    2. TINYINT 、SIGNEDとともに使用する場合、-128〜127の範囲をカバーしますが、UNSIGNEDの範囲は0〜255です。
    3. SMALLINT 、SIGNEDとともに使用する場合、-32768〜32767の範囲をカバーします。UNSIGNEDの範囲は0〜65535です。
    4. INT 、UNSIGNEDで使用する場合は、0〜4294967295の範囲をカバーし、それ以外の場合は-2147483648〜2147483647をカバーします。

    注 :TINYINT、SMALLINT、およびINTでは、デフォルトのSIGNEDが想定されます。

    DOUBLE(M、D) 、ここで M は桁の総数であり、 D は小数点以下の桁数で、倍精度浮動小数点数を表します。 UNSIGNEDが指定されている場合、負の値は許可されません。

    文字列:
    1. VARCHAR(M) Mの可変長の文字列を表します はバイト単位の最大許容列長です(理論上は65,535)。ほとんどの場合、バイト数は文字数と同じですが、3バイトも使用できる文字もあります。たとえば、スペイン語の文字ñは1文字を表しますが、2バイトを使用します。
    2. TEXT(M) 最大長が65,535文字の列を表します。ただし、 VARCHAR(M)で発生するように 、マルチバイト文字が格納されている場合、実際の最大長は短くなります。 Mの場合 が指定されている場合、列はそのような数の文字を格納できる最小の型として作成されます。
    3. MEDIUMTEXT(M) およびLONGTEXT(M) TEXT(M)に似ています 、最大許容長はそれぞれ16,777,215文字と4,294,967,295文字であるということだけです。
    日時:
    1. 日付 YYYY-MM-DDで日付を表します フォーマット。
    2. 時間 HH:MM:SS.sssで時間を表します 形式(時間、分、秒、およびミリ秒)。
    3. 日時 日付の組み合わせです および時間 YYYY-MM-DD HH:MM:SS フォーマット。
    4. タイムスタンプ 行が追加または更新された瞬間を定義するために使用されます。

    これらのデータ型を確認すると、テーブルの特定の列に割り当てる必要のあるデータ型を判断できるようになります。

    たとえば、人の名前は VARCHAR(50)に簡単に収まります。 、一方、ブログ投稿にはテキストが必要です タイプ( Mを選択 特定のニーズに応じて)。

    主キーと外部キーを使用したテーブルの作成

    テーブルの作成に取り掛かる前に、リレーショナルデータベースに関する2つの基本的な概念を確認する必要があります。プライマリ および外国 キー。

    主キー テーブル内の各行またはレコードを一意に識別する値が含まれます。一方、外部キー 2つのテーブルのデータ間にリンクを作成し、外部キーが配置されているテーブルに格納できるデータを制御するために使用されます。通常、主キーと外部キーはどちらもINTです。

    説明のために、BookstoreDBを使用してみましょう AuthorsTBLという名前の2つのテーブルを作成します およびBooksTBL 次のように。 NOT NULL 制約は、関連付けられたフィールドに NULL以外の値が必要であることを示します 。

    また、 AUTO_INCREMENT INTの値を1つ増やすために使用されます 新しいレコードがテーブルに挿入されたときの主キー列。

    MariaDB [(none)]> USE BookstoreDB;
    
    MariaDB [(none)]> CREATE TABLE AuthorsTBL (
    AuthorID INT NOT NULL AUTO_INCREMENT,
    AuthorName VARCHAR(100),
    PRIMARY KEY(AuthorID)
    );
    
    MariaDB [(none)]> CREATE TABLE BooksTBL (
    BookID INT NOT NULL AUTO_INCREMENT,
    BookName VARCHAR(100) NOT NULL,
    AuthorID INT NOT NULL,
    BookPrice DECIMAL(6,2) NOT NULL,
    BookLastUpdated TIMESTAMP,
    BookIsAvailable BOOLEAN,
    PRIMARY KEY(BookID),
    FOREIGN KEY (AuthorID) REFERENCES AuthorsTBL(AuthorID)
    );
    
    主キーと外部キーを使用してMySQLテーブルを作成する
    MariaDB [(none)]> USE BookstoreDB;
    Database changed
    MariaDB [BookstoreDB]> CREATE TABLE AuthorsTBL (
        -> AuthorID INT NOT NULL AUTO_INCREMENT,
        -> AuthorName VARCHAR(100),
        -> PRIMARY KEY(AuthorID)
        -> );
    Query OK, 0 rows affected (0.05 sec)
    
    MariaDB [BookstoreDB]> CREATE TABLE BooksTBL (
        -> BookID INT NOT NULL AUTO_INCREMENT,
        -> BookName VARCHAR(100) NOT NULL,
        -> AuthorID INT NOT NULL,
        -> BookPrice DECIMAL(6,2) NOT NULL,
        -> BookLastUpdated TIMESTAMP,
        -> BookIsAvailable BOOLEAN,
        -> PRIMARY KEY(BookID),
        -> FOREIGN KEY (AuthorID) REFERENCES AuthorsTBL(AuthorID)
        -> );
    Query OK, 0 rows affected (0.05 sec)
    
    MariaDB [BookstoreDB]> 
    

    これで、先に進んでAuthorsTBLにレコードを挿入し始めることができます。 およびBooksTBL

    行の選択、挿入、更新、および削除

    最初にAuthorsTBLにデータを入力します テーブル。なんで? AuthorIDの値が必要なため BooksTBLにレコードを挿入する前 。

    MariaDBプロンプトから次のクエリを実行します。

    MariaDB [BookstoreDB]> INSERT INTO AuthorsTBL (AuthorName) VALUES ('Agatha Christie'), ('Stephen King'), ('Paulo Coelho');
    

    その後、 AuthorsTBLからすべてのレコードを選択します 。 AuthorIDが必要になることを忘れないでください レコードごとにINSERTを作成します BooksTBLのクエリ 。

    一度に1つのレコードを取得する場合は、場所を使用できます。 行が返されるために満たす必要がある条件を示す句。たとえば、

    MariaDB [BookstoreDB]> SELECT * FROM AuthorsTBL WHERE AuthorName='Agatha Christie';
    

    または、すべてのレコードを同時に選択することもできます:

    MariaDB [BookstoreDB]> SELECT * FROM AuthorsTBL;
    
    MySQLでレコードを選択してクエリする
    MariaDB [BookstoreDB]> SELECT * FROM AuthorsTBL WHERE AuthorName='Agatha Christie';
    +----------+-----------------+
    | AuthorID | AuthorName      |
    +----------+-----------------+
    |        1 | Agatha Christie |
    +----------+-----------------+
    1 row in set (0.00 sec)
    
    MariaDB [BookstoreDB]> SELECT * FROM AuthorsTBL;
    +----------+-----------------+
    | AuthorID | AuthorName      |
    +----------+-----------------+
    |        1 | Agatha Christie |
    |        2 | Stephen King    |
    |        3 | Paulo Coelho    |
    +----------+-----------------+
    3 rows in set (0.00 sec)
    
    MariaDB [BookstoreDB]>
    

    それでは、挿入を作成しましょう BooksTBLのクエリ 、対応する AuthorIDを使用 各本の著者と一致するように。 1の値 BookIsAvailable 書籍の在庫があることを示します。0 それ以外の場合:

    MariaDB [BookstoreDB]> INSERT INTO BooksTBL (BookName, AuthorID, BookPrice, BookIsAvailable)
    VALUES ('And Then There Were None', 1, 14.95, 1),
    ('The Man in the Brown Suit', 1, 23.99, 1),
    ('The Stand', 2, 35.99, 1),
    ('Pet Sematary', 2, 17.95, 0),
    ('The Green Mile', 2, 29.99, 1),
    ('The Alchemist', 3, 25, 1),
    ('By the River Piedra I Sat Down and Wept', 3, 18.95, 0);
    
    MySQLテーブルにクエリを挿入
    MariaDB [BookstoreDB]> INSERT INTO BooksTBL (BookName, AuthorID, BookPrice, BookIsAvailable)
        -> VALUES ('And Then There Were None', 1, 14.95, 1),
        -> ('The Man in the Brown Suit', 1, 23.99, 1),
        -> ('The Stand', 2, 35.99, 1),
        -> ('Pet Sematary', 2, 17.95, 0),
        -> ('The Green Mile', 2, 29.99, 1),
        -> ('The Alchemist', 3, 25, 1),
        -> ('By the River Piedra I Sat Down and Wept', 3, 18.95, 0);
    Query OK, 7 rows affected (0.03 sec)
    Records: 7  Duplicates: 0  Warnings: 0
    

    この時点で、 SELECTを実行します BooksTBLのレコードを表示するには 。次に、更新しましょう 「錬金術師」の価格 」パウロコエーリョ およびSELECT その特定のレコードをもう一度。

    BookLastUpdatedに注意してください フィールドに異なる値が表示されるようになりました。前に説明したように、タイムスタンプ フィールドには、レコードが挿入されたとき、または最後に変更されたときの値が表示されます。

    MariaDB [BookstoreDB]> SELECT * FROM BooksTBL;
    MariaDB [BookstoreDB]> UPDATE BooksTBL SET BookPrice=22.75 WHERE BookID=6;
    MariaDB [BookstoreDB]> SELECT * FROM BooksTBL WHERE BookID=6;
    
    MySQLデータベースにクエリを挿入してテーブルを更新する
    MariaDB [BookstoreDB]> SELECT * FROM BooksTBL;
    +--------+-----------------------------------------+----------+-----------+---------------------+-----------------+
    | BookID | BookName                                | AuthorID | BookPrice | BookLastUpdated     | BookIsAvailable |
    +--------+-----------------------------------------+----------+-----------+---------------------+-----------------+
    |      1 | And Then There Were None                |        1 |     14.95 | 2016-10-01 23:31:41 |               1 |
    |      2 | The Man in the Brown Suit               |        1 |     23.99 | 2016-10-01 23:31:41 |               1 |
    |      3 | The Stand                               |        2 |     35.99 | 2016-10-01 23:31:41 |               1 |
    |      4 | Pet Sematary                            |        2 |     17.95 | 2016-10-01 23:31:41 |               0 |
    |      5 | The Green Mile                          |        2 |     29.99 | 2016-10-01 23:31:41 |               1 |
    |      6 | The Alchemist                           |        3 |     25.00 | 2016-10-01 23:31:41 |               1 |
    |      7 | By the River Piedra I Sat Down and Wept |        3 |     18.95 | 2016-10-01 23:31:41 |               0 |
    +--------+-----------------------------------------+----------+-----------+---------------------+-----------------+
    7 rows in set (0.00 sec)
    
    MariaDB [BookstoreDB]> UPDATE BooksTBL SET BookPrice=22.75 WHERE BookID=6;
    Query OK, 1 row affected (0.04 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    MariaDB [BookstoreDB]> SELECT * FROM BooksTBL WHERE BookID=6;
    +--------+---------------+----------+-----------+---------------------+-----------------+
    | BookID | BookName      | AuthorID | BookPrice | BookLastUpdated     | BookIsAvailable |
    +--------+---------------+----------+-----------+---------------------+-----------------+
    |      6 | The Alchemist |        3 |     22.75 | 2016-10-01 23:35:00 |               1 |
    +--------+---------------+----------+-----------+---------------------+-----------------+
    1 row in set (0.00 sec)
    
    MariaDB [BookstoreDB]> 
    

    ここでは行いませんが、使用されなくなったレコードを削除することもできます。たとえば、「錬金術師」を削除するとします。 」BooksTBLから 。

    そのために、 DELETEを使用します 次のようなステートメント:

    MariaDB [BookstoreDB]> DELETE FROM BooksTBL WHERE BookID=6;
    

    更新の場合と同様 、 SELECTを実行することをお勧めします まず、 DELETEの影響を受ける可能性のあるレコードを表示します。 。

    また、場所を追加することを忘れないでください 句と条件(BookID =6) 削除する特定のレコードを選択します。そうしないと、テーブル内のすべての行が削除されるリスクがあります!

    2つ(またはそれ以上)のフィールドを連結する場合は、 CONCATを使用できます。 声明。たとえば、本の名前と著者が「アルケミスト(パウロコエーリョ)」の形式で1つのフィールドで構成される結果セットを返したいとします。 」と価格の別の列。

    これには参加が必要です AuthorsTBLの間 およびBooksTBL 両方のテーブルで共有される共通フィールド( AuthorID ):

    MariaDB [BookstoreDB]> SELECT CONCAT(BooksTBL.BookName, ' (', AuthorsTBL.AuthorName, ')') AS Description, BooksTBL.BookPrice FROM AuthorsTBL JOIN BooksTBL ON AuthorsTBL.AuthorID = BooksTBL.AuthorID;
    

    ご覧のとおり、 CONCAT カンマで区切られた複数の文字列式を結合できます。また、エイリアス説明を選択したことにも気付くでしょう。 連結の結果セットを表します。

    上記のクエリの出力を次の画像に示します。

    MySQLテーブルの複数のフィールドのクエリ
    MariaDB [BookstoreDB]> SELECT CONCAT(BooksTBL.BookName, ' (', AuthorsTBL.AuthorName, ')') AS Description, BooksTBL.BookPrice FROM AuthorsTBL JOIN BooksTBL ON AuthorsTBL.AuthorID = BooksTBL.AuthorID;
    +--------------------------------------------------------+-----------+
    | Description                                            | BookPrice |
    +--------------------------------------------------------+-----------+
    | And Then There Were None (Agatha Christie)             |     14.95 |
    | The Man in the Brown Suit (Agatha Christie)            |     23.99 |
    | The Stand (Stephen King)                               |     35.99 |
    | Pet Sematary (Stephen King)                            |     17.95 |
    | The Green Mile (Stephen King)                          |     29.99 |
    | The Alchemist (Paulo Coelho)                           |     25.00 |
    | By the River Piedra I Sat Down and Wept (Paulo Coelho) |     18.95 |
    +--------------------------------------------------------+-----------+
    7 rows in set (0.00 sec)
    

    BookstoreDBデータベースにアクセスするためのユーザーを作成する

    ルートを使用する すべてのDMLを実行する データベースでの操作は悪い考えです。これを回避するために、新しい MariaDBを作成できます ユーザーアカウント( bookstoreuserという名前を付けます )そして、 BookstoreDBに必要なすべての権限を割り当てます :

    MariaDB [BookstoreDB]> CREATE USER [email protected] IDENTIFIED BY 'YourPasswordHere';
    MariaDB [BookstoreDB]> GRANT ALL PRIVILEGES ON  BookstoreDB.* to [email protected];
    MariaDB [BookstoreDB]> FLUSH PRIVILEGES;
    
    権限を持つ新しいデータベースユーザーを作成する
    MariaDB [BookstoreDB]> CREATE USER [email protected] IDENTIFIED BY 'tecmint';
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [BookstoreDB]> GRANT ALL PRIVILEGES ON  BookstoreDB.* to [email protected];
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [BookstoreDB]> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.00 sec)
    

    データベースごとに専用の個別のユーザーを配置することで、単一のアカウントが侵害された場合にデータベース全体が損傷するのを防ぐことができます。

    追加のMySQLのヒント

    MariaDBをクリアするには プロンプトが表示されたら、次のコマンドを入力して Enterを押します。 :

    MariaDB [BookstoreDB]> \! clear
    

    特定のテーブルの構成を検査するには、次のようにします。

    MariaDB [BookstoreDB]> SELECT COLUMNS IN [TABLE NAME HERE ];
    

    たとえば、

    MariaDB [BookstoreDB]> SHOW COLUMNS IN BooksTBL;
    
    データベーステーブルの列を一覧表示する
    MariaDB [BookstoreDB]> SHOW COLUMNS IN BooksTBL;
    +-----------------+--------------+------+-----+-------------------+-----------------------------+
    | Field           | Type         | Null | Key | Default           | Extra                       |
    +-----------------+--------------+------+-----+-------------------+-----------------------------+
    | BookID          | int(11)      | NO   | PRI | NULL              | auto_increment              |
    | BookName        | varchar(100) | NO   |     | NULL              |                             |
    | AuthorID        | int(11)      | NO   | MUL | NULL              |                             |
    | BookPrice       | decimal(6,2) | NO   |     | NULL              |                             |
    | BookLastUpdated | timestamp    | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
    | BookIsAvailable | tinyint(1)   | YES  |     | NULL              |                             |
    +-----------------+--------------+------+-----+-------------------+-----------------------------+
    6 rows in set (0.02 sec)
    

    簡単に調べると、 BookIsAvailable フィールドはNULLを認めます 値。それを許可したくないので、 次のような表:

    MariaDB [BookstoreDB]> ALTER TABLE BooksTBL MODIFY BookIsAvailable BOOLEAN NOT NULL;
    

    (列をもう一度表示してください–強調表示されたはい 上の画像では、いいえになっているはずです。 。

    最後に、サーバー上のすべてのデータベースを表示するには、次の手順を実行します。

    MariaDB [BookstoreDB]> SHOW DATABASES;
    OR
    MariaDB [BookstoreDB]> SHOW SCHEMAS;
    
    すべてのMySQLデータベースを一覧表示する
    [[email protected] ~]# mysql -u bookstoreuser -p
    Enter password: 
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 3
    Server version: 10.1.14-MariaDB MariaDB Server
    
    Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [BookstoreDB]> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | BookstoreDB        |
    | information_schema |
    +--------------------+
    2 rows in set (0.00 sec)
    
    MariaDB [BookstoreDB]> SHOW SCHEMAS;
    +--------------------+
    | Database           |
    +--------------------+
    | BookstoreDB        |
    | information_schema |
    +--------------------+
    2 rows in set (0.00 sec)
    

    次の画像は、 bookstoreuserとしてMariaDBプロンプトにアクセスした後の上記のコマンドの結果を示しています。 (このアカウントが BookstoreDB以外のデータベースを「見る」ことができないことに注意してください およびinformation_schema (すべてのユーザーが利用可能):

    概要

    この記事では、 DMLを実行する方法について説明しました。 操作と、MariaDBデータベース上にデータベース、テーブル、および専用ユーザーを作成する方法。さらに、システム/データベース管理者としての生活を楽にするためのヒントをいくつか紹介しました。

    1. MySQLデータベース管理パート– 1
    2. MySQLデータベース管理パート– 2
    3. MySQLパフォーマンスの調整と最適化–パート3

    この記事についてご不明な点がございましたら、お気軽にお問い合わせください。以下のコメントフォームを使用して、お気軽にご連絡ください。


    1. Barman 2.11:barman-cloud-restoreおよびbarman-cloud-wal-restore

    2. SQLServer2005のINSERTWHERECOUNT(*)=0でのUNIQUEKEY制約への違反

    3. SQLiteStatementはSELECT/INSERT / DELETE/UPDATEを実行します

    4. 行レベルのセキュリティの詳細な調査