Structured Query Language:結構化查詢語言。用於查詢關聯式資料庫的語言。
不要誤以爲pgSQL
|| mySQL
== SQL
, 前兩者是以SQL為準則的資料庫管理系統廠商,SQL
本身已經是一種標準了,也是第四代的程式語言。最簡單基礎的說明便是SQL
是查詢資料庫資料的語言。
DBMS
資料庫管理系統(英語:database management system)。DBMS
+DB
的部分就為常見的一家家廠商pg
、my
等,所以在問該學pgSQL
還是mySQL
都其實是在問,該用哪一家SQL
的廠商,當然各廠商之間,函式語法有一點差異及功能上各有優點。
維基百科,自由的百科全書。
是對不同於傳統的關聯式資料庫的資料庫管理系統的統稱。NoSQL
就不是指程式語言或標準喔~
SQL
系統的資料庫長得會有點像。
ID | name | role | IQ |
---|------|
01 | 大明 | 戰士 | 120|
02 | 小明 | 法師 | 120|
03 | 小美 | 偵查 | 120|
NoSQL
以最常用的Key-Value Database
來看則像。
(:key => 01_name, :value => 小明)
(:key => 02_role, :value => 法師)
(:key => 03_IQ, :value => 120)
或常常看到的.json
檔案。
也並不是說NoSQL
的系統就不允許有關聯性資料庫,還是可以有,但是最大的不同點在於,NoSQL
可以處理分散式的資料。
SQL
由於是關聯性資料庫,資料明顯標準化,雖DBMS
間有所差異,但是了解標準後,跳換使用不同DBMS
也不會有太大不適應。NoSQL
能處理較零散的資料,犧牲了明顯關聯性,但提高彈性與效能,比較新
,新的就是潮
!
實話說,不是選SQL
或NoSQL
,要為自己的專案選擇適合的DB
種類,SQL
1986年成為美國國家標準學會的一項標準,只從這個時間點算也已經30年,用SQL
的資料庫大多有著資料一致性,關聯性明確,安全性較高(比較級)的優點,Rails
框架中Active Record
也很明顯較適合SQL
(這句廢話,基本query都是翻譯成SQL),雖然我一直認為SQL
是我的弱項,但如果只是查找一些資本資料或簡單關聯性,會大概20~30個SQL
語法,可能各DBMS
都可以去使用了。CP值比較高
NoSQL
由於目前沒有明確標準語言,各廠商間的系統會有很大的差異,例如可能選擇mongo
再換Dynamo
基本上是等於重新學另一種軟體的使用方式(兩者需要不同套件與函式)。
SQL
會了,再選擇一種NoSQL
來練習,這樣最潮
一樣不會講SQL
教學與安裝DBMS
部分,但真的可以先從這兩個網站開始上手,初期非常足夠。
https://www.w3schools.com/sql/sql_distinct.asp
https://www.w3school.com.cn/index.html
不是會了Active Record Query
就不用學SQL
....
SQL
面試題1.NoSQL
與傳統DBMS
差異?
前面所說的就是了。
2.SQL injection
?
最簡單的理解:攻擊者可以對網站輸入SQL
語法讓網站去操作,例如輸入DROP TABLE table_nam
....
通常有三種類型:Authorization Bypass
Injecting SQL Sub-Statements into SQL Queries
Exploiting Stored Procedures
。其中以Injecting SQL Sub-Statements into SQL Queries
最為常見及需防範部分。
在Rails
中就有內建的防範措施,於Rails Guides
就有專門的資料介紹。
https://guides.rubyonrails.org/security.html#sql-injection
Thanks to clever methods, this is hardly a problem in most Rails applications. However, this is a very devastating and common attack in web applications, so it is important to understand the problem.
另外開頭也示範了三種攻擊方式的原理,例如解決Authorization Bypass
。
可以看到Authorization Bypass
示範中,在我們查找用戶帳號密碼的query
如果是寫這樣。
User.first("login = '#{params[:name]}' AND password = '#{params[:password]}'")
如果攻擊者輸入'OR '1'='1 作為名稱,並輸入'OR '2'>'1 作為密碼,則會生成下面的SQL語法
SELECT * FROM users WHERE login = '' OR '1'='1' AND password = '' OR '2'>'1' LIMIT 1
利用到了OR
把原本要輸入的資料,變成1=1
與2>1
成為條件之一,兩個都是true
選項。
Rails
的對策便是有內置的SQL
字符過濾功能,可以把'
、"
、NULL
或換行轉譯,其實用find
和find_by
都會有這功能,但在其中有where
這類查詢語法時,還是需手動操作,讓用戶輸入受檢查
過的資料而不是讓用戶直接輸入例如:
以下是在我們自己的Query
該怎麼寫。
正確的
Model.where("login = ? AND password = ?", entered_user_name, entered_password)
錯誤的
Model.where("login = #{user_name} AND password = #{password}"
3.primary key
& foreign key
?
primary key
常翻譯主要索引條件(鍵),常有解釋是資料表上某一欄位的值,但重點是這些值是要在整張資料表上唯一的,例如我上面畫得很醜的這個。
ID | name | role | IQ | s_id
---|------|
01 | 大明 | 戰士 | 120| 001
02 | 小明 | 法師 | 120| 002
03 | 小美 | 偵查 | 120| 003
當中只有id
或s_id
適合當作primary key
,id
又比s_id
適合,畢竟id
是內建,即使刪除資料後新建,慣例上不會用舊的id
,會繼續順延用下去,例如上圖現在把01
刪掉,新建的只會是04
。
foreign key
常翻外部索引外部索引條件(鍵),主要是利用建立兩張資料相關連的部分,當一個資料表的primary key
被另一個資料可進行參考時,兩者便會建立連結(具有關聯性),而被參考的primary key
資料也成為foreign key
。
今天的leetCode1929. Concatenation of Array
怎麼突然跳到1000多題?因為我今天好奇acceptance(驗收過的)
這個百分比是啥意思,比較多人驗收,應該比較熱門。結果最高是這題。
然後果然解起來很開心!!!
題目連結:https://leetcode.com/problems/concatenation-of-array/
題目重點:Ruby果然神簡潔!
def get_concatenation(nums)
nums+nums
end
解完,開心。
再來開心一題好了 XD!!!!(偶爾放鬆一下!!)
leetCode1480. Running Sum of 1d Array
題目連結:https://leetcode.com/problems/running-sum-of-1d-array/
題目重點:用each_with_index,還有nums[index] =
超方便。
# @param {Integer[]} nums
# @return {Integer[]}
def running_sum(nums)
end
p running_sum([1,2,3,4]) #=> [1,3,6,10]
p running_sum([1,1,1,1,1]) #=> [1,2,3,4,5]
p running_sum([3,1,2,10,1]) #=> [3,4,6,16,17]
看例子一的示範
Running sum is obtained as follows: [1, 1+2, 1+2+3, 1+2+3+4].
[1, 1+2, 1+2+3, 1+2+3+4] == [1, 1+2, 3+3, 6+4]
Ruby
學員起手式,自定義Array
的sum
方法。
def sum(array)
sum = 0
array.each {|num| sum += num}
sum
end
現在還缺指定array
內每一個值等於當下的sum
def running_sum(nums)
sum = 0
nums.each_with_index do |num, index|
nums[index] = num + sum
sum += num
end
end
收工,開心!!
今天提到的
1.NoSQL
與傳統DBMS
差異?
2.SQL injection
?
3.primary key
& foreign key
?
4.leetcode還是有讓人建立一點信心的時候。