MySQL データベース - 基本の概要 (概要、SQL、関数、制約、複数テーブル クエリ、トランザクション)

目次

概要

コンセプト

MySQLの起動と停止

クライアント接続

リレーショナルデータベース(RDBMS)

SQL

データの種類

DDL

DML 

DQL

DCL 

関数

文字列関数

数値関数

日付関数

プロセス関数

制約

複数テーブルのクエリ

複数のテーブルの関係

デカルト積

内部結合

外部結合

自己接続 

ユニオンクエリ

サブクエリ

事務


概要

コンセプト

  1. データベース (DB) - データが保管される倉庫
  2. データベース管理システム (DBMS) - データベースを操作および管理する大規模なソフトウェア
  3. データベース システム (DBS) -データベースとその管理ソフトウェアで構成されるシステムです。
  4. SQL - リレーショナル データベースを操作するためのプログラミング言語、一連の標準

MySQLの起動と停止

起動する

ネットスタートmysql80

停止

ネットストップmysql80

クライアント接続

cmdコマンド

mysql [-h 127.0.0.1] [-P 3306] -u root -p

リレーショナルデータベース(RDBMS)

リレーショナル モデルに基づいたデータベースで、相互接続された複数の 2 次元テーブルで構成されます。

特徴:

  1. テーブルを使用してデータを統一形式で保存し、メンテナンスを容易にします。
  2. SQL言語による操作、統一された標準で使いやすい 

SQL

データの種類

数値型:主にさまざまなサイズの整数。

文字列型:主にchar (固定長文字列) と varchar (可変長文字列) の違いを明確にします。

日付タイプ:一般的に使用される DATE。日付は一重引用符で囲む必要があることに注意してください。

タイプ 説明する サイズ フォーマット 範囲
日付 日付値 3 YYYY-MM-DD 1000-01-01 ~ 9999-12-31

DDL

データ定義言語 データ定義言語。データ オブジェクト (データベース、テーブル、フィールド) を定義するために使用されます。

データベース操作

1. すべてのデータベースのクエリ: SHOW DATABASES;
2. 現在のデータベースのクエリ: SELECT DATABASE();
3. 作成: CREATE DATABASE IF NOT EXISTS データベース名 DEFAULT CHARSET 文字セット COLLATE 照合順序。

4. 削除: DROP DATABASE IF EXISTS データベース名。

5. 使用:データベース名を使用します。

テーブル操作

1. 現在のデータベース内のすべてのテーブルをクエリします。

SHOW TABLES;

2. クエリテーブルの構造

DESC 表名;

3. 指定したテーブルのテーブル作成文をクエリします。

SHOW CREATE TABLE 表名;

4.テーブルの作成

CREATE TABLE 表名(
    字段1 字段1类型[COMMENT 字段1注释],
    字段2 字段2类型[COMMENT 字段2注释],
    字段3 字段3类型[COMMENT 字段3注释],
    ......
    字段n 字段n类型[COMMENT 字段n注释]
)[COMMENT 表注释];

5. フィールドの追加

ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释];

6. データ型を変更する

ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);

7. フィールド名とフィールドタイプを変更する

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释];

8. フィールドの削除

ALTER TABLE 表名 DROP 字段名;

9. テーブル名の変更

ALTER TABLE 表名 RENAME TO 新表名;

10. テーブルの削除

DROP TABLE [IF EXISTS] 表名;

11. 指定したテーブルを削除し、テーブルを再作成します。

TRUNCATE TABLE 表名;

DML 

DML の完全な英語名は Data Manipulation Language (データ操作言語) で、データベース内のテーブルのデータ レコードを追加、削除、変更するために使用されます。

1. 指定したフィールドにデータを追加します。

INSERT INTO 表名(字段名1,字段名2,...) VALUES(值1,值2,...);

2. すべてのフィールドにデータを追加します。

INSERT INTO 表名 VALUES(值1,值2,...);

3. データをバッチで追加します。

INSERT INTO 表名(字段名1,字段名2,...) VALUES(值1,值2,...),
                                           (值1,值2,...),
                                           (值1,值2,...),...;
INSERT INTO 表名 VALUES(值1,值2,...),(值1,值2,...),...;

4. データを変更します。

