1. ホーム
  2. mysql

MySQLの基礎知識まとめ

2022-02-21 11:06:21
<パス <ブロッククオート

???? 個人のホームページです。 Javaプログラムフィッシュ
???? 高品質のMySQLコースのセットを作成するために準備し、あなたは見続けることができます
???? 記事がお役に立てれば。 フォロー、いいね、ブックマーク(ワンクリック3リンク)、コラムの購読を歓迎します!
???? 何か質問があれば、お気軽にプライベートメッセージを送ってください!見かけたら、迅速に返信します。

<テーブル シリアル番号 内容物 リンクアドレス 1 MySQLの基本概要 2 MySQLインデックス 共有する 3 MySQLトランザクション 共有する 4 MySQLのロック機構 共有する 5 MySQL JOINの原理 共有すること 6 MySQL Order By 原則 共有する 7 Redoログ、Undoログ、Binlog 共有する 8 InnoDBのメモリ構造には、次の4つのコアコンポーネントがあります。 共有されるもの 9 マスター・スレーブ レプリケーションの原理 共有する 10 マスタースレーブレイテンシーソリューション 共有する 11 SQL文のクエリーの原則 共有する 12 MySQL大量データ最適化 共有する 13 SQL最適化 共有する 14 データベースとキャッシュの二重書き込み一貫性スキーム 共有する 15 分散ロック 共有する

記事目次


I. MySQLのインストール

mysqlがシステムにインストールされているか確認します。

rpm -qa | grep mysql


すでにインストールされている場合は、アンインストールを選択することができます

rpm -e mysql // normal removal mode
rpm -e --nodeps mysql // strong delete mode


mysqlのダウンロード

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm
yum update
yum install mysql-server


パーミッションの設定。

chown mysql:mysql -R /var/lib/mysql


MySQLを初期化する。

mysqld --initialize


MySQLを起動します。

systemctl start mysqld


MySQLの稼働状況を表示する。

systemctl status mysqld


インストールが正常に行われたことを確認する

mysqladmin --version


MySQLクライアントを使用する

mysql


その後、再度パスワードを入力し、mysqlコマンドでMySQLサーバーに接続します。デフォルトでは、MySQLサーバーのログインパスワードは空なので、このインスタンスではパスワードを入力する必要はありません。

どのようなライブラリーが利用できるかを確認するには

mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql |
| test
+----------+
2 rows in set (0.11 sec)


パスワードの設定

Mysqlのインストールに成功すると、rootユーザのデフォルトパスワードは空になります。

mysqladmin -u root password "new_password";


II. ライブラリ操作コマンド

1、データベースを作成する。createコマンドは、データベースを作成するために使用されます。

mysql> create database <database name>;


2. すべてのデータベースを表示する

mysql> show databases;


3. データベースを修正する。ALTER TABLEステートメントは、既存のテーブルのカラムを追加、削除、または変更するために使用されます。

ALTERコマンドとDROP句を使用して、[user_info]テーブルのageフィールドを削除します。

mysql> ALTER TABLE user_info DROP age;


注意:データ・テーブルにフィールドが1つしか残っていない場合、DROPを使用してフィールドを削除することはできません。

MySQLはADD句を使用してデータテーブルにカラムを追加します。次の例のように、テーブル[user_info]に年齢フィールドを追加し、データ型を定義します。

mysql> ALTER TABLE user_info ADD age INT;


フィールドの種類と名前を変更する必要がある場合は、ALTERコマンドのMODIFY句またはCHANGE句を使用することができます。
例えば、フィールドmobileの型をCHAR(1)からCHAR(11)に変更する場合は、以下のコマンドを実行します。

mysql> ALTER TABLE user_info MODIFY mobile CHAR(11);


CHANGE句の場合は、構文が大きく異なります。CHANGEキーワードの直後に、変更したいフィールドの名前を指定し、その後に新しいフィールド名と型を指定します。次の例を試してみてください。

# Modify the field name
mysql> ALTER TABLE user_info CHANGE mobile phone CHAR(11);
# Modify the field name + data type
mysql> ALTER TABLE user_info CHANGE mobile phone VARCHAR;


4. データベースを削除する。dropコマンドを使用して、データベースを削除します。

mysql> drop database <database name>;


上記のコマンドを実行すると、データテーブル・フィールドの末尾にiフィールドが自動的に追加されます。

5. データベースの使用

mysql> use <database name>;


