ホームページ  >  記事  >  データベース  >  MySQL SQL 構文と SQL 解析シーケンスのソース コード分析

MySQL SQL 構文と SQL 解析シーケンスのソース コード分析

王林
王林転載
2023-05-29 10:34:131558ブラウズ

SQL (Structured Query Language) は、[リレーショナル データベース] にアクセスするための標準言語として標準です。 Oracle、DB2、SQL Server、PostgreSQL、MySQL などの多くのデータベース製品がサポートしています。過去数年間、NoSQL は当初 SQL を必要としないと主張していましたが、最終的には SQL テクノロジと互換性を持たせるために「Not Only SQL」に修正する必要がありました。

現在の一般的なバージョンは SQL 92 標準です。 MySql を含む他のデータベースも、MySQL の limit キーワードなど、SQL 92 または SQL 99 の標準に基づいて独自の SQL ステートメントの一部を拡張しています。

SQL 言語分類

  • DDL

    データベース オブジェクト、データベース、テーブル、列などを定義するために使用されるデータ定義言語。作成、変更、削除など。

  • DML

    データ操作言語は、データベース内のテーブルのレコードを更新するために使用されます。挿入、更新、削除など。

  • DCL

    データ制御言語は、データベースのアクセス許可、セキュリティ レベルなどを定義するために使用されます。 Grant など。

  • DQL:

    クエリに使用されるデータ クエリ言語。 select、from、where など。

SQL 構文の順序と解析順序

# 语法顺序
SELECT DISTINCT
	<select_list>
FROM
	<left_table> <join_type>
JOIN <right_table> ON <join_condition>
WHERE
	<where_condition>
GROUP BY
	<group_by_list>
HAVING
	<having_condition>
ORDER BY
	<order_by_condition>
LIMIT <limit_number>

# 解析顺序
FROM <left_table>
ON <join_condition>
<join_type> JOIN <right_table>  -- 这一步和上一步,会循环执行
WHERE <where_condition> -- 这一步会循环执行,多个条件从左往右
GROUP BY <group_by_list>
HAVING <having_condition>
SELECT   -- 分组之后才执行SELECT
DISTINCT <select_list>
ORDER BY <order_by_condition>
LIMIT <limit_number> -- 这一步是MySQL独有的语法,前面都是SQL92标准

FROM

左のテーブルと右のテーブルを計算します。 FROMデカルト積、仮想テーブル VT1

select * from seller join product;

MySQL SQL 構文と SQL 解析シーケンスのソース コード分析

##ON

仮想テーブル VT1 を生成した後、ON キーワードでフィルタリングします。 match 条件は仮想テーブル VT2

select * from seller s join product p on s.id = p.id;

MySQL SQL 構文と SQL 解析シーケンスのソース コード分析

#OUTER JOIN

  • LEFT (OUTER) JOIN: にフィルタリングされます。左側のテーブル (保持テーブル) のすべてのレコードと、ON 条件を満たす右側のテーブルのレコードを返します

  • RIGHT (OUTER) JOIN: 同じ原則

  • INNTER JOINT: 左右のテーブルで ON 条件を満たすレコードのみを返します。

  • # OUTER JOIN (LEFT JOIN、RIGHT JOIN) が指定されている場合、 ON 条件に一致しないテーブル内のレコードは保持され、その行は仮想テーブル VT2 に外部行として追加され、仮想テーブル VT3 が形成されます。
select * from seller s right join product p on s.id = p.id;

MySQL SQL 構文と SQL 解析シーケンスのソース コード分析FROM 句に 3 つ以上のテーブルが含まれている場合、前の結合接続によって生成された結果 VT3 と次のテーブルに対して上記の手順が繰り返されます

WHERE

where 条件に基づいてフィルタリングします

GROUP BY

結果をグループ化します

-- mysql 8 默认开启了 only_full_group_by
select version(),@@sql_mode;
-- 需要把这个选项关掉,
set global sql_mode=&#39;STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION&#39;;
set session sql_mode=&#39;STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION&#39;;
-- 后执行group by 正常
select * from user group by name;

MySQL SQL 構文と SQL 解析シーケンスのソース コード分析HAVING

条件を指定してグループ化された結果をフィルタリングします。

SELECT

指定した列を選択します。

DISTINCT

特定の列を重複排除します。

注意してください。 DISTINCT は SELECT の最初の列である必要があります。後に追加することは無効です。

-- 下面无效
select id, distinct name from user;
-- 下面有效
select distinct name from user;

MySQL SQL 構文と SQL 解析シーケンスのソース コード分析

MySQL SQL 構文と SQL 解析シーケンスのソース コード分析 DISTINCT の後に複数の列を追加する場合、スプライシング複数の列をまとめて重複を削除します

#特定の列に基づいて重複を削除し、データの行全体を表示したい場合は、GROUP BYMySQL SQL 構文と SQL 解析シーケンスのソース コード分析## を使用できます。 # ORDER BY

Sort

LIMIT

Paging

注: select の列のエイリアスは、上に示したように order by でのみ使用できます。 SQL 解析シーケンスを知ることができます

#

以上がMySQL SQL 構文と SQL 解析シーケンスのソース コード分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。