この「ティーポット」は、初心者のためのMySQLに専念しています。 SQLリクエストの構築の基本

  • チュートリアル

教科書は何ですか

この教科書は、SQL(DDL、DML)の「私のメモリのスタンプ」のようなものです、すなわち これは、プロの活動\u200b\u200bの過程で蓄積した情報であり、絶えず私の頭に格納されています。 これは私にとって十分な最小値です。これは、データベースを最も頻繁に取り扱うときに使用されます。 より完全なSQLデザインを適用する必要がある場合は、通常、インターネット上にあるMSDNライブラリにアピールします。 私の意見では、すべてを頭の中に保つことは非常に困難であり、これは特に必要ありません。 しかし、基本的な設計を知ることは非常に便利です。 それらは、Oracle、MySQL、Firebirdなど、同じ形式で内部的に同じ形式で適用されます。 違いは主に詳細に異なる可能性があるデータ型で構成されています。 SQL言語の主なデザインはそれほど多く、そして常に練習で、彼らはすぐに覚えています。 たとえば、オブジェクトを作成する(テーブル、制限、索引など)を手に入れるのに十分です。 テキストエディタ データベースと連携する環境(IDE)で、特定のデータベースタイプ(MS SQL、Oracle、MySQL、Firebird、...)で動作するようにVisual Toolkit Sharpenを勉強する必要はありません。 それは便利であり、すべてのテキストが目の前にあるという事実であり、あなたは例えばインデックスや制限を作成するために多数のタブで実行する必要はありません。 データベースを常に連携させる場合、作成、変更、および特にスクリプトのヘルプを持つオブジェクトが視覚的モードで実行するのではありません。 スクリプトモード(したがって、正確さを伴う)では、オブジェクトの名前の規則を設定および制御する方が簡単です(私の主観的な意見)。 さらに、スクリプトは、1つのデータベース(たとえばテスト)で行われた変更が同じ形式で別のベース(Pafidive)に転送されなければならない場合に便利に使用されます。

SQL言語はいくつかの部分に分かれています、ここで私は最も重要な部分を考慮します。
  • 以下の構成を含むDML - データ操作言語(データ操作言語)。
    • 選択 - データサンプリング
    • 挿入 - 新しいデータを挿入します
    • 更新 - データ更新
    • 削除 - データを削除します
    • マージ - データマージ
だから 私はこの教科書のこのような理論がほとんどありませんでした、そしてすべての設計は実際の例で説明されます。 さらに、プログラミング言語、特にSQLが実際にのみ習得し、自分自身を振りかけ、このデザインを実行したときに起こることを実現することができます。

この教科書は、ステップバイステップの原則として作成されました。 一貫してそれを読むことが必要であり、その直後に例を実行する必要がある。 しかし、あなたがより詳細にある種のチームについて学ぶ必要があるならば、たとえばMSDNライブラリーにある特定のインターネット検索を使用してください。

この教科書を書くときは、MS SQL Serverバージョン2014データベースを使用していましたが、MS SQL Server Management Studio(SSMS)を使用してスクリプトを実行しました。

MS SQL Server Management Studio(SSMS)について簡単に説明する

SQL Server Management Studio(SSMS) - データベースコンポーネントを設定、管理、管理するためのMicrosoft SQL Serverのユーティリティ。 このユーティリティには、スクリプトエディタ(主に使用されます)と、オブジェクトとサーバーの設定で機能するグラフィカルプログラムが含まれています。 Main SQL Server Management StudioツールはObject Explorerです。これにより、ユーザーがそれらを管理したり、サーバー・オブジェクトを抽出したりできます。 このテキストはウィキペディアから部分的に借りられています。

新しいスクリプトエディタを作成するには、「新しいクエリ/新規要求」ボタンを使用します。

現在のデータベースを変更するには、ドロップダウンリストを使用できます。

特定のコマンド(またはコマンドのグループ)を実行するには、それを選択してEXECUTE / RUNボタンまたは「F5」キーを押します。 1つのコマンドのみがエディタにある場合、またはすべてのコマンドを満たす必要がある場合は、何も割り当てる必要はありません。

スクリプトを実行した後、特にオブジェクトの作成(テーブル、列、索引)変更を確認するには、適切なグループ(テーブルなど)、テーブル自体または列グループを選択して、コンテキストメニューからアップデートを使用します。

実際には、ここで与えられた例の実装について知る必要があるのはそれだけです。 SSMSユーティリティに沿った残りは独立して学ぶのは簡単です。

理論の少し

リレーショナルデータベース(RBD、または単純データベースのコンテキスト内)は、互いに関連するテーブルのセットです。 RUDLYを言うと、データベースはデータが構造化フォームに格納されているファイルです。

DBMS - これらのデータベースの制御システム、すなわち これは、特定の種類のデータベース(MS SQL、Oracle、MySQL、Firebird、...)を処理するためのツールのセットです。

注意
だから 人生では、会話型のスピーチでは、「Oracle Database、あるいは「Oracle」でも「Oracle DBMS」を意味します。その後、この教科書のコンテキストでは、データベースという用語が使用されることがあります。 文脈から、私はそれが正確に問題のあるものを理解するだろうと思います。

テーブルは一連の列です。 列はフィールドまたは列を呼び出すこともできます。これらの単語はすべて同じことを表現する同義語として使用されます。

テーブルはメインRBDオブジェクトであり、すべてのRBDデータがテーブル列に格納されています。 行、レコード - また同義語。

各テーブルの場合、その列には、その後に移動する名前が与えられます。
MS SQLのオブジェクト名(テーブル名、列名、インデックス名など)は、最大長128文字です。

参考のため - Oracleデータベース名は最大長30文字です。 したがって、特定のデータベースの場合は、文字数で制限を満たすオブジェクトの名前のルールを開発する必要があります。

SQLはDBMSを介してデータベース内の要求を実行できる言語です。 特定のDBMSでは、SQL言語は特定の実装(その方言)を持つことができます。

DDLとDML - SQL言語のサブセット:

  • DDL言語は、データベースの構造を作成して変更するために使用されます。 テーブルと接続を作成/変更/削除するには。
  • DML言語はデータデータを使用して操作することを可能にします。 彼女の行と。 これにより、テーブルからデータサンプルを作成したり、テーブルに新しいデータを追加したり、既存のデータを更新したり削除したりできます。

SQLでは、2種類のコメント(一回線と複数行)を使用できます。

一線のコメント
そして

/ *マルチラインコメント* /

実際には、この理論のためにすべてが十分になるでしょう。

DDL - データ定義言語(データ記述言語)

たとえば、プログラマフォームではない通常の人に、従業員のデータを含むテーブルを検討してください。

この場合、テーブルの列には、Tabel Number、フルネーム、生年月日、電子メール、ポジション、部門の名前があります。

これらの列のそれぞれは、それに含まれるデータの種類によって特徴付けることができます。

  • Tabel Number - 整数
  • フルネーム - 文字列
  • 生年月日 - 日付
  • Eメール - 文字列
  • 位置 - 文字列
  • 部門 - 文字列
列の種類は、どのような種類のデータがこの列を保存できるかを話す特性です。

まず、MS SQLで使用されている次のメインデータ型のみを覚えておくほど十分です。

MS SQL Designation description
可変長の行 varchar(n)
そして
nvarchar(n)
n個の数字を使用して、対応する列の最大可能な文字列長を指定できます。 たとえば、 "Full Name"列の値に最大30文字が含まれている可能性がある場合は、NVARCHARタイプを指定する必要があります(30)。
NVARCHARからのVARCHARの違いは、VARCHARがASCII形式で行を保存することを可能にし、1文字が1バイトを取り、NVARCHARストリングはUnicodeフォーマットで文字列を保存します。各文字は2バイトかかります。
VARCHAR型は、このフィールドがUnicode文字を保存する必要がないことを確認している場合にのみ使用する必要があります。 たとえば、VARCHARを使用してアドレスを保存できます。 eメールだから それらは通常ASCII文字のみを含みます。
文字列固定長 char(n)
そして
NCHAR(N)
可変長文字列から、このタイプは、行の長さがn文字未満である場合、それは常に長さNのスペースの権利に補完され、この形式のデータベース内の持続する、すなわち データベースでは、正確にn文字を占めます(1文字はchar for char for nchar typeの2バイトをかかります)。 私の練習では、このタイプは非常にめったに使用されず、使用される場合、それは主にCHAR形式(1)、すなわち使用されます。 フィールドが1文字で決まるとき。
整数 int。 このタイプを使用すると、列内の整数のみを使用できます。プラスと負の両方に使用できます。 参考のために(今はそれほど関連性はありません) - タイプINTを-2 147 483 648から2 147 483 647にすることを可能にする数値の範囲です。これは通常、識別子を指定するために使用されるメインタイプです。
本物または有効 浮く 話したら シンプルな言語これは、小数点(カンマ)が存在している可能性がある番号です。
日付 日付。 列を日付のみ保存する必要がある場合は、3つのコンポーネントからなる:数字、月、年。 例えば、2014年2月15日(2014年2月15日)。 このタイプは、「受信日」欄、「生年月日」などに使用することができる。 私たちが日付だけを修正することが重要である場合、または構成時期が私たちにとって重要ではなく、破棄することもできない場合
時間 時間。 このタイプは、列が時間データのみを格納する必要がある場合、すなわち使用できます。 時計、分、秒、ミリ秒。 たとえば、17:38:31.3231603です
たとえば、毎日の「飛行出発時間」です。
日時 日付時刻。 このタイプでは、日付と時刻の両方を同時に保存できます。 例えば、02/15/2014 17:38:31.323
たとえば、これは何らかのイベントの日時である可能性があります。
国旗 ビット。 このタイプは、「はい」/「いいえ」の値の保存を申請するのが便利です。ここで、「はい」は1として格納されますが、いいえ "は0として格納されます。

