当前位置:首页 » 编程软件 » 用编译原理知识分析sql语句

用编译原理知识分析sql语句

发布时间: 2022-06-19 00:44:05

⑴ 学习编译原理有作用

在毕业多年后我又翻出了当年的编译原理书,然后又买了一本类似的书,真是太有用了。
无论是工作上还是业余中如果想编一点稍微有一些智能的程序,必然要用到。目前大家都在用的正则表达式是用编译原理做的,那只是一个很小的应用例子。
大一点的应用可以做到一定的技术先进性,从而让你在本行业站稳脚跟。
比如
可以用语法分析来分析出一段用户上传是否含有代码,从而让你的网站更健壮。
分析和分解用户输入的sql语句,理解是否有害和是否有SQL注入。
在业务软件中结算方面允许用户输入条件表达式和四则运算,允许用户自定义结算公式或条件,使软件上一个档次。
甚至可以实现自己创造的编程语言,以后编程全用自语言来做,然后编译成老板要的那种语言。有的公司要java,有的公司要C#,C++,VB等等你都不必每样都费心了。这样做还有一个好处,你的源程序其实是自语言,目标代码则是社会上公认的源程序,所以是可以公开的。如果以这种技术为核心技术开公司的话,则有着技术上更高一层的先进性,这种核心竞争力是很值钱的。
试想,你公司的员工只会用自语言,他们跳槽的机会就少了。而你公司的用户总是可以得到全套的他们认为的源程序,则市场机会就大了。别的一般软件公司可不敢给出全套源程序,总要多少保留一点的。

⑵ 从哪些方面,sql语句性能如何分析

一段SQL代码写好以后,可以通过查看SQL的执行计划,初步预测该SQL在运行时的性能好坏,尤其是在发现某个SQL语句的效率较差时,我们可以通过查看执行计划,分析出该SQL代码的问题所在。

1、 打开熟悉的查看工具:PL/SQL Developer。
在PL/SQL Developer中写好一段SQL代码后,按F5,PL/SQL Developer会自动打开执行计划窗口,显示该SQL的执行计划。

2、 查看总COST,获得资源耗费的总体印象
一般而言,执行计划第一行所对应的COST(即成本耗费)值,反应了运行这段SQL的总体估计成本,单看这个总成本没有实际意义,但可以拿它与相同逻辑不同执行计划的SQL的总体COST进行比较,通常COST低的执行计划要好一些。

3、 按照从左至右,从上至下的方法,了解执行计划的执行步骤
执行计划按照层次逐步缩进,从左至右看,缩进最多的那一步,最先执行,如果缩进量相同,则按照从上而下的方法判断执行顺序,可粗略认为上面的步骤优先执行。每一个执行步骤都有对应的COST,可从单步COST的高低,以及单步的估计结果集(对应ROWS/基数),来分析表的访问方式,连接顺序以及连接方式是否合理。

4、 分析表的访问方式
表的访问方式主要是两种:全表扫描(TABLE ACCESS FULL)和索引扫描(INDEX SCAN),如果表上存在选择性很好的索引,却走了全表扫描,而且是大表的全表扫描,就说明表的访问方式可能存在问题;若大表上没有合适的索引而走了全表扫描,就需要分析能否建立索引,或者是否能选择更合适的表连接方式和连接顺序以提高效率。

5、 分析表的连接方式和连接顺序
表的连接顺序:就是以哪张表作为驱动表来连接其他表的先后访问顺序。
表的连接方式:简单来讲,就是两个表获得满足条件的数据时的连接过程。主要有三种表连接方式,嵌套循环(NESTED LOOPS)、哈希连接(HASH JOIN)和排序-合并连接(SORT MERGE JOIN)。我们常见得是嵌套循环和哈希连接。
嵌套循环:最适用也是最简单的连接方式。类似于用两层循环处理两个游标,外层游标称作驱动表,Oracle检索驱动表的数据,一条一条的代入内层游标,查找满足WHERE条件的所有数据,因此内层游标表中可用索引的选择性越好,嵌套循环连接的性能就越高。
哈希连接:先将驱动表的数据按照条件字段以散列的方式放入内存,然后在内存中匹配满足条件的行。哈希连接需要有合适的内存,而且必须在CBO优化模式下,连接两表的WHERE条件有等号的情况下才可以使用。哈希连接在表的数据量较大,表中没有合适的索引可用时比嵌套循环的效率要高。

⑶ 关于编译原理的学习

在未来的几年大学毕业后,我挖了一个编译器的理论书籍,然后买了一本类似的书,真正有用的。
无论是工作还是业余的,如果你要编译一个点稍微有一些智能的程序必须使用。大家都用正则表达式编译原理,它仅仅是一个小的应用实例。
应用程序可以做一些先进的技术,让您在行业中站稳脚跟。

