1 時間で MySQL データベースを学ぶ (Zhang Guo)

1 時間で MySQL データベースを学ぶ (Zhang Guo)

モバイル インターネットの終焉と人工知能の出現により、ビッグ データの重要性はますます高まっています。次に成功する人は、大量のデータを持つ人です。データとデータベースについて知っておく必要があります。

1. データベースの概要

データベースは、データを保管するための物流倉庫のように、データを保存および管理するソフトウェア システムです。

ビジネスの世界では、情報はビジネスチャンスを意味します。情報を得るための非常に重要な方法の 1 つは、データを分析して処理することです。これにより、さまざまな専門的なデータ管理ソフトウェアが生まれ、データベースもその 1 つです。もちろん、データベース管理システムは一気に確立されたわけではなく、継続的な充実と発展を経て、現在の形に至っています。

1.1 開発の歴史

1.1.1. 手動処理段階 1950 年代半ばにコンピューターが初めて発明される以前は、その処理能力は非常に限られており、簡単な計算しか実行できませんでした。データ処理機能も非常に限られていたため、当時のコンピューターは科学計算や工学計算にしか使用できませんでした。コンピュータにはデータを管理するための専用ソフトウェアはありません。データはコンピュータまたはデータを処理するプログラムによって運ばれます。データの保存形式、読み取りおよび書き込みパスまたは方法が変更された場合、プログラムの正確性を維持するために、その処理プログラムも対応する変更を行う必要があります。

1.1.2 ファイルシステム
1950 年代後半から 1960 年代半ばにかけて、ハードウェアとソフトウェアの技術の発展により、コンピューターは科学計算だけでなく、ビジネス管理にも広く使用されるようになりました。この期間中、データとプログラムは保存場所の点で完全に分離され、データは別々のファイルに整理されて外部記憶装置に保存され、データファイルは異なる時間に複数の異なるプログラムで使用できました。
プログラムとデータは保存場所が分離されており、オペレーティングシステムはデータの保存場所とアクセスパスの管理に役立ちますが、プログラムの設計は依然としてデータの保存形式と方法の影響を受け、データから完全に独立することはできず、データの冗長性は比較的大きくなります。

1.1.3. データベース管理システム 1970 年代以降、コンピュータのハードウェアとソフトウェアの技術は急速な発展を遂げてきました。この期間の最も重要な発展は、真のデータベース管理システムの出現であり、これにより、アプリケーションとデータ間の真に統一されたインターフェイスとデータ共有が可能になりました。これにより、アプリケーションは統一された方法でデータを直接操作できるようになり、アプリケーションとデータは高度な独立性を備えています。

1.2. 一般的なデータベース技術のブランド、サービス、アーキテクチャ

長年の開発を経て、市場には多くのデータベース システムが登場しました。個人的には、最も強力なのは Oracle だと思います。もちろん、DB2、Microsoft SQL Server、MySQL、SyBase など、他にも多くのシステムがあります。下の図は、一般的なデータベース テクノロジ ブランド、サービス、アーキテクチャを示しています。

1.3 データベースの分類

データベースは通常、階層型データベース、ネットワーク データベース、リレーショナル データベースの 3 つのタイプに分けられます。

さまざまなデータベースがさまざまなデータ構造に従って接続され、編成されます。

今日のインターネットでは、最も一般的なデータベース モデルは主にリレーショナル データベースと非リレーショナル データベースの 2 種類です。

1.3.1 リレーショナルデータベース

現在でも、リレーショナル データベースは、成熟したアプリケーションやサービス、さまざまなシステムで使用されている主なデータベースです。

代表者: Oracle、SQL Server、MySQL

1.3.2. 非リレーショナル データベース 時代の進歩と開発の必要性により、非リレーショナル データベースが誕生しました。

代表例: Redis、Mongodb

NoSQL データベースは、ストレージ速度と柔軟性に利点があり、キャッシュにもよく使用されます。

1.4. データベースの正規化<br /> 一連の手順を経て、ようやく顧客の要件をデータ テーブルに変換し、これらのテーブル間の関係を確立できました。これで開発に使用できるようになりますか?答えはノーです。なぜでしょうか?同じプロジェクトでは、需要分析とデータベース設計に多くの人が関わっています。人によって考え方が異なり、部門によって業務ニーズが異なります。私たちが設計するデータベースには必然的に同一データが多数含まれ、構造に矛盾が生じて開発に不便が生じる可能性があります。

1.4.1. パラダイムとは何か? 正規化されたデータベースを設計するには、データベース設計の標準原則であるデータベース設計パラダイムに従う必要があります。このパラダイムにより、データベース テーブル構造をより適切に設計し、冗長データを削減できるため、データベースのストレージ効率、データの整合性、およびスケーラビリティが向上します。

リレーショナル データベースを設計する場合、合理的なリレーショナル データベースを設計するために、さまざまな仕様と要件に準拠する必要があります。これらのさまざまな仕様は、さまざまなパラダイムと呼ばれます。さまざまなパラダイムにはサブパラダイムがあります。パラダイムが高ければ高いほど、データベースの冗長性は低くなります。現在、リレーショナル データベースには、第 1 パラダイム (1NF)、第 2 パラダイム (2NF)、第 3 パラダイム (3NF)、Badesco パラダイム (BCNF)、第 4 パラダイム (4NF)、第 5 パラダイム (5NF、完全パラダイムとも呼ばれる) の 6 つのパラダイムがあります。最小正規形は第 1 正規形 (1NF) です。より多くの仕様要件を満たす最初の正規形は第 2 正規形 (2NF) と呼ばれ、残りの正規形も同様です。一般的に言えば、データベースは第 3 正規形 (3NF) を満たすだけで済みます。

1.4.2. 3つの主要なパラダイム

第一正規形 (1NF)

いわゆる第 1 正規形 (1NF) は、リレーショナル モデルの列に追加された仕様要件を指します。すべての列はアトミックである必要があります。つまり、データベース テーブルの各列は分割できないアトミック データ項目であり、コレクション、配列、レコードなどの非アトミック データ項目にすることはできません。つまり、エンティティ内の属性に複数の値がある場合、それを異なる属性に分割する必要があります。第 1 正規形 (1NF) に準拠するテーブル内の各ドメイン値は、エンティティの属性または属性の一部にのみなります。つまり、第 1 正規形は重複のない領域です。

たとえば、表 1-1 では、「プロジェクト アドレス」列を州、市などに細分化することもできます。海外では、「名前」の列を「姓」と「名」の 2 つの列に分割するプログラムも増えています。

最初の正規形では、各列がアトミック性を維持し、それ以上分割できないことが求められますが、この要件は私たちのニーズに関連しています。たとえば、上記の表では、「プロジェクト アドレス」に対して州や都市のクエリとアプリケーションの要件がないため、分割する必要はありません。「名前」列についても同様です。

表1-1 元の表

プロジェクト番号

プロジェクト名

プロジェクト住所

従業員番号

従業員名

給料

位置

P001

港珠澳大橋

広東省珠海市

E0001

ジャック

6000/月

ワーカー

P001

港珠澳大橋

広東省珠海市

E0002

参加する

7800/月

ワーカー

001

港珠澳大橋

広東省珠海市

E0003

りんご

8000/月

上級技術者

P002

南シナ海航空宇宙

海南省三亜市

E0001

ジャック

5000/月

ワーカー

第2正規形 (2NF)

1NF に基づいて、非キー属性は主キーに完全に依存する必要があります。第 2 正規形 (2NF) は第 1 正規形 (1NF) に基づいて構築されます。つまり、第 2 正規形 (2NF) を満たすには、まず第 1 正規形 (1NF) を満たす必要があります。第 2 正規形 (2NF) では、データベース テーブル内の各インスタンスまたはレコードが一意に区別可能である必要があります。各エンティティをそのエンティティの一意の識別子として区別できる属性または属性のグループを選択します。

第 2 正規形 (2NF) では、エンティティの属性は主キーに完全に依存している必要があります。いわゆる完全な依存関係とは、主キーの一部にのみ依存する属性は存在し得ないことを意味します。そのような属性が存在する場合は、この属性と主キーのこの部分を分離して新しいエンティティを形成する必要があります。新しいエンティティと元のエンティティの間には 1 対多の関係があります。この区別を実現するには、通常、各インスタンスの一意の識別子を格納する列をテーブルに追加する必要があります。つまり、2 番目のパラダイムは最初のパラダイムに基づいており、属性は主キーに完全に依存しています。

たとえば、表 1-1 では、プロジェクト情報、従業員情報などが表に記載されています。その結果、大量のデータが重複することになります。第 2 正規形に従って、表 1-1 を表 1-2 と表 1-3 に分割できます。

l プロジェクト情報テーブル: (プロジェクト番号、プロジェクト名、プロジェクトアドレス):

表1-2 プロジェクト情報表

プロジェクト番号

プロジェクト名

プロジェクト住所

P001

港珠澳大橋

広東省珠海市

P002

南シナ海航空宇宙

海南省三亜市

l 従業員情報テーブル(従業員番号、従業員名、役職、給与レベル):

表1-3 従業員情報テーブル

従業員番号

従業員名

位置

給与水準

E0001

ジャック

ワーカー

3000/月

E0002

参加する

ワーカー

3000/月

E0003

りんご

上級技術者

6000/月

このように、表 1-1 は 2 つの表になり、それぞれが 1 つの事柄のみを説明し、明確かつ簡潔になります。

第3正規形 (3NF)

第 3 正規形は、第 2 正規形よりも一歩進んだものです。第 3 正規形の目的は、テーブル内の各列が主キー列に間接的ではなく直接的に関連付けられるようにすることです。つまり、各列は主キー列と直接の依存関係を持ち、第 3 正規形を満たします。

第 3 正規形では、各列が主キー列に直接関連している必要があります。次のように理解できます。張三が李四の兵士であり、王武が張三の兵士であるとします。では、王武は李四の兵士でしょうか。この関係から、王武は張三に依存しており、張三は李四の兵士であるため、王武も李四の兵士であることがわかります。したがって、王武も李四の兵士です。ここでは、3 番目のパラダイムで強調されている直接的な依存関係ではなく、間接的な依存関係が存在します。

次に、表 1-1 を 2 つの表に分割する第 2 正規形の説明を見てみましょう。これら 2 つの表は第 3 正規形に準拠していますか?従業員情報テーブルには、「従業員番号」、「従業員名」、「役職」、「給与レベル」が含まれます。ご存知のように、給与レベルは役職によって決まります。ここで、「給与レベル」は「役職」を通じて従業員に関連付けられますが、これは第 3 正規形に準拠していません。従業員情報テーブルを次のようにさらに分割する必要があります。

l 従業員情報テーブル: 従業員番号、従業員名、役職

l ポジションテーブル: ポジション番号、ポジション名、給与レベル

データベース正規化設計の 3 つのパラダイムを理解したので、表 1-1 の最適化されたデータ テーブルを見てみましょう。

従業員情報テーブル(従業員)

従業員番号

従業員名

仕事番号

E0001

ジャック

1

E0002

参加する

1

E0003

りんご

2

プロジェクト情報テーブル (ProjectInfo)

プロジェクト番号

プロジェクト名

プロジェクト住所

001

港珠澳大橋

広東省珠海市

P002

南シナ海航空宇宙

海南省三亜市

義務

仕事番号

役職

給料

1

ワーカー

3000/月

2

上級技術者

6000/月

プロジェクト参加者記録シート (Project_Employee_info)

シリアルナンバー

プロジェクト番号

従業員番号

1

001

E0001

2

001

E0002

3

P002

E0003

比較してみると、テーブルが増え、関係が複雑になり、データのクエリが面倒になり、プログラミングの難易度も上がっていることがわかりました。しかし、各テーブルの内容はより明確になり、重複データが少なくなり、更新とメンテナンスが容易になりました。では、この矛盾をどのようにバランスさせるのでしょうか。

1.4.3. パラダイムと効率