UPDATE 表名 SET 字段名1=值1,字段名2=值2,... [WHERE 条件];

5. データを削除します。

DELETE FROM 表名 [WHERE 条件];

DQL

DQL の完全な英語名は Data Query Language で、データベース内のテーブル内のレコードをクエリするために使用されるデータ クエリ言語です。

  • 基本的なクエリ
  • 条件付きクエリ (WHERE)
  • 集計関数 (カウント、最大、最小、平均、合計)
  • グループクエリ(GROUP BY)
  • ソートクエリ(ORDER BY)
  • ページングクエリ(LIMIT)

忘れがちな知識のポイントを簡単に説明します。 

1. 重複レコードを削除するキーワード:distinct

SELECT DISTINCT 字段列表 FROM 表名;

 2. whereとhaveの違い(グループクエリキーワード)

  • where はグループ化の前にフィルタリングを行い、where 条件が満たされない場合はグループ化には参加しませんが、have はグループ化後に結果をフィルタリングするというように、実行タイミングが異なります。
  • 判定条件が異なり、集計関数は判定できないが、ある場合は判定できる。

実行順序: ここで > 集計関数 > を持つ

3. 並べ替えクエリの場合: 複数フィールドの並べ替えの場合、最初のフィールドの値が同じ場合、2 番目のフィールドが並べ替えられます。

4.ページングクエリ:

SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;

開始インデックスは 0 から始まります。開始インデックス = (クエリ ページ番号 - 1) * 各ページに表示されるレコードの数です。ページング
クエリはデータベースの方言です。データベースが異なれば実装も異なります。MySQL では、
最初のインデックスの場合はLIMIT です。データのページがクエリされます。開始インデックスは省略でき、直接制限 10 と省略されます。

5. クエリステートメントの作成順序と実行順序:

書く順番:

SELECT
    フィールド リスト
FROM
    テーブル名リスト
WHERE
    条件リスト
GROUP BY
    グループ化フィールド リスト
HAVING
    グループ化後の条件リスト
ORDER BY
    ソート フィールド リスト
LIMIT
    ページング パラメータ

-------------------------------------------------- ------------

実行順序:

FROM
    テーブル名リスト
WHERE
    条件リスト
GROUP BY
    グループ化フィールド リスト
HAVING
    グループ化後条件リスト
SELECT
    フィールド リスト
ORDER BY
    ソート フィールド リスト
LIMIT
    ページング パラメータ

DCL 

DCL の完全な英語名は Data Control Language で、データベース ユーザーの管理とデータベース アクセス許可の制御に使用されます。

1. ユーザーに問い合わせる

USE mysql;
SELECT * FROM user;

2.ユーザーの作成

CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

3. ユーザーパスワードを変更する

ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';

4. ユーザーの削除

DROP USER '用户名'@'主机名';

知らせ:

  • ホスト名にはワイルドカード文字「%」を使用できます。
  • このタイプの SQL 開発者が操作することはほとんどなく、主に DBA (データベース管理者) によって使用されます。簡単な理解のために

5. 権限のクエリ

SHOW GRANTS FOR '用户名'@'主机名';

6. 権限を付与する

GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';

7. 権限を取り消します

REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';

知らせ:

  • 複数の権限を区切るにはカンマを使用します。
  • 承認する場合、データベース名とテーブル名は、すべてを表す * をワイルドカードとして使用できます。

関数

文字列関数

関数 関数
CONCAT(S1,S2,...Sn) 文字列の連結、S1、S2、...Sn を文字列に連結します。
下限(文字列) すべての文字列 str を小文字に変換します
アッパー(str) すべての文字列 str を大文字に変換します
LPAD(str,n,pad) 左パディング。文字列パッドを使用して str の左側をパディングし、文字列の長さが n に達するようにします。

RPAD(str,n,pad)

右パディング。文字列の長さが n に達するまで、str の右側を文字列パッドで埋めます。
トリム(文字列) 文字列から先頭末尾のスペースを削除する
SUBSTRING(str,start,len) 文字列 str の開始位置から長さ len の文字列を返します。

数値関数

