共计 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 行业资讯频道。