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还是有让人建立一点信心的时候。
<<: Day 12 Azure cognitive service: OCR- 光学字元辨识
今天回到大神的教学 重新认识 Vue.js | Kuro Hsu 3-3 Vue CLI 环境设定与...
我们在模板中要进行计算或转换资料时computed及method通常能做到一样的效果,这麽说的话那不...
哈罗大家好~ 关於 SharePoint 功能其实还可以再说个五天八夜(?),但我想在善用云端工具提...
Youtube 频道:https://www.youtube.com/c/kaochenlong ...
今天来玩玩新的 CC: Tweaked 方块:Printer 跟 Disk Drive 一样,放置在...