#Author: Kearney
#Contents: DataBase System Theory
#Time: 2020
全文は3704語で、辛抱強く学ぶ方法です。アオリはそれを与える!
記事ディレクトリ
前書き
データベースのインストールと接続はこの記事の範囲を超えています。データベースのインストールと接続の方法を検索して習得してください。
この記事では、例としてMyQSLを使用します。理解のために、SQLステートメントの例のいくつかの関連ステートメントもリストされています。メインの関数ステートメントではありません。
MySQLのSQLステートメントはキーワードの大文字と小文字を区別しませんが、多くの開発者はキーワードを大文字にし、テーブル名とフィールド名に小文字を使用することを好みます。この習慣を身に付けると、後で作成するスクリプトの読み取りと保守が容易になります。 。
データベースを作成する
sqlステートメントは終了記号としてセミコロンを使用し、大文字と小文字は区別されません
mysql -u root -p #以root账户登录数据库,井号“#”后面的内容为注释
create database TestDb; #创建数据库,数据库名为 TestDb
show databases; #查看MySQL中已存在的数据库,参考语句
テーブルを作成する
use TestDb; #选中数据库 TestDb,表示接下来的操作在 TestDb中进行
#若不提前选中数据库而直接建表,则会报错ERROR 1046
create table user( #在 TestDb中创建表,表名为 user
id INT, #每个字段之间用英文逗号隔开
username VARCHAR(32),
password VARCHAR(32),
phone VARCHAR(11) #!!!这里是没有逗号的哟
);
#下面的内容仅供学习,不是建表必备操作
show tables; #查看当前数据库中存在的表
DESCRIBE user; #查看表user的结构,可以简写为 DESC user;
drop table user; #删除表,仅供参考,不得已不使用的命令
作成されたテーブルの構造は次のとおりです(Excelテーブルによく似ています)。
フィールド名 | データの種類 | 備考 |
---|---|---|
id | INT | ユーザーID |
ユーザー名 | VARCHAR(32) | ユーザー名 |
パスワード | VARCHAR(32) | パスワード |
電話 | VARCHAR(11) | 携帯番号 |
INTタイプは数値を格納し、VARCHAR()は文字タイプであり、括弧内の文字の最大長
主キー制約を追加します
主キー制約で(Primary Key Constraint)
は、主キー列のデータが一意であり、空にならないようにする必要があります。主キーは、IDと同様に、テーブル内の各レコードを一意に識別できます。
テーブルの主キーは、複数または単一にすることができます。
テーブルを作成するときに主キーを指定します
列を定義するときに主キーを指定します
create table user(
id INT primary key, #指定id为主键
username VARCHAR(32),
password VARCHAR(32),
phone VARCHAR(11)
);
すべての列を定義した後、主キーを指定します
create table user(
id INT ,
username VARCHAR(32),
password VARCHAR(32),
phone VARCHAR(11),
primary key(id)#指定id为主键
# primary key(id,username)#指定id和username为主键,不同字段之间用逗号隔开
);
テーブルの構造を変更して、主キーを指定します
alter table user add primary key (id); #此时id在表里面必须是第一列
外部キー制約
外部キー(外部キー)は、別のテーブルのプライマリキーです。データの一貫性と整合性を維持するために使用されます。
外部キータイプは、対応するプライマリキータイプで設定する必要があります。
削除するフィールドに外部キーが含まれている場合、削除は失敗してエラーが報告されるため、最初に外部キー制約を削除する必要があります。
CONSTRAINT 外键名 FOREIGN KEY 字段名 REFERENCES 主表名(主键名)
CREATE table t_class(
id INT PRIMARY KEY, #主键,班级id
NAME VARCHAR(22)
);
CREATE table t_student(
id INT PRIMARY KEY,
NAME VARCHAR(22),
classId INT, #为班级id添加外键
CONSTRAINT fk_stu_class1 FOREIGN KEY (classId) REFERENCES t_class(id)
); #外键名是任意的,外键在另一个表中必须是主键!!!
一般的な制約
create table t_user(
id int primary key auto_increment,
username varchar(32) not null unique,
sex varchar(4) DEFAULT '男'
);
フィールドに2つ以上の制約を追加するには、制約をスペースで区切ります。
一意の制約
一意の制約で(Unique Constraint)
は、列のデータが一意であり、空にすることができますが、null値は1つしか存在できません。一意の制約がある列にデータを入力すると、エラーが報告されます。
この制約を追加するときは、フィールド名の後にキーワードを追加するだけで済みます。 UNIQUE
主キーには固有の制約ハローが付属しており、電子メールや携帯電話番号など、他の非主キーでよく使用されます(一部の登録ページは自明です)
空でない制約
null以外の制約をフィールドに追加した後、データベースは、テーブルにデータを挿入するときにフィールドの入力が空かどうかを確認します。空の場合、データの挿入は失敗し、エラーが報告されます。実名認証の携帯電話番号など、一部の必須フィールドで一般的に使用されます
この制約を追加するときは、フィールド名の後にキーワードを追加するだけで済みます。NOT NULL
デフォルトの制約
一部のデータをデフォルト値にしたい場合があります。たとえば、学生のスコアシートの第2レベルのスコアは、デフォルトでP(手動犬の頭)であるため、コースを欠席した少数の学生のみを変更できます。
この制約を追加するときは、フィールド名の後にキーワードを追加するだけで済みます。 DEFAULT
- 文字列タイプのデフォルト値を追加する場合は、英語の一重引用符を使用してください
- 中国のデフォルト値を追加する場合は、追加する必要があります
DEFAULT CHARSET=utf8;
自動増加
これは、学生番号や仕事番号などの連続データなど、理解しやすいものです。
この制約を追加するときは、フィールド名の後にキーワードを追加するだけで済みますAUTO_INCREMENT
。デフォルトでは、初期値と増分は両方ともです。1
テーブル構造を表示
DESCRIBE
テーブルのフィールド情報を表示できます。これには、フィールド名、フィールドデータタイプ、プライマリキーであるかどうか、デフォルト値があるかどうかなどが含まれます。
NULL
:この列は、保存されたNULL
値かどうかを示します。Key
:列にインデックスが付けられているかどうかを示します。PRI
:列がこのテーブルの主キーの一部であることを示します。UNI
:列がUNIQUE
インデックスの一部であることを示します。MUL
:指定された値が列に複数回表示される可能性があることを示します。Default
:列にデフォルト値があるかどうかを示します。デフォルト値がある場合は、その値を示します。Extra
:取得できる特定の列に関連する追加情報を示します。
データテーブルの詳細な構造を表示する:テーブルの作成時に記述された詳細なステートメントを返すだけでなく、ストレージエンジンと文字のエンコードも表示できます。
SHOW CREATE TABLE 表名;
返される結果のレイアウトは少し面倒だと思います。追加すると\G
効果が向上しますSHOW CREATE TABLE 表名 \G;
テーブルの構造を変更する
テーブル名を変更する
ALTER TABLE 旧表名 RENAME 新表名;
フィールド名を変更する
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;
新しいデータタイプを空にすることはできません。!!以前と同じ場合もあれば、異なる場合もあります。
フィールドデータタイプの変更
ALTER TABLE 表名 MODIFY 字段名 数据类型;
フィールドを追加
ALTER TABLE 表名 ADD 新字段名 数据类型 [约束条件] [FIRST|AFTER] 已存在字段名;
[FIRST|AFTER]
位置を指定しない場合MySQL
、フィールドを追加すると、デフォルトで新しいフィールドがテーブルの最後の列に追加されます。
最初の列に新しいフィールドを追加する場合はFIRST
、位置の説明を作成するだけで済みます。特定の列の後に新しいフィールドを追加するように指定する場合はAFTER
、位置の説明を作成するだけで済みます。特定の列の前に指定すると、エラーが報告されます!!!
フィールドを削除
ALTER TABLE 表名 DROP 字段名;
フィールドの配置位置を変更する
ALTER TABLE 表名 MODIFY 字段1 数据类型 FIRST|AFTER 字段2;
FIRST
位置の説明のみを行うと、フィールド1が最初の列に転送されます。
テーブルの外部キー制約を削除します
ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名;
データを挿入
テーブルのすべてのフィールドのデータを挿入します
INSERT INTO 表名 (字段名) VALUES (内容);
複数のフィールドとコンテンツはコンマで区切られ、文字のコンテンツは1対の単一引用符で囲まれます。コンテンツは、指定されたフィールドの順序に対応している必要があります。フィールド名を入力しない場合は、対応するデータをテーブルのフィールド順に挿入してください。
複数のレコードを同時にテーブルに挿入します
INSERT INTO 表名 (字段名) VALUES (内容1),(内容2),(内容3);
表に指定されている内容を更新する
UPDATE 表名 SET 字段名1 = 内容1, 字段名2 = 内容2, 字段名3 = 内容3 WHERE 过滤条件;
フィールドの数は更新要件によって異なり、1回の更新が必要です。
テーブル内の指定された行を削除します
DELETE FROM 表名 WHERE 条件语句;
条件ステートメントは、何を削除するかを指定しますwhere 条件语句;
。省略した場合、すべての行が削除されます。
TRUNCATE TABLE 表名;
また、テーブル内のすべてのレコードを削除するために使用することもできます。ただし、DELETEとは異なり、TRUNCATE TABLEステートメントは、テーブルの内容ではなく、テーブルを直接削除します。削除後、テーブルが再作成されます。したがって、その実行速度はDELETEステートメントよりも高速になります。
お問い合わせ
SELECT 字段名1,字段名2 FROM 表名;
SELECT 字段名1,字段名2 FROM 表名 WHERE 条件语句;
複数のフィールド名はコンマで区切ります。すべてのフィールドを照会するには*
、すべてのフィールド名を置き換えます。whereは、クエリが必要なコンテンツをフィルタリングするために使用されます。
比較演算子
オペレーター | 説明 |
---|---|
>> | 以上 |
> = | 以上 |
= | 等しい |
!=または<> | 等しくない |
< | 未満 |
<= | 以下 |
に
SELECT 字段名 FROM 表名 WHERE 字段名 IN (n1,n2,n3,...);
SELECT 字段名 FROM 表名 WHERE 字段名 NOT IN (n1,n2,n3,...);
INは、クエリが必要なコンテンツをフィルタリングするために使用されます。括弧内の数字の場合は、INT
フォーマットである必要があります。実際、INの内容が小さい場合は、代わりにフィールド名= n1またはフィールド名= n1を使用できます。
との間
SELECT 字段名 FROM 表名 WHERE 字段名 BETWEEN n1 AND n2;
SELECT 字段名 FROM 表名 WHERE 字段名 NOT BETWEEN n1 AND n2;
クローズドインターバル:フィルタリング範囲にはn1とn2が含まれます。
お気に入り
ワイルドカード%
または_
ファジーマッチングデータコンテンツを使用する
パーセント記号のワイルドカード%
は、ゼロ文字を含む任意の長さの文字と一致できます。下線のワイルドカード_
は1个
、あいまいな文字(スペースも文字)にのみ一致でき、2つは互いに一致でき、位置は柔軟です。
SELECT 字段名 FROM 表名 WHERE 字段名 LIKE '字符%';·
SELECT 字段名 FROM 表名 WHERE 字段名 LIKE '字符_';
無効です
結果の特定のフィールドがnull値である/ではないという結果をフィルタリングしますNULL
。
SELECT 字段名 FROM 表名 WHERE 字段名 IS [NOT] NULL;
DISTINCT
選択した結果の重複行を削除します
SELECT DISTINCT 字段名 FROM 表名;
およびまたは
SELECT 字段名 FROM 表名 WHERE 表达式1 AND 表达式2 [AND/OR] 表达式3 ;
論理関係を使用して、さまざまなフィールドの複数のフィルター条件で結果をフィルター処理します(たとえば、170を超え、体重が140未満の私を見つけます)。使用するか、同じフィールドに複数の条件がある場合に使用することをお勧めします。
制限
クエリ結果の数を制限するために使用されます。
SELECT 字段名 FROM 表名 LIMIT [OFFSET,] 记录数;
パラメータの説明:
OFFSET
オプションのパラメータである最初のパラメータは、オフセットを示します。デフォルト値が指定されていない場合は0
、クエリ結果の最初のレコードから開始し、オフセットがの場合は、クエリ結果1
の2番目のレコードから開始することを意味します。 、 等々。- 2番目のパラメーターであるレコード数は、返されるクエリ結果の数を示します。
並べ替え
SELECT 字段名 FROM 表名 ORDER BY 字段名1 [ASC[DESC]];
フィールド名1に従って昇順(ASE)または降順(DESC)で表示しORDER BY 字段名1
ます。順序を指定しない場合のみ、デフォルトで昇順が使用されます。
グループクエリGROUPBY
クエリは、レコードが最初に表示される各グループです。
SELECT 字段名 FROM 表名 GROUP BY 字段名;
なので
クエリ結果のテーブルまたは列のエイリアスに使用されます
内部結合クエリ
- 2つのテーブルの結合条件を満たす行のみが結果セットとして結合されます。これは内部結合と呼ばれます。
- キーワード:
[inner] join ... on
表1 [inner] join 表2 on 表1.字段=表2.字段
表1から各レコードを取り出し、表2に移動して、すべてのレコードを照合します。照合は、特定の条件が表1と表2で同じである必要があり、結果は最終的に保持されます。そうでない場合、保持されません。innerキーワードは省略できます。onは接続条件を表します。条件フィールドは同じビジネス上の意味を表し、ほとんどの場合、2つのテーブルのプライマリキーと外部キーの関係です。
例:学生の対応するクラスの名前を照会します。クラスがない場合は見つかりません。
外部結合クエリ
- 特定のテーブルをメインテーブルとして、その中のすべてのレコードを取り出し、条件に一致するかどうかに関係なく、各テーブルを別のテーブルに接続すると、最終的には保持されます。正しく照合および予約できます。照合できない場合、他のテーブルのフィールドは空白(
null
)になります。これは外部結合と呼ばれます。 - 外部結合クエリは、左外部結合クエリと右外部結合クエリに分けられます。
表1 left/right [outer] join 表2 on 表1.字段=表2.字段
- 左外部結合:内部結合に基づいて、表1の条件を満たさないすべてのデータ行も含まれ、表2の列にNULLを入力します。右外部結合:内部結合に基づいて、表2も含まれます。条件を満たさないすべてのデータ行は、表1の列1でNULLで埋められます。
例:大学生の対応するコースの名前を照会する、コースを選択していないコースの結果がNULLである、またはコースを選択していない学生の結果がNULLである。
複合クエリ
上記を組み合わせます。。。一緒に操作することは虎のように激しいです。
サブクエリ
SELECTで選択した結果を別のSELECTのデータソースとして使用する
SELECT * FROM t1 WHERE col1=(SELECT col2 FROM t2);
サブクエリはクエリ内にネストされており、常に括弧内に表示する必要があります。サブクエリは次の4つのカテゴリに分類できます。
- Scalarサブクエリ:最も単純な形式である単一の値を持つスカラーを返します。
- Lieziクエリ:
N
1行目の結果セットを返します。 - 行サブクエリ:戻り結果セットは
N
列の行です。 - テーブルサブクエリ:返される結果セットは
N
OKN
列です。
キーワードサブクエリALLANY SOME IN
すべて
ALLは、比較演算子の後ろに接続する必要があり、サブクエリがすべての値を返すことを表します。比較がTRUE
返されTRUE
ます。通常、最大より大きく、最小より小さく見える場合に使用されます。
いくつか
ANY
比較演算子と組み合わせて使用すると、サブクエリによって返される値と比較したTRUE
ときに返されることを意味しTRUE
ます。SOME
はいANY
、エイリアスは一般的にあまり使用されません。多くの場合、最小よりも大きいものを見つけるために使用されます
に
IN
意味は、指定された値がこのセットに含まれているかどうかです。含まれている場合は返されTRUE
ます。含まれていない場合は、(item 、item 、...)FALSE
と同じように返されます。IN
1
2
IN
ある= ANY
別名、両方とも同じですが、NOT IN
別名ではありません<> ANY
けど<> SOME
。
関数
AVG平均
SELECT AVG(列名) FROM 表明;
エラー収集
エラー1046(3D000):データベースが選択されていません
データベースが選択されていません、 use 数据库名称