関数 関数
CEIL(x) 切り上げ
フロア(x) 切り捨て
MOD(x,y) x/y の係数を返します。
らん() 0 ~ 1 の間の乱数を返します。小数点以下の桁はランダムで、0 と 1 は除きます。
ROUND(x,y) 小数点以下 y 桁を保持したまま、パラメータ x の四捨五入された値を求めます。

日付関数

関数 関数
CURDATE() 現在の日付を返す
時間() 現在時刻を返す
今() 現在の日付と時刻を返します
年(日付) 指定した日付の年を取得します
月(日付) 指定した日付の月を取得します
DAY(日付) 指定した日付の日付を取得する
DATE_ADD(日付,INTERVAL式型) 日付/時刻値と時刻値 expr を返します。
DATEDIFF(日付1,日付2) 開始時刻 date1 と終了時刻 date2 の間の日数を返します。

プロセス関数

C言語の三項演算子に似た機能

関数 関数
IF(値,t,f) 値が true の場合は t を返し、それ以外の場合は f を返します
IFNULL(値1,値2) value が空でない場合は value1 を返し、それ以外の場合は value2 を返します。
CASE WHEN [val1] THEN [res1] ... ELSE [デフォルト] END val1 が true の場合、res1 を返します...それ以外の場合はデフォルト値を返します
CASE [expr] WHEN [val1] THEN [res1] ... ELSE [デフォルト] END expr の値が val1 に等しい場合は res1 を返し、それ以外の場合はデフォルト値を返します。

制約

  1. 概念: 制約は、テーブル内のフィールドに作用して、テーブルに格納されるデータを制限するルールです。
  2. 目的: データベース内のデータの正確性、有効性、完全性を保証するため。
  3. 分類:
制約 説明する キーワード
非NULL制約 このフィールドのデータを NULL にすることはできません NULLではありません
一意の制約 このフィールド内のすべてのデータが一意であり、重複していないことを確認してください 個性的
主キー制約 主キーはデータ行の一意の識別子であり、空ではなく一意である必要があります。 主キー
デフォルトの制約 データを保存するときに、このフィールドの値が指定されていない場合は、デフォルト値が使用されます。 デフォルト
チェック制約 (バージョン 8.0.16 以降) 特定の条件を満たすフィールド値を保存する チェック
外部キー制約 2 つのテーブルのデータ間の接続を確立し、データの一貫性と整合性を確保するために使用されます。 外部キー

一般的な制約については、前の例を参照することでその使用法を理解できます。

  •  必要に応じてフォームの作成を完了します。
フィールド名 フィールドの意味 フィールドタイプ 制限 制約キーワード
ID ID 一意の識別子 整数 主キー、および自動的に増加します 主キー、AUTO_INCREMENT
名前 名前 varchar(10) 空ではなく、ユニークです NULL ではありません、一意です
整数 0より大きく120以下 チェック
状態 文字(1) この値が指定されていない場合、デフォルトは 1 になります。 デフォルト
性別 性別 文字(1) なし
create table user(
    id int primary key auto_increment comment '主键',
    name varchar(10) not null unique comment '姓名',
    age int check(age > 0 and age <= 120) comment '年龄',
    status char(1) default '1' comment '状态',
    gender char(1) comment '性别'
) comment '用户表';

外部キーの使用法に注目してください。

外部キーを追加する

CREATE TABLE 表名(
    字段名 数据类型,
    ...
    [CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主列表名)
);

-- 或
ALTER TABLE 表名 
    ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCE 主表 (主列表名);

外部キーの削除

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

外部キーの削除/更新動作

行動 説明する
何もしない 当在父表中删除/更新对应记录时,首先检查记录是否有对应外键,如果有则不允许删除/更新。(与RESTRICT一致)
RESTRICT 当在父表中删除/更新对应记录时,首先检查记录是否有对应外键,如果有则不允许删除/更新。(与NO ACTION一致)
CASCADE 当在父表中删除/更新对应记录时,首先检查记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
SET NULL 当在父表中删除对应记录时,首先检查记录是否有对应外键,如果有则设置子表中该外键值为null(要求该外键允许取null)
SET DEFAULT 父表有变更时,子表将外键列设置成一个默认的值(Innodb不支持)
ALTER TABLE 表名 
    ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCE 主表 (主列表名)
        ON UPDATE CASCADE ON DELETE CASCADE;

多表查询

