SQL
结构化查询语言(StructuredQueryLanguage)简称SQL(发音:/ˈɛskjuːˈɛl/"S-Q-L"),结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。
1、语言简介
应用
结构化查询语言SQL(STRUCTUREDQUERYLANGUAGE)是最重要的关系数据库操作语言,并且它的影响已经超出数据库领域,得到其他领域的重视和采用,如人工智能领域的数据检索,第四代软件开发工具中嵌入SQL的语言等。
支持标准
SQL是1986年10月由美国国家标准局(ANSI)通过的数据库语言美国标准,接着,国际标准化组织(ISO)颁布了SQL正式国际标准。1989年4月,ISO提出了具有完整性特征的SQL89标准,1992年11月又公布了SQL92标准,在此标准中,把数据库分为三个级别:基本集、标准集和完全集。
其他版本
各种不同的数据库对SQL语言的支持与标准存在着细微的不同,这是因为,有的产品的开发先于标准的公布,另外,各产品开发商为了达到特殊的性能或新的特性,需要对标准进行扩展。已有100多种遍布在从微机到大型机上的数据库产品SQL,其中包括DB2、SQL/DS、ORACLE、INGRES、SYBASE、SQLSERVER、DBASEⅣ、PARADOX、MICROSOFTACCESS等。
SQL语言基本上独立于数据库本身、使用的机器、网络、操作系统,基于SQL的DBMS产品可以运行在从个人机、工作站到基于局域网、小型机和大型机的各种计算机系统上,具有良好的可移植性。可以看出标准化的工作是很有意义的。早在1987年就有些有识之士预测SQL的标准化是“一场革命”,是“关系数据库管理系统的转折点”。数据库和各种产品都使用SQL作为共同的数据存取语言和标准的接口,使不同数据库系统之间的互操作有了共同的基础,进而实现异构机、各种操作环境的共享与移植。
1974年,在IBM公司圣约瑟研究实验室研制的大型关系数据库管理系统SYSTEMR中,使用SEQUEL语言(由BOYCE和CHAMBERLIN提出),后来在SEQUEL的基础上发展了SQL语言。SQL语言是一种交互式查询语言,允许用户直接查询存储数据,但它不是完整的程序语言,如它没有DO或FOR类似的循环语句,但它可以嵌入到另一种语言中,也可以借用VB、C、JAVA等语言,通过调用级接口(CALLLEVELINTERFACE)直接发送到数据库管理系统。SQL基本上是域关系演算,但可以实现关系代数操作。
2、语句结构
结构化查询语言包含6个部分:
一:数据查询语言(DQL:DataQueryLanguage):其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDERBY,GROUPBY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。
二:数据操作语言(DML:DataManipulationLanguage):
其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。
三:事务处理语言(TPL):
它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGINTRANSACTION,COMMIT和ROLLBACK。
四:数据控制语言(DCL):
它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。
五:数据定义语言(DDL):
其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREATTABLE或DROPTABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
六:指针控制语言(CCL):
它的语句,像DECLARECURSOR,FETCHINTO和UPDATEWHERECURRENT用于对一个或多个表单独行的操作。
3、发展历史
⒈1970:E.F.Codd发表了关系数据库理论(relationaldatabasetheory);
⒉1974-79:IBM以Codd的理论为基础开发了“Sequel”,并重命名为"结构化查询语言";
⒊1979:Oracle发布了商业版结构化查询语言;
⒋1981-84:出现了其他商业版本,分别来自IBM(DB2),DataGeneral,RelationalTechnology(INGRES);
⒌结构化查询语言/86:ANSI跟ISO的第一个标准;
⒍结构化查询语言/89:增加了引用完整性(referentialintegrity);
⒎结构化查询语言/92(aka结构化查询语言2):被数据库管理系统(DBMS)生产商广泛接受;
⒏1997+:成为动态网站(Dynamicwebcontent)的后台支持;
⒐结构化查询语言/2003:包含了XML相关内容,自动生成列值(columnvalues);
⒑结构化查询语言/2006:定义了结构化查询语言与XML(包含XQuery)的关联应用;
⒒2006:Sun公司将以结构化查询语言基础的数据库管理系统嵌入JavaV6。
4、数据类型
简要描述一下结构化查询语言中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型。
字符型VARCHARVSCHAR
VARCHAR型和CHAR型数据的这个差别是细微的,但是非常重要。他们都是用来储存字符串长度小于255的字符。
假如你向一个长度为四十个字符的VARCHAR型字段中输入数据BIllGAtES。当你以后从这个字段中取出此数据时,你取出的数据其长度为十个字符——字符串BillGates的长度。假如你把字符串输入一个长度为四十个字符的CHAR型字段中,那么当你取出数据时,所取出的数据长度将是四十个字符。字符串的后面会被附加多余的空格。
当你建立自己的站点时,你会发现使用VARCHAR型字段要比CHAR型字段方便的多。使用VARCHAR型字段时,你不需要为剪掉你数据中多余的空格而操心。
VARCHAR型字段的另一个突出的好处是它可以比CHAR型字段占用更少的内存和硬盘空间。当你的数据库很大时,这种内存和磁盘空间的节省会变得非常重要。
文本型
TEXT
使用文本型数据,你可以存放超过二十亿个字符的字符串。当你需要存储大串的字符时,应该使用文本型数据。
注意文本型数据没有长度,而上一节中所讲的字符型数据是有长度的。一个文本型字段中的数据通常要么为空,要么很大。
当你从HTMLFORM的多行文本编辑框(TEXTAREA)中收集数据时,你应该把收集的信息存储于文本型字段中。但是,无论何时,只要你能避免使用文本型字段,你就应该不使用它。文本型字段既大且慢,滥用文本型字段会使服务器速度变慢。文本型字段还会吃掉大量的磁盘空间。
一旦你向文本型字段中输入了任何数据(甚至是空值),就会有2K的空间被自动分配给该数据。除非删除该记录,否则你无法收回这部分存储空间。
数值型
整数INT、小数NUMERIC、钱数MONEY
INTVSSMALLINTVSTINYINT
通常,为了节省空间,应该尽可能的使用最小的整型数据。一个TINYINT型数据只占用一个字节;一个INT型数据占用四个字节。这看起来似乎差别不大,但是在比较大的表中,字节数的增长是很快的。另一方面,一旦你已经创建了一个字段,要修改它是很困难的。因此,为安全起见,你应该预测一下,一个字段所需要存储的数值最大有可能是多大,然后选择适当的数据类型。
NUMERIC
为了能对字段所存放的数据有更多的控制,你可以使用NUMERIC型数据来同时表示一个数的整数部分和小数部分。NUMERIC型数据使你能表示非常大的数——比INT型数据要大得多。一个NUMERIC型字段可以存储从-1038到1038范围内的数。NUMERIC型数据还使你能表示有小数部分的数。例如,你可以在NUMERIC型字段中存储小数3.14。
MONEYVSSMALLMONEY
你可以使用INT型或NUMERIC型数据来存储钱数。但是,专门有另外两种数据类型用于此目的。如果你希望你的网点能挣很多钱,你可以使用MONEY型数据。如果你的野心不大,你可以使用SMALLMONEY型数据。MONEY型数据可以存储从-922,337,203,685,477.5808到922,337,203,685,477.5807的钱数。如果你需要存储比这还大的金额,你可以使用NUMERIC型数据。
SMALLMONEY型数据只能存储从-214,748.3648到214,748.3647的钱数。同样,如果可以的话,你应该用SMALLMONEY型来代替MONEY型数据,以节省空间。
逻辑型
BIT
如果你使用复选框(CHECKBOX)从网页中搜集信息,你可以把此信息存储在BIT型字段中。BIT型字段只能取两个值:0或1。
当心,在你创建好一个表之后,你不能向表中添加BIT型字段。如果你打算在一个表中包含BIT型字段,你必须在创建表时完成。
日期型
DATETIMEVSSMALLDATETIME
一个DATETIME型的字段可以存储的日期范围是从1753年1月1日第一毫秒到9999年12月31日最后一毫秒。
如果你不需要覆盖这么大范围的日期和时间,你可以使用SMALLDATETIME型数据。它与DATETIME型数据同样使用,只不过它能表示的日期和时间范围比DATETIME型数据小,而且不如DATETIME型数据精确。一个SMALLDATETIME型的字段能够存储从1900年1月1日到2079年6月6日的日期,它只能精确到秒。
DATETIME型字段在你输入日期和时间之前并不包含实际的数据,认识这一点是重要的。
5、语言特点
1.一体化:SQL集数据定义DDL、数据操纵DML和数据控制DCL于一体,可以完成数据库中的全部工作。
2.使用方式灵活:它具有两种使用方式,即可以直接以命令方式交互使用;也可以嵌入使用,嵌入到C、C++、FORTRAN、COBOL、JAVA等主语言中使用。
3.非过程化:只提操作要求,不必描述操作步骤,也不需要导航。使用时只需要告诉计算机“做什么”,而不需要告诉它“怎么做”。
4.语言简洁,语法简单,好学好用:在ANSI标准中,只包含了94个英文单词,核心功能只用6个动词,语法接近英语口语。
软道语录
结构化查询语言
SQL(StructuredQueryLanguage,结构化查询语言)是一种用于数据库操作的语言。
6、使用简要
简单的Transact-结构化查询语言查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。
选择列表
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。
1、选择所有列
例如,下面语句显示testtable表中所有列的数据:
SELECT*FROMtesttable
2、选择部分列并指定它们的显示次序
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。
3、更改列标题
在选择列表中,可重新指定列标题。定义格式为:
列标题=列名列名列标题
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题:SELECT昵称=nickname,电子邮件=emailFROMtesttable。
4、删除重复行
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。
5、限制返回的行数
使用TOPn选项限制返回的数据行数,TOPn说明返回n行,而TOPnPERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。TOP命令仅针对SQLServer系列数据库,并不支持Oracle数据库。
7、SQLAggregate函数
SQLAggregate函数计算从列中取得的值,返回一个单一的值。
有用的Aggregate函数:
AVG()-返回平均值
COUNT()-返回行数
FIRST()-返回第一个记录的值
LAST()-返回最后一个记录的值
MAX()-返回最大值
MIN()-返回最小值
SUM()-返回总和
8、SQLScalar函数
SQLScalar函数基于输入值,返回一个单一的值。
有用的Scalar函数:
UCASE()-将某个字段转换为大写
LCASE()-将某个字段转换为小写
MID()-从某个文本字段提取字符
LEN()-返回某个文本字段的长度
ROUND()-对某个数值字段进行指定小数位数的四舍五入
NOW()-返回当前的系统日期和时间
FORMAT()-格式化某个字段的显示方式