同じフィールド値が禁止されていない場合は、指定されていない場合があります。この目的のためにNULLキーワードが使用されます。

例を実行するには、テストと呼ばれるテストデータベースを作成します。

次のコマンドを実行して、単純なデータベース(追加のパラメータを指定せずに)作成できます。

データベーステストを作成します
データベースをコマンドで削除できます(このコマンドには非常に注意してください)。

ドロップデータベーステスト。
データベースに切り替えるには、コマンドを実行できます。

テストを使用してください。
または、SSMSメニュー領域のドロップダウンリストでテストデータベースを選択します。 私が働くとき、データベース間のこの切り替え方法が使用されることがよく使われます。

これでデータベースでは、Cyrillicのギャップとシンボルを使用して、そのままの説明を使用してテーブルを作成できます。

テーブル[従業員]([Tabel Number] INT、[名前] NVARCHAR(30)、[出生日]日付、NVARCHAR(30)、[位置] NVARCHAR(30)、[部門])
この場合、角括弧で名前を締結する必要があります[...]。

しかし、データベースでは、利便性を高めるために、オブジェクトのすべての名前がラテン語に設定され、名前のギャップを使用しないことをお勧めします。 MS SQLでは、この場合、各単語は大文字で始まります。たとえば、「Tabel Number」フィールドには、名前パーバー番号を設定できます。 また、あなたはあなたが数字を使うことができます、たとえばphoneNumber1です。

メモで
いくつかのDBMSでは、次の「phone_number」という名前の名前形式がより好ましい場合があります。たとえば、このような形式は、Oracle Databaseでよく使用されます。 当然のことながら、フィールドの名前を指定するときは、DBMSで使用されているキーワードと一致しないことが望ましいです。

このため、角括弧で構文を忘れると、テーブルを削除します。

ドロップテーブル[従業員]
たとえば、従業員のあるテーブルを「Employees」と呼ぶことができ、そのフィールドは次の名前を尋ねることができます。

  • ID - Tabel Number(Employee Identifier)
  • 名前 - フルネーム
  • 誕生日 - 生年月日
  • 電子メール - Eメール
  • 位置 - 位置
  • 部門 - 部長
非常に頻繁には、単語IDは識別子フィールドに名前を付けるために使用されます。

それでは、テーブルを作成しましょう。

テーブルの従業員の作成(ID int、nvarchar(30)、誕生日日、電子メールNvarchar(30)、Position Nvarchar(30)、Department Nvarchar(30))
必要な列を埋めるように設定するには、NOT NULLオプションを使用できます。

既存のフィールドテーブルの場合は、次のコマンドを使用して上書きできます。

フィールド更新ID ALTERテーブルの従業員ALTER列ID int int null - 更新名ALTERテーブルの従業員ALTER列名NVARCHAR(30)NOT NULL

メモで
ほとんどのDBMSのSQL言語の全体的な概念は同じです(少なくともこれについては、私が働かせたDBMSを判断することができます)。 異なるDBMSの差DDLは、主にデータ型(名前だけでなく、その実装の一部もあるかもしれません)、SQL言語の特異性(つまり、チームの本質だけが多少異なる場合があります)で終了します。しかしALASの方言には小さい違いがあるかもしれませんが、標準はありません)。 SQLの基本を所有すると、1つのDBMSから別のDBMに簡単に移動できます。 この場合、新しいDBMSにおけるコマンドの実装の詳細を把握する必要があります。 ほとんどの場合、単に類推を実行するのに十分です。

テーブルの作成の作成employeesの作成テーブル(ID INT - Oracle Type INT - これは、NVARCHAR2(30)、 - NVARCHAR2のNVARCHARと同等の(38)NVARCHAR2(MS SQL Birthified Date)、電子メールNvarchar2(30)です。 )、位置NVARCHAR2(30)、NVARCHAR2(30))。 - ALTER列の代わりにIDフィールドと名前フィールドを更新する(ここでは、ALTER列の代わりにMODIFY(...))ALTER TABLE EMPLOYEEES MODIFY(ID INT NOT NULL、NVARCHAR2(30)NOT NULL)。 - PKの追加(この場合、デザインはMS SQLのようになります。以下に示す)ALTER TABLE EMPLOYEES Constraint PK_EMPLOYEES主キー(ID)を追加します。
Oracleの場合、VARCHAR2タイプの実装には違いがあります。そのエンコーディングはデータベースの設定に依存し、テキストは、たとえばUTF-8エンコーディングで保存できます。 さらに、Oracleのフィールドの長さをバイトと文字の両方で設定できます。このため、追加のオプションバイトとCHARが使用されます。これはフィールド長後に表示されます。

Name VARCHAR2(30バイト) - フィールド容量は30バイトの名前VARCHAR2(30文字)に等しくなります。フィールド容量は30文字になります。
デフォルトのバイトまたは文字で使用されるオプションは、Oracle Type VARCHAR2(30)の単純な指定の場合はデータベースの設定によって異なりますが、IDE設定にも設定できます。 一般的に、あなたは簡単に混同することができますので、Oracleの場合は、VARCHAR2タイプが使用されている場合(たとえば、UTF-8エンコーディングを使用するときに正当化されることがあります)、私は明示的にcharを処方することを好む(文字列は通常読むのが便利です)。

しかし、この場合、テーブルにデータがあれば、コマンドの実行を成功させるためには、IDと名前フィールドテーブルのすべての行が完了したことが必要です。 この例ではこれを説明し、IDフィールド、Position、部門のテーブルにデータを挿入します。これは、次のスクリプトによって実行できます。

従業員(ID、位置、部門)の値(1000、N "Director"、N "Administration")、(1001、N "プログラマー"、n ")、(1002、N"会計士 "、n"会計(1003、N "シニアプログラマー"、N "IT")
この場合、INSERTコマンドはエラーも発生します。 挿入するときは、必要な名前フィールドの値を指定しませんでした。
オリジナルのテーブルにこのデータを持っていれば、ALTER TABLE EMPERYED ALTER COLUMED INT NOT NULLコマンドが成功し、ALTER TABLE EMPERYOMES ALTER COLUMER NOT NULLコマンドがエラー・メッセージを発行した場合は、「ALTER TABLE EMPLOYEES ALTER」が変更されました。列名int not null "名前フィールドにヌル(指定されていない)値があるコマンド。

[名前]フィールドに値を追加して、データをもう一度入力します。


NOT NULLオプションは、作成時に直接使用することもできます。 新しい表。 CREATE TABLEコマンドのコンテキストで。

最初にコマンドを使用してテーブルを削除します。

テーブルの従業員を削除します。
これで、必須の列IDと名前を持つテーブルを作成します。

テーブルの従業員の作成(id int Not Null、NVarchar(30)NOT NULL、誕生日日、電子メールNvarchar(30)、Position Nvarchar(30))
NULLを書き込むための列名の名前の後にも、NULL値が許可されます(指定されていない)ことを意味しますが、この特性はデフォルトでは意味がありません。

既存の列をオプションにするのは逆に必要な場合は、次のコマンド構文を使用します。

ALTER TABLE EMPLOYEES ALTER列名NVARCHAR(30)NULL
または単に:

ALTER TABLE EMPLOYEES ALTER列名NVARCHAR(30)
このコマンドも、フィールドの種類を別の互換型に変更したり、その長さを変更できます。 たとえば、50文字の名前フィールドを展開します。

ALTER TABLE EMPLOYEES ALTER列名NVARCHAR(50)

主キー

テーブルを作成するときは、それが一意の列またはその一連の列を持つことが望ましいです。これは、この固有の値で、明確に識別されている可能性があります。 この値はテーブルの主キーと呼ばれます。 私たちの従業員テーブルの場合、そのような一意の値はID列(「従業員のテーブル番号」を含みます - 私たちの場合では、その値は各従業員に固有であり、繰り返すことはできません)。

既存のテーブルへの主キーを作成すると、コマンドを使用しています。

ALTER TABLE EMPLOYEESの追加制約PK_EMPLOYEES主キー(ID)
ここで、 "pk_employees"は主キーの制限の名前です。 通常、 "PK_"プレフィックスは、テーブル名が来ている後の主キーに名前を付けるために使用されます。

主キーが複数のフィールドで構成されている場合、これらのフィールドはカンマを介して括弧内に表示されている必要があります。

ALTER TABLE NAME_TABLE ADD制約の主キー名(FIELD1、フィールド2、...)
MS SQLでは、主キーに含まれているすべてのフィールドにはNOT NULLの特性がある必要があることが注目に値します。

また、主キーは、テーブルを作成するときに直接定義できます。 CREATE TABLEコマンドのコンテキストで。 テーブルを削除します。

テーブルの従業員を削除します。
次に次の構文を使用して作成します。

テーブルの従業員の作成(id int null、nvarchar(30)Not Null、誕生日日、電子メールNvarchar(30)、Position Nvarchar(30)、Constraint PK_Employees主キー(ID) - すべての後のPKを説明する制限のようなフィールド)
テーブルにくぼんだ後:

従業員(ID、ポジション、部門、名称)の値(1000、N "ディレクター"、N "Administration"、N "Ivanov i.i.")、(1001、N "プログラマー"、n "、n" Petrov PP)、(1002、N "会計士"、N "会計"、n "Sidorov SS")、(1003、N "シニアプログラマー"、n "IT"、N "Andreev A.")
テーブル内の主キーが1列の値のみで構成されている場合は、次の構文を使用できます。

テーブルの従業員の作成(ID int Not Null Constraint PK_Employees主キー、 - 名前の特性(30)NOT NULL、誕生日日、電子メールNvarchar(30)、Position Nvarchar(30))
実際、制限の名前は尋ねられない、この場合、システム名が割り当てられます( "pk__employee__3214ec278da42077"など)。

テーブルの従業員の作成(id int not null、nvarchar(30)Not Null、誕生日日、電子メールNvarchar(30)、Position Nvarchar(30)、Primity Key(ID))
または:

テーブルの従業員の作成(ID int Not Nullのプライマリキー、NVarchar(30)NOT NULL、誕生日日、電子メールNvarchar(30)、Position Nvarchar(30))、Department Nvarchar(30))
しかし、恒久的な表には、常に制限の名前を明確に設定することをお勧めします。 明示的に指定され理解可能な名前に従って、たとえば削除することができます。たとえば、操作を実行する方が簡単になります。

