SQL语句在数据库中是怎样执行的(sql怎么执行语句)
步:应用程序把查询SQL语句发给端执行
sql查询语句的执行顺序_sql语句进行查询
sql查询语句的执行顺序_sql语句进行查询
我们在数据层执行SQL语句时,应用程序会连接到相应的数据库,把SQL语句发送给处理。
第二步:解析请求的SQL语句
SQL缓存,经常用查询分析器的朋友大概都知道这样一个事实,往往一个查询语句在次运行的时候需要执行特别长的时间,但是如果你马上或者在一定时间内运行同样的语句,会在很短的时间内返回查询结果。原因是:
在接收到查询请求后,并不会马上去数据库查询,而是在数据库中的缓存中找是否有相对应的执行。如果存在,就直接调用已经编译好的执行,节省了执行的编译时间。
如果所查询的行已经存在于数据缓冲存储区中,就不用查询物理文件了,而是从缓存中取数据,这样从内存中取数据就会比从硬盘上读取数据快很多,提高了查询效率。数据缓冲存储区会在后面提到。
如果在SQL缓存中没有对应的执行,首先会对用户请求的SQL语句进行语法效验,如果有语法错误,会结束查询作,并用返回相应的错误信息给调用它的应用程序。
注意:此时返回的错误信息中,只会包含基本的语法错误信息,例如select写成selec等,错误信息中如果包含一列表中本没有的列,此时是不会检查出来的,因为只是语法验证,语义是否正确放在下一步进行。
语法符合后,就开始验证它的语义是否正确。例如,表名、列名、存储过程等等数据库对象是否真正存在,如果发现有不存在的,就会报错给应用程序,同时结束查询。
接下来就是获得对象的解析锁,我们在查询一个表时,首先会对这个对象加锁,这是为了保证数据的统一性,如果不加锁,此时有数据插入,但因为没有加锁的原因,查询已经将这条记录读入,而有的插入会因为事务的失败会回滚,就会形成读的现象。
接下来就是对数据库用户权限的验证。SQL语句语法,语义都正确,此时并不一定能够得到查询结果,如果数据库用户没有相应的访问权限,会报出权限不足的错误给应用程序,在稍大的项目中,往往一个项目里面会包含好几个数据库连接串,这些数据库用户具有不同的权限,有的是只读权限,有的是只写权限,有的是可读可写,根据不同的作选取不同的用户来执行。稍微不注意,无论你的SQL语句写的多么完善,完美无缺都没用。
解析的一步,就是确定最终的执行。当语法、语义、权限都验证后,并不会马上给你返回结果,而是会针对你的SQL进行优化,选择不同的查询算法以效的形式返回给应用程序。例如在做表联合查询时,会根据开销成本来最终决定采用hashjoin,mergejoin,还是loopjoin,采用哪一个索引会更高效等等。不过它的自动化优化是有限的,要想写出高效的查询SQL还是要优化自己的SQL查询语句。
当确定好执行后,就会把这个执行保存到SQL缓存中,下次在有相同的执行请求时,就直接从缓存中取,避免重新编译执行。
第三步:语句执行
对SQL语句解析完成后,才会知道这条语句到底表态了什么意思,接下来才会真正的执行SQL语句。
此时分两种情况:
如果查询语句所包含的数据行已经读取到数据缓冲存储区的话,会直接从数据缓冲存储区中读取数据返回给应用程序,避免了从物理文件中读取,提高查询速度。
如果数据行没有在数据缓冲存储区中,则会从物理文件中读取记录返回给应用程序,同时把数据行写入数据缓冲存储区中,供下次使用。
说明:SQL缓存分好几种,这里有兴趣的朋友可以去搜索一下。有时因为缓存的存在,使得我们很难马上看出优化的结果,因为第二次执行因为有缓存的存在,会特别快速,所以一般都是先消除缓存,然后比较优化前后的性能表现,这里有几个常用的方法:
1DBCC
2从缓冲池中删除所有清除缓冲区。
3DBCC
4从过程缓存中删除所有元素。
5DBCC
6从所有缓存中释放所有未使用的缓存条目。
SQL2005数据库引擎会事先在后台清理未使用的缓存条目,以使内存可用于当前条目。但是,可以使用此命令从所有缓存中手动删除未使用的条目。
这只能基本消除SQL缓存的影响,目前好像没有完全消除缓存的方案,如果大家有,请指教。
执行顺序:
FROM子句返回初始结果集。
WHERE子句排除不满足搜索条件的行。
GROUPBY子句将选定的行收集到GROUPBY子句中各个值的组中。
选择列表中指定的聚合函数可以计算各组的汇总值。
此外,HAVING子句排除不满足搜索条件的行。
计算所有的表达式;
使用orderby对结果集进行排序。
查找你要搜索的字段。
sql语句的and和or怎么确定执行的先后顺序
sql语句的and和or运算符属于相同优先级,按结合性进行从左到右结合。
在一个表达式中可能包含多个有不同运算符连接起来的、具有不同数据类型的数据对象;由于表达式有多种运算,不同的结合顺序可能得出不同结果甚至出现错误运算错误,因为当表达式中含多种运算时,必须按一定顺序进行结合,才能保证运算的合理性和结果的正确性、性。
优先级从高到低依次递减,最上面具有的优先级,逗号作符具有的优先级。表达式的结合次序取决于表达式中各种运算符的优先级。优先级高的运算符先结合,优先级低的运算符后结合,同一优先级的运算符按结合性进行从左到右结合。
扩展资料:
每种同类型的运算符都有内部的运算符优先级,不同类型的运算符之间也有相应的优先级顺序。一个表达式中既可以包括相同类型的运算符,也可以包括不同类型的运算符或者函数。当多种运算符出现在同一个表达式中时,应该先按照不同类型运算符间的优先级进行运算。
各种运算符间的优先级如下:数值运算符、字符串运算符、关系运算符、逻辑运算符。可以用括号改变优先级顺序,使得括号内的运算优先于括号外的运算。对于多重括号,总是由内到外强制表达式的某些部分优先运行。括号内的运算总是先计算。
sql语句执行顺序
学习SQL语句,最重要的一点就是它的执行顺序。如果执行顺序搞不清楚,在写SQL语句时只能在试验中检测正确与否。那么SQL语句执行循序是什么呢?
SQL语句执行顺序 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。
2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。
3)视图转换,将涉及视图的查询语句转换为相应的对基表查询语句。
4)表达式转换, 将复杂的 SQL 表达式转换为较简单的等效连接表达式。
5)选择优化器,不同的优化器一般产生不同的“执行”
6)选择连接方式, ORACLE 有三种连接方式,对多表连接 ORACLE 可选择适当的连接方式。
7)选择连接顺序, 对多表连接 ORACLE 选择哪一对表先连接,选择这两表中哪个表做为源数据表。
8)选择数据的搜索路径,根据以上条件选择合适的数据搜索路径,如是选用全表搜索还是利用索引或是其他的方式。
9)运行“执行”
SQL关键字和参数描述 bind_argument
一个传递到动态SQL语句的表达式值(IN绑定),或是一个存储动态SQL语句返回值的变量(OUT绑定)。
BULK COLLECT INTO
如果使用仅当动态SQL语句可以返回多行,此子句指定一个或多个存储返回行。该子句必须有一个相应的兼容型或数组来存储动态SQL语句的查询列。
collection_name
一个声明的,用来存储动态SQL语句返回行。
dynamic_returning_clause
如果使用仅当动态SQL语句有RETURNING INTO子句,这个子句返回动态SQL语句受影响行的列值,变量或记录。该子句可以包括OUT绑定参数。
dynamic_sql_stmt
一个字符串常量,字符串变量,或表示SQL语句的字符串表达式,必须是CHAR、VARCHAR2或者CLOB类型。
host_array_name
返回行数组进行存储,该数组必须声明一个PL / SQL主机环境中,并传递给PL/ SQL绑定参数(冒号(:)前缀)
IN, OUT, IN OUT
绑定参数的参数模式,IN绑定参数传递值到动态SQL语句,OUT绑定参数存储动态SQL语句返回值。IN OUT绑定参数传递初始值到动态SQL语句,并存储动态SQL语句返回值。默认绑定参数的参数模式是IN。
INTO
当且仅当动态SQL语句是一个SELECT语句,最多可以返回一行。此子句指定变量或记录存储返回行的列值。对于每个动态SQL语句查询列,必须有相应的自定义变量兼容类型和记录兼容类型。
record_name
存储返回行的用户自定或%rowtype记录。
USING
当且仅当动态SQL语句包含占位符,指定绑定参数列表。
sql执行顺序
我们先执行from,join来确定表之间的连接关系,得到初步的数据where对数据进行普通的初步的筛选group by 分组各组。
电脑:华为MateBook14
系统:Windows10
软件:本地设置1.0MySql数据库
1、from
先确定从哪个表中取数据,所以执行from tab。存在多表连接,from tab1,tab2。可以对表加别名,方便后面的引用。
2、where
where语句是对条件加以限定,如果没有需要限定的,那就写成where 1=1,表示总为true,无附加条件。
3、group by……hing
分组语句,比如按照员工姓名分组,要就行分组的字段,必须出现在select中,否则就会报错。hing是和group by配合使用的,用来作条件限定,下面写个例子。
4、聚合函数
常用的聚合函数有max,min,count,sum,聚合函数的执行在group by之后,hing之前。如果在where中写聚合函数,就会出错。
5、select语句
选出要查找的字段,如果全选可以select 。这里选出员工姓名,所有月份的总工资数。
6、order by
排序语句,默认为升序排列。如果要降序排列,就写成order by desc。order by语句在执行,只有select选出要查找的字段,才能进行排序。
Hive SQL语句执行顺序
Hive 中 sql 语句的执行顺序如下:
from .. where .. join .. on .. select .. group by .. select .. hing .. distinct .. order by .. limit .. union/union all
下面我们通过一个 sql 语句分析下:
上面这条 sql 语句是可以成功执行的,我们看下它在 MR 中的执行顺序:
Map 阶段 :
Reduce 阶段 :
上面这个执行顺序到底对不对呢,我们可以通过 explain 执行来看下,内容过多,我们分阶段来看。
我们看到 Stage-5 是根,也就是执行 Stage-5,Stage-2 依赖 Stage-5,Stage-0 依赖 Stage-2。
图中标 ① 处是表扫描作,注意先扫描的 b 表,也就是 left join 后面的表,然后进行过滤作(图中标 ② 处),我们 sql 语句中是对 a 表进行的过滤,但是 Hive 也会自动对 b 表进行相同的过滤作,这样可以减少关联的数据量。
先扫描 a 表(图中标 ① 处);接下来进行过滤作 idno > '112233'(图中标 ② 处);然后进行 left join,关联的 key 是 idno(图中标 ③ 处);执行完关联作之后会进行输出作,输出的是三个字段,包括 select 的两个字段加 group by 的一个字段(图中标 ④ 处);然后进行 group by 作,分组方式是 hash(图中标 ⑤ 处);然后进行排序作,按照 idno 进行正向排序(图中标 ⑥ 处)。
首先进行 group by 作,注意此时的分组方式是 mergepartial 合并分组(图中标 ① 处);然后进行 select 作,此时输出的字段只有两个了,输出的行数是 30304 行(图中标 ② 处);接下来执行 hing 的过滤作,过滤出 count_user>1 的字段,输出的行数是 10101 行(图中标 ③ 处);然后进行 limit 限制输出的行数(图中标 ④ 处);图中标 ⑤ 处表示是否对文件压缩,false 不压缩。
限制最终输出的行数为 10 行。
通过上面对 SQL 执行的分析,总结以下几点: