SQL
| 编程范型 | 多范式: 宣告式 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| 语言家族 | 查詢語言 | ||||||||
| 設計者 | Donald D. Chamberlin Raymond F. Boyce |
||||||||
| 實作者 | ISO/IEC | ||||||||
| 发行时间 | 1974 | ||||||||
| 最新发行时间 | SQL:2011(2011) | ||||||||
| 型態系統 | 静态, 强类型 | ||||||||
| 作業系統 | 跨平台 | ||||||||
| 文件格式详情 | |||||||||
| 扩展名 | .sql |
||||||||
| 互联网媒体类型 | application/sql[1][2] |
||||||||
| 开发者 | ISO/IEC | ||||||||
| 初始版本 | 1986年 | ||||||||
| 最新版本 | |||||||||
| 格式类型 | 数据库 | ||||||||
| 标准 | ISO/IEC 9075 | ||||||||
| 自由格式? | 是 | ||||||||
|
|||||||||
结构化查询语言(英语:Structured Query Language,縮寫:SQL),是一種特殊目的之程式語言,用于数据库中的标准數據查询语言,IBM公司最早使用在其开发的数据库系统中。1986年10月,美国国家标准協会对SQL进行规范后,以此作为关系式数据库管理系统的标准語言(ANSI X3. 135-1986),1987年得到國際標準組織的支持下成为国际标准。不过各种通行的数据库系统在其实践过程中都对SQL规范作了某些编改和扩充。所以,实际上不同数据库系统之间的SQL不能完全相互通用。
歷史[编辑]
在1970年代初,由IBM公司San Jose,California研究實驗室的埃德加·科德發表將資料組成表格的應用原則(Codd's Relational Algebra)。1974年,同一實驗室的D.D.Chamberlin和R.F. Boyce對Codd's Relational Algebra在研制关系数据库管理系统System R中,研制出一套規範語言-SEQUEL(Structured English Query Language),並在1976年11月的IBM Journal of R&D上公布新版本的SQL(叫SEQUEL/2)。1980年改名為SQL。
1979年ORACLE公司首先提供商用的SQL,IBM公司在DB2和SQL/DS数据库系统中也实现了SQL。
1986年10月,美国ANSI采用SQL作为关系数据库管理系统的标准语言(ANSI X3. 135-1986),后为国际标准化组织(ISO)采纳为国际标准。
1989年,美国ANSI采纳在ANSI X3.135-1989报告中定义的关系数据库管理系统的SQL标准语言,称为ANSI SQL 89,该标准替代ANSI X3.135-1986版本。该标准为下列组织所采纳:
- 国际标准化组织(ISO),为ISO 9075-1989报告“Database Language SQL With Integrity Enhancement”
- 美国联邦政府,发布在The Federal Information Processing Standard Publication(FIPS PUB)127
目前,所有主要的关系数据库管理系统支持某些形式的SQL,大部分数据库至少遵守ANSI SQL89标准。
ANSI SQL92标准在交叉连接(cross join)和内部连接之上,新增加了外部连接,并支持在FROM子句中写连接表达式。支持集合的并运算、交运算。支持Case (SQL)表达式。支持CHECK约束。创建临时表。支持cursor。支持事务隔离。
语言特点[编辑]
SQL是高级的非過程化編程語言,它允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解其具体的数据存放方式。而它的界面,能使具有底层结构完全不同的数据库系统和不同数据库之间,使用相同的SQL作为数据的输入与管理。它以记录项目〔records〕的合集(set)〔项集,record set〕作为操纵对象,所有SQL语句接受项集作为输入,回送出的项集作为输出,这种项集特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语句可以嵌套,这使它拥有极大的灵活性和强大的功能。在多数情况下,在其他編程語言中需要用一大段程序才可实践的一个单独事件,而其在SQL上只需要一个语句就可以被表达出来。这也意味着用SQL可以写出非常复杂的语句。
SQL包含四个部分:
標準化[编辑]
- SQL-86
- SQL-89
- SQL-92
- SQL:1999
- SQL:2003
- SQL:2006
- SQL:2008
- SQL:2011
SQL函数[编辑]
| 函数 | 描述 |
|---|---|
| AVG | 平均值 |
| COUNT | 计数(不含Null) |
| First | 第一个记录的值 |
| MAX | 最大值 |
| MIN | 最小值 |
| STDEV | |
| STDEVP | |
| SUM | 求和 |
| VAR | |
| VARP | |
| UCASE | 转化为全大写字母 |
| LCASE | 转化为全小写字母 |
| MID | 取中值 |
| LEN | 计算字符串长度 |
| INSTR | 获得子字符串在母字符串的起始位置 |
| LEFT | 取字符串左边子串 |
| RIGHT | 取字符串右边子串 |
| ROUND | 数值四舍五入取整 |
| MOD | 取余 |
| NOW | 获得当前时间的值 |
| FORMAT | 字符串格式化 |
| DATEDIFF | 获得两个时间的差值 |
以SQL為基礎的其他延伸語言[编辑]
- 微軟MS SQL-Server,以及Sybase Adaptive Server系列資料庫所用的SQL
安全問題[编辑]
由於SQL指令在部份進階使用時,語法會依照特定條件來變換,而且若是表格中的欄位過多時,許多開發人員都會習慣以字串組立的方式建立SQL指令,而且又使用系統管理員級的帳戶連到資料庫,因此讓駭客有機會利用SQL的組立方式進行攻擊,像是在指令中添加部份刺探性或破壞性的指令(例如DROP TABLE、DROP DATABASE或是DELETE * FROM myTable等具破壞性的指令),讓資料庫的資料或實體伺服器被破壞,導致服務中斷或是系統癱瘓等後果,或是以邏輯的漏洞,在密碼欄寫入特殊字串(例如' or '1'='1),讓該字串形成的邏輯判斷永遠為真,而不需要知道密碼,以達成非法登入系統的目的,此種攻擊手法稱為SQL注入(SQL injection)。
目前實務上較有效的防禦方法,就是全面改用參數化查詢。
參考資料[编辑]
相關[编辑]
外部連結[编辑]
|
||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 数据库管理系统(DBMS) () | |
|
概念 |
|
|
数据库组件 |
SQL |
| 数据库管理系统的实现 | |
|
实现类型 |
|
|
数据库组件 |
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