多表关系

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:

  • 一对多(多对一)
  • 多对多
  • 一对一

 

笛卡尔积

笛卡尔积是指在数学中,两个集合A和集合B的所有的组合情况。

例如A、B 和1、2、3、4组合,不同的组合情况就有八种:

  • A 1
  • A 2
  • A 3
  • A 4
  • B 1
  • B 2
  • B 3
  • B 4

所以,在多表查询时,需要消除无效的笛卡尔积。

内连接

 隐式内连接

SELECT 字段列表 FROM 表1,表2 WHERE 条件...;

显式内连接

SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件 ...;

外连接

左外连接

SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件 ...;

相当于查询表1(左表)的所有数据,包含表1和表2交集部分的数据

右外连接

SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件...;

相当于查询表2(右表)的所有数据,包含表1和表2交集部分的数据

自连接 

SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件...;

自连接查询,可以是内连接查询,也可以是外连接查询。

联合查询

查询语法

SELECT 字段列表 FROM 表A ...
UNION [ALL]
SELECT 字段列表 FROM 表B ...;

对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。

union all会将全部的数据直接合并在一起,union会对合并之后的数据去重。

子查询

SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

 子查询外部的语句可以是INSERT/UPDATE/DELETE/SELECT 的任何一个。

根据子查询的结果不同,分为:

  • 标量子查询(子查询结果为单个值)
  • 列子查询(子查询结果为一列)
  • 行子查询(子查询结果为一行)
  • テーブルサブクエリ (サブクエリの結果は複数の行と列です)

サブクエリの位置により、WHERE以降、FROM以降、SELECT以降に分かれます。

事務

トランザクションは一連の操作であり、分割できない作業単位です。トランザクションは、システム全体に対して操作リクエストを送信または取り消します。つまり、これらの操作は同時に成功するか、同時に失敗します。

 1. トランザクション操作 

START TRANSACTION; -- 开启事务
COMMIT / ROLLBACK; -- 提交/回滚事务

2. 不倫の4つの特徴

原子性、一貫性、分離性、耐久性

 

原子性

  • トランザクションは、全体が成功するか全体が失敗する、分割できない最小の操作単位です。

トランザクションが実行されると、同じバッチで一連の SQL ステートメントが実行されます。1 つの SQL ステートメントでエラーが発生した場合、バッチ内のすべての SQL ステートメントがキャンセルされます。

一貫性

  • トランザクションが完了すると、すべてのデータが一貫した状態になる必要があります。

たとえば、銀行振込は 2 つのアクションに分類できます。1 つは口座 A からの資金 X の引き落とし、もう 1 つは口座 B への資金 X の追加です。このプロセス中にエラーが発生した場合は、操作全体を初期状態にロールバックする必要があります。A と B の合計口座残高が初期状態と一致していることを確認します。

分離

  • データベース システムが提供する分離メカニズムにより、トランザクションは外部の同時操作の影響を受けない独立した環境で実行されます。

たとえば、あるトランザクションが特定のデータ項目を変更しており、この時点で別のトランザクションもそのデータ項目を変更しようとしていますが、分離が存在するため、2 番目のトランザクションは最初のトランザクションが変更を完了するまで待機してから変更が行われます。修正。

耐久性

  • トランザクションがコミットまたはロールバックされると、データベース内のデータに対する変更は永続的になります。

トランザクションがコミットされると、データベースへの変更は永続的になる必要があり (データ送信はハード ディスクに保存されます)、その後の他の操作や失敗がこのトランザクションの変更に影響を与えることはありません。

3. 同時トランザクションの問題

(1) ダーティ・リーディング

あるトランザクションは、別のトランザクションがまだコミットしていないデータを読み取ります。

(2) 繰り返し不可能な読み取り

トランザクションは同じレコードを連続して読み取りますが、2 回読み取られるデータは異なります。これを非反復読み取りと呼びます。

(3) ファントム読み取り

トランザクションが条件に従ってデータをクエリすると、対応するデータ行は存在しませんが、データを挿入すると、あたかも「ファントム」が現れたかのように、このデータ行がすでに存在していることがわかります。

 

4. トランザクション分離レベル 

READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE(串行化)

 


終わり


おすすめ

転載: blog.csdn.net/li13437542099/article/details/132651303
おすすめ