III. 表操作コマンド

1. テーブルを作成します。

MySQL データテーブルを作成するには、次の情報が必要です。

  • テーブル名
  • テーブルのフィールド名
  • 各テーブルフィールドの定義

以下は、MySQL データテーブルを作成するための一般的な SQL 構文です。

CREATE TABLE table_name (column_name column_type);


データテーブルの記事を作成します。

CREATE TABLE `article` (
  `pk_id` int NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL COMMENT 'Article title',
  `author_id` int NOT NULL COMMENT 'Article author ID',
  `category_id` int NULL COMMENT 'Article category',
  `reading_quantity` int NULL COMMENT 'Reading quantity',
  `status` int NULL COMMENT 'Article status, 0:draft_box 1:under review 2:released',
  `release_date` timestamp NULL COMMENT 'Article release time',
  `update_date` timestamp NULL COMMENT 'Article modification time',
  PRIMARY KEY (`pk_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


<ブロッククオート
  • 様々なSQLステートメントを実演するために、すべてのフィールドを1つのテーブルに入れました。
  • フィールドをNULLにしたくない場合は、フィールドのプロパティをNOT NULLに設定すると、データベースを操作したときにフィールドに入力されたデータがNULLであればエラーが報告されます。
  • AUTO_INCREMENT は自己インクリメントの属性を定義します。通常、主キーに使用され、値は自動的に 1 ずつ増加します。
  • PRIMARY KEY キーワードは、カラムの主キーを定義するために使用されます。複数のカラムを使用して主キーを定義することができ、カラムはカンマで区切られます。
  • ENGINEはストレージエンジン、CHARSETはエンコーディングを設定します。

2. データを挿入する


INSERT INTO `game`. `article`(`pk_id`, `title`, `author_id`, `category_id`, `reading_quantity`, `status`, `release_date`, `update_date`) VALUES (1, 'MySQL Basics Summary', 1, 1, 5000, 0, '2021-09-03 16:18:54', '2021-09-03 16:18:56');

INSERT INTO `game`. `article`(`pk_id`, `title`, `author_id`, `category_id`, `reading_quantity`, `status`, `release_date`, `update_date`) VALUES (2, 'MySQL index', 1, 1, 4000, 0, '2021-09-03 16:23:32', '2021-09-03 16:23:34');

INSERT INTO `game`. `article`(`pk_id`, `title`, `author_id`, `category_id`, `reading_quantity`, `status`, `release_date`, `update_date`) VALUES (3, 'MySQL transaction', 1, 1, 3000, 0, '2021-09-03 16:24:20', '2021-09-03 16:24:22');


3. クエリデータ

select * from article where pk_id in(1,2);


<イグ
pk_id が 1 と 2 に等しい場合のクエリ

4. データの修正

update article set title="MySQL Basic Summary (Fine)" where pk_id = 1;


タイトルを MySQL Basics Summary (fine) これは、pk_id=1 の行にのみ適用されます。

5. データの削除

delete from article where pk_id = 1;


pk_id が 1 に等しいレコードを削除する。

6. テーブルのデータを空にする

truncate article;


7. テーブルコメントの修正

alter table article comment 'Article table';


8. テーブルクエリ

まずはテストデータの挿入から。

INSERT INTO `game`. `article`(`pk_id`, `title`, `author_id`, `category_id`, `reading_quantity`, `status`, `release_date`, `update_date`) VALUES (1, 'MySQL Basics Summary', 1, 1, 5000, 0, '2021-09-03 16:18:54', '2021-09-03 16:18:56');

INSERT INTO `game`. `article`(`pk_id`, `title`, `author_id`, `category_id`, `reading_quantity`, `status`, `release_date`, `update_date`) VALUES (2, 'MySQL index', 1, 1, 4000, 0, '2021-09-03 16:23:32', '2021-09-03 16:23:34');

INSERT INTO `game`. `article`(`pk_id`, `title`, `author_id`, `category_id`, `reading_quantity`, `status`, `release_date`, `update_date`) VALUES (3, 'MySQL transaction', 1, 1, 3000, 0, '2021-09-03 16:24:20', '2021-09-03 16:24:22');


(1) いいね!ファジーなクエリ

## Fuzzy query: like, % identifies a match for any brother character, _ indicates a match for a character
## Query the article table for articles with MySQL titles
select * from article where title like '%MySQL%';


<イグ

(2) in演算子を使うと、WHERE句に複数の値を指定することができます。

select * from article where reading_quantity in (5000,6000);


<イグ
読者数5000人、6000人の記事へのクエリ

(3)または

select * from article where reading_quantity = 5000 or author_id = 2;


<イグ

readsが5000、もしくは著者IDが2の記事を検索する。

(3)および

select * from article where author_id = 1 and reading_quantity >= 5000;


<イグ
著者IDが1で、読者数が5000人以上の記事を検索します。

(4) 順番、並べ替え

select * from article order by reading_quantity asc


<イグ

昇順、降順のソート

(5) 制限、ページングクエリ

# Start at 1 and return two rows
select * from article limit 1,2;


<イグ

limit(初期レコード行オフセットは0、第1パラメータは最初に返されるレコード行のオフセットを指定、第2パラメータは返されるレコード行の最大数を指定)

(6) 区別、重複排除

select distinct title from article;


タイトルによる重複排除

(7) group by、group query

select author_id,count(0) from article where status = 1 group by author_id;


各著者が何本の記事を出版したかを問い合わせる

(8)件

select *, (
    case
    when reading_quantity >= 5000 then
            'Hot articles'
    when reading_quantity >= 4000 then
            'Quality articles'
    when reading_quantity >= 3000 then
            'Normal articles'
     else
            'Low quality articles'
     end
    ) 'article_rank'
from
    article



<イグ

上記のSQL文をJavaコードに変換してみると、理解できるはずです。

if(reading_quantity >= 5000){

}else if(reading_quantity >= 4000){

}else if(reading_quantity >= 3000){

}else{

}


IV. データ型

MySQL のデータフィールドのタイプを定義することは、データベースを最適化するために非常に重要です。

MySQLは様々な型をサポートしており、大きく分けて、数値型、日付/時刻型、文字列(キャラクタ)型の3つがあります。

1. 数値の種類

(1) 整数型

  • 整数型の数値は、デフォルトで正の整数と負の整数の両方を表すことができます(この場合、符号付き数値と呼びます)。0と正の整数だけを表現したい場合は、unsignedキーワード "unsigned"を使用して整数型を変更することができます。
  • 各クラスの記憶容量と値の範囲。
<テーブル タイプ サイズ 範囲(符号付き) レンジ(符号なし) 使用方法 TINYINT 1バイト (-128, 127) (0, 255) 小さな整数値 SMALLINT 2バイト (-32 768, 32 767) (0, 65 535) 大きな整数値 メディアミント 3バイト (-8 388 608, 8 388 607) (0, 16 777 215) 大きな整数値 INTまたはINTEGER 4バイト (-2 147 483 648, 2 147 483 647) (0, 4 294 967 295) 大きな整数値 BIGINT 8バイト (-9,223,372,036,854,775,808, 9 223 372 036 854 775 807) (0, 18 446 744 073 709 551 615) 非常に大きな整数値

(2) 10進数型

  • decimal(length, precision) は,精度が決定される(小数点以下の桁数が決定される)小数の種類を表すために用いられる。lengthは小数の最大桁数を決定し,precisionは精度(小数点以下の桁数)を設定するために用いられる。
  • 例:10進数(5,2)は、10進数の値域:999.99~999.99 10進数(5,0)は、-9999~999999 整数という意味です。
  • 各カテゴリーの記憶容量と値の範囲。
<テーブル タイプ サイズ 範囲(符号付き) レンジ(符号なし) 使用方法 フロート 4バイト (-3.402 823 466 e+38, -1.175 494 351 e-38), 0, (1.175 494 351 e-38, 3.402 823 466 351 e+38) 0, (1.175 494 351 e-38, 3.402 823 466 e+38) 単精度
浮動小数点数 DOUBLE 8バイト (-1.797 693 134 862 315 7 e+308, -2.225 073 858 507 201 4 e-308), 0, (2.225 073 858 507 201 4 e-308, 1.797 693 134 862 315 7 e+308) 0, (2.225 073 858 507 201 4 e-308, 1.797 693 134 862 315 7 e+308) 倍精度
浮動小数点数 デシマル DECIMAL(M,D)の場合、M>DならM+2、そうでなければD+2 MとDの値による M と D の値に依存する。 小さい値

2. 日付と時刻の種類

時刻の値を表す日付と時刻の型は、DATETIME、DATE、TIMESTAMP、TIME、YEARです。

各時間型には有効な値の範囲と、MySQL が表現することが合法でない値を指定するときに使用する "ゼロ" 値があります。

TIMESTAMP型は、後述する独自の自動更新機能を備えています。

<テーブル タイプ サイズ
(バイト) 範囲 フォーマット 使用方法 日付 3 1000-01-01/9999-12-31 YYYY-MM-DD 日付の値 時間 3 '-838:59:59'/'838:59:59' HH:MM:SS 時間値または持続時間 年 1 1901/2155 YYYY 年 値 データタイム 8 1000-01-01 00:00:00/9999-12-31 23:59:59 yyyy-mm-dd hh:mm:ss 日付と時刻の混在した値 タイムスタンプ 4 1970-01-01 00:00:00/2038
終了時刻は、最初の 2147483647 秒、日本標準時 2038-1-19 11:14:07 日本時間2038年1月19日午前03時14分07秒 yyyymmdd hhmmss 日付と時刻の混在した値、タイムスタンプ

3. 文字列の種類

文字列型とは、CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM、SETを指します。このセクションでは、これらの型の動作とクエリでの使用方法について説明します。

<テーブル タイプ サイズ 使用 CHAR 0〜255バイト 固定長文字列 VARCHAR 0-65535バイト 可変長文字列 TINYBLOB 0〜255バイト 最大255文字までのバイナリ文字列 TINYTEXT 0〜255バイト 短いテキスト文字列 BLOB 0-65 535バイト バイナリ形式の長いテキストデータ テキスト 0-65 535バイト 長いテキストデータ メディアムブロック 0~16 777 215 バイト バイナリ形式の中長テキストデータ MEDIUMTEXT 0~16 777 215 バイト 中長テキストデータ LONGBLOB 0-4 294 967 295 バイト バイナリ形式の極めて大きなテキストデータ LONGTEXT 0-4 294 967 295 バイト 非常に大きなテキストデータ

備考 : char(n) や varchar(n) の括弧内の n はバイト数ではなく文字数を表し、例えば CHAR(30) は 30 文字を格納します。

CHAR型とVARCHAR型は似ていますが、保存と取り出しの方法が異なります。また、最大長や末尾の空白を保存するかどうかの点でも異なります。保存や取り出しの際に大文字と小文字の変換は行われません。

BINARYとVARBINARYはCHARとVARCHARに似ていますが、非バイナリ文字列の代わりにバイナリ文字列を含むという点が異なります。つまり、文字列の代わりにバイト文字列を格納します。つまり、文字セットを持たず、列値のバイトに基づいて数値のソートと比較を行います。

BLOBは、可変量のデータを保持できるバイナリラージオブジェクトである。BLOBには4つのタイプがある。TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOBの4種類があり、それぞれ保持できるストレージの範囲が異なる。

TEXTは4種類あります。TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXTの4つのBLOBタイプに対応し、状況に応じて格納できる最大長が異なる。

V. 機能

MySQL には、強力で使いやすい関数が多数用意されており、これらを使用することでデータベース管理の効率が大幅に向上するため、さまざまなユーザのニーズに柔軟に対応することができます。この記事では、MySQL の関数を分類して要約し、後で必要になったときにチェックできるようにします。

準備すること

テーブルを作成する。

-- Article table
CREATE TABLE `article` (
  `pk_id` int NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL COMMENT 'Article title',
  `author_id` int NOT NULL COMMENT 'Article author ID',
  `category_id` int NULL COMMENT 'Article category',
  `reading_quantity` int NULL COMMENT 'Reading quantity',
  `status` int NULL COMMENT 'Article status, 0:draft_box 1:under review 2:released',
  `release_date` timestamp NULL COMMENT 'Article release time',
  `update_date` timestamp NULL COMMENT 'Article modification time',
  PRIMARY KEY (`pk_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


データを挿入する

INSERT INTO `game`. `article`(`pk_id`, `title`, `author_id`, `category_id`, `reading_quantity`, `status`, `release_date`, `update_date`) VALUES (1, 'MySQL Basics Summary', 1, 1, 5000, 0, '2021-09-03 16:18:54', '2021-09-03 16:18:56');

INSERT INTO `game`. `article`(`pk_id`, `title`, `author_id`, `category_id`, `reading_quantity`, `status`, `release_date`, `update_date`) VALUES (2, 'MySQL index', 1, 1, -4000, 0, '2021-09-03 16:23:32', '2021-09-03 16:23:34');

INSERT INTO `game`. `article`(`pk_id`, `title`, `author_id`, `category_id`, `reading_quantity`, `status`, `release_date`, `update_date`) VALUES (3, 'MySQL transaction', 1, 1, 3000, 0, '2021-09-03 16:24:20', '2021-09-03 16:24:22');


ここでは、絶対値などの関数のデモのために、pk_idが2に等しい場合の読み取り値を-4000に設定しています。

データ一覧です。

1. MySQL 数値計算機 関数

(1) ABS(x)

説明 xの絶対値を返す

ケース

select pk_id,abs(reading_quantity) from article;


<イグ

pk_id が 1 で reading_quantity が -4000 のレコードは abs(reading_quantity) で 4000 になります。

(2) AVG(式)

説明 式の平均を返す。expressionはフィールド

ケース

select AVG(reading_quantity) from article;


<イグ

(3) MAX(式)

説明 フィールド式に含まれる最大値を返します。

ケース

select max(reading_quantity) from article;


<イグ

(4) MIN(式)

説明 フィールド式に含まれる最小値を返す

ケース

select min(reading_quantity) from article;


<イグ
(5) CEIL(x)

説明:切り上げ

事例を紹介します。

SELECT CEIL(1.5)  
-> 2
SELECT CEIL(-1.5)  
-> -1


(6) FLOOR(x)

説明:切り捨て

事例を紹介します。

SELECT FLOOR(1.5)  
-> 1
SELECT FLOOR(-1.5)  
-> -2


(7) ROUND(x)

説明 丸め
事例を紹介します。

SELECT ROUND(1.4) 
-> 1
SELECT ROUND(1.5)  
-> 2


(8) SUM(式)

説明 指定されたフィールドの合計を返します

ケース

select sum(reading_quantity) from article;


<イグ

2. MySQL 文字列関数

(1) CHARACTER_LENGTH(s)の場合

説明 文字列 s の文字数を返します。

ケース

select pk_id,title,CHARACTER_LENGTH(title) from article;


<イグ

(2) CONCAT(s1,s2...sn)

説明 s1,s2 のような複数の文字列を1つの文字列に統合する。

ケース

select pk_id,CONCAT(title,author_id) from article;


<イグ

titleフィールドとauthor_idを結合する。

(3) LEFT(s,n)

説明 文字列 s の最初の n 文字を返す

ケース

select pk_id,left(title,1) from article;


<イグ

(4) RIGHT(s,n)

説明 文字列 s の最後の n 文字を返します。

ケース

select pk_id,right(title,1) from article;


<イグ

(5) LOWER(s)の場合

説明 文字列 s のすべての文字を小文字に変換する

SELECT LOWER('JAVA') 
 -> java


(6) UPPER(s)の場合

説明 文字列を大文字に変換する

大文字・小文字を区別します。

SELECT LOWER('java')  
-> JAVA


(7) LTRIM(s)

説明:文字列 s の先頭にあるスペースを削除する。

SELECT LTRIM(" JAVA") 
-> JAVA


(8) REPLACE(s,s1,s2)

説明 文字列 s の中の文字列 s1 を文字列 s2 で置き換えます。

ケース

SELECT REPLACE('abc','a','x') 
-> xbc


(9) REVERSE(s)について

説明 文字列 s の順番を逆にします。

SELECT REVERSE('JAVA')
-> AVAJ


(10) SUBSTR(s, start, length)

説明 文字列 s の開始位置から長さの部分文字列を取り出します。

select pk_id,substr(title,1,2) from article;


<イグ

3. MySQL の時刻と日付の関数

(1) CURDATE()

説明 現在の日付を返す

ケース

SELECT CURDATE(); 
-> 2021-08-18


(2) NOW()

説明 現在の日付と時刻を返します。

ケース

SELECT NOW()
-> 2021-09-03 17:14:15


(3) 月(d)

説明 日付dの月の値を返す(1〜12)。

select pk_id,month(release_date) from article;


<イグ

(4) DAYNAME(d)

説明:日付を返す d は月曜日、火曜日のような曜日を表す

ケース

select pk_id,dayname(release_date) from article;


<イグ

(5) WEEK(d)

説明 日付dをその年の第1週として、0から53の範囲で計算します。

ケース

select pk_id,week(release_date) from article;


<イグ

VI. リンククエリ

  • 内部結合

    • 等価リンク
    • 非等価な結合
  • 外部リンク

    • 左外部リンク
    • 右外部リンク
  • セルフリンク

データを用意する。

CREATE TABLE `dept` (
  `department_id` int NOT NULL AUTO_INCREMENT COMMENT 'Department number',
  `dname` varchar(255) NULL COMMENT 'department name',
  `location` varchar(255) NULL COMMENT 'address',
  PRIMARY KEY (`department_id`)
) COMMENT = 'department table';

CREATE TABLE `employee` (
  `employee_id` int(0) NOT NULL AUTO_INCREMENT COMMENT 'employee_id',
  `c_name` varchar(255) NULL COMMENT 'Employee Chinese name',
  `e_name` varchar(255) NULL COMMENT 'Employee English name',
  `hiredate` timestamp(0) NULL COMMENT 'Date of hire, date of entry',
  `salary` int(11) NULL COMMENT 'Salary',
  `comm` int(11) NULL COMMENT 'bonus',
  `job_id` int(11) NULL COMMENT 'Job type',
  `department_id` int(11) NULL COMMENT 'Department number',
  `manager_id` int(11) NULL COMMENT 'Direct supervisor number',
  PRIMARY KEY (`employee_id`)
) COMMENT = 'Employee Table';

-- insert data into the table
insert into dept values(10,'Finance Department','Beijing');
insert into dept values(20,'R&D Department','Shanghai');
insert into dept values(30,'Sales Department','Guangzhou');
insert into dept values(40,'Administration','Shenzhen');
insert into dept values(50,'HR','Nanjing');
-- insert data into table
insert into employee values(1,'Xiao Hong','xiaohong','1980-12-17',7902,800,1,10,2);
insert into employee values(2,'iron egg','tiedan','1981-02-20',7698,1600,3,30,3);
insert into employee values(3,'Zhang San','zhangsan','1981-02-22',7698,1250,5,30,4);
insert into employee values(4,'li si','lisi','1981-04-02',7839,2975,2,20,5);
insert into employee values(5,'wanglaowu','wanglaowu','1981-09-28',7698,1250,1,40,0);
insert into employee values(6,'趙六','zhaoliu','1981-05-01',7839,2850,3,50,5);

-- inner link
select e.c_name,d.dname,d.location from employee e inner join dept d on e.department_id= d.department_id;

-- left outer join, means the data of the left table as the base, to match the data of the right table, if the match is displayed, if not, it will be displayed as null
-- Query all the data in the employee table and the data in the dept table that matches the employee, if there is no match, display null
select e.c_name,d.dname from employee e left outer join dept d on d.department_id = e.department_id ;

-- The right outer join and the left outer join are just left and right tables swapped to achieve the same effect
-- Here is the query dept department table corresponding to all departments and employee table corresponding to the data, you will find that originally there are 6 data in employee, only 5 data is displayed because there is no data in one person's department 60 then dept, so it is not displayed.
select e.c_name,d.dname from employee e right outer join dept d on d.department_id = e.department_id;

-- A self-join query is a join query between the current table and itself, the key point is to virtualize a table with an alias
-- Query the name of the employee and his supervisor, since the supervisor is also an employee, so virtualize a supervisor table here
select e.c_name employee_name,b.c_name supervisor_name from employee e left join employee b on e.manager_id= b.employee_id;


-- inner link
select e.c_name,d.dname,d.location from employee e inner join dept d on e.department_id= d.department_id;


<イグ

-- left outer join, means the data of the left table as the base, to match the data of the right table, if the match is displayed, if not, it will be displayed as null
-- Query all the data in the employee table and the data in the dept table that matches the employee, if there is no match, display null
select e.c_name,d.dname from employee e left outer join dept d on d.department_id = e.department_id ;


<イグ

-- The right outer join and the left outer join are just left and right tables swapped to achieve the same effect
-- Here is the query dept department table corresponding to all departments and employee table corresponding to the data, you will find that originally there are 6 data in employee, only 5 data is displayed because there is no data in one person's department 60 then dept, so it is not displayed.
select e.c_name,d.dname from employee e right outer join dept d on d.department_id = e.department_id;


<イグ

-- A self-join query is a join query between the current table and itself, the key point is to virtualize a table with an alias
-- Query the name of the employee and his supervisor, since the supervisor is also an employee, so virtualize a supervisor table here
select e.c_name employee_name,b.c_name supervisor_name from employee e left join employee b on e.manager_id= b.employee_id;


<イグ