ALTER TABLE EMPLOYEESを削除するConstraint PK_EMPLOYEES
しかし、制限の名前を指定せずに、一時的なデータベース表の作成時に適用するのが便利です。これは、使用後に削除されます。これは、一時的なデータベース表を作成します(時間表の名前が#または##で始まります)。

suitable

現時点では、次のコマンドを確認しました。
  • テーブルを作成します name_table(フィールドの転送とその種類、制限) - 現在のデータベースに新しいテーブルを作成するのに役立ちます。
  • ドロップテーブル name_table - 現在のデータベースからテーブルを削除するために使用されます。
  • 他の机 name_table. 列を変更します。 レリーバーの名前... - 列の種類をアップグレードするか、設定を変更するために使用されます(たとえば、特性NULLまたはNOT NULLを指定するには)。
  • 他の机 name_table. 制約を追加します。 プログラム名 主キー(field1、field2、...) - 主キーを既存のテーブルに追加します。
  • 他の机 name_table. ドロップ制約 プライマー名 - テーブルからの制限を削除します。

一時的な表について少し

MSDNから切り取ります。 MS SQL Serverでは、一時テーブルには2種類あります。ローカル(#)とグローバル(##)。 ローカルの一時テーブルは、接続セッションが最初に作成されるとすぐに、SQL Serverインスタンスと完了するまで作成者にのみ表示されます。 SQL Serverインスタンスからユーザーを切断した後、ローカルタイムテーブルは自動的に削除されます。 これらのテーブルを作成した後のすべてのユーザーには、グローバル一時テーブルがすべてのユーザーに表示され、これらのテーブルを参照しているすべてのユーザーがSQL Serverインスタンスから切断されたときに削除されます。

一時テーブルはTEMPDBシステムベースで作成されます。 それらを作成することによって、メインベースをリターしない、残りの時間テーブルは通常のテーブルと完全に同じであるため、DROP TABLEコマンドを使用して削除することもできます。 ローカル(#)一時テーブルがより頻繁に使用されます。

一時テーブルを作成するには、create tableコマンドを使用できます。

テーブル#tempを作成する(ID int、nvarchar(30))
MS SQLの一時テーブルは通常のテーブルと似ているので、したがって、Drop Tableコマンドを削除することもできます。

ドロップテーブル#テンポ

また、一時テーブル(通常のテーブルとして)は、Select構文...に記載されているリクエストによって返されたデータを作成してすぐに記入できます。

EmployeesからID、#tempに名前を付けます

メモで
異なるDBMSでは、一時テーブルの実装は異なる場合があります。 たとえば、OracleおよびFirebird DBMSでは、一時テーブル構造をCREATE GLOBE TEMPORAL TABLERコマンドを使用して事前に定義する必要があります。その場合、ユーザーはすでにメインテーブルの中から既にそれを確認して動作します。通常のテーブルとして。

データベースの正規化 - サブテーブル(ディレクトリ)とタイの定義を破壊する

当社の現在の従業員テーブルには、位置と部門のフィールドに、ユーザーが最初にエラーに含まれているテキストを入力することができます。たとえば、1人の従業員が単に「IT」、および2番目の従業員を示すことができるため、 3番目の「IT」に「IT部門」を紹介してください。 その結果、ユーザを意味するのは理解可能である。 1つの部門の従業員による従業員のデータ、またはユーザーが記述され、3つの異なる部門ですか。 そしてさらに多くの場合、この場合、報告書のデータを適切にグループ化することはできません。ここで、各部署の文脈で従業員数を表示する必要がある場合があります。

第2の欠点は、この情報の記憶量およびその重複の量にある。 従業員ごとに、部門のフルネームが表示されます。これは、部門名から各シンボルの保存のためのスペースのデータベースに必要です。

「ジュニア・プログラマー」の位置「プログラマー」の名前を変更する必要がある場合など、ある位置の名前が変更された場合、3番目の欠点は、これらのフィールドの更新が変更されるのが複雑です。 この場合、その位置は「プログラマー」に等しいテーブルの各行を変更する必要があります。

データの短所を避けて使用されるために、いわゆるデータベースの正規化は、それをサブテーブル、参照書のテーブルに粉砕しています。 不具合の理論を登る必要はなく、通常の形態が自分自身を表すことを研究する必要はありません。正規化の本質を理解するのに十分です。

2つの参照書の2つのテーブルを「ポジション」と「部署」、最初にポジションを呼び出し、それぞれ2番目の部門を作成しましょう。

テーブルの位置を作成する(ID Int Intentity(1,1)NOT NULL制約PK_POSTIONS主キー、NVARCHAR)NULL NOT NULL)テーブル部門の作成(ID INT個別(1,1)NOT NULLの制約PK_Departments主キー、NVARCHAR(30) )nullではない)
ここでは、新しいIDオプションを使用しました。これは、ID列のデータが1、ステップ1、すなわち、1から始まるように自動的に番号付けされることを示唆していることに注意してください。 新しいレコードを追加するとき、それらは一貫して値1,2,3などを割り当てます。 そのような分野は通常AUTOINCOMYと呼ばれます。 テーブルはIDプロパティを持つフィールドを1つだけ定義でき、通常はオプションでこのようなフィールドはこのテーブルの主キーです。

メモで
異なるDBMSでは、メータを有するフィールドの実装はそれ自身の方法で行うことができる。 たとえば、MySQLでは、このフィールドはAUTO_INCREMENTオプションを使用して決定されます。 OracleとFirebirdでは、この機能はシーケンスが使用(シーケンス)を使用して正立されました。 しかし、私はOracleを知っている限りでは、生成されたIDオプションが追加されました。

このテーブルを自動的に入力しましょう。

[Position]テーブルの[名前]フィールドである[Positions]フィールドから固有の値を入力します。位置の挿入位置表は、位置が指定されていないレコードを捨ててください。
私は部門のテーブルで同じことをします。

部門を挿入(名前)部門がNULLではない従業員から別の部門を選択
ポジションと部門のテーブルを開くと、番号が付けられたフィールド値IDのセットが表示されます。

位置から*を選択してください

部門から*を選択してください

テーブルデータは、タスク投稿や部門への参照書の役割を果たします。 今我々は投稿や部門を参照します。 まず第一に、識別子データを格納するためのEmployeeesテーブルに新しいフィールドを作成します。

ALTER TABLEのフィールドを追加します。従業員の追加PositionID INT - ALTER TABLEのフィールドを追加するEmployeesデバイスINTを追加
参照帳のように、参照フィールドの種類は似ている必要があります。

また、複数のフィールドを1つのコマンドで作成できるようにテーブルに追加すると、カンマを介してフィールドをリストしました。

ALTER TABLE EMPLOYEES PositionID INTを追加します
これで、ユーザーがフィールドデータに書き込む機能を持たないように、これらのフィールドの参照(参照制限 - 外部キー)、参照書籍のID値の値に含まれていない値が表示されます。 。

ALTER TABLE EMPLOYEESの追加制約FK_EMPLOYEES_POTIONID外部キー(POSITIONID)参照位置(ID)
そして2番目のフィールドの場合も同じことを行います。

ALTER TABLE EMPLOYEES Constraint FK_EMPLOYEES_DEPARTMENTID FORIALキー(Lealences)
これで、これらのフィールドのユーザーは、対応するディレクトリからIDの値のみを適用できます。 したがって、新しい部署またはポジションを使用するには、適切なディレクトリに新しいエントリを追加する最初のものになります。 だから 投稿と部門は、1回のインスタンスで参照書に保存され、名前を変更するために、ディレクトリ内でのみ変更するのに十分です。

基準制限の名前は通常コンポジットです。「FK_」プレフィックスで構成されている場合、テーブル名が来て、アンダースコアがディレクトリテーブル識別子を参照するフィールドの名前です。

識別子(ID)は、通常、接続にのみ使用される内部値であり、そこに格納されているのは絶対に無関心なので、発生する数のシーケンスで穴を取り除くことを試みる必要はありません。たとえば、ディレクトリからレコードを削除した後に、テーブルを操作する過程で。

ALTER TABLEテーブルの追加制約名外部キー(Field1、Field 2、...)参照table_spatch(field1、フィールド2、...)
この場合、主キーは、テーブルテーブル内の複数のフィールド(Field1、Field2、...)の組み合わせで表示されます。

実際には、参照書からID値のPositionIDとDepartmentID値を更新します。 DMLによってこの目的のために更新コマンドを使用します。

Update E PositionID \u003d(Name \u003d E.Positionの位置からIDを選択)、employees eからのDepartmentID \u003d(Name \u003d E.Departmentがある部門からのIDを選択)
要求に従って何が起こったのか見てみましょう。

従業員から*を選択してください

All、PositionIDフィールドとDepartmentIDフィールドには、適切な位置識別子と部門が適切な位置識別子と部門がいっぱいになります.EmployeeSテーブルは、これらのフィールドを削除できます。

ALTER TABLE EMPLOYEEES列位置を削除します
これでテーブルは次の形式を取得しました。

従業員から*を選択してください

ID. 名前。 お誕生日 Eメール PositionID。 部長。
1000 ivanov i.i. ヌル ヌル 2 1
1001 Petrov P.p. ヌル ヌル 3 3
1002 Sidorov S. ヌル ヌル 1 2
1003 Andreev A.A. ヌル ヌル 4 3

それら。 私たちは最終的に冗長な情報を保存することを取り除きました。 現在、位置と部門の数によると、参照表の値を使用して自分の名前を一意に決定できます。

E.ID、E.NAME、P.Name PositionName、D.Name Departments e左上の部門名Reft D.ID \u003d E.DepartmentID左結合ポジションP.ID \u003d E.PositionID

オブジェクトインスペクタで、このテーブル用に作成されたすべてのオブジェクトを見ることができます。 ここから、あなたはこれらのオブジェクトを使って異なる操作を生み出すことができます - オブジェクトの名前を変更または削除します。

テーブルがそれ自体を参照できることも注目に値します、すなわち 再帰的なリンクを作成できます。 たとえば、この従業員の対象となる従業員を示す従業員を持つテーブルに別のManagerIDフィールドを追加します。 フィールドを作成します。

ALTER TABLE EMPLOYEES ManagerID INTを追加します
このフィールドでは、NULL値が許可されていますが、たとえば、従業員が高くない場合は、フィールドが空になります。

それでは、従業員のテーブルの外部キーを作成しましょう。

ALTER TABLE EMPLOYEES Constraint FK_EMPLOYEES_MANAGERID外部キー(ManagerID)参照社員(ID)
ダイアグラムを作成して、テーブル間のリンクがその上にあるものを見てみましょう。

その結果、次の図が表示されます(従業員の表は、その職位やそのままのテーブルに関連付けられているだけでなく、それ自体を参照しています)。

最後に、リファレンスキーが削除カスケードとアップデートカスケードの追加オプションを含めることができると言う価値があります。これは、テーブルディレクトリにリンクがあるエントリを削除または更新するときに行動する方法を推奨します。 これらのオプションが指定されていない場合は、別のテーブルからのリンクがあるレコードのテーブルディレクトリのIDを変更できません。これにリンクしているすべての行を削除するまで、ディレクトリからそのようなエントリを削除することはできません。エントリまたは、これらの行の別の値へのリンクを更新します。

たとえば、fk_employees_departmentIDのDelete Cascade On Delete Cascadeのオプションを使用してテーブルを再選択します。

テーブルの従業員の削除テーブルの従業員の作成(id int not null、nvarchar(30)、誕生日日、電子メールNvarchar(30)、PositionId Int、Deparmance PK_Employees主キー(ID)、Constraint FK_Employees_DepartmentId(DepartmentID)参照部門の部門(ID)の削除、制約FK_EMPLOYEES_POTIONSID外部キー(POSITION)参照位置(ID)、制約FK_EMPLOYEES_MANAGERID FORENIONEキー(ManagerID)参照社員(ID))従業員(ID))従業員(ID、名前、誕生日、PositionID、Management ID) )値(1000、N "Ivanov II"、 "19550219"、2.1、Null)、(1001、N "Petrov PP"、 "19831203"、3,3,1003)、(1002、N "Sidorov SS" 、「19760607」、1,2,1000)、(1003、N "Andreev AA"、 "19820417"、4,3,1000)
Departmentsテーブルから識別子3を使って部門を削除します。

