1. はじめに
接続操作では、駆動テーブルと被駆動テーブルの関連付け条件をその後に置きます。テーブルと駆動テーブルを追加しました。駆動テーブルのフィルター条件が on または where の後に配置された場合、エラーは報告されませんが、取得される結果セットは異なりますか? ? ?
1.1 mysql 接続の原理
ご存知のとおり、mysql は Nested-Loop Join (ネストループ結合、現時点では最適化アルゴリズムを考慮していません) に基づいています。 ) テーブル間の接続操作を実行するアルゴリズム 一般的なプロセスは次のとおりです。
ドライバー テーブルを選択し、ドライバー テーブルに関連するフィルター条件を使用して単一テーブルを実行します。ドライバー テーブルに対するクエリ;
クエリされたドライバー テーブル内の各レコードについて、駆動テーブル内の一致するレコードを検索します。
疑似コードは次のとおりです。
for each row in t1 { // 遍历满足对t1单表查询结果集中的每一条纪录 for each row in t2 { // 对于某条t1纪录,遍历满足对t2单表查询结果集中的每一条纪录 if row satisfies join conditions, send to client } }
1.2 show warnings コマンド
記述した SQL ステートメントは次のように最適化されます。その後、オプティマイザは実行のためにエグゼキュータに渡され、show warnings コマンドを使用すると、オプティマイザによって最適化された SQL を取得できます。
2. 準備
テーブルの構造は次のとおりです:
CREATE TABLE `student` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `stu_code` varchar(20) NOT NULL DEFAULT '', `stu_name` varchar(30) NOT NULL DEFAULT '', `stu_sex` varchar(10) NOT NULL DEFAULT '', `stu_age` int(10) NOT NULL DEFAULT '0', `stu_dept` varchar(30) NOT NULL DEFAULT '', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `uq_stu_code` (`stu_code`) ) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8mb4 CREATE TABLE `course` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `cou_code` varchar(20) NOT NULL DEFAULT '', `cou_name` varchar(50) NOT NULL DEFAULT '', `cou_score` int(10) NOT NULL DEFAULT '0', `stu_code` varchar(20) NOT NULL DEFAULT '', PRIMARY KEY (`id`) USING BTREE, KEY `idx_stu_code_cou_code` (`stu_code`,`cou_code`) ) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4
テーブルのデータは次のとおりです:
3. inner join inner join on と where
sql の違いは次のとおりです:
select * from student inner join course on student.stu_code = course.stu_code and student.stu_code >= 3 and course.cou_score >= 80;
explain sql コマンドを実行します:
show warnings コマンドを実行します:
分析: 表示警告の分析から、内部結合接続の場合、オプティマイザーによる最適化の後、on 接続条件は where! に変換されます。つまり、内部接続の where と on は
と同等です。
4. left join left join on と where
4.1 のドライバー テーブル フィルター条件
sql の違いは次のとおりです:
select * from student left join course on student.stu_code = course.stu_code where student.stu_code >= 3;
explain sql コマンドを実行します:
show warnings コマンドを実行します:
結果セット:
分析: Explain 分析から、student がドライバー テーブルとして使用されます、student.stu_code >= 3 は、テーブル全体のスキャンを実行するためのフィルター条件として使用され、その後、クエリされた各レコードの Student.stu_code (つまり、on 条件内) がフィルター条件として使用され、駆動テーブル コースでの単一テーブル クエリ。
4.2 ドライバー テーブル フィルター条件の
sql は次のとおりです:
select * from student left join course on student.stu_code = course.stu_code and student.stu_code >= 3;
explain SQL コマンドを実行します:
show warnings コマンドを実行:
## 結果セット:
分析: Explain 分析からわかるように、student はテーブル全体のスキャンを実行するドライバー テーブルとして使用され、その後、クエリされた各テーブルの Student.stu_code と Student.stu_code が使用されます。 Record are >= 3 (つまり、on 条件内) は、駆動テーブルが単一テーブル クエリを実行できるようにするフィルター条件として使用されます。現時点では、student.stu_code >= 3 はフィルターされません。ドライバー テーブルに接続する場合にのみ有効となり、クエリは一致するレコードを見つけることができず、NULL を返します。
sql は次のとおりです:
select * from student left join course on student.stu_code = course.stu_code and course.cou_score >= 80;
explain SQL コマンドを実行します:
show warnings コマンドを実行:
# ##################################
分析: Explain 分析からわかるように、テーブル全体のスキャンを実行するための駆動テーブルとして Student が使用され、クエリされた各レコードの Student.stu_code と course.cou_score は次のようになります。 on 条件の = 80 (つまり、) は、駆動テーブルが単一テーブル クエリを実行できるようにするためのフィルター条件として使用されます。
4.4 ここで、駆動テーブルのフィルター条件
sqlは次のとおりです:
explain sql コマンドを実行します:
show warnings コマンドを実行します:
結果セット:
ショーの警告の分析からですか?左結合接続が内部結合接続になりますか?
分析: show warnings 分析から、駆動テーブルの where にフィルター条件がある場合、左結合が無効になり、内部結合接続に最適化されることがわかります。したがって、 駆動テーブルのフィルター条件は、where
の代わりに配置する必要があります。
以上がMySQLテーブル接続の実行プロセスは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了mysql高级篇的一些问题,包括了索引是什么、索引底层实现等等问题,下面一起来看一下,希望对大家有帮助。

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン
