MySQL学习之SQL语法及SQL解析顺序

目录
  • SQL语言分类
  • SQL语法顺序和解析顺序
  • FROM
  • ON
  • OUTER JOIN
  • WHERE
  • GROUP BY
  • HAVING
  • SELECT
  • DISTINCT
  • ORDER BY
  • LIMIT

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   -- 分组之后才执行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学习之QL语法及SQL解析顺序的文章就介绍到这了,更多相关SQL语法及解析顺序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mysql insert 存在即不插入语法说明

    目录 insert 存在即不插入语法 介绍三种方式 第一种:replace into 第二种:DUAL临时表 第三种:根据主键判断 效果区别 已有数据存在则不插入,否则则修改 用法 insert 存在即不插入语法 介绍三种方式 第一种:replace into replace into table(id, name) values(1, '张三') ; /*或者*/ replace into table(id, name) select 1, '张三' ; replace into 跟 inse

  • Mysql数据库存储过程基本语法讲解

    drop procedure sp_name// 在此之前,小编给大家讲述过MYSQL语法的基本知识,本篇内容,小编通过下面的一个实例,给读者们通过实战中的代码讲解一下基本语法的知识. 一般情况下MYSQL以:结尾表示确认输入并执行语句,但在存储过程中:不是表示结束,因此可以用该命令将:号改为//表示确认输入并执行.存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. 一.创建存储过程 1.基本语法: create procedure sp_name() be

  • Mysql语法、特殊符号及正则表达式的使用详解

    Mysql常用显示命令 1.显示当前数据库服务器中的数据库列表: mysql> SHOW DATABASES; 注意:mysql库里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作. 2.进入数据库: mysql> USE 库名: 2.显示数据库中的数据表: mysql> SHOW TABLES; 3.显示数据表的结构: mysql> DESCRIBE 表名; 4.建立数据库: mysql> CREATE DATABASE 库名; 5.建立数据表:

  • 关于Mysql update修改多个字段and的语法问题详析

    在MySQL里面update一条记录,语法都正确的,但记录并没有被更新... 问题语句 执行之前的记录是这样的: 执行之后的记录是这样的: 可以看到,实际上是有效果的: why? 看起来,语法是完全没有问题,MySQL官方文档的update语法: 看到assignment_list的格式是以逗号分隔的col_name=value列表,一下子豁然开朗,开发同学想要的多字段更新语句应该这样写: 小结:在一条UPDATE语句中,如果要更新多个字段,字段间不能使用"AND",而应该用逗号分隔.

  • MySQL存储过程及语法详解

    目录 1. 存储过程基本用法 1.1 概念 1.2 创建存储过程 1.2.1 语法格式 2.2.2 语法介绍 1.3 调用存储过程 1.4 查看存储过程 1.5 删除存储过程 2. 存储过程中的语法结构 2.1 变量的声明以及赋值 2.1.1 DECLARE 声明变量 2.1.2 SET 变量赋值 2.1.3 select...into 赋值 2.2 条件判断 2.2.1 if条件判断 2.3 传递参数 2.3.1 IN - 输入参数 2.3.2 out - 输出参数 2.4 case 结构 2

  • MySQL学习之SQL语法及SQL解析顺序

    目录 SQL语言分类 SQL语法顺序和解析顺序 FROM ON OUTER JOIN WHERE GROUP BY HAVING SELECT DISTINCT ORDER BY LIMIT SQL(Structured Query Language)是一种标准,作为一种访问[关系型数据库的标准语言].许多数据库产品,如Oracle,DB2,SQL Server,PostgreSQL,MySQL都支持它.近几年的NoSQL最初是宣称不再需要SQL,后来也不得不修正为Not Only SQL,来拥

  • SQL语句执行深入讲解(MySQL架构总览->查询执行流程->SQL解析顺序)

    前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来探讨一下其中的知识. 一.MySQL架构总览: 架构最好看图,再配上必要的说明文字. 下图根据参考书籍中一图为原本,再在其上添加上了自己的理解. 从上图中我们可以看到,整个架构分为两层,上层是MySQLD的被称为的'SQL Layer',下层是各种各样对上提供接口的存储引擎,被称为'Storage Engin

  • MySQL系列之四 SQL语法

    目录 一.SQL语言的简介和规范 二.数据库操作 1.创建库 2.删除库 3.查看数据库列表 三.表操作 1.创建表 2.修改表 3.删除表 4.查看表 四.DML: 数据操作语言 1.INSERT 插入数据 2.UPDATE 修改数据 3.DELETE 删除数据 五.SELECT:数据查询 六.多表查询 1.交叉连接 2.内连接 3.外连接 4.完全外连接 5.自连接 七.子查询 八.数据类型 1.数值型 2.字符型 3.日期时间型 4.布尔型 总结 一.SQL语言的简介和规范 ​ 是一种特定

  • MySQL 最基本的SQL语法/语句

    DDL-数据定义语言(Create,Alter,Drop,DECLARE) DML-数据操纵语言(Select,Delete,Update,Insert) DCL-数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句: 1.说明:创建数据库 Create DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 备份数据的 device USE mas

  • 查询mysql中执行效率低的sql语句的方法

    一些小技巧1. 如何查出效率低的语句?在MySQL下,在启动参数中设置 --log-slow-queries=[文件名],就可以在指定的日志文件中记录执行时间超过long_query_time(缺省为10秒)的SQL语句.你也可以在启动配置文件中修改long query的时间,如: 复制代码 代码如下: # Set long query time to 8 seconds    long_query_time=8 2. 如何查询某表的索引?可使用SHOW INDEX语句,如: 复制代码 代码如下

  • MySql中如何使用 explain 查询 SQL 的执行计划

    explain命令是查看查询优化器如何决定执行查询的主要方法. 这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,值得花时间去了解,因为可以学习到查询是如何执行的. 1.什么是MySQL执行计划 要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有简单的了解. MySQL本身的功能架构分为三个部分,分别是 应用层.逻辑层.物理层,不只是MySQL ,其他大多数数据库产品都是按这种架构来进行划分的. 应用层,主要负责与客户端进行交互,建立链接,记住链接状态,

  • MyBatis执行Sql的流程实例解析

    这篇文章主要介绍了MyBatis执行Sql的流程实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本博客着重介绍MyBatis执行Sql的流程,关于在执行过程中缓存.动态SQl生成等细节不在本博客中体现,相应内容后面再单独写博客分析吧. 还是以之前的查询作为列子: public class UserDaoTest { private SqlSessionFactory sqlSessionFactory; @Before public v

  • mysql将bin-log日志文件转为sql文件的方法

    查看mysqlbinlog版本 mysqlbinlog -V [--version] 查看binlog日志开启状态 show variables like '%log_bin%'; mysql打开bin-log日志后,mysql数据库的非查询操作会将记录保存到bin-log文件中.一般bin-log日志文件不能打开查看的,需要用到mysql的工具进行.假设/mysql/data/目录中存放着二进制文件mysql-bin.000011.需要将日志文件mysql-bin.000011中关于数据库ti

  • MyBatis动态SQL实现配置过程解析

    动态SQL 什么是动态SQL: ​ 动态SQL就是根据不同的条件生成不同的SQL语句 if choose(when,otherwise) trim(where,set) foreach 1.搭建环境 建表 CREATE TABLE `bolg`( `id` VARCHAR(50) NOT NULL COMMENT '博客id', `title` VARCHAR(100) not null comment '博客标题', `author` VARCHAR(30) not null comment

  • SQL语法CONSTRAINT约束操作详情

    CONSTRAINT约束,即对数据库表中的数据进行约束,以保证数据记录的完整性和有效性. 比较常用的是,创建表时添加约束,但是为了整理记录,这里把所有的用法都写下来,但是大家按照最常见的重点掌握. 1.主键约束 primary key #主键约束 primary key #添加主键 添加后系统会默认为对应的列添加索引 提高检索速度  #方法一(单列主键):id int PRIMARY KEY //方法一是创建表时 当前定义字段后 方法二是创建表时 所有定义字段后 #方法二(单|多列主键):CON

随机推荐