ID \u003d 3の部門を削除します
Employeesテーブルのデータを見てみましょう。

従業員から*を選択してください

ID. 名前。 お誕生日 Eメール PositionID。 部長。 ManagerID。
1000 ivanov i.i. 1955-02-19 ヌル 2 1 ヌル
1002 Sidorov S. 1976-06-07 ヌル 1 2 1000

ご覧のとおり、社員テーブルから部門3のデータも引退しました。

Update Cascadeのオプションも同様に動作しますが、ディレクトリ内のID値を更新するときに動作します。 たとえば、POSTSディレクトリの位置IDを変更した場合、この場合、DepartmentIDはディレクトリ内で尋ねられた新しいID値に更新されます。 しかし、この場合、それは単に実証に失敗するでしょう DepartmentsテーブルのID列はIDオプションです。これにより、次のクエリを実行することはできません(部門の識別子3から30を変更します)。

更新部門はID \u003d 30を設定します。ここで、ID \u003d 3
主なことは、削除カスケードとアップデートカスケードに関するこれら2つのオプションの本質を理解することです。 私はこれらのオプションをまれなケースで非常に適用し、それらを参照制限で指定する前によく考えてください、 参照表からのレコードを不注意で除去すると、これは大きな問題につながり、連鎖反応を生み出す可能性があります。

リカバリ部3:

挿入部門(ID、名前)の値(3、N "IT")のIdentity _Indertの部門を追加/変更する権限を与えます(3、N "IT") - Identity Set Identity_Insert部門を追加/変更する禁止
TRUNCATE TABLEコマンドを使用して、従業員テーブルを完全にクリーンアップします。

テーブルの従業員を切り捨てる。
前の挿入コマンドを使用してデータをもう一度リロードします。

従業員を挿入(ID、名前、誕生日、PositionID、DepartmentID、ManageminID)の値(1000、N "Ivanov I.i."、 "19550219"、2,1、Null)、(1001、N "Petrov PP"、 "19831203"、3 、3,1003)、(1002、N "Sidorov SS"、 "19760607"、1,2,1000)、(1003、N "Andrev AA"、 "19820417" 4,3,1000)

suitable

与えられた瞬間に、いくつかのDDLコマンドが私たちの知識に追加されました。
  • フィールドにIDプロパティを追加する - このフィールドをテーブルの(フィールド)に入力するようにします。
  • 他の机 name_table. 追加。 list_pole_s_chards - テーブルに新しいフィールドを追加することができます。
  • 他の机 name_table. ドロップカラム。 list_pole - テーブルからフィールドを削除できます。
  • 他の机 name_table. 制約を追加します。 プログラム名 外部キー。(田畑) 参考文献 table_spatch(フィールド) - テーブルとテーブル参照帳の間の接続を定義できます。

その他の制限 - ユニークな、デフォルト、チェック

固有の制限を使用して、このフィールドまたはフィールドセット内の各行の値は一意である必要があります。 従業員のテーブルの場合は、そのような制限を電子メールフィールドに適用できます。 まだ定義されていない場合は、以前に電子メールの値を入力してください。

Update employeesセット電子メール\u003d " [Eメールで保護されている]「ID \u003d 1000 Update Emailesを電子メール\u003d」を設定します。 [Eメールで保護されている]「ID \u003d 1001のUpdate Emailesを電子メール\u003d」を設定します。 [Eメールで保護されている]「ID \u003d 1002のUpdate Emailesを電子メール\u003d」を設定します。 [Eメールで保護されている]"id \u003d 1003の場合、ここで
そして今、あなたはこの分野に固有の制限を課すことができます:

ALTER TABLE EMPLOYEES制約UQ_EMPLOYEES_EMAIL一意(Eメール)
これで、ユーザーは複数の従業員から同じ電子メールを作ることができません。

一意性制限は通常次のと呼ばれます。

したがって、テーブルがコンテキスト内で一意である場合は、フィールドの組み合わせが必要です。その後、それらをコンマを通してリストします。

ALTER TABLE NAME_TABLEの追加制約名の一意(field1、フィールド2、...)
デフォルトの制限フィールドへの追加を使用して、挿入時に置き換えられるデフォルト値を設定できます。 新しい録音 このフィールドは、[コマンドリストの挿入]リストに表示されません。 この制限は、テーブルを作成するときに直接設定できます。

新しい「受信日」フィールドをEmployeesテーブルに追加して、それを録音し、このフィールドのデフォルト値が現在の日付になるとします。

ALTER TABLEの従業員の追加希釈日を追加しないNULLデフォルトSYSDATETIME()
または、Hiredate列が既に存在する場合は、次の構文を使用できます。

ALTER TABLEの従業員は、希少子にデフォルトのsysdatetime()を追加します
ここで私は制限の名前を示すものではありませんでした。 デフォルトの場合は、それほど重要ではないという意見がありました。 しかし、あなたが良い方法でするならば、私はあなたが怠惰である必要はなく、通常の名前を設定する価値があると思います。 これは次のようにして行われます。

ALTER TABLE EMPLOYEES録音中の制約DF_EMPLOYEES_HIREDATEデフォルトのSYSDATETIME()を追加
この列以前は、[Hiredate]フィールドに各エントリに追加されると、現在の日付値が挿入されます。

新しいエントリを追加するとき、現在の日付も自動的に挿入されます。もちろん、それを明確に指定しない場合、すなわち 列のリストには指定しないでください。 追加された値のリストにあるhiredateフィールドを指定せずに例を表示しましょう。

