データベースは頭を包み込むのが難しい場合があります。ただし、これらはフルスタックプログラミングとデータを保存するバックエンドサービスの構築に不可欠です。
この投稿では、SQL、データベース、およびリレーショナルデータベース管理システムの謎を解き明かします。また、ハリーポッター自身や、ホグワーツで受けているクラスのいくつかなど、魔法の世界との類似点もいくつか使用します。
重要な用語に飛び込む前に、データベース自体が何であるかを定義しましょう。
データベース は、コンピューターに保持されている構造化されたデータセットであり、特にさまざまな方法でアクセスできるものです。これは基本的に、コンピューター上のデータの整理されたセットであり、コンピューターシステムから電子的にアクセスできます。
以下は、私たちが始めるいくつかの重要な用語です:
- RDMS: リレーショナルデータベース管理システム。このデータベースのフレームワークはMySQLの基盤です。
- SQL: 構造化照会言語。
- 表: データを運ぶデータベースオブジェクト。テーブル名の例は、「Students」、「Teachers」、または「Courses」です。
- フィールド: テーブルの値はフィールドと呼ばれます。学生のフィールドの例は、「名」、「姓」、「GPA」です。
- レコード/行: テーブル内の個々のエントリ。
教師とコースをデータベースに追加すると、学生、教師、コースのテーブルを作成できます。
ガイドを進めるにつれ、学生のみを使用します。 参考としてここに例を示します。ホグワーツ魔法魔術学校でソフトウェアエンジニアとして雇われることができたのであれば、データベースはこれらのコマンドのいくつかをうまく利用しているかもしれません:D
SQLステートメント
セミコロンは、あるSQLステートメントを別のSQLステートメントから分離するための標準的な方法です。これにより、同じ呼び出しで複数のSQLステートメントを実行できます。このガイドでは、各ステートメントの最後にセミコロンを付けます。
作成 :新しいSQLテーブルを作成します。
たとえば、ホグワーツ魔法魔術学校の生徒データベースを作成する場合は、 CREATEを使用します。 作る 「学生」と呼ばれるテーブル。
- 構文
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
column3 datatype,
....
);
- 例
CREATE TABLE Students
(first_name VARCHAR(255),
last_name VARCHAR(255),
login VARCHAR(255),
age INTEGER,
gpa REAL,
house VARCHAR(255));
ドロップ :テーブルを削除します。このコマンドを使用するときは、テーブル内のすべてのデータが消去されるため、十分に注意してください。
Studentデータベース全体を削除する場合は、 DROPを使用します。 そのアクションを実行します。
- 構文
DROP TABLE table_name;
- 例
DROP TABLE Students;
挿入 :データの新しい行をテーブルに追加します。
INSERTを使用します ホグワーツに入学するときに新しい学生を追加します。
- 構文
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
- 例
INSERT
INTO Students(first_name, last_name, login, age, gpa, house)
VALUES
('Harry', 'Potter', 'theboywholived', 15, 4.0, 'Gryffindor'),
('Hermionie', 'Granger','granger2', 15, 4.5, 'Gryffindor'),
('Ron', 'Weasley','weasley7', 15, 3.7, 'Gryffindor'),
('Draco', 'Malfoy', 'malfoy999', 15, 4.0, 'Slytherin'),
('Cedric', 'Diggory','diggory123', 15, 4.0, 'Hufflepuff');
選択 :データベース内のデータをフェッチして、テーブル形式で返すために使用されます。
グリフィンドールハウスにいる学生の名前をすべて取得したい場合は、 SELECTを使用します。 指図。次の例では、Studentsテーブルで、データベース内のすべての学生の名前と名前をクエリします。これは、上記の5行だけです。
- 構文
SELECT column1, column2, ...
FROM table_name;
- 例
SELECT first_name, last_name FROM Students;
first_name | last_name |
---|---|
ハリー | ポッター |
ハーミオニー | グレンジャー |
ロン | ウィーズリー |
ドラコ | マルフォイ |
セドリック | ディゴリー |
または、テーブル内のすべてのフィールドを選択する場合、コマンドは「*」構文を使用します。これは、すべてのフィールドを選択することを意味します。
SELECT * FROM Students;
first_name | last_name | ログイン | 年齢 | gpa | 家 |
---|---|---|---|---|---|
ハリー | ポッター | 生きた少年 | 15 | 4 | グリフィンドール |
ハーミオニー | グレンジャー | grander2 | 15 | 4.5 | グリフィンドール |
ロン | ウィーズリー | weasley7 | 15 | 3.7 | グリフィンドール |
ドラコ | マルフォイ | malfoy999 | 15 | 4 | スリザリン |
セドリック | ディゴリー | diggory123 | 15 | 4 | ハッフルパフ |
条項 はSQLステートメントの論理チャンクであり、(理論的には)オプションのフィールドです。
上記のステートメントでは、Studentデータベースのすべてのフィールドを返すだけです。返される値の条件を指定しませんでした。
すべての学生ではなく、家がグリフィンドールである学生だけにクエリを実行したい場合はどうなりますか?名が「H」で始まる生徒、またはHufflepuffとSlytherinのいずれかの生徒にクエリを実行するのはどうでしょうか。これらのより複雑なケースは、SQL句によって解決されます。
以下は最も一般的な句の概要ですが、SQL言語にはさらにいくつかの句があります。さらに詳しい情報が必要な場合は、一般的な概要を以下に示します。
場所: データベースからデータをフェッチする際の状態を示すために使用されます。 Selectの例に戻ると、 WHEREを使用する必要があります。 家をグリフィンドールとして指定するため。
- 構文
SELECT column1, column2, ...
FROM table_name
WHERE condition;
- 例
SELECT * FROM Students
WHERE house='Gryffindor';
first_name | last_name | ログイン | 年齢 | gpa | 家 |
---|---|---|---|---|---|
ハリー | ポッター | 生きた少年 | 15 | 4 | グリフィンドール |
ハーミオニー | グレンジャー | grander2 | 15 | 4.5 | グリフィンドール |
ロン | ウィーズリー | weasley7 | 15 | 3.7 | グリフィンドール |
そして ANDで区切られたすべての条件が真であるSQLステートメントで複数の句を組み合わせるために使用されます。 ANDを使用して、3.8GPAを超えるグリフィンドールの生徒を取得します。
- 構文
SELECT column1, column2, ...
FROM table_name
WHERE condition1 AND condition2 AND condition3 ...;
- 例
SELECT * FROM Students
WHERE house='Gryffindor' AND gpa>3.8;
first_name | last_name | ログイン | 年齢 | gpa | 家 |
---|---|---|---|---|---|
ハリー | ポッター | 生きた少年 | 15 | 4 | グリフィンドール |
ハーミオニー | グレンジャー | grander2 | 15 | 4.5 | グリフィンドール |
または :ANDに似ていますが、ORで区切られた条件の1つだけが真であるデータのみを返します。 HufflepuffとSlytherinの両方ではなく、両方の学生を取得したい場合は、ORコマンドを使用します。
- 構文
SELECT column1, column2, ...
FROM table_name
WHERE condition1 OR condition2 OR condition3 ...;
- 例
SELECT * FROM Students
WHERE house='Slytherin' OR house='Hufflepuff';
first_name | last_name | ログイン | 年齢 | gpa | 家 |
---|---|---|---|---|---|
ドラコ | マルフォイ | malfoy999 | 15 | 4 | スリザリン |
セドリック | ディゴリー | diggory123 | 15 | 4 | ハッフルパフ |
いいね: WHEREとともに使用して、特定のパターンを検索します。名前が「H」で始まるウィザード/魔女の名前と名前だけが必要な場合は、Likeコマンドを使用できます。
- 構文
SELECT column1, column2, ...
FROM table_name
WHERE columnN LIKE pattern;
- 例
SELECT first_name, last_name FROM Students
WHERE first_name LIKE 'H%';
first_name | last_name |
---|---|
ハリー | ポッター |
ハーミオニー | グレンジャー |
カウント: テーブル内の1つまたは複数の列の数を検索するために使用されます。
- 構文
SELECT COUNT(column_name)
FROM table_name
WHERE condition;
- 例
SELECT COUNT(first_name) FROM Students;
COUNT(first_name) |
---|
5 |
同じ構文を使用する他の2つのコマンドは、AVGとSUMです。 AVGはすべての値の平均を計算し、sumはすべての値の合計を計算します。
制限の選択: 指定された量だけ応答を遮断するために使用されます。上位の回答が選択される方法は、最初にデータベースに時系列で挿入された順序です。
- 構文
SELECT column_name(s)
FROM table_name
WHERE condition
LIMIT number;
- 例
SELECT * FROM Students LIMIT 3;
first_name | last_name | ログイン | 年齢 | gpa | 家 |
---|---|---|---|---|---|
ハリー | ポッター | 生きた少年 | 15 | 4 | グリフィンドール |
ハーミオニー | グレンジャー | grander2 | 15 | 4.5 | グリフィンドール |
ロン | ウィーズリー | weasley7 | 15 | 3.7 | グリフィンドール |
注文者: 結果を昇順または降順で並べ替えます。
- 構文
SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ... ASC|DESC;
- 例
SELECT * FROM Students ORDER BY first_name;
first_name | last_name | ログイン | 年齢 | gpa | 家 |
---|---|---|---|---|---|
セドリック | ディゴリー | diggory123 | 15 | 4 | ハッフルパフ |
ドラコ | マルフォイ | malfoy999 | 15 | 4 | スリザリン |
ハリー | ポッター | 生きた少年 | 15 | 4 | グリフィンドール |
ハーミオニー | グレンジャー | grander2 | 15 | 4.5 | グリフィンドール |
ロン | ウィーズリー | weasley7 | 15 | 3.7 | グリフィンドール |
グループ化: 同じ値を持つカテゴリを行にグループ化します。各家の生徒数(たとえば、グリフィンドールでは3人)を知りたい場合は、GroupByコマンドを利用できます。
- 構文
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);
- 例
SELECT COUNT(first_name), house FROM Students GROUP BY house;
COUNT(first_name) | 家 |
---|---|
3 | グリフィンドール |
1 | ハッフルパフ |
1 | スリザリン |
最後に、上記のすべてのコマンドの動作を示すDBフィドルがあります!
データベースを設計する場合、従うことができる2つの主要な設計パターンがあり、それぞれに独自のトレードオフがあります。
正規化: 冗長性を最小限に抑えるために最適化します 読み取り時間ではありません。
そのコースを教えている教師の教師IDを持つコーステーブルがあるとしましょう。また、教師名を持つ教師のデータベースもあります。
特定のコースを教えている教師の名前を取得する場合、コーステーブルには教師名がないため(効率的ですが冗長です)、CoursesテーブルとTeachersテーブルの両方にクエリを実行する必要があります。
非正規化: 読み取り時間に最適化 、冗長性を最小限に抑えるためではありません。
教師IDと教師名を持つコーステーブルがあるとします。教師の名前もある教師のデータベースがあります。コース内の教師の名前を取得したい場合は、コーステーブルを使用できます(冗長ですが効率的です)。
ユーザーが操作するデータが安全で、正確で、賢明であることがユーザーにとって重要です。例としては、年齢が負の数でないこと、または2人の生徒が同じ情報を持っていないことを確認することがあります。これをデータの整合性と呼びます。
データの整合性にはいくつかの形式があり、次の4つのカテゴリに分類できます。
- エンティティの整合性 :テーブルに重複する行はありません。たとえば、RonWeasleyをデータベースに2回挿入することはできません。
- ドメインの整合性 :正しい値を適用するために挿入できる値のタイプを制限します。たとえば、家はグリフィンドール、レイヴンクロー、スリザリン、またはハッフルパフのみになります。
- 参照整合性 :他のレコードで使用されているレコードは削除できません。現在コースを教えている教師を削除することはできません。
- ユーザー定義の整合性: データベースに対するビジネス関連のロジックとルールで構成される「その他」のカテゴリ。
- オラクル :非常に安定して成熟していますが、コストがかかる可能性があります
- MySQL :軽量でセットアップが高速ですが、Oracleほど成熟していません
- PostgreSQL :特定のユースケースには適していますが、超高速ではありません
- SWEPrep-受信トレイに直接質問をインタビュー
- freeCodeCampのSQLとデータベース
- クリーンコード
- 効果的なJava
- Oracleドキュメント
- MySqlドキュメント
- PostgreSQLドキュメント
- Redditスレッド :データベース、SQL、および新しいテクノロジーに関する優れたスレッド
- ハッカーニュース: テクノロジー業界の最新の動向を把握するための本当に素晴らしいリソース
- CodePen: 優れたSQLプラクティスを見つけるための優れたリソース。