データベースを設計する際、設計者、顧客、開発者は、データベース設計について通常一定の対立を抱えています。顧客は利便性と明確な結果を好み、開発者もデータベース関係が比較的単純で開発の難しさが軽減されることを望んでいます。設計者は、3 つの主要なパラダイムを適用して、データベースを厳密に正規化し、データの冗長性を減らし、データベースの保守性とスケーラビリティを向上させる必要があります。このことから、3 つの主要なパラダイムを満たすために、私たちのデータベース設計は顧客や開発者のデータベース設計とは異なることがわかります。したがって、実際のデータベース設計では、盲目的に正規化を追求することはできません。3 つの主要なパラダイムを考慮し、データの冗長性とさまざまなデータベース操作の異常を減らし、データベースのパフォーマンスの問題を十分に考慮して、適切なデータベース冗長性を実現する必要があります。

2. MySQL の紹介

2.1. MySQLの概要

MySQL は、スウェーデンの会社 MySQL AB によって開発されたリレーショナル データベース管理システムであり、現在は Oracle の製品です。 MySQL は、最も人気のあるリレーショナル データベース管理システムの 1 つです。WEB アプリケーションに関して言えば、MySQL は最高の RDBMS (リレーショナル データベース管理システム) アプリケーション ソフトウェアの 1 つです。

MySQL は、すべてのデータを 1 つの大きなウェアハウスに格納するのではなく、異なるテーブルにデータを格納するリレーショナル データベース管理システムであり、速度と柔軟性が向上します。

MySQL で使用される SQL 言語は、データベースにアクセスするために最も一般的に使用される標準化された言語です。 MySQL ソフトウェアは二重ライセンス ポリシーを採用しており、コミュニティ エディションと商用エディションに分かれています。サイズが小さく、速度が速く、総所有コストが低いこと、特にオープン ソースであることから、MySQL は中小規模の Web サイトの開発用の Web サイト データベースとして一般的に選択されています。

MySQL公式サイト: https://www.mysql.com/

MySQL ダウンロード: https://www.mysql.com/downloads/

2.2 システム特性

1.これは C および C++ で記述されており、ソース コードの移植性を保証するためにさまざまなコンパイラでテストされています。

2. AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows などの複数のオペレーティング システムをサポートします。

3.複数のプログラミング言語用の API が提供されています。これらのプログラミング言語には、C、C++、Python、Java、Perl、PHP、Eiffel、Ruby、.NET、Tcl などが含まれます。

4. CPU リソースを最大限に活用するためにマルチスレッドをサポートします。

5.最適化された SQL クエリ アルゴリズムにより、クエリ速度が効果的に向上します。

6.クライアント サーバー ネットワーク環境で独立したアプリケーションとして使用したり、ライブラリとして他のソフトウェアに組み込んだりすることができます。

7.多言語サポートを提供します。中国語 GB 2312、BIG5、日本語 Shift_JIS などの一般的なエンコードをデータ テーブル名やデータ列名として使用できます。

8. TCP/IP、ODBC、JDBC などの複数のデータベース接続方法を提供します。

9.データベース操作を管理、検査、最適化するための管理ツールを提供します。

10.大規模なデータベースをサポートします。数千万件のレコードを含む大規模なデータベースを処理できます。

11.複数のストレージ エンジンをサポートします。

12.MySQL はオープンソースなので、追加料金を支払う必要はありません。

13.MySQL は標準の SQL データ言語形式を使用します。

14.MySQL は、現在最も人気のある Web 開発言語である PHP を適切にサポートしています。

15.MySQL はカスタマイズ可能で、GPL プロトコルを使用します。ソース コードを変更して独自の MySQL システムを開発できます。

16. オンライン DDL/変更機能、データ アーキテクチャは動的なアプリケーションと開発者の柔軟性をサポートします (5.6 の新機能)

17. 自己修復型クラスタをサポートするためにグローバルトランザクション識別子を複製する(5.6 の新機能)

18. スレーブをクラッシュさせずにレプリケーションを行うと可用性が向上します (5.6 の新機能)

19. マルチスレッドスレーブを複製してパフォーマンスを向上する(5.6 の新機能)

20.3 倍高速なパフォーマンス (5.7 の新機能)

21. 新しいオプティマイザー(5.7 の新機能)

22. ネイティブ JSON サポート (5.7 の新機能)

23.マルチソースレプリケーション(5.7の新機能)

24. GIS の空間拡張 (5.7 の新機能)

2.3 ストレージエンジン

MySQL データベースは、アプリケーションのニーズに応じてさまざまなエンジンを用意しています。エンジンによって重点が異なります。違いは次のとおりです。

MyISAM は、MySQL 5.0 より前のデフォルトのデータベース エンジンであり、最も一般的に使用されています。挿入速度とクエリ速度は速くなりますが、トランザクションはサポートされません。

InnoDB は、トランザクション データベースに適したエンジンです。ACID トランザクションと行レベルのロックをサポートしています。MySQL 5.5 以降、デフォルトのデータベース エンジンになっています。

BDB は、トランザクション データベースのもう 1 つの選択肢である Berkeley DB から派生したもので、コミットやロールバックなどの他のトランザクション機能をサポートしています。

メモリは、すべてのデータをメモリ内に保存し、挿入、更新、クエリの効率が非常に高いストレージ エンジンです。ただし、データ量に比例してメモリ領域を占有します。 MySQL を再起動するとその内容は失われます。

Merge は、一定数の MyISAM テーブルを 1 つに結合します。これは、超大規模なデータを保存する場合に非常に便利です。

アーカイブは、大量の独立した履歴データを保存するのに非常に適しています。あまり読まれないからです。アーカイブは挿入速度は速いが、クエリのサポートは比較的貧弱である

Federated は、さまざまな MySQL サーバーを組み合わせて、完全なデータベースを論理的に形成します。分散アプリケーションに最適

Cluster/NDB は、複数のデータ マシンを使用して共同でサービスを提供し、全体的なパフォーマンスとセキュリティを向上させる、冗長性の高いストレージ エンジンです。大容量データ、高度なセキュリティとパフォーマンスが求められるアプリケーションに適しています

CSV は、データをコンマで論理的に区切るストレージ エンジンです。データベース サブディレクトリ内の各テーブルに対して .csv ファイルが作成されます。これは、データの各行が 1 つのテキスト行を占める通常のテキスト ファイルです。 CSV ストレージ エンジンはインデックスをサポートしていません。

BlackHole ブラックホールエンジン。書き込まれたデータは消えます。通常はレプリケーションリレーのバイナリログを記録するために使用されます。

Examples ストレージ エンジンは何も行わないスタブ エンジンです。これは、新しいストレージ エンジンの作成を開始する方法を示すための MySQL ソース コードの例として意図されています。繰り返しますが、その主な関心は開発者向けです。 Examples ストレージ エンジンはインデックス作成をサポートしていません。

さらに、MySQL のストレージ エンジン インターフェイスは適切に定義されています。興味のある開発者は、ドキュメントを読んで独自のストレージ エンジンを作成できます。

3. MySQLデータベースを素早くインストールして実行する

MySQL はかつてオープンソースで無料でしたが、Oracle に買収された後にいくつか変更がありました。以前のバージョンはすべて無料でしたが、コミュニティ エディションは GPL 契約に基づいてオープンソースで無料、商用エディションはより広範な機能を提供しましたが有料でした。

コミュニティエディションのダウンロードアドレス: https://dev.mysql.com/downloads/ (無料)

Enterprise Editionのダウンロードアドレス: https://www.mysql.com/downloads/ (有料)

3.1. 緑色のバージョンを使用する

MySQLを便利かつ迅速に使用するために、設定なしで解凍後すぐに使用できるグリーンMySQLを用意しました。

ダウンロードアドレス1: https://pan.baidu.com/s/1hrS5KUw パスワード: sug9

ダウンロードアドレス2: https://www.jb51.net/softs/594937.html

ダウンロード後すぐに解凍してください:

クリックすると、メニューをカスタマイズし、リソースを整理するための小さなツールである PStart.exe が起動します。

MySQLソフトウェアには5.0と5.5の2つのグリーンバージョンがあります。

Navicat for MySQLはデータベースクライアント管理ツールです

PStart.exe をクリックして起動すると、次のようになります。

クリックして MySQL サービスを開始し、Navicat for MySQL を実行します。

*注: 上記の PStart は、ドキュメントを整理するためのツールにすぎず、必須ではありません。起動時にエラーが発生したり、空の場合は、次のようにして直接シャットダウンし、MySQL サービスを直接起動できます。

mysql_start.bat は MySql データベースを起動するために使用され、mysql_stop.bat は MySql データベースをシャットダウンするために使用されます。

開発ツールは次のように同じ方法で起動します。

navicat.exe は、Navicat データベース クライアントを起動するために使用されます。毎回フォルダーを開く手間を省くために、デスクトップにショートカットを送信するのが最適です。

3.1.1、mysqlリモートアクセスの設定

mysqlコマンドを実行してmysqlコマンドモードに入り、次のSQLコードを実行します。

mysql> mysql を使用します。 
mysql> GRANT ALL ON *.* TO admin@'%' IDENTIFIED BY 'admin' WITH GRANT OPTION;

#この文は、任意の IP アドレス (上記の % はこれを意味します) を持つ任意のコンピューターが、管理者アカウントとパスワード (admin) を使用してこの MySQL サーバーにアクセスできることを意味します。
#リモートでログインするには、このようなアカウントを追加する必要があります。 root アカウントはリモートでログインできず、ローカルでのみログインできます。

3.1.2. mysqlユーザーのパスワードを変更する

1.mysqladminコマンド

形式は次のとおりです (USER はユーザー名、PASSWORD は新しいパスワードです)。

mysqladmin -u USER -p password PASSWORD

このコマンドを実行すると、元のパスワードを入力するよう求められます。正しく入力した後、パスワードを変更できます。
たとえば、ルートユーザーのパスワードを123456に設定すると、

mysqladmin -u root -p password 123456

2. ユーザーステートメントの更新

この方法では、まず root アカウントで MySQL にログインし、次のコマンドを実行する必要があります。

ユーザーを更新します。SET password=PASSWORD('123456') WHERE user='root'; FLUSH PRIVILEGES;

3. SET PASSWORDステートメント

この方法では、まず root コマンドを使用して MySQL にログインし、次のコマンドを実行する必要があります。

SET PASSWORD FOR root=PASSWORD('123456');

4. ルートパスワードを紛失した場合

MySQL に付属するツール「MySQL GUI Tools」を使用します。私は常にバージョン 5.0 を使用しています。 インストール ディレクトリでプログラム MySQLSystemTrayMonitor.exe を実行します。実行後、システム トレイにアイコンが表示されます。 MySQL サービスがインストールされていない場合は表示されません。まず、「アクション」>「MySQL インスタンスの管理」からサービスを構成してインストールできます。サービスがインストールされている場合は、右クリックすると「インスタンスの構成」メニューが表示されます。クリックすると、次の MySQL 管理者ウィンドウが表示されます。

元のサービス構成が正常であれば、左側のリストで「スタートアップ変数」を選択し、対応する右側のタブで「セキュリティ」を選択し、「許可テーブルを無効にする」をチェックしてから、「変更を適用」します。

左側の「サーバー コントロール」に戻り、右側の対応する「サービスの開始/停止」タブをクリックしてサービスを開始します。この時点で、MySQL に接続するためにユーザー名とパスワードは必要なくなり、root パスワードを変更できます。

3.1.2 インストールサービス

まず、mysql インストール ディレクトリの下の bin ディレクトリに入り、次に DOS コマンド ウィンドウを開いてディレクトリに入ります (必ずディレクトリを入力してください。そうしないと操作が失敗します)

DOS コマンドを実行します:

コマンド「mysqld --install」を入力すると、次のインターフェースが表示されます。サービスは正常にインストールされました。

mysql --installではなくmysqld --installであることに注意してください。

サービスをアンインストールする場合は、次のコマンドを入力します: mysqld --remove。次のインターフェースが表示されます。サービスが正常に削除されたことを示すメッセージが表示されます。

3.2. インストールバージョンを使用する

MySQL5.5.27_64ビットインストールパッケージのダウンロードアドレス1: https://pan.baidu.com/s/1minwz1m パスワード: ispn

MySQL5.5.56_64 ビットインストールパッケージのダウンロードアドレス 2: https://www.jb51.net/softs/363920.html

MySQL5.7.17 インストール パッケージ公式サイトのダウンロード アドレス: https://dev.mysql.com/downloads/windows/installer/

カスタムを選択:

インストールされているコンポーネント情報:

サーバーソフトウェアディレクトリ:

データディレクトリ:

