您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

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

2026/3/28 1:22:39发布14次查看
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>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 -- 分组之后才执行selectdistinct <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 joinleft (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_byselect 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解析顺序源码分析的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product