SQL的基本操作(1.数据类型)
1.数据类型
数据类弄是数据的一种属性,表示数据所表示信息的类型。任何一种计算机语言都定义了自己的数据类型。当然,不同的程序语言都具有不同的特点,所定义的数据类型的各类和名称都或多或少有些不同。SQL Server 提供了 25 种数据类型:
·Binary [(n)]
·Varbinary [(n)]
·Char [(n)]
·Varchar[(n)]
·Nchar[(n)]
·Nvarchar[(n)]
·Datetime
·Smalldatetime
·Decimal[(p[,s])]
·Numeric[(p[,s])]
·Float[(n)]
·Real
·Int
·Smallint
·Tinyint
·Money
·Smallmoney
·Bit
·Cursor
·Sysname
·Timestamp
·Uniqueidentifier
·Text
·Image
·Ntext
(1)二进制数据类型
二进制数据包括 Binary、Varbinary 和 Image.
Binary 数据类型既可以是固定长度的(Binary),也可以是变长度的。
Binary[(n)] 是 n 位固定的二进制数据。其中,n 的取值范围是从 1 到 8000。其存储窨的大小是 n + 4 个字节。
Varbinary[(n)] 是 n 位变长度的二进制数据。其中,n 的取值范围是从 1 到 8000。其存储窨的大小是 n + 4个字节,不是 n 个字节。
在 Image 数据类型中存储的数据是以位字符串存储的,不是由 SQL Server 解释的,必须由应用程序来解释。例如,应用程序可以使用 BMP、TIEF、GIF 和 JPEG 格式把数据存储在 Image 数据类型中。
(2)字符数据类型
字符数据的类型包括 Char,Varchar 和 Text。
字符数据是由任何字母、符号和数字任意组合而成的数据。
Varchar 是变长字符数据,其长度不超过 8KB。Char 是定长字符数据,其长度最多为 8KB。超过 8KB 的ASCII 数据可以使用Text 数据类型存储。例如,因为 Html 文档全部都是 ASCII 字符,并且在一般情况下长度超过 8KB,所以这些文档可以 Text 数据类型存储在 SQL Server 中。
(3)Unicode 数据类型
Unicode 数据类型包括 Nchar,Nvarchar 和Ntext。
在 Microsoft SQL Server 中,传统的非 Unicode 数据类型允许使用由特定字符集定义的字符。在 SQL Server 安装过程中,允许选择一种字符集。使用 Unicode 数据类型,列中可以存储任何由Unicode 标准定义的字符。在 Unicode 标准中,包括了以各种字符集定义的全部字符。使用Unicode 数据类型,所战胜的窨是使用非 Unicode 数据类型所占用的窨大小的两倍。
在 SQL Server 中,Unicode 数据以 Nchar、Nvarchar 和 Ntext 数据类型存储。使用这种字符类型存储的列可以存储多个字符集中的字符。当列的长度变化时,应该使用 Nvarchar 字符类型,这时最多可以存储 4000 个字符。当列的长度固定不变时,应该使用 Nchar 字符类型,同样,这时最多可以存储 4000 个字符。当使用 Ntext 数据类型时,该列可以存储多于 4000 个字符。
(4)日期和时间数据类型
日期和时间数据类型包括 Datetime 和 Smalldatetime 两种类型。
日期和时间数据类型由有效的日期和时间组成。例如,有效的日期和时间数据包括“4/01/98 12:15:00:00:00 PM”和“1:28:29:15:01 AM 8/17/98”。前一个数据类型是日期在前,时间在后一个数据类型是霎时间在前,日期在后。在 Microsoft SQL Server 中,日期和时间数据类型包括Datetime 和 Smalldatetime 两种类型时,所存储的日期范围是从 1753 年 1 月 1 日开始,到 9999 年12 月 31 日结束(每一个值要求 8 个存储字节)。使用 Smalldatetime 数据类型时,所存储的日期范围是 1900 年 1 月 1日 开始,到 2079 年 12 月 31 日结束(每一个值要求 4 个存储字节)。
日期的格式可以设定。设置日期格式的命令如下:
Set DateFormat {format | @format _var|
其中,format | @format_var 是日期的顺序。有效的参数包括 MDY、DMY、YMD、YDM、MYD 和 DYM。在默认情况下,日期格式为 MDY。
例如,当执行 Set DateFormat YMD 之后,日期的格式为年 月 日 形式;当执行 Set DateFormat DMY 之后,日期的格式为 日 月有年 形式
(5)数字数据类型
数字数据只包含数字。数字数据类型包括正数和负数、小数(浮点数)和整数 。
整数由正整数和负整数组成,例如 39、25、0-2 和 33967。在 Micrsoft SQL Server 中,整数存储的数据类型是 Int,Smallint 和 Tinyint。Int 数据类型存储数据的范围大于 Smallint 数据类型存储数据的范围,而 Smallint 据类型存储数据的范围大于 Tinyint 数据类型存储数据的范围。使用 Int 数据狗昔存储数据的范围是从 -2 147 483 648 到 2 147 483 647(每一个值要求 4个字节存储空间)。使用 Smallint 数据类型时,存储数据的范围从 -32 768 到 32 767(每一个值要求2个字节存储空间)。使用 Tinyint 数据类型时,存储数据的范围是从0 到255(每一个值要求1个字节存储空间)。
精确小娄数据在 SQL Server 中的数据类型是 Decimal 和 Numeric。这种数据所占的存储空间根据该数据的位数后的位数来确定。
在SQL Server 中,近似小数数据的数据类型是 Float 和 Real。例如,三分之一这个分数记作。3333333,当使用近似数据类型时能准确表示。因此,从系统中检索到的数据可能与存储在该列中数据不完全一样。
(6)货币数据表示正的或者负的货币数量 。在 Microsoft SQL Server 中,货币数据的数据类型是Money 和 Smallmoney。Money 数据类型要求 8 个存储字节,Smallmoney 数据类型要求 4 个存储字节。
(7)特殊数据类型
特殊数据类型包括前面没有提过的数据类型。特殊的数据类型有3种,即 Timestamp、Bit 和 Uniqueidentifier。
Timestamp 用于表示SQL Server 活动的先后顺序,以二进投影的格式表示。Timestamp 数据与插入数据或者日期和时间没有关系。
Bit 由 1 或者 0 组成。当表示真或者假、ON 或者 OFF 时,使用 Bit 数据类型。例如,询问是否是每一次访问的客户机请求可以存储在这种数据类型的列中。
Uniqueidentifier 由 16 字节的十六进制数字组成,表示一个全局唯一的。当表的记录行要求唯一时,GUID是非常有用。例如,在客户标识号列使用这种数据类型可以区别不同的客户。
2.用户定义的数据类型
用户定义的数据类型基于在 Microsoft SQL Server 中提供的数据类型。当几个表中必须存储同一种数据类型时,并且为保证这些列有相同的数据类型、长度和可空性时,可以使用用户定义的数据类型。例如,可定义一种称为 postal_code 的数据类型,它基于 Char 数据类型。
当创建用户定义的数据类型时,必须提供三个数:数据类型的名称、所基于的系统数据类型和数据类型的可空性。
(1)创建用户定义的数据类型
创建用户定义的数据类型可以使用 Transact-SQL 语句。系统存储过程 sp_addtype 可以来创建用户定义的数据类型。其语法形式如下:
sp_addtype {type},[,system_data_bype][,'null_type']
其中,type 是用户定义的数据类型的名称。system_data_type 是系统提供的数据类型,例如 Decimal、Int、Char 等等。 null_type 表示该数据类型是如何处理空值的,必须使用单引号引起来,例如'NULL'、'NOT NULL'或者'NONULL'。
例子:
Use cust
Exec sp_addtype ssn,'Varchar(11)',"Not Null'
创建一个用户定义的数据类型 ssn,其基于的系统数据类型是变长为11 的字符,不允许空。
例子:
Use cust
Exec sp_addtype birthday,datetime,'Null'
创建一个用户定义的数据类型 birthday,其基于的系统数据类型是 DateTime,允许空。
例子:
Use master
Exec sp_addtype telephone,'varchar(24),'Not Null'
Eexc sp_addtype fax,'varchar(24)','Null'
创建两个数据类型,即 telephone 和 fax
(2)删除用户定义的数据类型
当用户定义的数据类型不需要时,可删除。删除用户定义的数据类型的命令是 sp_droptype {'type'}。
例子:
Use master
Exec sp_droptype 'ssn'
注意:当表中的列还正在使用用户定义的数据类型时,或者在其上面还绑定有默认或者规则时,这种用户定义的数据类型不能删除。
SQL的基本操作(2.数据库的相关操作)
1.如何创建数据库
(1).使用 Create Database 创建数据库
Create Database 语名的语法形式如下:
Create Database database_name
[On
{[Primary](Name=logical_file_name,
Filename='os_file_name'
[,Size=size]
[,Maxsize=max_size]
}[,...n]
]
[Log On
}(Name=Logical_name,
Filename='os_file_name'
[,Size=size])
}[,...n]
]
[For Restore]
注释:
Primary:该选项是一个关键字,用来指定主文件组中的文件。主文件组不公包含了数据库系统表中的全部内容,而且还包含了没有在用户文件组中包含的全部对象。一个数据库只能有一个主文件。在默认情况下,即在没有指定Primary关键字时,列在语句中的第一个文件就是主文件。
Name:该选项指定数据库的逻辑名字,这是在SQL Server 系统中使用的名称,是数据库在SQL Server 中标识符。
Filename:该选项用来指定数据库所在文件的操作系统文件名称和路径。在os_file_name中的路径必须是SQL Server 所在服务器上的一个文件夹。该操作系统文件名称与Name 的逻辑名称是一一对应的。
Size:该选项用来指定数据库操作系统文件的大小。在指定文件大小的时候,既可以使用MB单位,也可以使用KB单位。如果没有指定单位,那么系统默认的单位是MB。文件最小是1MB,也就是说,数据库所在的文件不能小于1MB。在默认情况下,数据库数据文件的大小是3MB,数据库日志文件的大小是1MB。
Maxsize:该选项用来指定操作系统文件可以增长的最大尺寸。在指定文件增长尺寸的时候,既可以使用MB单位,也可以使用KB单位。如果没有指定单位,那么系统的默认单位是MB。如果没有指定文件可以增长的最大尺寸,那么系统的增长是没有限制的,可以占满整个磁盘空间。
FielGrowth:该选取项用来指定文件的增量,当然该选项不能与Maxsize选项有冲突。该选项指定的数据值为零时,表示文件不能增长。该选项可以用MB、KB和百分比指定。
例子:
创建一个cust数据库,该数据库的主数据文件的逻辑名称是cust_data,操作系统文件是cust.mdf,大小是15MB,最大是30MB,以20%的速度增加;该数据库的日志文件的逻辑名称是cust_log,操作系统是cust.ldf,大小是3MB,最大是10MB,以1MB的速度增加。
Create Database cust
On
Primary (Name=cust_data,
Filename='d:/cust.mdf',
Size=15MB,
Maxsize=30MB,
Filegrowth=20%)
Log On
(Name=cust_log,
Filename='d:/cust.ldf',
Size=3MB,
Maxsize=10MB,
FileGrowth=1MB)
2.如何增加数据库的大小
(1).使用Alter Database命令来增加数据库文件的大小
如果在创建数据库文件时没有配置文件的大小自动增长,那么可以使用Alter Database命令来增加文件的大小。
例子:
将数据库cust的数据文件cust_data的大小调整为50MB。
Alter Database cust
Modify File (Name='cust_data',Size=50)
(2).使用Add File 增加一个次要文件
通过为数据库增加次要的数据文件和日志文件来增加数据库的大小。
例子:
Alter Database cust
Add File
(Name=cust_data2,Filename='d:/cust2.mdf',
Size=5MB,
Maxsize=10MB,
Filegrowth=10%)
3.压缩数据库和数据文件
(1)使用Dbcc Shrinkdatabase 命令压缩整个数据库
例子:
将cust数据库的大小压缩到10%
Dbcc Shrinkdatabase (cust,10)
(2)使用Dbcc ShrinkFile命令压缩数据库中的某一个数据文件
例子:
将cust数据文件的大小压缩到5MB
Dbcc ShrinkFile (cust,5)
4.删除数据库
(1)使用Drop命令删除数据库
例子:
将删除cust数据库
Drop Database cust
SQL的基本操作(3.表的相关操作)
1.创建表
(1)用Create Table 命令创建表
语法:
Create Table tabl_name
({
}column_name As computed_column_expression
}
}[,...n]
)
[On {fiegroup | Default}]
[Textimage_On {fiegroup | Default}]
例子:
打开cust数据库,创建一个表,该表包含了学生的有关信息,即有学号、姓名、性别、出生日期、籍贯、联系电话、住址和备注信息。
Use cust
Create Table students
(
number int not null,
name varchar(10) not null,
sex char(2) null,
birthday datetime null,
hometown varchar(30) null,
telphone_no varchar(12) null,
address varchar(30) null,
others varchar(50) null
)
在这个表中number表示学生代号,数据类型为int,不允许为空;name表示学生姓名,数据类型为varchar,长度为10,不允许为空;sex表示学生的性别,数据类型为char,长度为2,允许为空;birthday表示学生的出生日期,数据类型为datetime,允许为空;hometown表示学生的籍贯,数据类型为varchar,长度为30,允许为空;telephone_no表示学生的联系电脑,数据类型为varchar,长度为12,允许为空;address表示学生的住址,数据类型为varchar,长度为30,允许为空;others表示学生的备注信息,长度为50,允许为空。
2.修改表的结构
(1)使用T-SQL语句增加和删除一个新列
语法:
Alter Table table
{
ADO
{[]
|colun_name As computed_column_expression
|[]
}[,...n]
|Drop
{Column column
}[,...n]
}
例子:打开cust数据库,修改其中的表students的结构,增加一个新字段,字段名为ying,数据类型是varchar,长度是10,没有默认值,充许为空。
Use cust
Alter Table students Add ying varchar(10) null
打开cust数据库,修改其中的表students的结构,删除一个字段,字段名为ying。
Use cust
Alter Table students Drop Column ying
3.向表中插入数据
(1)用 Insert 语句
语法如下:
Insert [Into]
{table_name|view_name}[(column_list)]
{Values|values_list|select_statement}
注意:在插入数据时,字符数据和日期数据要使用引号引起来。
例子:
Use cust
Insert Into students
Values (11,"影子","男","1999-12-12","湖北","83779805","武汉市桥口区","VB爱好者")
打开cust数据库,向students表中插入数据
(2)用Default 选项
在插入数据时,可以使用Default选项。Default选项有两种形式,一种形式是Default Values,另一种是Default。
Default Values 形式为表中的某一行的所有列插入默认值。使用这种形式的前提条件是表中的所有列必须是这四种类型之一:Identity属性,Timestamp数据类型,允许为Null,或者有一个指定的默认值。否则,会错误信息。
例子:
Use cust
Insert Into students Default Values
这个例子会出现错误,因为students表的number字段是设置为不允许为空的。
Default 形式是为表中的某一列插入默认值。要插入的该列必须具备一定的条件,即该列要么是Timestamp 数据类型,要么是允许为Null,要么是有一个指定的默认值,否则,会出现错误信息。
例子:
Use cust
Insert Into students Values(11,"影子",Default,Default,Default,Default,Default,Default)
由天前2个字段不能为空,所以要赋值,否则会出现错误,而后面的6个字段允许为空,因此可以调用Default默认。
(3)插入部分数据
在使用Insert语句插入数据是,还可以插入部分数据,也就是可以为每一行的指定的部分列插入数据。在插入部分数据时,应该注意以下三个问题:
☆在 Insert 子句中,指定要插入数据的列名。
☆在 Values 子句中,列出与列名对应的数据。列名的顺序和数据的顺序应该完全对应。
☆在 Insert 子句中,没有列出的列应该至少具有这四种类型之一:Identtty 属性,Timestamp 数据类型,允许为 Null,或者有一个指定的默认值。否则,会出现错误信息。
例子:
Use cust
Insert Into students (number,name)
Values (110,"影子")
打开cust数据库,向students表中插入一行数据
注意:如用下例语句将发生错误,因为name字段是不允许为空的(在创建数据库时设定的)
Insert Into students (number)
Values (110)
(4)用 Select 语句插入多条数据
Insert 语句插入数据的特点是每一次只能插入一行数据。相反,Select 也可以用在 Insert 语句中,并且可以一次插入多条数据。使用 Select 语句插入数据的语法形式如下:
Insert table_name
Select column_list
From table_list
Where search_conditions
在使用 Select 语句插入数据时,应该注意下面几点:
☆在 Insert 语句中使用 Select 时,他们参考的表既可以是相同的,也可以是不同的。
☆要插入数据的表必须已经存在。
☆要插入数据的表必须和 Select 的结果集兼容。兼容的含义是列的数量和顺序必须相同,列的数据类型或者相同,或者SQL Server 可以自动转换。
例子:
Use cust
Insert students
Select number,name,sex,birthday,hometown,telphone_no,address,others
From students
注意:
Select 后面的字段要输完整,这个例子是自己向自己插入多条数据(自己向自己插入是被允许的)
补充:
你还可以“From students”后面加上“Where name="影子"”,只插入name等于影子的记录,可以用And 和 Or 加上多个条件。
(5)使用 Select Into 插入数据到一个新表中
带有 Into 子句的 Select 语句允许用户定义一个新表并且把数据插入到新表中。这种方法不同于前面讲述的那些方法。在前面的那些方法中,一个共同的特点,是在数据输入之前表已经存在。而使用 Select Into 插入数据的方法,是在插入数据的过程中建立新表。
Select Into 语句的语法如下:
Select select_list
Into new_table_name
From table_list
Where search_conditions
在使用 Select Into 插入数据时,要注意下面几点:
☆在某个数据库中使用 Select Into 插入数据时,设置该数据库的 Select Into/Bulk Copy 为真。
☆新表不能存在,否则会产生错误信息。
☆新表中的列和行是基于查询结果集
☆要插入的数据不记录在日志中。
☆在select_list 中出现的列应该使用别名,否则,新表中的列没有列名。没列名的表只能通过 Select * From new_table_name 的形式查询。因此,应该为列起个别名。
☆这种方法多用在对列进行各种计算的情况。
例子:
Select number,name
Into newcust1
From students
创建新的表newcust1,插入students表中的number和name字段的所有数据。
补充:如果要插入所有字段的记录,则“Select *”,也可在“From students”后加条件,方法和上个例子一样。
(6)用 UPdate 语句修改表中的数据
Update 语句用来修改表中已存在的数据。Update 语句既可以一次修改一行数据,也可以一次修改许多行,甚至可以一次修改表中的全部数据。Update 语句使用 Where 子句指定要修改的行,使用 Set 子句给出新的数据。新数据可以是常量,也可以是指定的表达式,还可以是使用 From 子句来自其他表的数据。
Update 语句的语法如下:
Update {table_name|view_name}
Set {column_list}=expression [,. . .]
[Where clause]
在使用 Update 语句时,如果没有使用 Where 子句,那么就对表中所有的行进行修改。如果使用Update 语句修改数据时与数据完整性约束有冲突,那么修改就不会发生,整个修改事务全部滚回。例如,这种冲突可能是所输入的值是错误的数据类型,或者所输入的值违背了在该列定义的规则约束,等等。
例子:
Use cust
Update students
Set name=name+"007"
Where number>100
打开cust数据库,修改students表,使number>100的数据的name的值全部加"007"。
4.用 Delete 语句删除表中的数据
当数据库中的数据不需要的进修可以删除。一般情况下,删除数据使用 Delete 语句。Delete 语句可以一次从一个表中删除一条或者多条数据行。
Delete 语句的语法如下:
Delete [From] table_name
Where search_conditions
在 Delete 语句中如果使用了 Where 子句,那么就从指定的表中删除满足 Where 子句条件的数据行。
例子:
Use cust
Delete students
Where number>100
删除 students中,number>100的数据
补充:
如果在 Delete 语句中没有指定 Where 子句,那么就将表中所有的记录全部删除,即 Delete students 语句删除表中的全部记录。
在删除表中的全部数据时,还可以使用 Truncate Table 语句。Truncate Table 语句和 Delete 语句都可以将表中的全部数据删除,但是,两条语句又有不同的特点。当用户使用 Delete 语句删除数据时,被删除的数据要记录在日志中。并不将对数据的变化记录在日志中。因此,使用 Truncate Table students 语句删除记录的速度快于使用 Delete students 语句删除表中记录的速度。
5.用 Drop Table 命令删除表
当数据库中的表不需要时可以删除。删除表可以使用 Drop Table 语句。删除表就是删除表的定义以及表的全部数据、索引、触发器、约束和指定该表的许可。当删除表时,基于表的视图不能被删除,必须使用 Drop View 语句删除视图。
Drop Table 语句的语法如下:
Drop Table table_name
例子:
Use cust
Drop Table students
删除cust数据库中的students表。
补充:
不能使用 Drop Table 语句删除正在被约束参考的表,必须首先要么删除外键约束,要么删除参考表。表的所有者可以删除表。当删除表是时,绑定在该表上的规则或者默认则失掉了绑定,该表的约束或者触发器则自动被删除。如果重新创建表,必须重新绑定相应的规则和默认、重新创建触发器和增加必要的约束。另外,系统表不能删除。
删除表的许可属于表的所有者。然而,数据所有者(DBO)、系统管理员(SA)和DLL管理员可以删除数据库中的任何对象。
SQL的基本操作(4.数据的检索)
1.用 Select 子句检索记录
Select 子句是每一个检索数据的查询核心。它告诉数据库引擎返回什么字段。
Select 子句的常见形式是:
Select *
该子句的意思是“返回在所指定的记录源中能找到的所有字段”。这种命令形式很方便,因为你无需知道从表中检索的字段名称。然而,检索表中的所有列是低效的。因此,因该只检索需要的字段,这样可以大大的提高查询的效率。
2.使用 From 子句指定记录源
From 子句说明的是查询检索记录的记录源;该记录源可以是一个表或另一个存储查询。
你还能从多个表中检索记录,这在后面的章节中将介绍。
例子:
Select * From students 检索students表中的所有记录
3.用 Where 子句说明条件
Where 子句告诉数据库引擎根据所提供的一个或多个条件限定其检索的记录。条件是一个表达式,可具有真假两种判断。
例子:
Select * From students Where name="影子"
返回students中name字段为影子的列表,这次所返回的结果没有特定顺序,除非你使用了 Order By 子句。该子句将在后面的章节介绍。
注意:Where 子句中的文本字符串界限符是双引号,在VB中因改为单引号,因为在VB中字符串的界定符是双引号。
补充:
使用 And 和 Or 逻辑可以将两个或更多的条件链接到一起以创建更高级的 Where 子句。
例子:
Select * From students Where name="影子" And number>100
返回name为影子number大于100的列表。
例子:
Select * From students Where name="影子" And (number>100 Or number<50)
返回name为影子,number大于100或者小于50的列表。
Where 子句中用到的操作符
操作符 功能
< 小于
<= 小于或等于
> 大于
>= 大于或等于
= 等于
<> 不等于
Between 在某个取值范围内
Like 匹配某个模式
In 包含在某个值列表中
SQL中的等于和不等于等操作符与VB中的意义和使用相同
例子:
(1).Between 操作符
Use cust
Select * From students
Where number Between 1 and 100
Between 操作符返回的是位于所说明的界限之内的所有记录值。这个例子就返回 number 字段 1 到 100 之间的全部记录。
(2). Like 操作符和通配符
Use cust
Select * From students
Where name Like "%影%"
Like 操作符把记录匹配到你说明的某个模式。这个例子是返回含“影”的任意字符串。
四种通配符的含义
通配符 描述
% 代表零个或者多个任意字符
_(下划线) 代表一个任意字符
[] 指定范围内的任意单个字符
[^] 不在指定范围内的任意单个字符
全部示例子如下:
Like "BR%" 返回以"BR"开始的任意字符串
Like "br%" 返回以"Br"开始的任意字符串
Like "%een" 返回以"een"结束的任意字符串
Like "%en%" 返回包含"en"的任意字符串
Like "_en" 返回以"en"结束的三个字符串
Like "[CK]%" 返回以"C"或者"K"开始的任意字符串
Like "[S-V]ing" 返回长为四个字符的字符串,结尾是"ing",开始是从S到V。
Like "M[^c]%" 返回以"M"开始且第二个字符不是"c"的任意字符串。
4. 使用 Order By 对结果排序
Order By 子句告诉数据库引擎对其检索的记录进行排序。可以对任何字段排序,或者对多个字段排序,并且可以以升序或隆序进行排序。
在一个正式的 Select 查询之后包含一个 Order By 子句,后跟想排序的字段(可以有多个)便可以说明一个排序顺序。
例子:
Use cust
Select * From students
Where name Like "%影%"
Order By number
对返回的结果按 number 进行排序。
以降序排序
如要以隆序排序,只需在排序的字段之后使用 Desc 关键字。
例子:
Use cust
Select * From students
Where name Like "%影%"
Order By number Desc
5. 使用 Top 显示某个范围的第一个记录或最后一个记录。
使用 Top 关键字可以只显示一个大记录前面或后面的少数几个记录。在查询中,Top 关键字与排序子句一起把结果集限制为少数几个记录或按某个百分比显示整个结果记录集合中的一部分。
例子:
Select Top 3 * From students 返回 students 表中的前3条记录
Select Top 10 Percent * From students 返回 students 表中前面的10%个记录
Select Top 3 * From students Order By number desc 返回 students 表中 number 最大的(最后)的3条记录
6. 用 As 对字段名进行别名化
为什么在查询中对字段命以别名,或重新命名,这样做的原因有两个:
☆所涉及的表的字段名很长,想使字段在结果集中更易处理一些。
☆创建的查询产生了某些计算或合计列,需要对之进行命名。
不管是什么原因对字段命以别名,在 SQL 中都可以容易地使用 As 子句做得。
例子:
Select number As 学号 ,name As 姓名 From students
7. 合并查询
合并查询( Union Query )用于合并具有相同字段结构的两个表的内容,如果想在一个结果集中显示多个记录源中的不相关的记录时,这十分有用。
例子:
Select *
From students
Union
Select *
From students1
该查询结果集把 students 和 students1 中的记录合并到一个结果中,其输出就和原表归档之前一模一样。
注意:缺省情况下,合并查询不会返回重复记录(如果记录归档系统在把记录拷到归档表中后不将相应的记录删除,这时该功能就有用了),可以加上 All 关键字而让合并查询显示重复记录。
例子:
Select *
From students
Union All
Select *
From students1
该合并查询显示 students 表和 students1 表的内容时,没有对重复记录进行处理
补充:
Union 运算符允许把两个或者多个查询结果合并到一个查询结果集中。如果比较 Union 和 Join 两咱运算符,那么 Union 运算符增加行的数量,而 Join 运算符增加列的数量。使用 Union 时应该注意,两个结果中的列的结构必须匹配,数据类型必须兼容等等。
Union 运算符的语法形式如下:
Select select_list
From clause
Where clause
Group By clause
Having clause
Union [All]
Select select_list
From clause
Where clause
Group By clause
Having clause
Order By clause
Compute clause
对于 Union 运算符,有下列几点需要说明:
·在默认情况下,Union 运算符删除全部冗余行。如果使用All 选项,那么冗余行不删除。
·在 Union 语句中的全部 select_list 必须有相同数量的列、兼容的数据类型并且按照同样的顺序出现。
·在结果集中,列名来自第一个 Select 语句。
8.连接查询
在实际使用过程中经常需要同时从两个表或者两个以上表中检索数据。连接就是允许同时从两个表或者两个以上表中检索数据,指定这些表中某个或者某些列作为连接条件。在 SQL Server 中,可以使用两种连接语法形式,一种是 Ansi 连接语法形式,这是连接用在 From 子句中,另外一种是 SQL Server 连接语句形式,这是连接用在 Where 子句中。
Ansi 连接语法形式如下:
Select table_name.column_name,table_name.column_name,...
From {table_name [join_type] Join table_name On search_conditions}
Where [search_conditions]
在 Ansi 语法形式中,可以 Ansi 连接关键字来确定使用的连接形式。例如:
☆使用 Inner Join 关键字,结果集中仅包含满足条件的行。
☆使用 Cross Join 关键字,结果集中包含两个表中所有行的组合。
☆使用 Outer Join 关键字,结果集中既包含那些满足条件的行,还包含那些其中某个表的全部行。
SQL Server 连接语法形式如下所示:
Select table_name.column_name,table_name.column_name,...
From [table_name,tab
结构化查询语言(SQL)详解之一
一、SQL语句的分类
ANSI SQL语句分成以下六类(按使用频率排列):
数据查询语言(DQL):其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。
数据操作语言(DML):其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。
事务处理语言(TPL):它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。
数据控制语言(DCL):它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。
数据定义语言(DDL):其语句可在数据库中创建新表(CREAT TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
指针控制语言(CCL):它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。
目前还没有一个商用的RDBMS支持全部的ANSI SQL-92中的所有保留字。例如Jet 3.5数据库引擎不支持任何DCL保留字,而是用Data Accesss Object的计划性安全对象和Visual Basic的保留字及关键字取代。同时Jet 3.5引擎不需支持CCL语句,因为Jet不处理SQL语句中的指针。
二、DQL语法详解
SQL操作符和表达式
SQL提供基本的算术操作符:<,>,=,<=,>=,<>。SQL增加了一组操作符,用于与文本数据类型的字段值连接(LINK和IN)及处理字段中的NULL值(IS NULL和IS NOT NULL)。SQL语句中的大多数操作符都是双值的。双值函数需要两个操作数,像LIKE,IN,IS NULL等则是单值的。
对于文本字段数据类型字段的WHERE标准,最有用的操作符是LIKE。在Jet SQL中称为LIKE操作符。下表显示了LIKE操作符的ANSI SQL语法和用于SQL语句WHERE子句中的Jet SQL Like操作符。
用途 ANSI SQL Jet SQL 返回
取包含字符的任何文本 LIKE '%am%' Like "*am*" ram,rams damsel,amnesty
取以字符打头的任何文本 LIKE 'John%' Like "John*" Johnson,Johnsson
取以字符结尾的任何文本 LIKE '%son' Like "*son" Johnson,Anderson
取文本和任意单个后缀字符 LIKE 'Glen_' Like "Glen?" Glenn,Glens
取文本和任意单个前缀字符 LIKE '_am' Like "?am" dam,Pam,ram
取文本和一个前缀及任意个后缀字符 LIKE '_am%' Like "?am*" dams,Pam,Ramses
注意:为与ANSI SQL-92保持一致,本地OLE DB数据提供者(Microsoft.JET.OLEDB.3.51)使用%和_通配符而非Jet的?和*。这种不一致要求修改已存在的DAO代码以适应ADO使用SQL通配符。
连接表
1。常规的内部连接或相等连接
最常见的连接类型是相等连接(或称为INNER JOIN)。例如:
SELECT Publishers.Name,Titles.ISBN,Titles.Title FROM Publishers INNER JOIN Titles ON Publishers.PubID=Titles.PubID
也可以写成:
SELECT Publishers.Name,Titles.ISBN,Titles.Title FROM Publishers,Titles WHERE Publishers.PubID=Titles.PubID
2。多重相等连接
例如:
SELECT Titles.Title,Publishers.Name,Titles.ISBN,Authors.Author FROM Publishers,Titles,Authors,[Title Author] WHERE Titles.ISBN=[Title Author].ISBN AND Authors.Au_ID=[Title Author].Au_ID AND Publishers.PubID=Tiltes.PubID
3。外部连接
INNER JOIN只返回与字段值相匹配的行,OUTER JOIN返回一个表的所有行和另一个表中有匹配值的行。有两种类型的OUTER JOIN。
LEFT OUTER JOIN返回LEFT OUTER JOIN 语句左边表或结果集的所有行和语句右边表具有匹配值的行。WHERE子句中,*=操作符特指LEFT OUTER JOIN
RIGHT OUTER JOIN返回RIGHT OUTER JOIN 语句右边表或结果集的所有行和语句左边表具有匹配值的行。WHERE子句中,=*操作符表求RIGHT OUTER JOIN。
通常地,按一到多的形式创建。也就是说,代表关系中“一”方的主要表出现在JOIN表达式左边或WHERE子句中操作符左边,而关系中“多”方的相关表出现在表达式或操作符的右边。LEFT OUTER JOIN可以显示主表所有记录,而不管相关表中的匹配记录;RIGHT OUTER JOIN对寻找孤儿记录很有用。所谓“孤儿记录”就是那些在主表中没有相关记录的相关表中的记录,孤儿记录是违反引用一致性规则的结果。
注意:Jet SQL不支持WHERE子句中的*=和=*操作符。用Jet数据库引擎时要用LEFT JOIN或RIGHT JOIN保留字来创建外部连接。
4。DISTINCTROW
限定词DISTINCT告诉查询只返回在SELECT语句指定字段中具有不同值的行,Jet SQL的限定词DISTINCTROW使得返回集包括在两个表任意字段中有异值的行(而不只是SELECT语句指定显示的字段)
5。自连接和复合列
自连接是建立在同一表中具有相似字段数据类型两个字段之间的一个连接。第一个字段常为主键字段,而第二个字段常为与主键字段相关的外部键字段,尽管这种结构并不是自连接必需的(为使自连接结果有意义,前一个要求也许是需要的)。
建立自连接时,RDBMS建立原表的一个副本,然后把副本连接到原表上。以VB自带的Nwind.mdb为例。其中的Employees表包含ReportsTo字段来表示雇员主管的EmployeeID.在Employees表上建立自连接以显示雇员主管名字的Jet SQL语句如下
SELECT Employees.EmployeeID AS EmpID,Employees.LastName & "," & Employees.FirstName AS Employee,Employees.ReportsTo AS SupId, EmpCopy.LastName & "," & EmpCopy.FirstName AS Supervisor FROM Employees, Employees AS EmpCopy,Employees INNER JOIN EmpCopy ON Employees.ReportsTo=EmpCopy.EmployeeID
SQL汇总函数和GROUP BY及HAVING子句
1。汇总函数
COUNT(field_name)返回field_name中包含NOT NULL值的行数,COUNT(*)返回表或查询的行数,不考虑字段的NULL值。
MAX(field_name)返回集合中field_name的最大值
MIN(field_name)返回集合中field_name的最小值
SUM(field_name)返回集合中field_name值的和
AVG(field_name)返回集合中field_name值的算术平均值
下面是使用汇总函数的一个例子:
SELECT COUNT(*) AS Count,SUM(PubID) AS Total,AVG(PubID) AS Average,MIN(PubID) AS Minimum,MAX(PubID) AS Maximum FROM publishers
2。GROUP BY和HAVING
有重要内容的数据库常常有包含代表分类的字段的表,例如Nwind.mdb中的Products表把一种外来食品的品种归为8个类别。当要为一个对象的每个类获得SQL汇总函数值时,可以使用GROUP BY子句,GROUP BY子句创建一个虚表称为分组表。如果想用特殊标准来限制组(类)成员关系,WHERE子句可以建立标准,然而,WHERE作用于整个表。HAVING子句和WHERE子句一样,但它作用于组,而且把SQL汇总函数的适用性限制在一个组的特定集合上。所以可以加上带有IN操作符的HAVING子句。 例如:
SELECT CategoryID AS Categroy,COUNT(ProductID) AS Item, SUM(UnitsInStock) AS Sum_Stock FROM Products GROUP BY CategoryID HAVING CategoryID IN(1,2)
相关文章
- 在SQL中获取错误将数据类型varchar转换为float时出错
- 数据库:了解MySQL数据类型、SQL命令
- 关于SQL中数据类型(float和real)和 .NET Framework 中数据类型(float和double)的问题
- MongoDB --- 02. 基本操作,增删改查,数据类型,比较符,高级用法,pymongo
- 使用sql更改表的列的数据类型和添加新列和约束
- PostgreSQL、SQL Server数据库中的数据类型的映射关系
- SQL SERVER数据类型与C#数据类型对照表
- SQL Server 中使用数据类型表示小数
- mongodb基本操作命令及数据类型(一)
- 【SQL基础】T-SQL数据类型