zvvq技术分享网

MySQL之SQL语法及SQL解析顺序源码分析(sql的解释)

作者:zvvq博客网
导读sql(structured query language)是一种标准,作为一种访问【关系型数据库的标准语言】。许多数据库产品,如oracle,db2,sql server,postgresql, mysql 都支持它。在过去几年中,nosql最初声称不

sql(structured query language)是一种标准,作为一种访问【关系型数据库的标准语言】。许多数据库产品,如oracle,db2,sql server,postgresql,mysql都支持它。在过去几年中,nosql最初声称不需要sql,但最终不得不修正为"not only sql",以便兼容sql技术。 内容来自zvvq

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

SQL语言分类

DDL

内容来自zvvq

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

DML

zvvq

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

DCL

内容来自samhan666

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

内容来自samhan666

DQL: 内容来自samhan666

数据查询语言,用来查询。如select,from,where等 本文来自zvvq

 SQL语法顺序和解析顺序

1 zvvq好,好zvvq

2

本文来自zvvq

3

zvvq

4

本文来自zvvq

5

内容来自samhan

6 copyright zvvq

7 本文来自zvvq

8

本文来自zvvq

9 内容来自zvvq,别采集哟

10

内容来自zvvq

11

zvvq

12

内容来自zvvq

13 zvvq好,好zvvq

14

内容来自zvvq

15 zvvq好,好zvvq

16

zvvq好,好zvvq

17

内容来自zvvq,别采集哟

18

内容来自samhan

19

本文来自zvvq

20

内容来自zvvq,别采集哟

21 内容来自samhan

22 内容来自zvvq

23 内容来自samhan666

24

本文来自zvvq

25

内容来自zvvq

26 内容来自zvvq

27

copyright zvvq

# 语法顺序

本文来自zvvq

SELECT DISTINCT 内容来自samhan

<select_list> 本文来自zvvq

FROM

zvvq.cn

<left_table> <join_type> zvvq

JOIN <right_table> ON <join_condition> copyright zvvq

WHERE zvvq

<where_condition> zvvq.cn

GROUP BY

内容来自samhan666

<group_by_list> zvvq好,好zvvq

HAVING

内容来自zvvq

<having_condition> 本文来自zvvq

ORDER BY

zvvq.cn

<order_by_condition>

本文来自zvvq

LIMIT <limit_number>

zvvq好,好zvvq

# 解析顺序 内容来自zvvq,别采集哟

FROM <left_table>

内容来自samhan

ON <join_condition> 内容来自zvvq,别采集哟

<join_type> JOIN <right_table>  -- 这一步和上一步,会循环执行 内容来自zvvq,别采集哟

WHERE <where_condition> -- 这一步会循环执行,多个条件从左往右

zvvq

GROUP BY <group_by_list>

内容来自zvvq,别采集哟

HAVING <having_condition>

内容来自samhan

SELECT   -- 分组之后才执行SELECT

内容来自zvvq,别采集哟

DISTINCT <select_list>

内容来自samhan

ORDER BY <order_by_condition> copyright zvvq

LIMIT <limit_number> -- 这一步是MySQL独有的语法,前面都是SQL92标准 zvvq

登录后复制

FROM

对FROM的左表和右表计算笛卡尔积,产生虚表VT1

copyright zvvq

1

zvvq好,好zvvq

select * from seller join product;

zvvq

登录后复制

zvvq好,好zvvq

ON

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

zvvq.cn

1

内容来自samhan

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

本文来自zvvq

登录后复制

内容来自samhan

OUTER JOIN

LEFT (OUTER) JOIN : 会返回左表(保留表)中全部记录以及右表中满足ON条件的记录

zvvq.cn

RIGHT (OUTER) JOIN : 同理

内容来自samhan

INNTER JOINT : 只返回左右两表中满足ON条件的记录

zvvq

若指定了OUTER JOIN(LEFT JOIN,RIGHT JOIN),那么保留表中未匹配ON条件的行,就会作为外部行,添加到虚表VT2中,形成虚表VT3。

内容来自zvvq,别采集哟

1 内容来自zvvq,别采集哟

select * from seller s right join product p on s.id = p.id; 本文来自zvvq

登录后复制

zvvq

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

WHERE

根据where条件过滤 内容来自zvvq

GROUP BY

对结果进行分组 zvvq.cn

1 内容来自zvvq,别采集哟

2 zvvq好,好zvvq

3

本文来自zvvq

4

copyright zvvq

5

内容来自samhan666

6 zvvq

7 本文来自zvvq

-- mysql 8 默认开启了 only_full_group_by

本文来自zvvq

select version(),@@sql_mode; 内容来自samhan666

-- 需要把这个选项关掉,

zvvq

set global sql_mode=&#39;STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION&#39;;

zvvq.cn

set session sql_mode=&#39;STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION&#39;;

内容来自samhan666

-- 后执行group by 正常 内容来自samhan

select * from user group by name;

zvvq好,好zvvq

登录后复制

copyright zvvq

HAVING

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

内容来自samhan

SELECT

选取指定的列 本文来自zvvq

DISTINCT

针对某列去重 内容来自zvvq

注意DISTINCT 一定要SELECT的第一列,加在后面无效

1

内容来自samhan

2

内容来自samhan666

3

zvvq好,好zvvq

4

内容来自zvvq

-- 下面无效 内容来自zvvq

select id, distinct name from user; 内容来自samhan666

-- 下面有效

zvvq好,好zvvq

select distinct name from user; 内容来自zvvq,别采集哟

登录后复制

copyright zvvq

zvvq

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

内容来自zvvq

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

ORDER BY

排序

本文来自zvvq

LIMIT

分页 copyright zvvq

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

copyright zvvq

内容来自samhan

以上就是MySQL之SQL语法及SQL解析顺序源码分析的详细内容,更多请关注php中文网其它相关文章! 本文来自zvvq