當前位置:首頁 » 編程軟體 » 用編譯原理知識分析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欄位的長度,如果你的系統函數名稱有變化,請使用相應的函數。

熱點內容
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
國二c語言vc2010怎麼編譯運行 發布:2025-05-16 12:53:49 瀏覽:424
華為熱點哪裡看密碼 發布:2025-05-16 12:53:44 瀏覽:515
新手如何用java寫安卓app 發布:2025-05-16 12:53:07 瀏覽:402
虛榮掛腳本 發布:2025-05-16 12:50:44 瀏覽:480