従業員(ID、名前、電子メール)の値を挿入します(1004、N "Sergeev S."、 "、"、 " [Eメールで保護されている]")
何が起きたのか見てみましょう:

従業員から*を選択してください

ID. 名前。 お誕生日 Eメール PositionID。 部長。 ManagerID。 笑う。
1000 ivanov i.i. 1955-02-19 [Eメールで保護されている] 2 1 ヌル 2015-04-08
1001 Petrov P.p. 1983-12-03 [Eメールで保護されている] 3 4 1003 2015-04-08
1002 Sidorov S. 1976-06-07 [Eメールで保護されている] 1 2 1000 2015-04-08
1003 Andreev A.A. 1982-04-17 [Eメールで保護されている] 4 3 1000 2015-04-08
1004 Sergeev S. ヌル [Eメールで保護されている] ヌル ヌル ヌル 2015-04-08

チェック制限を確認するには、フィールドに挿入された値を確認する必要がある場合に使用されます。 たとえば、Tabel Numberフィールドにこの制限を提供します。これにより、従業員識別子(ID)があります。 この制限を使用して、タブレット番号は1000から1999まででなければならないとしましょう。

ALTER TABLEの従業員の追加制約CK_EMPLOYEES_IDチェック(1000~1999のID)
制限は通常「CK_」プレフィックスが最初に行く、次にテーブル名とこの制限が課されるフィールドの名前と呼ばれます。

制限が機能することを確認するために無効なエントリを挿入してみましょう(適切なエラーを受け取る必要があります)。

従業員を挿入(ID、Eメール)値(2000、 " [Eメールで保護されている]")
そして今、挿入された値を1500に変更し、エントリが挿入されることを確認します。

従業員を挿入(ID、Eメール)値(1500、 " [Eメールで保護されている]")
名前を指定せずに一意のチェック制限を作成することもできます。

ALTER TABLE EMPLOYEES一意の(電子メール)ALTER TABLEの従業員を追加するチェック(1000から1999年までのID)
しかし、これは良い習慣ではなく、制限の名前を明示的に設定することをお勧めします。 後で並べ替えるには、より困難になるでしょう、あなたはオブジェクトを開いて彼が何を答えるのを見る必要があります。

良い名前で、制限に関する多くの情報が彼の名前で直接見つけることができます。

したがって、まだテーブルを作成するときに、これらすべての制限を直ちに作成することができます。 テーブルを削除します。

テーブルの従業員を削除します。
1つの作成テーブルによって作成されたすべての制限でそれを再投入します。

テーブルの従業員の作成(id int not null、nvarchar(30)、誕生日日、電子メールNvarchar(30)、PositionId Int、Liredate Date Not Null Default SysDateTime()、 - デフォルトでは、PK_Employeesを制約します。主キー(ID)、制約FK_EMPLOYEES_DEPARTMENTIDED FOREANキー(Lealences)部門(ID)、制約FK_EMPLOYEES_POTIONSID外部キー(POSITIONID)参照位置(ID)、制約UQ_EMPLOYEES_EMAIL固有(電子メール)、制約CK_EMPLOYEES_ID検査(1000~1999歳のID))

従業員(ID、名前、誕生日、電子メール、PositionID、Department)の値を挿入します(1000、N "Ivanov I.I."、 "19550219"、 " [Eメールで保護されている]"、2.1)、(1001、N" Petrov PP "、" 19831203 "、" [Eメールで保護されている]「、3.3)、(1002、N "Sidorov S."、 "19760607"、 " [Eメールで保護されている]「、1,2)、(1003、N "Andreev A.A."、 "19820417"、 " [Eメールで保護されている]",4,3)

制限事項を作成するときに作成されたインデックスについて少し、主キーとユニークなもの

上記のスクリーンショットで見ることができるように、主キーと一意の制限を作成するときには、同じ名前(pk_employeesとuq_employees_email)で自動的に索引が作成されます。 デフォルトでは、主キーインデックスはクラスタ化されたものとして、および他のすべてのインデックスとして、非クラスタ化されていない索引として作成されます。 クラスタインデックスの概念がすべてのDBMSにはないと言う価値があります。 テーブルには、クラスタ(クラスタ化)インデックスが1つだけです。 クラスタ化 - テーブルエントリがこのインデックスによってソートされることを意味します。また、このインデックスがテーブルのすべてのデータに直接アクセスできると言える。 テーブルのメインインデックスを話すことです。 もっと失礼な場合、これはテーブルにねじ込まれたインデックスです。 クラスタインデックスは、要求を最適化するときに役立つ可能性がある非常に強力なツールです。単にこれを覚えておいてください。 クラスタインデックスが主キーで使用されていないと言っても、他のインデックスの場合は、主キーを作成するときは、非クラスタ化オプションを指定する必要があります。

ALTER TABLE NAME_TABLE ADD制約プライマリキーNonclusteredプライマリ名(field1、フィールド2、...)
たとえば、pk_employeesの制約インデックスを作成し、UQ_EMPLOYEES_EMAIL制限インデックスはクラスタです。 まず最初に、これらの制限を削除します。

ALTER TABLE EMPLOYEES DROP Constraint PK_EMPLOYEES ALTERテーブルの従業員の削除制約UQ_EMPLOYEES_EMAIL
現在、クラスタ化されていないオプションと非クラスタリングで作成しましょう。

ALTER TABLE EMPLOYEESの追加制約PK_EMPLOYEES主キー非クラスタリング(ID)ALTER表の従業員制約UQ_EMPLOYEES_EMAIL一意のクラスタ化(電子メール)
さて、Employeeesテーブルからサンプルを選択することで、レコードはクラスタ化されたUQ_EMPLOYEES_EMAIL INDEXによってソートされています。

従業員から*を選択してください

ID. 名前。 お誕生日 Eメール PositionID。 部長。 笑う。
1003 Andreev A.A. 1982-04-17 [Eメールで保護されている] 4 3 2015-04-08
1000 ivanov i.i. 1955-02-19 [Eメールで保護されている] 2 1 2015-04-08
1001 Petrov P.p. 1983-12-03 [Eメールで保護されている] 3 3 2015-04-08
1002 Sidorov S. 1976-06-07 [Eメールで保護されている] 1 2 2015-04-08

この前に、クラスタインデックスがPK_EMPlayeeesインデックスの場合、デフォルトのエントリはIDフィールドによってソートされました。

しかし、この場合、クラスタインデックスの本質を示す例です。 ほとんどの場合、従業員テーブルはIDフィールドによって行われ、場合によっては彼女がディレクトリとして機能する可能性があります。

参考書のために、通常、クラスタインデックスが主キー上に構築されることをお勧めします。 クエリでは、例えば名前(投稿、部署)を受け取るディレクトリの証明書を参照します。 ここで私は上記のものを覚えています。クラスタインデックスはテーブルの行に直接アクセスできることを覚えており、追加のオーバーヘッドなしで任意の列の値を取得できるようになります。

クラスタインデックスは、サンプルが最も頻繁にあるフィールドに適用することが有益です。

テーブルの中に代理フィールドでキーを作成することがあります。この場合、この場合、サロゲートの主キーを作成するときに、クラスタ化されたインデックスオプションをより適切なインデックスのために保存し、非クラスタ化オプションを指定してください。

suitable

この段階では、Typeのチームによって作成されているすべての種類の制限があります。 "ALTER TABLE_TABLE_TABLE ADD制約名:": ":": ":": ":": ":": ":": ":
  • 主キー - 主キー。
  • 外部キー。 - データの参照整合性のリンクと制御を設定します。
  • 一意の - 独自性を作成することができます。
  • 小切手。 - 入力されたデータの正確さを許可します。
  • デフォルト。 - デフォルト値を設定できます。
  • コマンドを使用してすべての制限を削除できることも注目に値します。 他の机 name_table. ドロップ制約 プロミネーション名」
また、インデックスのトピックを部分的に触れ、クラスタの概念を分解しました( クラスタ化されました。)そしてノンクラスター( 非クラスター)インデックス。

独立索引の作成

ここでの独立性の下では、主キーまたは一意を制限するために作成されていないインデックスを指します。

フィールドまたはフィールド上のインデックスは、次のコマンドで作成できます。

employeesにindex idx_employees_nameを作成する(名前)
また、ここでは、クラスタ化されていないオプション、非クラスター済み、固有、およびそれぞれのASCフィールド(デフォルト)またはDESCを指定することができます。

従業員にUQ_EMPLOYES_EMAILDESCを作成する(EメールDEC)
クラスタ以外のインデックスを作成するときは、非クラスタ化オプションをリリースできます。 それはデフォルトで暗示されています、ここでは、チーム内でクラスタ化されていないオプションの位置を単に指定することを示しています。

索引を削除することは次のとおりです。

Drop Index IDX_EMPLOYEES_NAMEを従業員にドロップします
単純なインデックスと制限は、create tableコマンドのコンテキストで作成できます。

たとえば、テーブルを削除します。

テーブルの従業員を削除します。
1つのCREATE TABLEコマンドを使用して、作成されたすべての制限と索引でそれを再投入してください。