语法分析可以用来分析它是否包含一些用户上传的代码,使您的网站更可靠。
分析和分解用户输入的SQL语句,了解它是否是危险和SQL注入。
结算业务软件允许用户输入条件表达式和四则运算,允许用户自定义结算公式或条件,使软件上了一个档次。
甚至可??以创建自己的编程语言,由于语言做编程后充分利用,然后编译成一个老板是什么样的语言。有些公司希望一些公司希望JAVA,C#,C + +,VB,等你并不需要各种麻烦。这样做还有一个好处,你因为语言对象的源代码是公认的开源社区,这样你就可以打开。然后,如果这项技术为核心技术,以开公司,具有技术上的先进性这个核心竞争力的更高水平的,是非常有价值的。
想象一下,您的公司的员工只有自我的语言,少的机会,他们就放弃了。你的用户总是可以得到一套完整的源代码,他们认为市场的机会是很大的。其他通用软件公司能不能给一套完整的源代码,始终保持那么一点点。

⑷ java解析sql语句是实现不了的

这个需要用到编译原理的知识,理论上,既然dbms可以解析,那我们当然可以实现。
不过比较、很、太难实现而已。
并且不同数据库、不同版本的语法结构还不一样,又进一步增加了难度

⑸ SQL语句讲解

DECLARE @dtDate DATETIME //定义日期型的局部变量
SET @dtDate = DateAdd(dd, -50 , GetDate() ) //对刚定义好的局部变量赋值。

1. 当前系统日期、时间
select getdate()

2. dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值
例如:向日期加上2天
select dateadd(day,2,'2004-10-15') --返回:2004-10-17 00:00:00.000

3. datediff 返回跨两个指定日期的日期和时间边界数。
select datediff(day,'2004-09-01','2004-09-18') --返回:17

4. datepart 返回代表指定日期的指定日期部分的整数。
SELECT DATEPART(month, '2004-10-15') --返回 10

5. datename 返回代表指定日期的指定日期部分的字符串
SELECT datename(weekday, '2004-10-15') --返回:星期五

6. day(), month(),year() --可以与datepart对照一下

⑹ SQL语句解释,详细点……

BEGIN
declare @StartIndex int,@Length int -- 这里定义两个整形变量

set @StartIndex = CharIndex(ltrim(@BeginStr),ltrim(@Source),0) + len(@BeginStr)
--上面这句找出@beginStr在@source中出现的位置,并加上@BeginStr的长度,其结果存入@StartIndex这个变量中
if CharIndex(ltrim(@BeginStr),ltrim(@Source),0) <= 0 Begin
return ''
end -- 如果@BeginStr没有出现在@Source中,返回空字符串,不再执行下面的语句
if ltrim(rtrim(@EndStr)) = ''
set @Length = len(ltrim(@Source))-@StartIndex +5
-- 如果@EndStr = '',@source的长度-上面计算出的@StartIndex的值+5存入@Length这个变量中
else
set @Length = CharIndex(ltrim(@EndStr),ltrim(@Source))-@StartIndex
--否则@EndStr在@Source字串中出现的位置 - 上面计算出的@StartIndex的值存入@Length这个变量中

if(@Length<0) Begin
set @Length = 0 --这个就好懂了
End

return substring(ltrim(@Source),@StartIndex,@Length)
--返回一个字符串,值为:截取@Source这个字串中第@StartIndex开始,长度为@Length
END

⑺ 请问编译原理中什么叫完成词法分析,语法分析

以你说的SQL语句为例,词法分析是将语句中的单词流识别出来,比如create table Student 词法分析是分析出 这句的单词流是 “create” “table” “identifier”(前提是你给它们编号 比如用宏或者枚举),然后语法分析 是通过单词流 判断 非逻辑错误 比如 有不能识别的符号 create table后面不是标示符等等 语义分析是分析语句的逻辑关系 比如字段长度越界什么的如 vchar(2) 你赋值为“啊啊啊啊啊啊”这种错误的识别是语义分析阶段完成的 希望能帮到你

⑻ sql语句分析。(名牌大学考试题)

首先要说,这些语法都是基于SQLSERVER数据库的语法,DATEDIFF TOP等,在ORACLE等其他数据库是没有的。
1. 主要是datediff函数的用法,获取两个日期之间的时间差,可以得到年月日小时分秒等等,可以参看这个函数的说明。
这里第一个参数表示获取时间差的类型,minute表示获取两个日期的时间差是分钟。
第二个参数是起始时间,第二个是截止时间,都是datetime类型。
getdate(),获取当前时间的函数。
我觉得你这个语句写的有问题。第一,参数minute,不需要使用单引号,如果使用了单引号,参数就错误了,因为datediff第一个参数不是字符型的。
第二,datediff的函数第二个日期是开始时间,第二个是结束时间,你这个正好反了。
SQL: select * from 日程安排 where datediff(minute,f开始时间,getdate())>5
这个的意思是当前时间已经超过了开始时间5分钟的,会显示出来,而不是提前5分钟提醒。
提前五分钟提醒:SQL: select * from 日程安排 where datediff(minute,getdate(), f开始时间) < 5
距离当前时间小于5分钟的记录,才是提前5分钟提醒。