インストールするには「インストール」をクリックします:


構成:

マシンタイプ


トランザクション機能をサポートするかどうか:

InnoDB テーブルスペース:


接続数:


文字セット設定:


Windows 管理関連の設定:


セキュリティ オプションを構成し、管理者のユーザー名とパスワードを設定します。


最後に、設定を実行します。


設定後、サービスが開始されます。

新しいバージョンの MySQL インストール パッケージははるかに大きく、インストール プロセスも若干異なります。

4. GUIを使用してMySQLを操作する

4.1 リレーショナルデータベースの典型的な概念

データベース: データ ウェアハウス

テーブル: データはテーブルに保存されます。テーブルに保存されるデータは、同じデータ形式である必要があります。

行: 行はデータを記録するために使用されます

レコード: 行内のデータ

列: 列はデータ形式を指定するために使用されます

フィールド: データの列

SQL: データを管理するために使用される言語。構造化クエリ言語 (SQL)

主キー: テーブル内のレコードを一意に識別します。空または重複は許可されません。

4.2. データベースにログインする

*ローカルデータベースに接続するときにサービスを開始する必要があります

4.3. データベースを作成する

4.4. テーブルを作成する

列タイプ:

数値型

整数: tinyint、smallint、mediumint、int、bigint
浮動小数点数: float、double、real、decimal
日付と時刻: 日付、時刻、日時、タイムスタンプ、年

文字列型: char、varchar
テキスト: tinytext、text、mediumtext、longtext

バイナリ(画像や音楽などの保存に使用可能): tinyblob、blob、mediumblob、longblob

列の制約:

4.5. データの管理

4.5.1. データを追加する

新しく作成したテーブル名をダブルクリックしてテーブルを開き、データを追加します。

4.5.2. データの削除

4.5.3. テーブル構造の変更

既存のテーブルに列を追加する場合は、テーブル構造を変更できます。

4.5.4 外部キー

上記の学生テーブルにはいくつか問題があります。

a) 変更は容易ではありません。例えば、教室が305教室に変更された場合、各生徒は

b) データの冗長性、大量の重複データ

次の図に示すように、テーブルを 2 つに分割して問題を解決します。

ここでのクラス番号は外部キーであり、空にすることもできますが、空でない場合は、その値が参照先のテーブルに存在する必要があります。学生テーブル内の番号が主キーである場合、ここで繰り返すことはできませんが、外部キーは繰り返すことができ、空にすることができます。

外部キーを追加します。

授業スケジュール:

生徒テーブル:

外部キーを追加します。

削除および更新時に、連鎖更新および連鎖削除を実現できます。更新を CASCADE に設定すると、主キーが変更され、主キーを参照するテーブルも変更されます。削除を CASCADE に設定すると、主キー テーブルが削除され、参照されているレコードが削除されます。

4.5.5 ユニークキー

ユニーク キー (ユニーク制約とも呼ばれます) は、複数のユニーク キーが存在する可能性があり、値が NULL になる可能性があるという点で主キーとは異なりますが、NULL を繰り返すことはできないため、1 つの行のみが NULL 値を持つことができます。暗黙的に一意のインデックスが作成されます。

設定方法: インデックス -> インデックスの追加 -> フィールド名に一意制約を設定する列を追加 -> インデックスの種類として一意を選択

#クエリ yuangong から id、name を選択

yuangongから*を選択

給与が5000を超える元宮から*を選択

# yuangong(name,salary,bumenId,mobile) に INSERT を追加します。 value('张为剑',2190.6,2,19889007867);

INSERT into yuangong(name,salary,bumenId,mobile) value('张娜拉',9871.6,1,19889007777);


#変更 update yuangong set salary=salary+1 where id=7

#deleteINSERT into yuangong(name,salary,bumenId,mobile) value('张拉拉',9871.6,1,19889007777);

ID=8 の yuangong から削除

4.6. コンピュータの練習

1. HRという新しいデータベースを作成し、HRデータベースにEMPテーブルを追加します。EMPテーブルのテーブル構造は次のとおりです。

EMP フォーム: 従業員情報

名前

タイプ

説明する

1

従業員

整数

従業員ID、主キー、自動増分

2

ENAME

可変長文字(10)

従業員の名前、10文字、空ではない、一意のキー

3

仕事

可変長文字(9)

従業員の立場

4

MGR

整数

従業員に対応するリーダー番号。リーダーは従業員でもあります。空にすることができます (この列は削除できます)

5

採用日

タイムスタンプ

従業員の雇用日。デフォルトでは現在の日付になります。

6

セール

数値(7,2)

基本給は小数点以下2桁、整数5桁の合計7桁

7

通信

数値(7,2)

ボーナス、コミッション

8

部門

整数

従業員の部門番号(オプション)、外部キー f​​k_deptno

9

詳細

文章

メモ(オプション)

部門: 部門テーブル

名前

タイプ

説明する

1

部門番号

整数

部門番号、主キー、自動増分

2

名前

可変長文字(10)

部門名、50文字、空ではない、一意のキー

3

DTel

可変長文字(10)

電話、利用可能

2. 上記のテーブル構造に従ってテーブルの作成を完了します。テーブル名はempです。

3. テーブルに5つ以上のデータを追加する

4. 次のクエリ要件を完了します

4.1 すべての従業員情報を照会する

4.2 給与が2000~5000ドルの全従業員の名前、役職、給与を照会する

4.3 姓が「Zhang」であるすべての従業員を照会する

4.4 2014年から2015年の間に入社した従業員を給与の高い順に照会する

4.5. 賃金を20%引き上げる

4.6. 給与3,000人民元未満の従業員のボーナスを給与の2.8倍に変更する

4.7. ID 5または姓が「Wang」の従業員を削除します。

5. SQLを使用してMySQLデータベースにアクセスする

5.0、学生テーブルStuを定義する

(ID番号、名前、性別、年齢、...)

5.0.1. 新しいデータベースを作成する

5.0.2、新しいテーブルを作成する

5.0.3. 新しいクエリを作成する

5.1. データを追加する

挿入ステートメントは、データベース テーブルに 1 行以上のデータを挿入するために使用できます。使用される一般的な形式は次のとおりです。

テーブル名(フィールドリスト)値(値リスト)に挿入します。

insert [into] テーブル名 [(列名 1, 列名 2, 列名 3, ...)] 値 (値 1, 値 2, 値 3, ...);

学生の値に挿入します(NULL, "张三", "男", 20, "18889009876");

データの一部のみを挿入する必要がある場合や、列の順序を無視して挿入する必要がある場合は、次のフォームを使用して挿入できます。

学生名、性別、年齢に値("李四", "女", 21)を挿入します。

#1. データを追加します。 insert into stu(name,sex,age) values('Jacky Cheung','male',18);
insert into stu(name,sex,age) values('张娜拉','女',73);
insert into stu(name,sex,age) values('张家辉','男',23);
insert into stu(name,sex,age) values('张慧美','女',85);
insert into stu(name,sex,age) values('张铁林','男',35);

5.2 クエリデータ

SELECT ステートメントは、特定のクエリ ルールに従ってデータベースからデータを取得するためによく使用されます。基本的な使用法は次のとおりです。

テーブル名からフィールド名を選択 [クエリ条件];

学生テーブル内のすべての情報を照会します: select * from students;

学生テーブル内のすべての名前と年齢情報を照会します。select name, age from students;

ワイルドカード * を使用して、テーブル内のすべてのコンテンツをクエリすることもできます。ステートメント: select * from students;

#1、データを追加します。 insert into stu(name,sex,age) values('Jacky Cheung','Male',18);
insert into stu(name,sex,age) values('张娜拉','女',73);
insert into stu(name,sex,age) values('张家辉','男',23);
insert into stu(name,sex,age) values('张慧美','女',85);
insert into stu(name,sex,age) values('张铁林','男',35);

insert into stu(name,sex,age) values('张国立','男',99);

#2. データのクエリ #2.1. すべての学生をクエリします select id,name,sex,age from stu;

#2.2、80歳以上の女子学生を照会する select id,name,sex,age from stu where age>80 and sex='female';

結果:

5.2.1. 式と条件付きクエリ

where キーワードは、クエリ条件を指定するために使用されます。使用形式は次のとおりです: select column name from table name where condition;

たとえば、女性の性別に関するすべての情報を照会するには、次のクエリ ステートメントを入力します: select * from students where sex="female";

where 句は、名前が値と等しい「where 列名 = 値」のクエリ形式をサポートするだけでなく、=、>、<、>=、<、!= などの一般的な比較演算子や、is [not] null、in、like などの拡張演算子もサポートします。 また、 or と and を使用してクエリ条件を組み合わせることもできます。より高度な条件付きクエリ方法については今後学習するので、ここでは紹介しません。

例:

21 歳以上の人のすべての情報を照会します。年齢が 21 歳を超える学生から * を選択します。

名前に「王」が含まれる人のすべての情報を照会します。select * from students where name like "%王%";

ID が 5 未満で、年齢が 20 を超える人のすべての情報を照会します。select * from students where id<5 and age>20;

5.2.2 集計関数

生徒の総数を取得する: 生徒からcount(*)を選択します

生徒の平均点数を取得します。生徒からavg(mark)を選択します。

最高得点を獲得する: 生徒からmax(mark)を選択

最低スコアを取得: 生徒からmin(mark)を選択

生徒の合計得点を取得します。生徒から合計(点数)を選択します。

5.3. データの削除

テーブル名から削除 [削除条件];

テーブル内のすべてのデータを削除します: 学生から削除します。

ID 10で行を削除:ID = 10の学生から削除します。

88歳未満のすべてのデータを削除:88歳未満の学生から削除します。

#1データ----

Stu(名前、性別、年齢)の値に挿入(「Jacky Cheung」、「Male」、18);
STU(名前、性別、年齢)の値に挿入( '张娜拉'、 '女'、73);
STU(名前、性別、年齢)の値に挿入( '张家辉'、 '男'、23)​​;
Stu(名前、性別、年齢)の値に挿入( '张慧美'、 '女'、85);
STU(名前、性別、年齢)の値に挿入( '张铁林'、 '男'、35);
STU(名前、性別、年齢)値に挿入( '张国立'、 '男'、99);

#2。

#2.1Aすべての学生がSTUからID、名前、性別、年齢を選択します。

#2.2は、80歳以上の女子学生をクエリします。

#2.3は、STUから平均年齢を選択する平均年齢を選択します。

#3。
#3.1、学生IDの年齢1 x 1アップデートSTU SET AGE = AGE+1ここでID = 1;

#3.2。
#concat(str1、str2、...)concatenate string update stu set age = 90、name = concat(name、 '(ald man)')age> = 80およびsex = 'female';

#3.3、学生No. 4の名前をZhang Huimei Update Stu set name = 'Zhang Huimei' where id = 4;

#4削除---
#4.1、 70歳以上の生徒を削除して、70歳以上のSTUから削除します。

#4.2、STUからすべての生徒を削除します。

5.4データ

更新ステートメントを使用して、テーブルのデータを変更できます。

更新テーブル名設定列名=新しい値が更新されます。

テーブル名の更新フィールド=値リスト更新条件

使用例:

ID 5の携帯電話番号をデフォルトに変更します " - ":uspated dustitent set tel = default where id = 5;

全員の年齢を1倍にする:学生を更新する年齢=年齢+1;

携帯電話番号13723887766を使用して学生の名前を「Zhang Guo」に変更し、19歳までの年齢に変更します。

5.5テーブルを変更します

Alter Tableステートメントは、テーブルが作成された後に使用されます。

5.5.1列を追加します

基本フォーム:テーブル名を変更する列名列データ型[挿入位置の後];

例:

テーブルの端にアドレス列を追加します。テーブルの学生を変更すると、アドレスchar(60)を追加します。

年齢の後に誕生日の列を挿入します。

5.5.2列の基本的な形式を変更します。

例:

テーブルのTel列を電話に変更します。テーブルの学生を変更すると、電話char(12)デフォルト " - ";

名前列のデータ型をchar(9)に変更します。

5.5.3、列列の削除基本フォーム:Table Table Nameドロップ列名を変更します。

例:

年齢列を削除します:テーブルの学生ドロップ年齢を変更します。

5.5.4、テーブルの名前を変更しました。

例:

生徒のテーブルの名前を温度に変更します。

