Sql的执行过程说明
更新时间:2023-10-30SQL执行过程简介
SQL(Structured Query Language)是一种用于管理关系型数据库的标准语言,其执行过程可分为编译阶段和执行阶段。
编译阶段的主要任务是将SQL语句转换为数据库可执行的执行计划,包括语法分析、词法分析、语义分析、查询重写、优化器生成执行计划等步骤。
SELECT * FROM table WHERE id = 1;
如上述SQL语句,编译阶段将对其进行解析,分析其语法及语义,转换为以下执行计划:
Operation Name Row Source Cost ------------------ ---------------- ---------------- SELECT STATEMENT 2 TABLE ACCESS TABLE "SCOTT"."EMP" 2 INDEX UNIQUE "SCOTT"."PK_EMP" 1
执行阶段的主要任务是按照编译阶段生成的执行计划从数据库中检索数据,并将结果返回给用户或其他程序。
SQL编译阶段具体步骤
SQL编译阶段包括以下几个具体步骤:
语法分析
将SQL语句的单词序列按照语法规则转换为抽象语法树(AST),并进行语法检查。
SELECT * FORM table WHERE id = 1;
如上述SQL语句,因为FORM关键字拼写错误,因此在语法分析阶段就会被拦截。
词法分析
将SQL语句的单词序列转换为标记(token),并进行词法检查。
SELECT * FROM table WHERE id = 1';
如上述SQL语句,在词法分析阶段会检测到字符串常量末尾缺少单引号,因此会报错。
语义分析
检查SQL语句的各个部分是否符合语义要求,包括表、列名等的解析,以及权限检查等。
SELECT salary FROM employees WHERE department_id = 10;
如上述SQL语句,语义分析会检查employees表是否包含salary列,以及当前用户是否有查询该表的权限。
查询重写
对SQL语句进行等效转换,以优化执行计划。
SELECT * FROM employees WHERE department_id = 10 AND salary > 5000;
如上述SQL语句,查询重写可将其转换为以下等效 SQL 语句:
SELECT * FROM employees WHERE department_id = 10 INTERSECT SELECT * FROM employees WHERE salary > 5000;
优化器生成执行计划
根据查询重写后的 SQL 语句和数据库当前状态,生成查询执行计划,包括选择索引、创建子查询、表连接等操作,以在执行阶段高效地检索数据。
SELECT * FROM employees WHERE salary > 5000;
如上述SQL语句,在优化器生成执行计划时可选择适合该查询的索引(如salary 索引),以提高查询效率。
SQL执行阶段具体步骤
SQL执行阶段包括以下几个具体步骤:
连接数据库
建立与数据库之间的连接。
$conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); }
执行SQL语句
执行编译阶段生成的 SQL 执行计划,并检索相关的数据。
$sql = "SELECT * FROM employees WHERE department_id = 10"; $result = $conn->query($sql); if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { echo "Name: " . $row["first_name"]. " " . $row["last_name"]. "
"; } } else { echo "0 results"; }
解析结果
将执行阶段检索到的结果集解析为程序可用的格式。
$sql = "SELECT * FROM employees WHERE department_id = 10"; $result = $conn->query($sql); if ($result->num_rows > 0) { $employees = array(); while($row = $result->fetch_assoc()) { $employee = array( "name" => $row["first_name"]. " " . $row["last_name"], "hire_date" => $row["hire_date"], "salary" => $row["salary"] ); $employees[] = $employee; } } else { $employees = array(); }
关闭连接
结束与数据库的连接。
$conn->close();
总结
SQL执行过程分为编译阶段和执行阶段。其中编译阶段主要任务是将SQL语句转换为数据库可执行的执行计划,而执行阶段主要任务是按照执行计划从数据库中检索数据,并将结果返回给用户或其他程序。在编译阶段,SQL执行过程依次经历了语法分析、词法分析、语义分析、查询重写和优化器生成执行计划等步骤;在执行阶段,SQL执行过程依次经历了连接数据库、执行SQL语句、解析结果和关闭连接等步骤。