2.
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段= a.主键字段 order by a.排序字段

先看from括号内的语句:select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc,按照排序字段降序排列取出前20行数据。
然后再整体看,把表和这个20行数据关联,那么能取到的最大范围也就是这20行了。
然后取出前10行,我不知道这个为什么叫做分页查询,因为根本没有每页多少行以及第几页的参数在。这个语句就是按照排序字段倒叙排列的前20行,然后在按照排序字段正序排列从这前20行中取出前10行。实际上就是取出了按照排序字段倒叙排列的第11-20行的数据并正序排列。

3.内连接:实际上就是两表直接连接,取出连接成立的所有数据。语法使用Inner join
距离:有学生表:student : student_id , student_name
001 张三
002 李四
003 王五
成绩表: score : course_id student_id score
课程1 001 85
课程2 001 85
课程1 002 80
课程2 002 90
查询学生选课成绩,显示 student_name, course_id, score
select a.student_name, b.course_id, b.score
from student a inner join score b on a.student_id = b.student_id
查询结果 student_name, course_id, score
张三 课程1 85
张三 课程2 85
李四 课程1 80
李四 课程2 90
可以看到,直接符合连接条件的数据,都会被选择出来,而王五,因为在成绩表没有成绩,所以查询结果并没有王五的数据。

4.外连接,left join, right join,分别是左外连接和右外连接。
就是以一个表为主,而另一个表为辅。主表的数据都会被查询出来,而符合两表连接条件,那么辅表的数据就会显示,否则,为空(NULL)
还以上表和上述语句为例,查询所有学生的成绩清单,没有成绩显示空,但是学生要显示。
select a.student_name, b.course_id, b.score
from student a left join score b on a.student_id = b.student_id

查询结果:
student_name course_id score
张三 课程1 85
张三 课程2 85
李四 课程1 80
李四 课程2 90
王五 NULL NULL

可以看到,虽然连接条件王五这条并不成立,但是王五的数据一样会被显示出来,只是成绩表的相关数据位空。
有连接和左连接一样,把上面的顺序换过来,效果相同
select a.student_name, b.course_id, b.score
from score b right join student a on a.student_id = b.student_id

⑼ 分析SQL语句

分开来看。
首先从from的后面看起,这样就可以看到两个别名 a 跟 b
a就不用我多说了,就是一个表。b呢其实就是一个查询出来的结果,一个结果集,你可以简单的认为别名为b的查询结果就是一个只有 adddate 字段的一个表 select max(adddate) adddate from table where table.title=a.title ,这个表示取table表中同一个title的adddate的最大值。
最后,查询出来的结果,应该 title是唯一的

⑽ sql 语句讲解

charindex('-',bh)表示获取字段bh中-的位置,比如字段内容为13-11,那么返回的结果就是3

left(bh, charindex('-',bh)-1)表示获取字段bh中-前面的部分,比如字段内容为13-11,返回的结果就是13

convert(int, left(bh, charindex('-',bh)-1))表示把字段bh中-前面的部分转换为数值类型。在ORDER BY 里面,把字段转换为数值类型,能把9排在13的前面,如果不转换,9会排在13的后面,因为字符比较是从左到右的。

排序的次关键字convert(int, right(bh, charindex('-',bh)+4))好象是错的,比如对于字段内容为13-11,那么charindex('-',bh)的结果是3,right(bh, charindex('-',bh)+4)就表示获取它右边的7位,明显错误。应该修改为:
right(bh, length(bh)-charindex('-',bh)+1)

假设length(bh)表示bh字段的长度,如果你的系统函数名称有变化,请使用相应的函数。

热点内容
汽车小组件怎么弄到安卓桌面 发布:2025-05-16 13:51:12 浏览:218
linuxg编译器下载 发布:2025-05-16 13:50:58 浏览:775
centosc编译器 发布:2025-05-16 13:50:17 浏览:947
安卓手机如何变换桌面 发布:2025-05-16 13:39:33 浏览:514
sql存储过程命令 发布:2025-05-16 13:17:54 浏览:145
用纸做解压小玩具西瓜 发布:2025-05-16 13:04:09 浏览:935
局域网xp无法访问win7 发布:2025-05-16 13:03:58 浏览:942
油卡如何修改密码 发布:2025-05-16 13:00:35 浏览:901
安卓手机如何拼照片 发布:2025-05-16 12:58:23 浏览:374
深入浅出python 发布:2025-05-16 12:56:52 浏览:655