5.5.5、テーブルの削除の基本的な形式:テーブルテーブル名をドロップします。

例:生徒のテーブルを削除:テーブルの生徒をドロップします。

5.5.6データベースの削除の基本形式:データベース名をドロップします。

例:LCOAデータベースを削除:データベースLCOAをドロップします。

5.5.7 MySQLノート

/ * mysqlを開始 */
ネットスタートMySQL

/*サーバーから接続して切断*/
mysql -hアドレス-Pポート-U username-pパスワード/ *許可確認をスキップし、mysqlにログイン */
mysqld --skip-grant-tables
 - ルートパスワードを変更するパスワード暗号化機能パスワード()
mysql.userの更新パスワード=パスワード( 'root');

show processlist-現在のショー変数を実行しているスレッドを表示 -  

/ *データベース操作 */ ---------------------
 - 現在のデータベースを表示しますselect database();
 - 現在の時刻、ユーザー名、およびデータベースバージョンを表示しますselect now()、user()、version();
 - データベースの作成データベース[存在しない場合]データベース名データベースオプションデータベースオプション:
 文字セットcharset_name
 collat​​e collat​​ion_name
 - 既存のライブラリを表示データベースを表示[「パターン」など]
 - 現在のデータベース情報を表示するデータベースデータベース名を作成しますデータベースのオプション情報を変更するデータベースの変更データベースの名前の変更オプション情報 - データベースドロップデータベース[存在する場合]データベース名を削除して、Directoryとそのディレクトリコンテンツを削除します / *テーブル操作 * / -----------------
 - テーブルの作成[一時的なテーブルを作成] [存在しない場合] [データベース名]テーブル名(テーブル構造定義)[テーブルオプション]
 各フィールドには、フィールドが終了すると、テーブルが自動的に消えることはありません。
 フィールド名データ型[null |] [default_value] [auto_increment] [key] |
 - テーブルオプション - 文字セットcharset = charset_name
 テーブルが設定されていない場合、データベース文字セットが使用されます-Storage Engine = Engine_Name 
 テーブルは、さまざまな構造を管理するときに異なるデータ構造を使用します。
 異なるエンジンは、テーブルの構造とテーブルファイルを保存します。
  - インデックスファイルディレクトリindexディレクトリ= 'ディレクトリ'
  - テーブルコメントコメント= '文字列'
  - パーティションオプションパーティション...(詳細についてはマニュアルを参照)
 - すべてのテーブルを表示するテーブルを表示[「パターン」のように]
 テーブル名からテーブルを表示 - テーブル構造を表示するテーブル名の作成(詳細情報)
 DESCテーブル名/テーブル名の説明/テーブル名の説明テーブル名[「パターン」のような]
 テーブルステータスを表示[db_nameから] [「パターン」のように]
 - テーブルの変更 - テーブル自体の変更テーブル名を変更するオプションEG:Table Table Name Engine = myisamを変更します。
  - テーブルの名前を変更して、元のテーブル名を新しいテーブル名に名前を変更しました。
 -NAME CAN 2つのテーブル名を交換できます - テーブルのフィールドメカニズムを変更するテーブルテーブル名の操作名 - 操作名の操作名[列]フィールド名の追加 - フィールド名の追加 - フィールド名の後に最初に追加 - 最初の追加のプライマリキー(フィールド名)を追加することを示します - 一意の追加[インデックス名](フィールド名](フィールド名) - 一意のインデックス[インデックス名](フィールド追加インデックスの作成) 
 ドロップ[列]フィールド名 - ディレートフィールド修正[列]フィールド名フィールド属性 - フィールド属性のサポートの修正、およびフィールド名を変更できません(すべての元の属性も記述する必要があります)
 変更[列]オリジナルフィールド名新しいフィールド名フィールド属性属性フィールド名ドロッププライマリキーの変更 - プライマリキーを削除します(プライマリキーの削除の前に、削除する必要があります)
 ドロップインデックス名delete index drop fortion key foreign key-delete fortion key-deleteテーブルドロップテーブル[存在する場合]テーブル名...
 - クリアテーブルデータの切り捨て[テーブル]テーブル名 - コピーテーブル構造テーブル名を作成するテーブル名のようなコピーするテーブル名とデータコピーテーブル構造とデータテーブル名を作成します[as] select * from table name from table name from copeed-エラーを確認するテーブルをチェックしてくださいtbl_name [、tbl_name] ... [オプション] ...
 - 最適化の最適化
 - テーブル修理[ローカル| no_write_to_binlog]テーブルtbl_name [、tbl_name] ... [extended] [use_frm]
 - 分析テーブル分析[local | no_write_to_binlog]テーブルtbl_name [、tbl_name] ...



/*データ操作*/ ---------------------------
-[(フィールドリスト)]値(値リスト)[、(値リスト)、...
  - 挿入する値リストにすべてのフィールドが含まれ、同じ順序である場合、フィールドリストを省略できます。
  - 複数のデータレコードを同時に挿入できます!
 交換は挿入とまったく同じで、交換可能です。
 [Into]テーブル名設定フィールド名=値[、フィールド名=値、...]
 - テーブル名[その他の条項]から[フィールドリスト]を選択してください
  - 複数のテーブルから来ることができる複数のフィールド - 他の条項なしで使用できます - フィールドリストは *すべてのフィールドを表すために *に置き換えることができます - テーブル名から削除削除[削除条件句]
 条件条項なしでは、すべてが削除されます - 更新テーブル名の変更セットフィールド名= new値[、フィールド名= new値] [条件を更新]

/*文字セットエンコード*/ --------------------------------
 - エンコードはMySQL、データベース、テーブル、およびフィールドに設定できます -  dataエンコードは、「character_set_%」のようなクライアントエンコードと一致する必要はありませんODING SET変数名=変数値SET CHARICAL_SET_CLIENT = GBK;
 文字セット結果 = gbk を設定します。
 set character_set_connection = gbk;
名前gbk;  - 上記の3つの設定を完了するのに相当 - プルーフセットは、show show charset [like 'pattern'のように] show show show show show collat​​ions [like 'partune set charset cathares set ending ending catharpering ecoding ending setting/ * necoding setting/view set
1。数値タイプ-------
 タイプバイト範囲(署名されたビット)
 tinyint 1 byte-128〜127 unsignedビット:0〜255
 Smallint 2バイト-32768〜32767
 Mediumt 3 Bytes-8388608〜8388607
 int 4バイトBigint 8バイトInt(m)mは数字の総数を表します - デフォルトでは符号ビットが存在します、符号なし属性の変更 - 表示幅を表示します。フィールドを定義するときに特定の数字を設定するには十分ではありません。
  - 要件が満たされると、小さいほど良い。
 -1はブール値が真であることを意味し、0はブール値がfalseであることを意味します。 MySQLにはブールタイプがなく、Integers 0および1で表されます。 Tinyint(1)は、一般的にブール型を表すために使用されます。

-b。
 タイプバイトレンジフロート(単一精度)4バイトダブル(ダブル精度)8バイトフローティングポイントタイプは、シンボルビット符号なし属性と表示幅Zerofill属性の両方をサポートします。
 整数とは異なり、0は前後に入力されます。
 フローティングポイントタイプを定義するときは、数字と小数点の総数を指定する必要があります。
 フロート(M、D)ダブル(M、D)
 mは数字の総数を表し、dは小数点以下の場所の数を表します。
 mとdのサイズは、浮動小数点数の範囲を決定します。整数の固定範囲とは異なります。
 mは、数字の総数(小数点と正の兆候を除く)と表示幅(すべてのディスプレイシンボルが含まれています)を表します。
 科学表記の表現をサポートします。
 浮動小数点数は、おおよその値を表します。

 -  c。
 小数 -可変長小数(m、d)mは数字の総数も表し、dは小数点の数を表します。
 浮動小数点数の丸めとは異なり、データ変更なしで正確な値を保存します。
 浮動小数点数を文字列に変換して保存し、9桁ごとに4バイトに保存します。

2。文字列タイプ -  a、varchar ------
 CHARは固定長さの文字列ですが、無駄なスペースですVARCHARは可変的な長さの文字列ですが、Space Mは、この長さを保存できる最大の長さを表します。
 異なるエンコーディングは異なるスペースを占めています。
 チャーは、最大255文字で、エンコーディングとは何の関係もありません。
 65535文字までのVarcharは、エンコードに関連しています。
 有効なレコードは、最大で65535バイトを超えることはできません。
 UTF8は、最大21844文字を持ち、最大32766文字、LATIN1は65532文字の長さを使用する必要があります。
 Varcharの最大有効長は、最大線サイズと使用される文字セットによって決定されます。
 最大有効長は65532バイトです。なぜなら、Varcharが文字列を保存すると、最初のバイトが空で、文字列の長さを保存するために2つのバイトが必要であるため、有効な長さは64432-1-2 = 65532バイトです。
 例:テーブルがテーブルTBの作成として定義されている場合、C1 INT、C2 CHAR(30)、C3 VARCHAR(N))charset = utf8; 回答:(65535-1-2-4-30*3)/3

-b。テキスト-------
 BLOBバイナリ文字列(バイト文字列)
 tinyblob、blob、mediumblob、longblob
 テキスト非バイナリ文字列(文字文字列)
 tinytext、テキスト、中テキスト、ロングテキスト
 テキストを定義する場合、長さを定義する必要も、総長さも計算しません。
 テキストタイプを定義する場合、デフォルト値を指定できません -  c。
 CharやVarcharと同様に、バイナリ文字列を保存するために使用されます。つまり、文字文字列ではなくバイト文字列を保存します。
 char、varchar、テキストはバイナリ、varbinary、blobに対応しています。

3.日付と時刻のタイプは、通常、タイムスタンプを保存するために整数を使用してタイムスタンプを保存します。これは、PHPが便利にタイムスタンプをフォーマットできるためです。
 DateTime 8バイト日付と時刻1000-01-01 00:00:00から9999-12-31 23:59:59
 日付3バイト日付1000-01-01〜9999-12-31
 タイムスタンプ4バイトタイムスタンプ19700101000000〜2038-01-19 03:14:07
 時間3バイト時間-838:59:59〜838:59:59
 1年1バイト年1901年から2155年
 
DateTime「yyyy-mm-dd HH:mm:ss」
タイムスタンプ「YY-MM-DD HH:MM:SS」
 「yyyymmddhhmmss」
 「yymmddhhmmss」
 yyyymmddhhmmss
 yymmddhhmmss
日付「yyyy-mm-dd」
 「YY-MM-DD」
 「yyyymmdd」
 「Yymmdd」
 yyyymmdd
 yymmdd
時間「HH:MM:SS」
 「hhmmss」
 hhmmss
年「yyyy」
 「YY」
 ええ
 ええ

4。列挙とコレクション - 列挙-------
enum(val1、val2、val3 ...)
 既知の値でラジオを選択します。最大数は65535です。
 列挙値を保存すると、2バイトの整数(SmallLint)として保存されます。各列挙値は、保存された位置の順序で1つずつ増加します。
 文字列型として表されますが、ストレージは整数です。
 null値のインデックスはnullです。
 空の文字列エラー値のインデックス値は0です。

 -  セット  -  -  -  - -
set(val1、val2、val3 ...)
 [テーブル]タブ(性別セット( 'male'、 'female'、 'non'));
 タブ値に挿入( '男性、女性');
 最大64人の異なるメンバーがいる場合があります。合計8バイトでBigintに保存されます。ビット操作の形をとってください。
 テーブルを作成すると、セットメンバー値のテールスペースが自動的に削除されます。

/* type*/を選択します
-PHP角度1。関数は2。小さなストレージスペースとより高い処理効率3。互換性の問題を検討 -  IPストレージ--------
1.保存するだけ、入手可能な文字列2。計算、ルックアップなどを計算する必要がある場合は、4バイトの署名のないINTとして保存できます。つまり、符号なし
 1)PHP関数変換IP2longは整数に変換できますが、シンボルを運ぶという問題があります。署名されていない整数としてフォーマットする必要があります。
 sprintf関数を使用して、文字列sprintf( "%u"、ip2long( '192.168.3.134'))をフォーマットします。
 次に、long2ipを使用して整数をIP文字列に戻します2)mysql関数変換(符号なし整数、符号なし)
 inet_aton( '127.0.0.1')IPを整数に変換INET_NTOA(2130706433)整数をIPに変換します
 