テーブルの従業員の作成(id int null、nvarchar(30)、誕生日日の名前、電子メールNvarchar(30)、PositionId Int、Liredate Date Not Null Constraint DF_Employees_Hiredateデフォルトのsysdatetime()、constraint pk_employees主キー(ID )、Constraint FK_EMPLOYEES_DepartmentID外部キー(ID)、制約FK_EMPLOYES_POTIONSID外部キー(POSITIONID)参照位置(ID)、制約FK_EMPLOYES_MANAGERID外部キー(ManagerID)参照emporles(ID)、制約UQ_EMPLOYEES_EMAIL UNISTEES(Eメール)、制約CK_EMPLOYEES_IDチェック(1000~1999のID)、IDX_EMPLOYEES_NAME(名前)))
最後に、従業員の表に挿入します。

従業員を挿入(ID、名前、誕生日、電子メール、PositionID、Department、ManagementID)の値(1000、N "Ivanov I.i."、 "19550219"、 " [Eメールで保護されている]「、2.1、NULL)、(1001、N "Petrov PP"、 "19831203"、 " [Eメールで保護されている]「、3,3,1003)、(1002、N "Sidorov S."、 "19760607"、 " [Eメールで保護されている]「、1,2,1000)、(1003、N "Andread AA。"、 "19820417"、 " [Eメールで保護されている]",4,3,1000)
さらに、クラスタ以外のインデックスでは、含めることで値を指定することで値を含めることができることに注目する価値があります。 それら。 この場合、INCLUDEインデックスはクラスタインデックスを思い出させます。これで、インデックスがテーブルにねじ込まれていないだけで、必要な値はインデックスにねじ込まれます。 したがって、そのようなインデックスは、リストされたすべてのフィールドがインデックス内で利用可能である場合に選択(選択)するためのクエリの性能を非常に向上させることができ、その後、テーブルに全く訴えることが可能である。 しかし、それは自然にインデックスのサイズを増加させます。 リストされたフィールドの値はインデックス内で重複しています。

MSDNから切り取ります。 一般的な構文 インデックスを作成するためのコマンド

[一意] [クラスタ化された] NonClustered] index index_name on. (列[ASC | DESC] [、... N])[含める(column_name [、... n])]]

suitable

インデックスはデータサンプリングレート(選択)を増やすことができますが、インデックスはテーブルデータの修正の速度を短縮します。 各修正後、システムは特定のテーブルのすべてのインデックスを再構築する必要があります。

それぞれの場合では、最適な解決策、ゴールデンミドルを見つけることが賢明であり、その結果、サンプリングの性能とデータの修正が適切なレベルであった。 インデックスとその数量を作成するための戦略は、たとえばデータがテーブル内でどの程度変更されるかについての多くの要因によって異なります。

DDLによる結論。

ご覧のとおり、DDL言語は最初は一目で見える可能性があるため、折り畳まれていません。 ここで私は3つのテーブルのみを操作して、ほとんどすべての基本的なデザインを表示することができました。

主なことは本質を理解し、そして他の練習の残りを理解することです。

SQLと呼ばれるこの素晴らしい言葉を習得するのに頑張ってください。

著者から: あなたはあなたにやかんを呼びましたか? まあ、これは修正されたビジネスです! 各サモワールはかつてやかんであった! それぞれの専門家はかつてサモワールでしたか? いいえ、また何かが間違っている! 一般に、初心者のためのMySQL。

なぜMySQLのティーポット

あなたがインターネットであなたの人生を結ぶために真剣に集まったならば、次に「Web」の最初のステップですぐにこのDBMSにわたるでしょう。 MySQLは、データベース管理システムの「すべてのインターネット」システムによって括弧を入れることができます。 それがなければ、それ以上の重大なリソースは考慮されていない、それは各ホスティングの管理計画に存在します。 そして、すべての人気のあるCMSのほとんど、さらには「自衛的」エンジンでさえ、彼女の参加で構築されています。

一般的に、このプラットフォームなしではできません。 しかしそれを勉強するためにも必要になるでしょう。 正しいアプローチ、正しい道具、そして主な欲求と忍耐。 私は最新のコンポーネントを願っています、あなたは長所で持っています。 そして、あなたの脳が沸騰すること、そして本当のやかんからのように頭から注がれたことのために準備されています

しかし、ダミーのためのMySQLはそれが間違っている場合にのみ与えられます。 私たちはそのような間違いをしていない、そしてこの技術に非常に基本的な基本的なものに精通していきましょう。

基本概念

まず最初に、この出版物で説明する主な概念を渡します。

データベース(データベース)は、単位ユニットの主要コンポーネントです。 データベースには、列とレコード(行)で構成されるテーブルが含まれています。 交差点に形成された細胞は特定の種類の構造化データを含む。

DBMS(データベース管理システム)は、データベースを管理するためのすべてのソフトウェアモジュールのセットです。

SQL - DBMSのコア(サーバ)と開発者が「通信する」という構造化クエリの言語。 プログラム言語と同様に、SQLには独自の構文、一連のコマンドと演算子、サポートされているデータ型があります。

理論知識を始めると、私たちは十分です。 理論のないギャップは「色」の練習をしています。 正しいソフトウェアツールを選択することは残っています。

正しいツールの選択

初心者のためのMySQLシェルの品揃え全体の品揃えで頻繁に「急いで」、単に存在しないことを認識しました。 DBMS管理のためのすべてのソフトウェア製品はすでに必要です インストールされたサーバー データベース 一般的に、私はもう一度「スクーター」を発明しないことにしましたが、私は国内のデノーパッケージを選びました。 公式ウェブサイトでダウンロードできます。

その構成はDBMSのすべてのコンポーネントを既に含み、簡単でわかりやすいインストールの直後に新しいComplementがMySQLとの実用的な知識を開始することを可能にします。 さらに、Denwerには、より多くの必要なツール開発者が含まれています。ローカルサーバー、PHP。

最初のステップ

すべてが自動的に発生するため、「gentlemansky」セットのインストールプロセスを説明しません。 インストールを開始した後、プレスするための鍵のみが管理されます。 DummiesのMySQLのバリアントで必要なものだけです。

インストールプロセスが完了したら、ローカルサーバーを起動し、数秒待ってください。 そのタイプの後 住所欄 ブラウザローカルホスト。

ページ「稼い、稼いだ!」 スナップショットで指定されているリンクの1つに進みます。 その後、あなたはphpmyadmin - データベースを管理するためのシェルにとられるでしょう。

リンクhttp://downloads.mysql.com/docs/world.sql.zipをクリックすると、公式のMySQLサイトからテストデータベースの例をダウンロードします。 繰り返しますが、PhpMyAdminの上にメインメニューの[インポート]タブに移動します。 最初のセクション(「インポートされたファイル」)の「現在の電流へのインポート」ウィンドウで、「コンピュータの概要」を設定してください。

エクスプローラウィンドウで、データベースのダウンロードした例のアーカイブを選択します。 メインウィンドウの下部にある[OK]をクリックするのを忘れないでください。

指定されたパラメータ値を変更しないことをお勧めします。 これにより、データインポートされたソースが間違って表示される可能性があります。 phpMyAdminシステムが圧縮データベースアルゴリズムを認識できないエラーを発行した場合は、それを解凍してインポートプロセス全体を最初に繰り返します。

すべてがうまくいったら、プログラムメッセージが上部に表示されます。このインポートは成功し、データベースリストの左側にあります - もう1つ(単語)。

あなたが扱う必要があるものをより明確に想像することができるように、内側からの構造を考えてみましょう。

初心者用のMySQLデータベースの名前をクリックしてください。 それが成るテーブルのリストを表示します。 そのうちの1つをクリックしてください。 それからアイテムに行きます トップメニュー "構造"。 主な作業領域にはテーブル構造が表示されます。すべての列、データ型、およびすべての属性の名前。

データベースを研究するための本、ビデオコース、オンラインリソース、リレーショナル理論とSQL言語の基本。

Alan Bully "SQL学習"(2007)

Territory SQLスタディパスの先頭に立つ人には、この本に最適な選択です。 それはあなたが一次知識の必要な基盤を購入することを可能にするだけでなく、プログラマーが使用した最も人気のある微妙さと強力な言語の手段についても伝えます。
データベース、リレーショナル理論、およびSQL言語専用の多くのマニュアルは、退屈なプレゼンテーションに過大上されています。 理論的基礎。 この本は、その軽量な、居間のおかげで楽しい例外です。 作者は、SQL式とブロック、条件の種類、join-ah、副照会、その他多くのものに関するリーダー情報を習得します。
実際に得られた知識を確保するために、著者はMySQLトレーニングベースを作成し、理論的資料全体をカバーする要求の多くの実用的な例を提供します。

クリス・フィイラー「SQL」(2013)


本はANSI SQL-92言語のバージョンについて話しています(SQL2)。 対応するクラスのタスクをサンプリングして変更し、データベース構造オブジェクトを処理するためにクエリ言語を適用する方法について詳細に説明されています。 全ての例を詳細に説明する。
MySQL、Oracle、MS SQL Server、PostgreSQLの実装では、SQL方言の違いに特別な注意が払われます。
本は、独立してSQL言語を学び、このトピックに関する知識を向上させたいと思うすべてのものを対象としています。

Anthony Molinaro "SQL。 レシピのコレクション」(2009)


