MySQL之SQL语法及SQL解析顺序源码分析

58次阅读
没有评论

共计 2280 个字符,预计需要花费 6 分钟才能阅读完成。

这篇“MySQL 之 SQL 语法及 SQL 解析顺序源码分析”文章的知识点大部分人都不太理解,所以丸趣 TV 小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL 之 SQL 语法及 SQL 解析顺序源码分析”文章吧。

SQL(Structured Query Language)是一种标准,作为一种访问【关系型数据库的标准语言】。许多数据库产品,如 Oracle,DB2,SQL Server,PostgreSQL,MySQL 都支持它。近几年的 NoSQL 最初是宣称不再需要 SQL,后来也不得不修正为 Not Only SQL,来拥抱 SQL。

目前比较典型的版本是 SQL 92 标准。包括 MySql 在内的其他数据库,在 SQL 92 或 SQL 99 这些标准基础之上,还扩展了一些自己的 SQL 语句,如 MySQL 中的 limit 关键字。

SQL 语言分类

DDL

数据定义语言,用来定义数据库对象,数据库,表,列等。如 create,alter,drop 等

DML

数据操作语言,用来对数据库中的表的记录进行更新。如 insert,update,delete 等

DCL

数据控制语言,用来定义数据库的访问权限,安全级别等。如 grant 等

DQL:

数据查询语言,用来查询。如 select,from,where 等

 SQL 语法顺序和解析顺序

#  语法顺序
SELECT DISTINCT
 select_list 
 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;

ON

产生虚表 VT1 后,通过 ON 关键字进行筛选,只有符合 join_condition 条件的才会被筛选到虚表 VT2

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

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;

若 FROM 子句,包含不止 2 个表,则会对上一个 join 连接产生的结果 VT3,和下一个表重复执行上面的步骤

WHERE

根据 where 条件过滤

GROUP BY

对结果进行分组

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

HAVING

对分组的结果,进行 having 条件过滤

SELECT

选取指定的列

DISTINCT

针对某列去重
注意 DISTINCT 一定要 SELECT 的第一列,加在后面无效

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

distinct 后加多列,则是将多列拼接在一起来去重

若想根据某一列去重,并显示出整行的数据,可以用 GROUP BY

ORDER BY

排序

LIMIT

分页

注意:对于 select 中的列的别名,只有在 order by 中才能使用,由上面的 SQL 解析顺序可知

以上就是关于“MySQL 之 SQL 语法及 SQL 解析顺序源码分析”这篇文章的内容,相信大家都有了一定的了解,希望丸趣 TV 小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-13发表,共计2280字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)