/ *列属性(列の制約) */ ---------------------------------
1.プライマリキー - レコードを一意に識別し、プライマリキーとして使用できるフィールド。
  - テーブルには1つの主キーのみがあります。
  - 一次キーには一意性があります。
  - フィールドを宣言するとき、それは主キーで識別されます。
 フィールドリストの後に例を宣言することもできます。テーブルタブの作成(ID int、stu varchar(10)、primary key(id));
  - プライマリキーフィールドの値はnullできません。
  - 一次キーは、複数のフィールドで構成できます。現時点では、フィールドリストの後に宣言された方法が必要です。
 例:テーブルタブの作成(ID INT、STU VARCHAR(10)、Age Int、Primary Key(Stu、Age));

2。一意の一意のインデックス(一意の制約)
 特定のフィールドの値を繰り返しできません。
 
3. NULL Constraint Nullはデータ型ではなく、列の属性です。
 現在の列がnullであるかどうかを示し、何もないことを示します。
 null、nullになることが許可されています。デフォルト。
 ヌルではなく、ヌルになることは許可されていません。
 タブ値に挿入(null、 'val');
  - これは、フィールドがnullの許可されているかどうかに応じて、最初のフィールドの値がnullに設定されることを意味します
 
4.デフォルトのデフォルト値属性現在のフィールドのデフォルト値。
 タブ値に挿入(デフォルト、 'val');
 [Table Timestamp default current_timestamp)を作成するテーブルタブ(add_timeタイムスタンプ);
  - 現在の時刻のタイムスタンプがデフォルト値に設定されていることを示します。
 current_date、current_time

5。auto_increment自動成長制約自動成長はインデックス付けする必要があります(プライマリキーまたはユニーク)
 自動成長のためのフィールドは1つしかありません。
 デフォルトは自動的に成長を開始する1です。テーブル属性auto_increment = xを介して設定するか、テーブルtbl auto_increment = xを変更できます。

6。コメントコメント例:テーブルタブの作成(ID int)コメント「コメントコンテンツ」;

7.外部のキー外部キーの制約は、マスターテーブルとスレーブテーブルのデータの整合性を制限するために使用されます。
 T1を変更する制約の追加 `T1_T2_FK`外部キー(T1_ID)参照T2(ID);
  - テーブルT1のT1_ID外部キーをテーブルT2のIDフィールドに関連付けます。
  - 各外部キーには、スレーブテーブル(チャイルドテーブル)と呼ばれる外部キーを含むテーブルを指定し、外部キー(親テーブル)と呼ばれるテーブルを指定できます。

 関数:データの一貫性と整合性を維持します。主な目的は、外部キーテーブル(表から)に保存されているデータを制御することです。

 MySQLでは、外部キーの制約をINNODBエンジンに使用できます。
 文法:
 外部キー(外部キーフィールド)参照メインテーブル名(関連フィールド)[アクションメインテーブルレコードが削除されたとき] [メインテーブルレコードが更新されたときのアクション]
 現時点では、プライマリテーブルの既存の値に制約する必要がある奴隷テーブルの外部キーを検出する必要があります。外部キーは、関連性がない場合はnullに設定できます。

 メインテーブルが記録されたときにアクションを指定することはできません。この時点でメインテーブルの操作が拒否されます。
 更新時または削除が指定されている場合:削除または更新する場合、選択する操作がいくつかあります。
 1。カスケード、カスケード操作。主要なテーブルデータが更新され(プライマリキー値が更新)、スレーブテーブルが更新されます(外部キー値が更新されます)。マスターテーブルレコードが削除され、スレーブテーブル関連のレコードも削除されます。
 2. nullを設定し、nullに設定します。主要なテーブルデータが更新され(プライマリキー値が更新されます)、スレーブテーブルの外部キーはnullに設定されます。マスターテーブルレコードが削除され、スレーブテーブル関連レコードの外部キーがnullに設定されています。ただし、null属性の制約なしでは、この外部キー列が必要であることに注意してください。
 3。親のテーブルの削除と更新を制限、拒否します。

 外部キーはInnoDBストレージエンジンによってのみサポートされていることに注意してください。他のエンジンはサポートされていません。


/*テーブルビルディング仕様*/ ------------------------------
  - 通常の形式、nf
  - 各テーブルには1つのエンティティ情報が保持されます - それぞれにプライマリキーとしてIDフィールドがあります -  IDプライマリキー +アトミックテーブル-1NF、最初の通常の形式フィールドは分割できないため、最初の通常の形式が満たされます。
 -2NF、2番目の通常のモデルが最初の通常のモデルを満たしているという前提で、部分依存関係は発生できません。
 部分的な依存関係を回避するために主要なキーを排除します。単一列キーワードを追加します。
 -3NF、3番目の通常モデルが2番目の通常モデルを満たしているという前提で、推移的依存関係は発生できません。
 フィールドは主キーに依存しますが、他のフィールドはフィールドに依存します。これは推移的な依存関係です。
 テーブル内のエンティティ情報のデータの実装。


/* select */ ------------------

[all | distible] select_expr from-> where-> [total function]  - > having-> order by> limit

a select_expr
  - すべてのフィールドは *で表すことができます。
 tbから *を選択します。
  - 式を使用できます(計算式、関数呼び出し、およびフィールドも式です)
 TBからStu、29+25、Now()を選択します。
  - 各列にエイリアスを使用できます。列の識別を簡素化し、複数の列識別子の重複を回避するのに適しています。
 -Asキーワードを使用するか、ASを省略します。
 TBからadd10としてStu+10を選択します。

b。クエリのソースを識別するために使用されます。
  - テーブルをエイリアスできます。 ASキーワードを使用します。
 tb1からtt、tb2としてtb1からbbを選択します。
  -  From句の後、複数のテーブルが同時に表示される可能性があります。
  - 複数のテーブルが水平に重ねられ、データがデカルト製品を形成します。
 tb1、tb2から *を選択します。

c。
 -integer 1はtrueを意味し、0はfalseを意味します。
  - 表現は、演算子とオペランドで構成されています。
  - オペレーター:変数(フィールド)、値、関数返品バリューオペレーター:
 =、<=>、<>、!=、<=、<、> =、>、!、&&、||、 
 in(not)null、(not)like、(not)in、(not)between、and、and、ol、on not、xor
 IS/IS Plus/false/不明値<=>関数は<>と同じです。
 グループ化後、ソートが実行されます。上昇:ASC、降順:DESC
 
 次の[合計関数]をグループで使用する必要があります。
 カウント異なる数の非ヌル値カウント(*)、count(field)を返します
 sum max最大値を見つける最小値AVG平均値group_concatを見つける最小値は、グループの非null値で文字列結果を返します。グループ内の文字列を連結します。

e。
 最初に検出データを実行する場所、元のデータをフィルタリングします。
 フィルター処理された結果を再度フィルタリングします。
 HANGフィールドをクエリする必要があり、データテーブルにフィールドが存在する必要があります。
 フィールドを使用できない場合、できることを持っています。 Where Codeを実行するときは、列値がまだ決定されないためです。
 全体の関数を使用できない場合。通常、あなたは持っている前に合計関数を使用する必要があります
 SQL標準では、グループ内の列の列を句または合計関数の列を参照する必要があります。

f句ごとに、ソートフィールド/エイリアスの並べ替え順序[、並べ替えフィールド/エイリアスソートメソッド] ...
 上昇:ASC、降順:DESC
 複数のフィールドの並べ替えをサポートします。

g。処理された結果はコレクションと見なされ、インデックスはレコードが表示される順序で0から始まります。
 開始位置を制限し、数字数を取得し、最初のパラメーターを省略し、インデックス0から始まることを示します。制限桁数hを取得します。
 複数の選択クエリの結果を結果セットに組み合わせます。
 選択...ユニオン[すべて|異なる]選択...
 デフォルトの異なる方法、つまり、すべての返された行が一意に推奨され、各選択クエリはブラケットで包まれています。
 順序を並べ替えるときは、組み合わせて制限を追加する必要があります。
 選択クエリごとに必要なフィールドの数は同じです。
 結果のフィールド名は最初の選択ステートメントの対象となるため、各選択クエリのフィールドリスト(番号、タイプ)は一貫している必要があります。