この出版物は、すでにSQLに関するいくつかの知識を持っていて、この分野でのスキルを向上させたい人を対象としています。 著者は、DBMS、Oracle、PostgreSQL、MySQL、SQL ServerさまざまなDBMSでタスクを解決するための例を提供しているため、データベースの分野では非常に便利で専門家があります。
この本は、SQLの使用方法を学ぶのに役立ちます。データベース内の操作からデータへの操作からアプリケーション内のネットワーク経由でそれらを送信します。
ウィンドウ関数と特別な演算子、およびデータウェアハウスを操作する高度な方法を学びます。ヒストグラム、ブロック内のデータアライメント、スライディング範囲の集合、電流和とアームの形成を実行します。 文字列を列に展開したり、逆の逆数、行の中の計算を簡素化したり、結果セットの二重展開を実行したり、行のバイパスを実行します。これにより、SQLが文字、単語、または文字列の要素にSYNTAX文字列を使用できます。セパレータ 作者が提供する技術はあなたのアプリケーションのコードを最適化し、あなたの前に新しいSQL言語機能を開きます。

Alex Kriegelなど。 "SQL。 ユーザー聖書»、第2版(2010)


本は、各章が3つの主要なDBMSの方言に対する特定の要求の実装の比較を提供するという点で一意です。 これにより、初心者からGuru、一種のデスクトップマニュアルの開発者のためのSQL言語に関する徹底的かつ実用的な参照書です。
この出版物は、非常に基本からトランザクションおよびロック、機能、およびデータベース保護ツールへのテーマをカバーしています。
最後にいくつかの追加のトピックが表示されます.SQL統合、OLAP Business Analytics、さらにはるかに多くのものです。

Eric Redmond、Jim R. Wilson "7週間7つのデータベース。 現代データベースとNOSQLIDEOLYの紹介 "(2015)

この本は、Redis、Neo4j、Couchdb、MongoDB、HBase、PostgreSQL、およびRiakのほとんどを説明しています。 各データベースは、主なアイデアと強みを示す実データを扱う例を提供します。
この本は、7つのデータベースのそれぞれの強みと短所の光を交換し、要件を最もよく満たすものを選ぶように教えます。

ほとんどの最近のWebアプリケーションは、通常、呼び出された言語を使用してデータベースと対話します。SQL。 幸いなことに、この言語は非常に学ぶのがとても簡単です。 この記事では簡単に見ていきますSQL. お問い合わせ、対話のためにそれらの使用方法を学ぶMySQLデータベース。

あなたは何が必要ですか?

SQL(構造化照会言語) のようなデータベース管理システムと対話するように特別に設計された言語MySQL、Oracle、SQLite そして他の...実行するSQL. この記事でのリクエストをインストールすることをお勧めしますミーズル 上に ローカルコンピュータ。 私もお勧めします phpmyadmin。 ビジュアルインタフェースとして。

これはすべてのお気に入りのデンバーで利用可能です。 私は誰もがそれが何であるかを知っていて、それを取るべき場所を知っているべきだと思います:)。 できるもう1つの使用洗濯やMAMP。

デンバーでは内蔵されていますミーズル コンソール。 それを使います。

データベースを作成します。データベースの作成

これが私たちの最初の要求です。 私達はさらなる仕事のために私達の最初のデータベースを作成します。

開始するには、発見しますミーズル コンソールとログイン。 にとって濡れている。 デフォルトのパスワードは空です。 それは何もありません:)。 にとってMAMP - "root"。 デンバーの場合は明確にする必要があります。

ログイン後、次の行を入力してをクリックしてください入る:

データベースmy_first_dbを作成します。

セミコロン(;)は、要求の最後に、他の言語と同様に追加されることに注意してください。

SQLでもコマンド 登録機に敏感です。 私たちはそれらを大きな文字で書きます。

オプティ のみ: キャラクターセット。そして 照合

インストールしたい場合文字セット(シンボル)と照合順序(比較) 次のコマンドを書きます。

データベースの作成my_first_dbデフォルトの文字セットutf8 utf8_general_ciを収集します。

でサポートされている文字セットのリストがあります MySQL。

データベースを表示:すべてのデータベースのリストを表示します

このコマンドは、利用可能なすべてのデータベースを出力するために使用されます。

ドロップデータベース:データベースの削除

既存のデータベースをこのリクエストで削除できます。

警告なしで実行されるように、このコマンドに注意してください。 データベースにデータがある場合は削除されます。

使用する:データベースの選択

技術的には、これは要求ではなく、オペレータであり、最後にコンマのあるポイントを必要としません。

彼はMySQLを報告します 現在のセッションのデフォルトのデータベースを選択します。 これでテーブルを作成して他のものをデータベースで作成する準備が整いました。

データベース内のテーブルは何ですか?

データベースにテーブルをフォームに送信することができますExcelファイル。

画像のように、表は列名、行、および情報を持ちます。 viaSQL. そのようなテーブルを作成できるリクエスト。 追加、読み、更新、情報を削除することもできます。

テーブルを作成します。 テーブルを作成する

C. このリクエストの助けは、データベースにテーブルを作成できます。 残念ながら、ドキュメンテーションミーズル この問題の初心者にはあまり明確ではありません。 この種の要求の構造は非常に複雑になる可能性がありますが、簡単に始めます。

次のクエリは2スピーカーを含むテーブルを作成します。

テーブルユーザーを作成する(USERNAME VARCHAR(20)、CREATE_DATE DATE)。

私達は私達の要求をいくつかの行とインデントのタブで書くことができます。

最初の文字列は簡単です。 名前 "users"という名前のテーブルを作成します。 括弧では、カンマを介して、すべての列のリストがあります。 列の各名前の後、VARCHARやDATEなどの情報タイプがあります。

VARCHAR(20)は、列に文字列型を持ち、最大20文字の長さにすることができます。 日付は、そのような形式で日付を格納するために使用される情報の一種でもあります。 "GGyg - MM-DD"。

主キー( 主キーh)

次のクエリを満たす前に、私たちの主キーになる "user_id"の列も含める必要があります。 テーブルの各行を識別するために使用される情報として主キーを認識できます。

テーブルユーザーを作成します(user_id int auto_increment主キー、username varchar(20)、create_date date)。

int。 32ビット整数型(例えば、数字)を作成します。 自動増加。 自動的に新しい値を生成しますID. 新しい情報数を追加するたびに。 これは必ずしもそうではありませんが、プロセス全体を簡単にします。

この列は全体の値であることは必須ではありませんが、最もよく使われます。 主キーの存在も必須ではありませんが、データベースのアーキテクチャとパフォーマンスに推奨されます。

リクエストを実行しましょう。

表を表示:すべてのテーブルを表示

このリクエストを使用すると、データベース内にあるテーブルのリストを取得できます。

説明:テーブル構造を表示

既存の表の構造を表示するには、このクエリを使用できます。

列はすべてのプロパティで表示されます。

ドロップテーブル:テーブルを削除します

ドロップデータベースだけでなく、 この要求はテーブルとその内容を警告なしで削除します。

他の机: 変更テーブルの変更

この要求には、テーブルとすることができる変更が多いほど複雑な構造を含めることができます。 例を見てみましょう。

(最後のステップを削除した場合は、テスト用に再度作成してください)

列を追加する

ALTER TABLEユーザーは、ユーザー名の後に電子メールVARCHAR(100)を追加します。

SQLの読みやすい可能性のおかげで、私はそれが詳細に説明することを意味しないと思います。 我々が追加します 新しい列 「ユーザー名」の後に「Eメール」。

スピーカーを削除します

それはまたとても簡単でした。 警告なしでデータを削除できるように、このリクエストを注意してください。

さらなる実験のために単なるリモートカラムを復元してください。

列を変更する

列のプロパティを変更したい場合があります。これに対して完全に削除する必要はありません。

この要求は "user_name"のユーザー列を名前変更し、その型をVarchar(30)で変更しました(20)。 そのような変更はテーブル内のデータを変更しないでください。

インサート: 表への情報を追加する

次の要求を使用してテーブルにいくつかの情報を追加しましょう。

ご覧のとおり、values()にはコンマで区切られた値のリストが含まれています。 すべての値は単一の列に囲まれています。 そして、値は、テーブルを作成するときに定義された列の順になければなりません。

「user_id」という主キーフィールドの最初のNULL値は次のように注意してください。 列にauto_increntプロパティがあるため、IDが自動的に生成されるためにこれを行います。 初回IDの情報が追加されたら1。次の範囲 - 2などが...

代替オプション

シリーズを追加するための別のクエリオプションがあります。

今回は、値の代わりにSETキーワードを使用しており、括弧はありません。 いくつかのニュアンスがあります。

列をスキップできます。 たとえば、 "user_id"の値を割り当てていません。デフォルトではauto_increment値が受信されます。 列をVARCHAR型でスキップすると、空の文字列が追加されます。

各列は名前で適用する必要があります。 このため、過去のバージョンとは対照的に、それらは任意の順序で述べることができます。

代替バージョン2。

これが別のオプションです。

繰り返しますが、列名への参照があるため、値を任意の順序で設定できます。

last_insert_id()

このクエリを使用して、現在のセッションの最後の行のauto_incrementであるIDを取得できます。

今()

これで、クエリでMySQL関数を使用する方法を示す時が来ました。

now()関数は現在の日付を表示します。 そのため、新しい行の挿入時に列の日付を自動的に設定するために使用できます。

1つの警告を受けたが、それに注意を払わないように注意してください。 その理由は、now()も一時的な情報を出力するのに役立ちます。

選択する: テーブルからデータを読む

表に情報を追加すると、そこから読むことがそれを学ぶための論理的なものであることを意味します。 これはこのように選択要求が私たちを助けるでしょう。

以下は、テーブルを読み取る最も簡単な選択要求です。

この場合、アスタリスク(*)は、テーブルからすべてのフィールドを要求したことを意味します。 特定のスピーカーしか欲しいのなら、リクエストはこのようになります。