/* subquery*/ -----------------------------
  - サブクリーズはブラケットに包まれている必要があります。
 -  from type fromはテーブルであるために必要であり、サブクエリの結果にエイリアスを与えなければなりません。
  - 各クエリ内の条件を簡素化します。
  - タイプから、結果を生成するために一時テーブルを生成する必要があります。これは、元のテーブルのロックを解放するために使用できます。
 -SubQueryはテーブル、表現型のサブクエリを返します。
 select * from(select * from tb where id> 0)as subfrom where id> 1;
 - タイプ - サブクエリは値、スカラーサブクエリを返します。
  - サブクエリをエイリアスする必要はありません。
 -SubQueryのテーブルは、更新に直接使用できません。
 tbから * where money =(tbからmax(money)を選択);
  - 列のサブクエリサブクエリの結果が列を返した場合。
 存在するかどうかを使用して完全なクエリを使用し、存在しない条件ではない条件は、サブクエリがデータを返す場合、1または0を返します。一般的に条件を判断するために使用されます。
 存在するt1からcolumn1を選択します(t2から *を選択);
  - 行サブクエリクエリ条件は行です。
 [t1から(id、gender)in(select id、select from t2から)を選択します。
 ラインコンストラクター:( col1、col2、...)またはrow(col1、col2、...)
 行コンストラクターは通常、2つ以上の列を返すことができるサブQuerieを比較するために使用されます。

  - 特別なオペレーター!= all()は、notに相当します
 = some()はinと同等です。いずれかのエイリアス!= some()は、そのうちの1つに等しくなく、そのうちの1つに等しくありません。
 すべて、一部は他の演算子と一緒に使用できます。


/ *クエリに参加 */ -----------------------------
 複数のテーブルからフィールドに参加し、接続条件を指定します。
 - インナー結合
  - デフォルトは内部接続であり、内側は省略できます。
  - 接続は、データが存在する場合にのみ送信できます。つまり、接続の結果には空白線を持つことはできません。
 上に接続条件を表します。その条件付き式は、どこに似ています。条件も省略できます(条件が常に真実であることを意味します)
 接続条件を表す場所を使用することもできます。
 使用もありますが、フィールド名は同じでなければなりません。使用(フィールド名)

  - クロス接続クロス結合
 つまり、条件付き内部接続はありません。
 TB1 Cross結合TB2から *を選択します。
 - 外側の結合
  - データが存在しない場合、接続結果にも表示されます。
  - 左結合
 データが存在しない場合、左のテーブルのレコードが表示され、右のテーブルがnullが満たされています - 右の結合
 データが存在しない場合、右のテーブルのレコードが表示されますが、左のテーブルがnullで満たされています - 自然結合
 接続条件を自動的に決定し、接続を完了します。
 使用を省略することと同等であり、同じフィールド名が自動的に検索されます。
 自然結合
 自然な左結合
 自然な右結合

info.id、info.name、info.stu_num、extra_info.hobby、extra_info.sex from info、extra_info where info.stu_num = extra_info.stu_id;

/*インポートとエクスポート*/ -----------------------------------
テーブル名[コントロール形式]を選択します。 「\\」によって逃げられた ''
 「文字列」によって終了しました - 「char」によって囲まれた終了 - 「char」によって逃げられたパッケージ - 逃げた - 例:
 outfile '/tmp/result.text'にa、b、a+bを選択します
 「によって終了したフィールド」、オプションで囲まれた '""
 '\n' で終了する行
 test_table から;
ラインコントロールライン形式のデフォルト:「\ n」で終了した行
 terminated by 'string' -- 終止/* insert */ ------------------
Selectステートメントによって取得されたデータは、挿入を使用して挿入できます。

列の仕様は省略でき、列の順序で表示されるすべてのフィールドに括弧内で値()を提供する必要があります。
 または、セット構文を使用します。
 tbl_nameをset field = value、...;に挿入します。

()、()、();の形で、一度に複数の値を使用できます。
 tbl_name values()、()、()に挿入します。

列値を指定すると、式を使用できます。
 tbl_name値に挿入(field_value、10+10、now());
特別な値のデフォルトを使用して、列がデフォルト値を使用することを示すことができます。
 tbl_name値に挿入(field_value、default);

クエリの結果は、挿入する値として渡すことができます。
 tbl_name selectに挿入...;

他の非プリマリーキー列の情報が、挿入された値でプライマリキー(または一意のインデックス)競合が発生したときに更新されることを指定できます。
 tbl_name値に挿入/set/select on duplicate key update field = value、…;

/* 消去 */  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - -
tbl_nameから削除[Where_definition] [Order by ...] [Rimit row_count]

条件に従って削除するレコードの最大数を削除します。制限

ソート条件によって削除できます。 +制限で注文します

マルチテーブル削除をサポートし、同様の結合構文を使用します。
表1から削除し、表2を使用して表2は操作条件を結合します。

/ * Truncate */ -----------------------------------
truncate [table] tbl_name
データの削除と再構成のテーブルの違いをクリアします。
1. Truncateはテーブルを削除してから作成することです。削除は1つずつ削除することです。 deleteには3がありません。Truncateは削除する数がわかりませんが、削除はそれを知っています。
4,當被用于帶分區的表時,truncate 會保留分區/* 備份與還原*/ ------------------
バックアップ、テーブル内のデータ構造とデータを保存します。
MySqldump指令を使用して完了します。

 - エクスポート1。テーブルのエクスポートmysqldump -u username -pパスワードライブラリ名表名>ファイル名(d:/a.sql)
2。複数のテーブルをエクスポートmysqldump -u username -pパスワードライブラリ名表1表2表3>ファイル名(d:/a.sql)
3。すべてのテーブルをエクスポートmysqldump -u username -pパスワードライブラリ名>ファイル名(d:/a.sql)
4。ライブラリのエクスポートmysqldump -u username -p password -bライブラリ名>ファイル名(d:/a.sql)

CAN -Wバックアップ条件を携帯する-IMPORT1。MySQLにログインするとき:
  source 備份文件2. 在不登錄的情況下mysql -u用戶名-p密碼庫名< 備份文件/* 視圖*/ ------------------
ビューとは:
 ビューは、クエリによって内容が定義される仮想テーブルです。実際のテーブルと同様に、ビューは名前付きの列とデータ行のセットで構成されます。ただし、ビューはデータベース内に格納されたデータ値のセットとしては存在しません。行と列のデータは、ビューを定義するクエリによって参照されるテーブルから取得され、ビューが参照されたときに動的に生成されます。
 ビューにはテーブル構造ファイルがありますが、データファイルは存在しません。
 ビューは、その中で参照される基になるテーブルに対するフィルターのように機能します。定義されたビューのフィルタリングは、現在または他のデータベースの1つ以上のテーブル、または他のビューからのものである場合があります。通過視圖進行查詢沒有任何限制,通過它們進行數據修改時的限制也很少。
 視圖是存儲在數據庫中的查詢的sql語句,它主要出于兩種原因:安全原因,視圖可以隱藏一些數據,如:社會保險基金表,可以用視圖只顯示姓名,地址,而不顯示社會保險號和工資數等,另一原因是可使復雜的查詢易于理解和使用。

-- 創建視圖CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement
 - 視圖名必須唯一,同時不能與表重名。
 - 視圖可以使用select語句查詢到的列名,也可以自己指定相應的列名。
 - 可以指定視圖執行的算法,通過ALGORITHM指定。
 - column_list如果存在,則數目必須等于SELECT語句檢索的列數-- 查看結構SHOW CREATE VIEW view_name 

-- 刪除視圖- 刪除視圖后,數據依然存在。
 - 可同時刪除多個視圖。
 DROP VIEW [IF EXISTS] view_name ...

-- 修改視圖結構- 一般不修改視圖,因為不是所有的更新視圖都會映射到表上。
 ALTER VIEW view_name [(column_list)] AS select_statement

-- 視圖作用1. 簡化業務邏輯2. 對客戶端隱藏真實的表結構-- 視圖算法(ALGORITHM)
 MERGE 合并將視圖的查詢語句,與外部查詢需要先合并再執行!
 TEMPTABLE 臨時表將視圖執行完畢后,形成臨時表,再做外層查詢!
 UNDEFINED 未定義(默認),指的是MySQL自主去選擇相應的算法。



/* 取引 */  -  -  -  -  -  -  -  -  -  -  - 
事務是指邏輯上的一組操作,組成這組操作的各個單元,要不全成功要不全失敗。 
 - 支持連續SQL的集體成功或集體撤銷。
 - 事務是數據庫在數據晚自習方面的一個功能。
 - 需要利用InnoDB 或BDB 存儲引擎,對自動提交的特性支持完成。
 - InnoDB被稱為事務安全型引擎。

-- 事務開啟START TRANSACTION; 或者BEGIN;
 開啟事務后,所有被執行的SQL語句均被認作當前事務內的SQL語句。
-- 事務提交COMMIT;
-- 事務回滾ROLLBACK;
 如果部分操作發生問題,映射到事務開啟前。

-- 事務的特性1. 原子性(Atomicity)
 事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生。
 2. 一貫性
 事務前后數據的完整性必須保持一致。
 - 事務開始和結束時,外部數據一致- 在整個事務過程中,操作是連續的3. 隔離性(Isolation)
 多個用戶并發訪問數據庫時,一個用戶的事務不能被其它用戶的事物所干擾,多個并發事務之間的數據要相互隔離。
 4. 耐久性
 一個事務一旦被提交,它對數據庫中的數據改變就是永久性的。

-- 事務的實現1. 要求是事務支持的表類型2. 執行一組相關的操作前開啟事務3. 整組操作完成后,都成功,則提交;如果存在失敗,選擇回滾,則會回到事務開始的備份點。

-- 事務的原理利用InnoDB的自動提交(autocommit)特性完成。
 普通的MySQL執行語句后,當前的數據提交操作均可被其他客戶端可見。
 而事務是暫時關閉“自動提交”機制,需要commit提交持久化數據操作。

-- 注意1. 數據定義語言(DDL)語句不能被回滾,比如創建或取消數據庫的語句,和創建、取消或更改表或存儲的子程序的語句。
 2. 事務不能被嵌套-- 保存點SAVEPOINT 保存點名稱-- 設置一個事務保存點ROLLBACK TO SAVEPOINT 保存點名稱-- 回滾到保存點RELEASE SAVEPOINT 保存點名稱-- 刪除保存點-- InnoDB自動提交特性設置SET autocommit = 0|1; 0表示關閉自動提交,1表示開啟自動提交。
 - 如果關閉了,那普通操作的結果對其他客戶端也不可見,需要commit提交后才能持久化數據操作。
 - 也可以關閉自動提交來開啟事務。但與START TRANSACTION不同的是,
 SET autocommit是永久改變服務器的設置,直到下次再次修改該設置。(針對當前連接)
 而START TRANSACTION記錄開啟前的狀態,而一旦事務提交或回滾后就需要再次開啟事務。(針對當前事務)


/* 鎖表*/
表鎖定只用于防止其它客戶端進行不正當地讀取和寫入MyISAM 支持表鎖,InnoDB 支持行鎖-- 鎖定LOCK TABLES tbl_name [AS alias]
-- 解鎖UNLOCK TABLES


/* 觸發器*/ ------------------
 觸發程序是與表有關的命名數據庫對象,當該表出現特定事件時,將激活該對象監聽:記錄的增加、修改、刪除。

-- 創建觸發器CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt
 パラメータ:
 trigger_time是觸發程序的動作時間。它可以是before 或after,以指明觸發程序是在激活它的語句之前或之后觸發。
 trigger_event指明了激活觸發程序的語句的類型INSERT:將新行插入表時激活觸發程序UPDATE:更改某一行時激活觸發程序DELETE:從表中刪除某一行時激活觸發程序tbl_name:監聽的表,必須是永久性的表,不能將觸發程序與TEMPORARY表或視圖關聯起來。
 trigger_stmt:當觸發程序激活時執行的語句。執行多個語句,可使用BEGIN...END復合語句結構-- 刪除DROP TRIGGER [schema_name.]trigger_name

可以使用old和new代替舊的和新的數據更新操作,更新前是old,更新后是new.
 刪除操作,只有old.
 增加操作,只有new.

-- 注意1. 對于具有相同觸發程序動作時間和事件的給定表,不能有兩個觸發程序。


-- 字符連接函數concat(str1[, str2,...])

-- 分支語句if 條件then
 執行語句elseif 條件then
 執行語句else
 執行語句end if;

-- 修改最外層語句結束符delimiter 自定義結束符號SQL語句自定義結束符號delimiter ; -- 修改回原來的分號-- 語句塊包裹begin
 語句塊end

-- 特殊的執行1. 只要添加記錄,就會觸發程序。
2. Insert into on duplicate key update 語法會觸發:
 如果沒有重復記錄,會觸發before insert, after insert;
 如果有重復記錄并更新,會觸發before insert, before update, after update;
 如果有重復記錄但是沒有發生更新,則觸發before insert, before update
3. Replace 語法如果有記錄,則執行before insert, before delete, after delete, after insert


/* SQL編程*/ ------------------

--// 局部變量----------
-- 變量聲明declare var_name[,...] type [default value] 
 這個語句被用來聲明局部變量。要給變量提供一個默認值,請包含一個default子句。值可以被指定為一個表達式,不需要為一個常數。如果沒有default子句,初始值為null。 

-- 賦值使用set 和select into 語句為變量賦值。

 - 注意:在函數內是可以使用全局變量(用戶自定義的變量)


--// 全局變量----------
-- 定義、賦值set 語句可以定義并為變量賦值。
set @var = value;
也可以使用select into語句為變量初始化并賦值。這樣要求select語句只能返回一行,但是可以是多個字段,就意味著同時為多個變量進行賦值,變量的數量需要與查詢的列數一致。
還可以把賦值語句看作一個表達式,通過select執行完成。此時為了避免=被當作關系運算符看待,使用:=代替。(set語句可以使用= 和:=)。
select @var:=20;
select @v1:=id, @v2=name from t1 limit 1;
select * from tbl_name where @var:=30;

select into 可以將表中查詢獲得的數據賦給變量。
 -| select max(height) into @max_height from tb;

-- 自定義變量名為了避免select語句中,用戶自定義的變量與系統標識符(通常是字段名)沖突,用戶自定義變量在變量名前使用@作為開始符號。
@var=10;

 - 變量被定義后,在整個會話周期都有效(登錄到退出)


--// 控制結構----------
-- if語句if search_condition then 
 ステートメントリスト 
[elseif search_condition then
 statement_list]
...
[それ以外
 statement_list]
終了の場合;

-- case語句CASE value WHEN [compare-value] THEN result
[WHEN [compare-value] THEN result ...]
[ELSE result]
終わり


-- while循環[begin_label:] while search_condition do
 ステートメントリスト
end while [end_label];

- 如果需要在循環內提前終止while循環,則需要使用標簽;標簽需要成對出現。

 -- 退出循環退出整個循環leave
 退出當前循環iterate
 通過退出的標簽決定退出哪個循環--// 內置函數----------
-- 數值函數abs(x) -- 絕對值abs(-10.9) = 10
format(x, d) -- 格式化千分位數值format(1234567.456, 2) = 1,234,567.46
ceil(x) -- 向上取整ceil(10.1) = 11
floor(x) -- 向下取整floor (10.1) = 10
round(x) -- 四舍五入去整mod(m, n) -- m%nm mod n 求余10%3=1
pi() -- 獲得圓周率pow(m, n) -- m^n
sqrt(x) -- 算術平方根rand() -- 隨機數truncate(x, d) -- 截取d位小數-- 時間日期函數now(), current_timestamp(); -- 當前日期時間current_date(); -- 當前日期current_time(); -- 當前時間date('yyyy-mm-dd hh:ii:ss'); -- 獲取日期部分time('yyyy-mm-dd hh:ii:ss'); -- 獲取時間部分date_format('yyyy-mm-dd hh:ii:ss', '%d %y %a %d %m %b %j'); -- 格式化時間unix_timestamp(); -- 獲得unix時間戳from_unixtime(); -- 從時間戳獲得時間-- 字符串函數length(string) -- string長度,字節char_length(string) -- string的字符個數substring(str, position [,length]) -- 從str的position開始,取length個字符replace(str ,search_str ,replace_str) -- 在str中用replace_str替換search_str
instr(string ,substring) -- 返回substring首次在string中出現的位置concat(string [,...]) -- 連接字串charset(str) -- 返回字串字符集lcase(string) -- 轉換成小寫left(string, length) -- 從string2中的左邊起取length個字符load_file(file_name) -- 從文件讀取內容locate(substring, string [,start_position]) -- 同instr,但可指定開始位置lpad(string, length, pad) -- 重復用pad加在string開頭,直到字串長度為length
ltrim(string) -- 去除前端空格repeat(string, count) -- 重復count次rpad(string, length, pad) --在str后用pad補充,直到長度為length
rtrim(string) -- 去除后端空格strcmp(string1 ,string2) -- 逐字符比較兩字串大小-- 流程函數case when [condition] then result [when [condition] then result ...] [else result] end 多分支if(expr1,expr2,expr3) 雙分支。

-- 聚合函數count()
和();
max();
min();
avg();
グループ連結()

-- 其他常用函數md5();
default();


--// 存儲函數,自定義函數----------
-- 新建CREATE FUNCTION function_name (參數列表) RETURNS 返回值類型函數體- 函數名,應該合法的標識符,并且不應該與已有的關鍵字沖突。
 - 一個函數應該屬于某個數據庫,可以使用db_name.funciton_name的形式執行當前函數所屬數據庫,否則為當前數據庫。
 - 參數部分,由"參數名"和"參數類型"組成。多個參數用逗號隔開。
 - 函數體由多條可用的mysql語句,流程控制,變量聲明等語句構成。
 - 多條語句應該使用begin...end 語句塊包含。
 - 一定要有return 返回值語句。

-- 刪除DROP FUNCTION [IF EXISTS] function_name;

-- 查看SHOW FUNCTION STATUS LIKE 'partten'
 SHOW CREATE FUNCTION function_name;

-- 修改ALTER FUNCTION function_name 函數選項--// 存儲過程,自定義功能----------
-- 定義存儲存儲過程是一段代碼(過程),存儲在數據庫中的sql組成。
一個存儲過程通常用于完成一段業務邏輯,例如報名,交班費,訂單入庫等。
而一個函數通常專注與某個功能,視為其他程序服務的,需要在其他語句中調用函數才可以,而存儲過程不能被其他調用,是自己執行通過call執行。

-- 創建CREATE PROCEDURE sp_name (參數列表)
 過程體參數列表:不同于函數的參數列表,需要指明參數類型IN,表示輸入型OUT,表示輸出型INOUT,表示混合型注意,沒有返回值。


/* 存儲過程*/ ------------------
存儲過程是一段可執行性代碼的集合。相比函數,更偏向于業務邏輯。
調用:CALL 過程名-- 注意- 沒有返回值。
- 只能單獨調用,不可夾雜在其他語句中-- 參數IN|OUT|INOUT 參數名數據類型IN 輸入:在調用過程中,將數據輸入到過程體內部的參數OUT 輸出:在調用過程中,將過程體處理完的結果返回到客戶端INOUT 輸入輸出:既可輸入,也可輸出-- 語法CREATE PROCEDURE 過程名(參數列表)
始める
 過程體END


/* ユーザーと権限の管理 */ ------------------
ユーザー情報テーブル: mysql.user
-- 権限をフラッシュする
-- 增加用戶CREATE USER 用戶名IDENTIFIED BY [PASSWORD] 密碼(字符串)
 - mysql データベースに対するグローバル CREATE USER 権限、または INSERT 権限を持っている必要があります。
 - ユーザーの作成のみ可能で、権限を付与することはできません。
 - ユーザー名、引用符に注意してください: 例: 'user_name'@'192.168.1.1'
 - パスワードも引用符で囲む必要があり、純粋な数字のパスワードも引用符で囲む必要があります - パスワードをプレーンテキストで指定するには、PASSWORD キーワードを省略します。 PASSWORD() 関数によって返されるハッシュ値としてパスワードを指定するには、キーワード PASSWORD を含めます。
-- 重命名用戶RENAME USER old_user TO new_user
-- 設置密碼SET PASSWORD = PASSWORD('密碼') -- 為當前用戶設置密碼SET PASSWORD FOR 用戶名= PASSWORD('密碼') -- 為指定用戶設置密碼-- 刪除用戶DROP USER 用戶名-- 分配權限/添加用戶GRANT 權限列表ON 表名TO 用戶名[IDENTIFIED BY [PASSWORD] 'password']
 - all privileges 表示所有權限- *.* 表示所有庫的所有表- 庫名.表名表示某庫下面的某表-- 查看權限SHOW GRANTS FOR 用戶名-- 查看當前用戶權限SHOW GRANTS; 或SHOW GRANTS FOR CURRENT_USER; 或SHOW GRANTS FOR CURRENT_USER();
-- 撤消權限REVOKE 權限列表ON 表名FROM 用戶名REVOKE ALL PRIVILEGES, GRANT OPTION FROM 用戶名-- 撤銷所有權限-- 權限層級-- 要使用GRANT或REVOKE,您必須擁有GRANT OPTION權限,并且您必須用于您正在授予或撤銷的權限。
全局層級:全局權限適用于一個給定服務器中的所有數據庫,mysql.user
 GRANT ALL ON *.* および REVOKE ALL ON *.* は、グローバル権限のみを付与および取り消します。
數據庫層級:數據庫權限適用于一個給定數據庫中的所有目標,mysql.db, mysql.host
 GRANT ALL ON db_name.* および REVOKE ALL ON db_name.* は、データベース権限のみを付与および取り消します。
表層級:表權限適用于一個給定表中的所有列,mysql.talbes_priv
 GRANT ALL ON db_name.tbl_name および REVOKE ALL ON db_name.tbl_name は、テーブル権限のみを付与および取り消します。
列層級:列權限適用于一個給定表中的單一列,mysql.columns_priv
 REVOKE を使用する場合は、付与される列と同じ列を指定する必要があります。
-- 権限リスト ALL [PRIVILEGES] -- GRANT OPTION ALTERを除くすべての単純な権限を設定します -- ALTER TABLEの使用を許可します
ALTER ROUTINE -- ストアド プロシージャを変更または削除します CREATE -- CREATE TABLE の使用を有効にします
CREATE ROUTINE -- ストアドルーチンを作成する CREATE TEMPORARY TABLES -- CREATE TEMPORARY TABLEの使用を許可する
CREATE USER - CREATE USER、DROP USER、RENAME USER、および REVOKE ALL PRIVILEGES の使用を有効にします。
CREATE VIEW -- CREATE VIEWの使用を許可します
DELETE -- DELETEの使用を許可します
DROP -- DROP TABLEの使用を許可します
EXECUTE -- ユーザーがストアド プロシージャを実行できるようにします。 FILE -- SELECT ... INTO OUTFILE および LOAD DATA INFILE の使用を許可します。
INDEX -- CREATE INDEX と DROP INDEX の使用を許可します
INSERT -- INSERTの使用を許可します
LOCK TABLES - SELECT 権限を持つテーブルに対して LOCK TABLES を使用できます。
PROCESS -- SHOW FULL PROCESSLIST の使用を有効にする
REFERENCES -- 実装されていません RELOAD -- FLUSH は許可されています
レプリケーション クライアント - ユーザーがスレーブ サーバーまたはマスター サーバーのアドレスを問い合わせることができます。レプリケーション スレーブ - レプリケーション スレーブ サーバー (マスター サーバーからバイナリ ログ イベントを読み取る)
SELECT -- SELECTの使用を許可する
SHOW DATABASES -- すべてのデータベースを表示します SHOW VIEW -- SHOW CREATE VIEWの使用を有効にします
SHUTDOWN -- mysqladmin シャットダウンの使用を許可する
SUPER - CHANGE MASTER、KILL、PURGE MASTER LOGS、SET GLOBAL ステートメント、および mysqladmin debug コマンドの使用を有効にします。max_connections に達した場合でも、接続 (1 回) できます。
UPDATE -- UPDATEの使用を許可する
USAGE -- 「権限なし」の同義語 GRANT OPTION -- 権限の付与を許可する /* テーブルメンテナンス */
-- テーブルのキーワード分布を分析して保存します。ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE テーブル名...
-- 1 つ以上のテーブルにエラーがないか確認します CHECK TABLE tbl_name [, tbl_name] ... [オプション] ...
オプション = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
-- データ ファイルをデフラグします OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...


/* 雜項*/ ------------------
1. 可用反引號(`)為標識符(庫名、表名、字段名、索引、別名)包裹,以避免與關鍵字重名!中文也可以作為標識符!
2. 每個庫目錄存在一個保存當前數據庫的選項文件db.opt。
3. 注釋:
 單行注釋# 注釋內容多行注釋/* 注釋內容*/
 單行注釋-- 注釋內容(標準SQL注釋風格,要求雙破折號后加一空格符(空格、TAB、換行等))
4. 模式通配符:
 _ 任意單個字符% 任意多個字符,甚至包括零字符單引號需要進行轉義\'
5. CMD命令行內的語句結束符可以為";", "\G", "\g",僅影響顯示結果。其他地方還是用分號結束。delimiter 可修改當前對話的語句結束符。
6. SQL對大小寫不敏感7. 清除已有語句:\c

5.5.8、常用的SQL

/*==============================================================*/
/* DBMS name: MySQL 5.0 */
/* Created on: 2017/3/5 10:29:05 */
/*==============================================================*/


drop table if exists Address;

drop table if exists ArticleComment;

drop table if exists ArticleType;

drop table if exists Articles;

drop table if exists DictSub;

drop table if exists DictTop;

drop table if exists OrderPdt;

drop table if exists Orders;

drop table if exists ProductComment;

drop table if exists Products;

drop table if exists Users;

/*==============================================================*/
/* Table: Address */
/*==============================================================*/
create table Address
(
 `AddressId` int not null auto_increment comment '收貨地址編號',
 `UserId` int not null comment '用戶編號',
 `Province` varchar(50) not null comment '省',
 `City` varchar(50) not null comment '市',
 `County` varchar(50) not null comment '縣/區',
 `Street` varchar(300) not null comment '詳細地址',
 `RevName` varchar(30) not null comment '收貨人姓名',
 `PostCode` varchar(20) comment '郵政編碼',
 `Mobile` varchar(50) not null comment '手機',
 `Phone` varchar(50) comment '電話',
 `IsDefault` bool comment '是否為默認地址',
 primary key (AddressId)
);

alter table Address comment '收貨地址';

/*==============================================================*/
/* Table: ArticleComment */
/*==============================================================*/
create table ArticleComment
(
 `ArticleCommentId` int not null auto_increment comment '文章評論編號',
 `ArticleId` int not null comment '文章編號',
 `UserId` int not null comment '用戶編號',
 `ArticleCommentContent` varchar(4000) not null comment '文章評論內容',
 `ArticleCommentDate` timestamp default CURRENT_TIMESTAMP comment '文章評論時間',
 `ArticleCommentState` int default 1 comment '狀態',
 `ArticleRemark` int comment '打分',
 `ArticleCommentReserver1` varchar(4000) comment '備用1',
 `ArticleCommentReserver2` varchar(4000) comment '備用2',
 primary key (ArticleCommentId)
);

alter table ArticleComment comment '文章評論';

/*==============================================================*/
/* Table: ArticleType */
/*==============================================================*/
create table ArticleType
(
 `ArticleTypeId` int not null auto_increment comment '文章欄目編號',
 `ArticleTypeName` varchar(200) comment '文章欄目名稱',
 `ArticleTypeState` int default 1 comment '狀態',
 `ArticleTypeDesc` varchar(4000) comment '文章欄目描述',
 `ArticleTypePicture` varchar(400) comment '文章欄目圖片',
 `ArticleTypeReserve1` varchar(4000) comment '備用1',
 `ArticleTypeReserve2` varchar(4000) comment '備用2',
 primary key (ArticleTypeId)
);

alter table ArticleType comment '文章欄目';

/*==============================================================*/
/* Table: Articles */
/*==============================================================*/
create table Articles
(
 `ArticleId` int not null auto_increment comment '文章編號',
 `ArticleTypeId` int not null comment '文章欄目編號',
 `ArticleTitle` varchar(400) not null comment '文章標題',
 `ArticleContent` text comment '文章內容',
 `ArticleDate` timestamp default CURRENT_TIMESTAMP comment '文章發布時間',
 `ArticleAuthor` varchar(200) comment '文章發布者',
 `ArticleFileName` varchar(100) comment '靜態文件名',
 `ArticleThumbNail` varchar(200) comment '縮略圖片',
 `ArticleAddition` varchar(200) comment '附件名稱',
 `ArticleLevel` int comment '顯示的優先級',
 `ArticleIsAllowComment` integer default 1 comment '是否允許評論',
 `ArticleState` int default 1 comment '狀態',
 `ArticleHotCount` int comment '點擊次數',
 `ArticleReserve1` varchar(4000) comment '備用1',
 `ArticleReserve2` varchar(4000) comment '備用2',
 `ArticleReserve3` numeric(8,0) comment '備用3',
 primary key (ArticleId)
);

alter table Articles comment '文章';

/*==============================================================*/
/* Table: DictSub */
/*==============================================================*/
create table DictSub
(
 `SubId` int not null auto_increment comment '子項編號',
 `DictId` int not null comment '字典編號',
 `SubName` varchar(200) not null comment '子項名稱',
 `SubDesc` varchar(4000) comment '子項描述',
 `SubReserve1` varchar(4000) comment '保留備用1',
 primary key (SubId)
);

alter table DictSub comment '字典子項';

/*==============================================================*/
/* Table: DictTop */
/*==============================================================*/
create table DictTop
(
 `DictId` int not null auto_increment comment '字典編號',
 `DictName` varchar(100) not null comment '字典名稱',
 `DictDesc` varchar(4000) comment '字典描述',
 `DictReserve1` varchar(4000) comment '保留備用',
 primary key (DictId)
);

alter table DictTop comment '字典';

/*==============================================================*/
/* Table: OrderPdt */
/*==============================================================*/
create table OrderPdt
(
 `OrderPdtId` int not null auto_increment comment '訂單商品編號',
 `Id` int not null comment '編號',
 `UserId` int not null comment '用戶編號',
 `OrderId` int comment '訂單號',
 `PdtAmount` int comment '訂購數量',
 `PdtPrice` decimal comment '單價',
 `PdtReserve1` varchar(2000) comment '備用1',
 `PdtReserve2` varchar(4000) comment '備用2',
 primary key (OrderPdtId)
);

alter table OrderPdt comment '訂單商品';

/*==============================================================*/
/* Table: Orders */
/*==============================================================*/
create table Orders
(
 `OrderId` int not null auto_increment comment '訂單號',
 `AddressId` int not null comment '收貨地址編號',
 `OrderState` int default 1 comment '訂單狀態',
 `ExpressNO` varchar(50) comment '快遞編號',
 `ExpressName` varchar(50) comment '快遞名稱',
 `PayMoney` decimal comment '應支付',
 `PayedMoney` decimal comment '已支付',
 `SendInfo` varchar(300) comment '發貨人信息',
 `BuyDate` timestamp default CURRENT_TIMESTAMP comment '下單時間',
 `PayDate` datetime comment '支付時間',
 `SendDate` datetime comment '發貨時間',
 `ReceivDate` datetime comment '收貨時間',
 `OrderMessage` varchar(4000) comment '附言',
 `UserId` integer comment '用戶編號',
 `OrderReserve1` varchar(4000) comment '備用1',
 `OrderReserve2` varchar(4000) comment '備用2',
 `OrderReserve3` decimal comment '備用3',
 primary key (OrderId)
);

alter table Orders comment '訂單';

/*==============================================================*/
/* Table: ProductComment */
/*==============================================================*/
create table ProductComment
(
 `ProductCommentId` int not null auto_increment comment '商品評論編號',
 `ProductId` int not null comment '商品編號',
 `UserId` int not null comment '用戶編號',
 `ProductCommentContent` varchar(4000) comment '商品評論內容',
 `ProductCommentDate` timestamp default CURRENT_TIMESTAMP comment '商品評論時間',
 `ProductCommentState` int comment '狀態',
 `ProductCommentRemark` int comment '打分',
 `ProductCommentReserve1` varchar(4000) comment '備用1',
 `ProductCommentReserve2` varchar(4000) comment '備用2',
 primary key (ProductCommentId)
);

alter table ProductComment comment '商品評論';

/*==============================================================*/
/* Table: Products */
/*==============================================================*/
create table Products
(
 `Id` int not null auto_increment comment '編號',
 `Name` varchar(200) not null comment '名稱',
 `SubIdColor` int not null comment '所屬顏色',
 `SubIdBrand` int not null comment '所屬品牌',
 `SubIdInlay` int not null comment '所屬鑲嵌',
 `SubIdMoral` int not null comment '所屬寓意',
 `SubIdMaterial` int not null comment '所屬種水',
 `SubIdTopLevel` int not null comment '一級分類編號',
 `MarketPrice` decimal comment '市場參考價',
 `MyPrice` decimal not null comment '玉源直銷價',
 `Discount` decimal default 1 comment '折扣',
 `Picture` varchar(200) comment '圖片',
 `Amount` int comment '庫存量',
 `Description` text comment '詳細描述',
 `State` int default 1 comment '狀態',
 `AddDate` timestamp default CURRENT_TIMESTAMP comment '上貨日期',
 `Hang` int comment '掛件',
 `RawStone` int comment '賭石',
 `Size` varchar(200) comment '尺寸',
 `ExpressageName` varchar(100) comment '快遞名稱',
 `Expressage` decimal comment '快遞費',
 `AllowComment` int default 1 comment '是否允許評論',
 `Reserve1` varchar(4000) comment '保留備用1',
 `Reserve2` varchar(4000) comment '保留備用2',
 `Reserve3` decimal(0) comment '保留備用3',
 primary key (Id)
);

alter table Products comment '商品';

/*==============================================================*/
/* Table: Users */
/*==============================================================*/
create table Users
(
 `UserId` int not null auto_increment comment '用戶編號',
 `UserName` varchar(200) not null comment '用戶名',
 `Password` varchar(512) not null comment '密碼',
 `Email` varchar(100) not null comment '郵箱',
 `Sex` varchar(10) comment '性別',
 `State` int default 1 comment '狀態',
 `RightCode` int comment '權限狀態',
 `RegDate` timestamp default CURRENT_TIMESTAMP comment '注冊時間',
 `RegIP` varchar(200) comment '注冊IP',
 `LastLoginDate` datetime comment '最近登錄時間',
 `UserReserve1` varchar(4000) comment '保留備用1',
 `UserReserve2` varchar(4000) comment '保留備用2',
 `UserReserve3` varchar(4000) comment '保留備用3',
 primary key (UserId)
);

alter table Users comment '用戶';

alter table Address add constraint FK_AddressBelongUser foreign key (UserId)
 references Users (UserId) on delete restrict on update restrict;

alter table ArticleComment add constraint FK_ArticleCommentForArticle foreign key (ArticleId)
 references Articles (ArticleId) on delete restrict on update restrict;

alter table ArticleComment add constraint FK_ArticleCommentForUser foreign key (UserId)
 references Users (UserId) on delete restrict on update restrict;

alter table Articles add constraint FK_ArticleBelongType foreign key (ArticleTypeId)
 references ArticleType (ArticleTypeId) on delete restrict on update restrict;

alter table DictSub add constraint FK_BelongDict foreign key (DictId)
 references DictTop (DictId) on delete cascade on update cascade;

alter table OrderPdt add constraint FK_BelongOrder foreign key (OrderId)
 references Orders (OrderId) on delete cascade on update cascade;

alter table OrderPdt add constraint FK_CartForUser foreign key (UserId)
 references Users (UserId) on delete restrict on update restrict;

alter table OrderPdt add constraint FK_OrderDepProduct foreign key (Id)
 references Products (Id) on delete restrict on update restrict;

alter table Orders add constraint FK_OrderBelongAddress foreign key (AddressId)
 references Address (AddressId) on delete restrict on update restrict;

alter table ProductComment add constraint FK_ProductCommentBelongUsers foreign key (UserId)
 references Users (UserId) on delete restrict on update restrict;

alter table ProductComment add constraint FK_ProductCommentForProduct foreign key (ProductId)
 references Products (Id) on delete restrict on update restrict;

alter table Products add constraint FK_BelongBrand foreign key (SubIdMaterial)
 references DictSub (SubId) on delete restrict on update restrict;

alter table Products add constraint FK_BelongColor foreign key (SubIdBrand)
 references DictSub (SubId) on delete restrict on update restrict;

alter table Products add constraint FK_BelongInlay foreign key (SubIdInlay)
 references DictSub (SubId) on delete restrict on update restrict;

alter table Products add constraint FK_BelongMaterial foreign key (SubIdColor)
 references DictSub (SubId) on delete restrict on update restrict;

alter table Products add constraint FK_BelongMoral foreign key (SubIdTopLevel)
 references DictSub (SubId) on delete restrict on update restrict;

alter table Products add constraint FK_BelongTopLevel foreign key (SubIdMoral)
 references DictSub (SubId) on delete restrict on update restrict;

六、下載程序、幫助、視頻

MySQL綠色版下載地址1:https://pan.baidu.com/s/1hrS5KUw 密碼: sug9

MySQL綠色版下載地址2:https://www.jb51.net/softs/594937.html

MySQL文檔下載1:https://pan.baidu.com/s/1nuGQo57 密碼: 898h

MySQL文檔下載2:https://www.jb51.net/books/11598.html

MySQL5.5.27_64位安裝包下載地址1: https://pan.baidu.com/s/1minwz1m 密碼: ispn

MySQL5.5.56_64位安裝包下載地址2: https://www.jb51.net/softs/363920.html

MySQL5.7.17安裝包官網下載地址: https://dev.mysql.com/downloads/windows/installer/

文檔中沒有您可以查幫助:

<<:  JavaScript コンソールのその他の機能

>>:  CentOS プラットフォーム上で LAMP 環境を素早く構築する方法

推薦する

Mysql | ワイルドカード(%、_ など)を使用したファジークエリの詳細な説明

ワイルドカードのカテゴリ: %パーセント ワイルドカード: 任意の文字が任意の回数出現できることを示...

HTML スクロールバーのテキストエリア属性の設定

1.オーバーフローコンテンツのオーバーフロー設定(設定されたオブジェクトにスクロールバーを表示するか...

MySQL の冗長インデックスと重複インデックスの詳細な説明

MySQL では、同じ列に複数のインデックスを作成できます。意図的であるかどうかにかかわらず、MyS...

MySQL でスロークエリログを有効にする方法

1.1 はじめにスロークエリログを有効にすると、MySQL は指定された時間を超えるクエリステートメ...

MySQL エラー: 接続数が多すぎる場合の解決策

MySQLデータベースの接続が多すぎますこのエラーは明らかに、mysql_connect の後に m...

Linux nohup コマンドの原理と例の分析

nohup コマンドUnix/Linux を使用する場合、通常はプログラムをバックグラウンドで実行す...

JavaScript の基本オブジェクト

目次1. オブジェクト1.1 オブジェクトとは何ですか? 1.2 なぜオブジェクトが必要なのか? 2...

Centos7 に DAMO データベースをインストールするチュートリアル

1. 準備Linux オペレーティング システムをインストールした後、ここで Linux 7 を選択...

div+cssとウェブ標準ページの利点

div 要素は、HTML ドキュメント内のブロックレベル コンテンツの構造と背景を提供するために使用...

Windows 10 での MySQL 8.0.20 のインストールと設定方法のグラフィック チュートリアル

Win10システムにMySQL8.0.20をローカルにインストールし、個人的にテストして利用可能であ...

CentOS7.4 に MySQL 5.7.26 をインストールするための詳細なチュートリアル

CentOS にはデフォルトで MariaDB がインストールされていますが、これは MySQL の...

Vue+ElementUI で超大規模なフォーム例を処理する方法

最近、社内の業務調整により、以前の超長文のロジックが大幅に変更されたため、リファクタリングする予定で...

jQuery+h5 で 9 マス抽選特殊効果を実現 (フロントエンドとバックエンドのコード)

序文:フロントエンド: jq+h5 で 9 グリッドのダイナミック効果を実現バックエンド: thin...

IDEA で Linux コマンドを使用する方法

Windows システムと比較して、Linux システムは多数の豊富なコマンドライン ツールを提供し...