状態どこ。

ほとんどの場合、私たちはすべての列には興味がありませんが、いくつかだけです。 たとえば、ユーザー "NetTuts"の電子メールアドレスだけが必要なとします。

ここで、クエリ内の条件を設定して詳細なサンプルを作成することができます。

プログラミングのように、2つは(\u003d)に等しい平等に1つの符号が使用されます。

比較を使用することもできます。

または条件を組み合わせるために使用することもできます。

ご了承ください 数値 引用符で囲むべきではありません。

in()

これはいくつかの値のサンプリングに役立ちます。

お気に入り

「ワイルドカード」リクエストを行うことができます

%アイコンは「ワイルドカード」として使用されます。 つまり、彼の場所には何もあり得る。

状態注文する。

任意の基準で順序付けられた形式で結果を取得したい場合

デフォルトのASC(より多く)。 逆にそれはDESCを使用します。

制限...オフセット...

得られた結果の数を制限できます。

制限2は最初の最初の結果のみを取ります。 制限1オフセット2最初の2番目の後に1を取得します。 Limit 2,1は同じことを意味します(注意のみが最初に払われてから制限されています)。

更新: テーブル内の情報を変更してください

このクエリはテーブル内の情報を変更するために使用されます。

ほとんどの場合、特定の列に変更を加える可能性が最も高いため、WHERE条件で使用されます。 変更条件がない場合、変更はすべての行に影響します。

制限を使用して変更を加えたい行数を制限することもできます。

削除: テーブルから情報を削除します

アップデートと同様に、このクエリは次の場所で使用されます。

テーブルの内容を削除するには、次のようにします。

ユーザーから削除します。

しかし、それは使うのが良いです切り捨てられます。

削除に加えて、この要求もリセットします 自動増加。 また、再度行を追加すると、カウントは最初から開始されます。削除します。 これはそうではなく、カウントは続行されます。

小文字と特別な単語を無効にします

行の値

一部の文字を切断する必要があります(逃れる。 )、または多分問題がある可能性があります。

これを行うには、後部スラッシュを使用してください(\).

特別な言葉

MySQLの中から 多くの特別な言葉があります(選択または更新します。 )使用時にエラーを回避するには、引用符を使用する必要があります。 普通の引用符ではなく、そのようなものではありません(`).

つまり、という名前の列を追加する必要があります。削除します。 「、それはこのようにして行わなければなりません:

結論

最後まで読んでいただきありがとうございます。 この記事が役に立つことを願っています。 これは終わりではありません! つづく:)。

構造化照会言語(構造化照会言語)またはSQL- これは、準リレーショナルデータベースで使用するための宣言型プログラミング言語です。 元のSQL機能の多くは計算委託を委託するために取られましたが、最新のSQL拡張機能には、より多くのリレーショナル代数が含まれます。
SQLはもともとIBMによって作成されましたが、多くの製造業者は独自の方言を開発しました。 1986年に1986年のISOと1987年のISOのAmerican National Institute(ANSI)による標準として採用されました。 SQLプログラミング言語規格では、ANSIは公式のSQL発音が「ES KEW EL」であると述べた。 ただし、多くのデータベーススペシャリストは、「Slang」の発音「SIKVEL」を使用しました。これは、IBMからの商標と項目の相反のために後で変更された言語の初期名を反映しています。 初心者のためのプログラミング。
SQLプログラミング言語 1992年に改訂され、このバージョンはSQL-92 Vと呼ばれています。 それから、1999年にSQLになるために再度改訂されました:1999年(AKA SQL3)。 ダミーのためのプログラミング。 SQL 1999は、以前に他のバージョンでサポートされていないオブジェクトをサポートしていますが、2001年末にのみ、SQL実装をサポートしているSQL実装をサポートしています。
SQLは、ANSIとISOとして定義されていますが、多くのバリエーションと拡張機能があり、そのほとんどは、Oracle PL / SQL Corporationの実装やSybaseとMicrosoftの実装など、「Transact-SQL」の実装には独自の特性があります。これはプログラミングの基本で強く混乱することができます。 商業実装は、標準の主な機能のサポートを下げることは珍しくありません。そのようなデータ型は、ある種の独自のオプションを好む日時と同じ日時。 その結果、通常、構造的な構造的な変更なしにプラットフォームプラットフォームから移植されるANSI CまたはANSI Fortransとは対照的に、SQLプログラミング言語要求は、有意な変更なしに異なるデータベースシステム間でめったに転送されることはめったにありません。 データベース内のほとんどの人は、各開発者に独自のデータベース管理システムを提供し、購入者を特定のデータベースにリンクするために意図的性の欠如が意図的であると考えています。
名前が次のようになると、SQLプログラミング言語は、リレーショナルデータベースに含まれるデータクエリの特定のターゲットのために設計されています。 そのため、Cや基本などの手続き的な言語ではなく、より広範囲の問題を解決するように設計されている、データサンプルを作成するプログラミング言語命令のセットです。 PL / SQLなどの言語拡張機能は、SQLの利点を保存するときにSQLのための手続き型要素を追加することによってこの制限を解決するように設計されています。 もう1つの方法は、SQLがプロシージャー言語プログラミングコマンドを埋め込んでデータベースと対話することを許可されていることです。 たとえば、Oracleとその他のユーザーはデータベース内のJava言語をサポートしていますが、PostgreSQLではPerl、Tcl、またはCに関数を書き込むことができます。
SQLについての1つの冗談: "SQLは構造化も言語でもありません。" 冗談の本質は、SQLがチューリングの舌ではないということです。 。

Tから*を選択
C1。 C2。
1 a.
2 b
C1。 C2。
1 a.
2 b
TからC1を選択してください
C1。
1
2
C1。 C2。
1 a.
2 b
cから*を選択してください。ここで、c1 \u003d 1
C1。 C2。
1 a.

Tテーブルを考えると、SELECT *からTRESSOMERのすべての行のすべての要素が表示されます。
同じテーブルから、TリクエストからC1の選択は、テーブルのすべての行のC1列から要素を表示します。
同じテーブルから、C1 \u003d 1クエリがすべての行のすべての要素を表示します。ここで、C1列の値はすべて "1"です。

SQLキーワード

SQL単語はいくつかのグループに分けられます。

最初のISです データ操作言語またはDML (データ管理言語)。 DMLは、データベースを要求し、データの追加、更新、削除を要求するために使用される言語のサブセットです。

  • SELECTは最も頻繁に使用されるDMLコマンドの1つであり、ユーザが望みの結果の記述としてセットの形式として要求を要求することを可能にする。 Apositeでは、結果をどのように見つけなければならないかが示されていない - データベース内で実行できる形式の形式の要求は、データベースシステムの動作、より具体的にはオプティマイザが要求される。
  • 挿入は既存のテーブルの文字列(正式なダイヤル)を追加するために使用されます。
  • 更新は、テーブルの既存の文字列のデータ値を変更するために使用されます。
  • テーブルから削除される既存の行の定義を削除します。

他の3人 キーワードa、グループDMLに分類されると言えます。

  • 開始作業(またはSQLの方言に応じて、取引を開始する)を使用して、完全か満たされていないデータベーストランザクションの開始をマークすることができます。
  • コミットは、操作を実行した後にすべてのデータが変更されたことを確立します。
  • ロールバックは、データベースに「ロールバック」としてデータベースに記録された瞬間まで、最後の固定またはロールバックが破棄されなければならない、すべてのデータが破棄されなければならないと判断します。

コミットとロールバックは、トランザクションコントロールやブロッキングなどの領域で使用されます。 どちらの命令もすべてのトランザクション(データベース操作)を完了し、すべてのロックを削除してテーブル内のデータを変更しています。 開始作業または同様のアプリケーションの有無は、特定のSQL実装によって異なります。

2番目のキーワードグループはグループに属します データ定義言語またはDDL(データ定義言語). DDL. ユーザーが新しいテーブルと関連する要素を定義できます。 ほとんどの商用基地 sQLデータ DDLで独自の拡張子を持ち、これは非標準の非標準の制御を可能にしますが、特定のシステムの重要な要素を制御します。
主なDDL項目は、作成および削除するコマンドです。

  • 作成データベースに作成されるオブジェクト(たとえば、テーブルなど)を定義します。
  • DROPデータベース内の既存のオブジェクトが削除されるか、ルール、IRREATIORYARTYを決定します。
  • 一部のデータベースシステムもサポートしています 変更します。これにより、ユーザーは既存のオブジェクトをさまざまな方法で変更できます。たとえば、既存のテーブルに列を追加できます。

SQLキーワードの3番目のグループ データ管理言語またはDCL(データ制御言語). DCLに データアクセス権を担当し、ユーザーがデータベース内のデータを表示または操作するためのアクセス権を持っている人を監視することを可能にします。 これが2つの主要なキーワードです。

  • 許可 - ユーザーは操作を実行できます
  • REVOKE - ユーザーに操作を実行する機能を削除または制限します。

SQLを使用したデータベースシステム

  • インターベース
  • ミーズル
  • オラクル
  • PostgreSQL.
  • SQLサーバー

プロの開発プロフェッショナルになり、お金を稼ぐのか? 格安のビデオ情報は紹介をしています。

トピックを続ける:
インターネット

Windowsブートディスクを作成する最も一般的な方法の1つは、この記事で説明されている方法です。 そしてより正確に創造の中で、それは遠い世界で私たちを助けるでしょう...