① sql插入新数据的语法是什么
我从网上搜的,希望能帮到你
13.3 操作功能
SQL语言的操作功能包括对表中数据的增加、删除和更新操作。
13.3.1 插入
在一个表的尾部追加数据时,要用到插入功能,SQL的插入命令包括以下3种格式:
格式:
INSERT INTO 〈表名〉 [(〈字段名1〉 [,〈字段名2〉,…])]
VALUES(〈表达式1〉)[, 〈表达式2〉,…])
和
INSERT INTO 〈表名〉 FROM ARRAY 〈数组名〉
INSERT INTO 〈表名〉 FROM MEMVAR
功能:3种格式都是在指定的表的表尾添加一条新记录。
13.3.1 插入
说明:
(1)第1种格式其值为VALUES后面的表达式的值。当需要插入表中所有字段的数据时,表名后面的字段名可以缺省,但插入数据的格式必须与表的结构完成吻合;若只需要插入表中某些字段的数据,就需要列出插入数据的字段,当然相应表达式的数据位置会与之对应。
(2)第2种格式新记录的值是指定的数组中各元素的数据。数组中各元素与表中各字段顺序对应。如果数组中元素的数据类型与其对应的字段类型不一致,则新记录对应的字段为空值;如果表中字段个数大于数组元素的个数,则多的字段为空值。
(3)第3种格式新记录的值是指定的内存变量的值。添加的新记录的值是与指定表各字段名同名的内存变量的值,如果同名的内存变量不存在,则相应的字段为空。
Visual FoxPro支持两种SQL插入命令的格式,第一种格式是标准格式,第二种格式是Visual FoxPro的特殊格式。
13.3.1 插入
【13.42】在订购单表中,插入元组("E7","S4","OR01",09/25/03)。
INSERT INTO 订购单(职工号,供应商号,订购单号,订购日期,总金额)
VALUES("E7","S4","OR01",{^2003-09-25},1200)
其中“{^2003-09-25}”是日期型字段订购日期的值。
图13.48
13.3.1 插入
假设供应商尚未确定,那么只能先插入职工号和订购单号两个属性的值,这时可用如下命令:
INSERT INTO 订购单(职工号,订购单号) VALUES("E7","OR01")
这时另外三个属性的值为空。
13.3.1 插入
下面用一组命令来说明INSERT INTO…FROM ARRAY 的使用方式:
USE订购单 &&打开订购单
SCATTER to A1 &&将当前记录读到数组A1
COPY STRUCTURE TO A2 &&拷贝订购单表的结构到A2
INSERT INTO A2 FROM ARRAY A1 &&从数组A1插入一条记录到A2
SELECT A2 &&切换到A2的工作区
BROWSE &&用BROWSE命令验证插入的结果
USE &&关闭A2.dbf文件
DELETE FILE A2.dbf &&删除A2.dbf文件
13.3.1 插入
在一个表的尾部追加数据时,要用到插入功能,SQL的插入命令包括以下3种格式:
格式:
INSERT INTO 〈表名〉 [(〈字段名1〉 [,〈字段名2〉,…])]
VALUES(〈表达式1〉)[, 〈表达式2〉,…])
和
INSERT INTO 〈表名〉 FROM ARRAY 〈数组名〉
INSERT INTO 〈表名〉 FROM MEMVAR
功能:3种格式都是在指定的表的表尾添加一条新记录。
13.3.1 插入
说明:
(1)第1种格式其值为VALUES后面的表达式的值。当需要插入表中所有字段的数据时,表名后面的字段名可以缺省,但插入数据的格式必须与表的结构完成吻合;若只需要插入表中某些字段的数据,就需要列出插入数据的字段,当然相应表达式的数据位置会与之对应。
(2)第2种格式新记录的值是指定的数组中各元素的数据。数组中各元素与表中各字段顺序对应。如果数组中元素的数据类型与其对应的字段类型不一致,则新记录对应的字段为空值;如果表中字段个数大于数组元素的个数,则多的字段为空值。
(3)第3种格式新记录的值是指定的内存变量的值。添加的新记录的值是与指定表各字段名同名的内存变量的值,如果同名的内存变量不存在,则相应的字段为空。
Visual FoxPro支持两种SQL插入命令的格式,第一种格式是标准格式,第二种格式是Visual FoxPro的特殊格式。
13.3.1 插入
【13.42】在订购单表中,插入元组("E7","S4","OR01",09/25/03)。命令执行结果如图13.48所示。
INSERT INTO 订购单(职工号,供应商号,订购单号,订购日期,总金额)
VALUES("E7","S4","OR01",{^2003-09-25},1200)
其中“{^2003-09-25}”是日期型字段订购日期的值。
图13.48
13.3.1 插入
假设供应商尚未确定,那么只能先插入职工号和订购单号两个属性的值,这时可用如下命令:
INSERT INTO 订购单(职工号,订购单号) VALUES("E7","OR01")
这时另外三个属性的值为空。
13.3.1 插入
下面用一组命令来说明INSERT INTO…FROM ARRAY 的使用方式:
USE订购单 &&打开订购单
SCATTER to A1 &&将当前记录读到数组A1
COPY STRUCTURE TO A2 &&拷贝订购单表的结构到A2
INSERT INTO A2 FROM ARRAY A1 &&从数组A1插入一条记录到A2
SELECT A2 &&切换到A2的工作区
BROWSE &&用BROWSE命令验证插入的结果
USE &&关闭A2.dbf文件
DELETE FILE A2.dbf &&删除A2.dbf文件
13.3.1 插入
用下面一组命令来说明INSERT INTO…FROM MEMVAR的使用方式:
USE订购单 &&打开订购单
SCATTER M1 &&将当前记录读到内存变量M1中
COPY STRUCTURE TO A2 &&拷贝订购单表的结构到A2
INSETR INTO A2 FROM M1 &&从内存变量插入一条记录到A2
SELECT A2 &&切换到A2的工作区
BROWSE &&用BROWSE命令验证插入的结果
USE &&关闭A2.dbf文件
DELETE FILE A2.dbf &&删除A2.dbf文件
13.3.1 插入
说明:当一个表定义了主索引或候选索引后,由于相应的字段具有关键字的特性,即不能为空,所以只能用此命令插入记?肌oxPro以前的插入命令(INSERT或APPEND)是先插入一条空记录,然后再输入各字段的值,由于关键字字段不允许为空,所以使用以前的方法就不能成功地插入记录。
13.3.2 更新
更新是指对存储在表中的记录进行修改。
格式:
UPDATE [ 〈数据库〉! ] 〈表名〉
SET 〈列名1〉=〈表达式1〉 [, 〈列名2〉=〈表达式2〉 …]
[WHERE 〈条件表达式1〉 [AND | OR 〈条件表达式2〉 …]]
13.3.2 更新
说明:
(1)[〈数据库〉! ]〈表名〉:指定要更新数据的记录所在的表名及该表所在的数据库名。
(2)SET 〈列名〉=〈表达式〉:指定被更新的字段及该字段的新值。如果省略WHERE子句,则该字段每一条都用同样的值更新。
(3)WHERE 〈条件表达式〉:指明将要更新数据的记录。即更新表中符合条件表达式的记录,并且一次可以更新多个字段;如果不使用WHERE子句,则更新全部记录。
13.3.2 更新
【13.43】在职工表中,给WH1仓库的职工提高10%的工资。命令执行结果如图13.49所示。
UPDATE 职工 SET 工资=工资*1.10 WHERE 仓库号="WH1"
例如: 将所有学生的年龄增加1岁:
UPDATE 学生 SET 年龄=年龄+1
13.3.3 删除
用SQL语言可以删除数据表中的记录。
格式:
DELETE FROM [〈数据库!〉]〈表名〉
[WHERE 〈条件表达式1〉 [AND | OR 〈条件表达式2〉 …]]
说明:
(1)[〈数据库!〉]〈表名〉:指定加删除标记的表名及该表所在的数据库名,用“!”分割表名和数据库名,数据库名为可选项。
(2)WHERE选项:指明只对满足条件的记录加删除标记。如果不使用WHERE子句,则删除该表中的全部记录。
(3)上述删除只是加删除标记,并没有从物理上删除,只有执行了PACK命令,有删除标记的记录才能真正从表中删除。删除标记可以用REACLL命令取消。
13.3.3 删除
【13.44】删除仓库表中仓库号值是WH2的记录。
DELETE FROM 仓库 WHERE仓库号="WH2"
说明:SQL DELETE命令同样是逻辑删除记录,如果要物理删除记录需要继续使用PACK命令。
13.3.4 表的删除
随着数据库应用的变化,往往有些表连同它的数据不再需要了,这时可以删除这些表,以节省存储空间。
格式:DROP TABLE 〈表名〉
说明:DROP TABLE直接从磁盘上删除表名所对应的DBF文件。如果表名是数据库中的表,并且相应的数据库是当前数据库,则从数据库中删除表;否则虽然从磁盘上删除了DBF文件,但是记录在数据库DBC文件中的信息却没有删除,此后会出现错误提示。所以要删除数据库中的表时,最好应使数据库是当前打开的数据库,在数据库中进行操作。
② 求sql语法
SQL语言快速入门(一)
SQL是英文Structured Query Language的缩写,意思为结构化查询语言。
SQL语言的主要功能就是同各种数据库建立联系,进行沟通。按照ANSI(美国国家标准协会)的规定,SQL被作为关系型数据库管理系统的标准语言。SQL语句可以用来执行各种各样的操作,例如更新数据库中的数据,从数据库中提取数据等。目前,绝大多数流行的关系型数据库管理系统,如Oracle, Sybase, Microsoft SQL Server, Access等都采用了SQL语言标准。虽然很多数据库都对SQL语句进行了再开发和扩展,但是包括Select, Insert, Update, Delete, Create, 及Drop在内的标准的SQL命令仍然可以被用来完成几乎所有的数据库操作。下面,我们就来详细介绍一下SQL语言的基本知识。
数据库表格
一个典型的关系型数据库通常由一个或多个被称作表格的对象组成。数据库
中的所有数据或信息都被保存在这些数据库表格中。数据库中的每一个表格都具有
自己唯一的表格名称,都是由行和列组成,其中每一列包括了该列名称,数据类型
,以及列的其它属性等信息,而行则具体包含某一列的记录或数据。以下,是一个
名为天气的数据库表格的实例。
城市 最高气温 最低气温
北京 10 5
上海 15 8
天津 8 2
重庆 20 13
该表格中“城市”,“最高气温”和“最低气温”就是三个不同的列
,而表格中的每一行则包含了具体的表格数据。
数据查询
在众多的SQL命令中,select语句应该算是使用最频繁的。Select语句主要被用来对数据库进行查询并返回符合用户查询标准的结果数据。Select语句的语法格式如下:
select column1 [, column2,etc] from tablename
[where condition];
([] 表示可选项)
Select语句中位于Select关键词之后的列名用来决定那些列将作为查询结果返回。用户可以按照自己的需要选择任意列,还可以使用通配符“*”来设定返回表格中的所有列。
Select语句中位于from关键词之后的表格名称用来决定将要进行查询操作的目
标表格。
Select语句中的where可选从句用来规定哪些数据值或哪些行将被作为查询结果返回或显示。在where条件从句中可以使用以下一些运算符来设定查询标准:
= 等于
> 大于
< 小于
>= 大于等于
<= 小于等于
<> 不等于
除了上面所提到的运算符外,LIKE运算符在where条件从句中也非常重要。
LIKE运算符的功能非常强大,通过使用LIKE运算符可以设定只选择与用户规定格式相同的记录。此外,我们还可以使用通配符“%”用来代替任何字符串。举例如下:
Select firstname, lastname, city
from employee
where firstname LIKE ‘E%’;
(注意,字符串必须被包含在单括号内)
上述SQL语句将会查询所有名称以E开头的姓名。或者,通过如下语句:
Select * from employee
where firstname = ‘May’;
查询所有名称为May的行。
SQL语言快速入门(二)
创建表格
SQL语言中的create table语句被用来建立新的数据库表格。Create table
语句的使用格式如下:
create table tablename
(column1 data type,
column2 data type,
column3 data type);
如果用户希望在建立新表格时规定列的限制条件,可以使用可选的条件
选项:
create table tablename
(column1 data type [constraint],
column2 data type [constraint],
column3 data type [constraint]);
举例如下:
create table employee
(firstname varchar(15),
lastname varchar(20),
age number(3),
address varchar(30),
city varchar(20));
简单来说,创建新表格时,在关键词create table后面加入所要建立的表格
的名称,然后在括号内顺次设定各列的名称,数据类型,以及可选的限制条件
等。注意,所有的SQL语句在结尾处都要使用“;”符号。
使用SQL语句创建的数据库表格和表格中列的名称必须以字母开头,后面
可以使用字母,数字或下划线,名称的长度不能超过30个字符。注意,用户在
称时不要使用SQL语言中的保留关键词,如select, create, insert等,作为表格或
列的名称。
数据类型用来设定某一个具体列中数据的类型。例如,在姓名列中只能采
用的数据类型,而不能使用number的数据类型。
SQL语言中较为常用的数据类型为:
char(size):固定长度字符串,其中括号中的size用来设定字符串的最大
度。Char类型的最大长度为255字节。
varchar(size):可变长度字符串,最大长度由size设定。
number(size):数字类型,其中数字的最大位数由size设定。
Date:日期类型。
number(size,d):数字类型,size决定该数字总的最大位数,而d则用于
设定该数字在小数点后的位数。
最后,在创建新表格时需要注意的一点就是表格中列的限制条件。所谓限
制条件就是当向特定列输入数据时所必须遵守的规则。
例如,unique这一限制条件要求某一列中不能存在两个值相同的记录,所有
记录的值都必须是唯一的。除unique之外,较为常用的列的限制条件
还包括not, null和primary key等。Not null用来规定表格中某一列的值
不能为空.Primary key则为表格中的所有记录规定了唯一的标识符。
向表格中插入数据
SQL语言使用insert语句向数据库表格中插入或添加新的数据行。Insert语
句的使用格式如下:
insert into tablename
(first_column,...last_column)
values (first_value,...last_value);
例如:
insert into employee
(firstname, lastname, age, address, city)
values (‘Li’, ‘Ming’, 45, ‘No.77 Changan Road’, ‘Beijing”);
简单来说,当向数据库表格中添加新记录时,在关键词insert into后面输
入所要添加的表格名称,然后在括号中列出将要添加新值的列的名称。最后
,在关键词values的后面按照前面输入的列的顺序对应的输入所有要添加的
记录值。
更新记录
SQL语言使用update语句更新或修改满足规定条件的现有记录。
Update语句的格式为:
update tablename
set columnname = newvalue [, nextcolumn = newvalue2...]
where columnname OPERATOR value [and|or column OPERATOR value];
例如:
update employee
set age = age+1
where first_name= ‘Mary’and last_name= ‘Williams’;
使用update语句时,关键一点就是要设定好用于进行判断的where条件
从句。
删除记录
SQL语言使用delete语句删除数据库表格中的行或记录。Delete语句的
格式为:
delete from tablename
where columnname OPERATOR value [and|or column OPERATOR value];
例如:
delete from employee
where lastname = May;
简单来说,当需要删除某一行或某个记录时,在delete from关键词之
后输入表格名称,然后在where从句中设定删除记录的判断条件。注意,
如果用户在使用delete语句时不设定where从句,则表格中的所有记录将
全部被删除。
删除数据库表格
在SQL语言中使用drop table命令删除某个表格以及该表格中的所有记
录。Drop table命令的使用格式为:
drop table tablename;
例如:
drop table employee;
如果用户希望将某个数据库表格完全删除,只需要在drop table命令后
输入希望删除的表格名称即可。Drop table命令的作用与删除表格中的所有
记录不同。删除表格中的全部记录之后,该表格仍然存在,而且表格中列
的信息不会改变。而使用drop table命令则会将整个数据库表格的所有信息
全部删除。
以上,我们对SQL语言主要的命令和语句进行了较为详细的介绍。应该说SQL语句的语法结构和风格还是相当简单和直观的,只要用户结合实践多加练习,一定会在短期内迅速掌握。
SQL语言快速入门(三)
我们日常使用SQL语言的工作过程中,使用最多的还是从已经建立好的数据库中查询信息。下面,我们就来详细介绍一下如何使用SQL语言实现各种数据库查询操作。
SELECT…FROM
为方便讲解,我们在数据库中创建名为Store_Information的如下数据表。
Store_Information
Store_Name Sales Date
Los Angeles 00 Jan-10-2000
San Diego 0 Jan-11-2000
Los Angeles 0 Jan-12-2000
Boston 0 Jan-12-2000
SQL语言中用于数据库查询的最简单的命令就是SELECT…FROM,语法格
式为:
SELECT \"column_name\" FROM \"table_name\"
例如,如果我们希望查询Store_Information数据表中所有的商店名称时,可
以使用如下命令:
SELECT store_name FROM Store_Information
查询结果显示为:
Store_Name
Los Angeles
San Diego
Los Angeles
Boston
如果用户希望一次查询多个字段,可以将所要查询的字段名称依次加入
SELECT关键字之后,中间用“,”隔开即可。
DISTINCT
SELECT关键字支持用户查询数据表中指定字段的所有数据,但是这样有时
就会不可避免的出现重复信息。如果用户希望只查询那些具有不同记录值的信
息的话,可以使用SQL语言的DISTINCT关键字。语法格式如下:
SELECT DISTINCT \"column_name\"
FROM \"table_name\"
例如,我们可以使用以下命令查询Store_Information数据表具有不同记录值
的所有记录。
SELECT DISTINCT Store_Name FROM Store_Information
查询结果如下:
Store_Name
Los Angeles
San Diego
Boston
WHERE
除了选择具有不同记录值的记录之外,有时我们可能还会需要根据某些条
件对数据库中的数据进行查询。例如,我们可能需要查询Store_Information数
据表中销售额超过1000美圆的商店。为此,我们可以使用SQL语言的WHERE
关键字设定查询条件。语法格式如下:
SELECT \"column_name\"
FROM \"table_name\"
WHERE \"condition\"
由此,我们可以使用如下命令查询销售额超过1000美圆的商店信息:
SELECT store_name FROM Store_Information WHERE Sales > 1000
查询结果显示为:
store_name
Los Angeles
运算函数
现在,我们已经了解到在使用SQL语言进行数据库查询操作时可以通过对
数值的判断设定灵活的查询条件。为了增强对运算的支持能力,SQL提供了众
多实用的运算函数供广大用户使用。例如,我们可以直接在SQL命令中调用
SUM或AVG这两个分别用于计算总数和平均数的函数。语法格式如下:
SELECT \"function type\"(\"column_name\")
FROM \"table_name\"
如果我们希望查询Store_Information数据表中所有商店的总销售额的话,可
以使用如下命令:
SELECT SUM(Sales) FROM Store_Information
查询结果显示为:
SUM(Sales)
50
COUNT
除了SUM和AVG函数之外,COUNT函数是SQL语言中另一个较为常用
的运算函数。COUNT函数可以用来计算数据表中指定字段所包含的记录数目。
语法格式为:
SELECT COUNT(\"column_name\")
FROM \"table_name\"
例如,如果我们希望查询Store_Information数据表中的有关商店的记录条数
时,可以使用如下命令:
SELECT COUNT(store_name)
FROM Store_Information
查询结果显示为:
Count(store_name)
4
COUNT函数可以和DISTINCT关键字一起使用从而可以查询数据表中指定
字段中所有具有不同记录值的记录数目.例如,如果我们希望查询Store_Information
数据表中不同商店的数目时,可以使用如下命令:
SELECT COUNT(DISTINCT store_name)
FROM Store_Information
查询结果显示为:
Count(DISTINCT store_name)
3
GROUP BY
下面我们来进一步看一下SQL语言中的集合函数。上文中,我们曾使用
SUM函数计算所有商店的销售总额,如果我们希望计算每一家商店各自的总销
售额时该怎么办呢?要实现这一目的我们需要做两件事:首先,我们需要查询
商店名称和销售额两个字段;然后,我们使用SQL语言的GROUP BY命令将
销售额按照不同的商店进行分组,从而计算出不同商店的销售总额。GROUP
BY命令的语法格式为:
SELECT \"column_name1\", SUM(\"column_name2\")
FROM \"table_name\"
GROUP BY \"column_name1\"
我们可以使用如下命令实现上述查询目的:
SELECT store_name, SUM(Sales)
FROM Store_Information
GROUP BY store_name
查询结果显示为:
store_name SUM(Sales)
Los Angeles 00
San Diego 0
Boston 0
小注:
GROUP BY关键字一般应用于同时查询多个字段并对字段进行算术运
算的SQL命令中。
HAVING
用户在使用SQL语言的过程中可能希望解决的另一个问题就是对由sum或
其它集合函数运算结果的输出进行限制。例如,我们可能只希望看到Store_
Information数据表中销售总额超过1500美圆的商店的信息,这时我们就需要使
用HAVING从句。语法格式为:
SELECT \"column_name1\", SUM(\"column_name2\")
FROM \"table_name\"
GROUP BY \"column_name1\"
HAVING (arithematic function condition)
(GROUP BY从句可选)
由此,我们可以使用如下命令实现上述查询目的:
SELECT store_name, SUM(sales)
FROM Store_Information
GROUP BY store_name
HAVING SUM(sales) > 1500
查询结果显示为:
store_name SUM(Sales)
Los Angeles 00
小注:
SQL语言中设定集合函数的查询条件时使用HAVING从句而不是
WHERE从句。通常情况下,HAVING从句被放置在SQL命令的结尾处。
ALIAS
下面,我们重点介绍一下如何在SQL命令中设定别名。SQL语言中一般使
用两种类型的别名,分别为字段别名和数据表别名。简单的说,使用字段别名
可以帮助我们有效的组织查询的输出结果。例如,上文所列举的多个实例中,
当我们计算商店销售总额时,显示结果中就会出现SUM(sales)。虽然SUM(sales)
并不会对我们理解查询结果带来不便,但是如果我们需要在查询中使用多项复
杂运算时,显示结果就不会这么直观了。如果这时我们使用字段别名就会极大
的提高查询结果的可读性。
对于数据表别名,我们可以通过将别名直接放置在FROM从句中数据表名
称的后面设定。数据表别名在我们下面将要讲述的连接多个数据表进行查询的
操作中极为有用。
字段和数据表别名的语法格式如下:
SELECT \"table_alias\".\"column_name1\" \"column_alias\"
FROM \"table_name\" \"table_alias\"
即别名都直接放置在各自对应名称的后面,中间用空格分开。
以Store_Information数据表为例,我们可以在GROUP BY一节中所使用的
SQL命令中设置如下字段和数据表别名:
SELECT A1.store_name \ "Store\", SUM(Sales) \"Total Sales\"
FROM Store_Information A1
GROUP BY A1.store_name
查询结果显示为:
Store Total Sales
Los Angeles 00
San Diego 0
Boston 0
连接多个数据表
最后,我们来看一下如果使用SQL语言连接多个数据表,实现对多个数据
表的查询。为方便讲解,我们在数据库中分别创建了两个名为Store_Information
和Region的数据表。
Store_Information
Store_Name Sales Date
Los Angeles 00 Jan-10-2000
San Diego 0 Jan-11-2000
Los Angeles 0 Jan-12-2000
Boston 0 Jan-12-2000
Region
Region_Name Store_Name
East Boston
East New York
West Los Angeles
West San Diego
下面,我们就来看一下通过数据表的连接实现按不同区域查询销售额。
我们注意到在名为Region的数据表中包含区域和商店两个字段信息,而在名为
Store_Information的数据表中则包含每一家商店的销售信息。因此,为了得到按
区域划分的销售信息,我们需要将两个不同数据表的信息结合在一起进行查询.
通过对上述两个数据表的分析,我们发现每个数据表中都包含一个名为
Store_Name的字段,因此,我们可以使用如下命令实现查询目的:
SELECT A1.region_name REGION, SUM(A2.Sales) SALES
FROM Region A1, Store_Information A2
WHERE A1.store_name = A2.store_name
GROUP BY A1.region_name
查询结果显示为:
REGION SALES
East 0
West 50
说明:
上述查询命令的前两行用于指定所要查询的目标字段,分别为Region数据
表中的Region_Name字段和Store_Information数据表中Sales字段的记录值总
数。这里,我们设定两个字段的别名分别为REGION和SALES,两个数据表的
别名分别为A1和A2。如果我们只使用字段别名而不设定数据表别名的话,上
述SQL命令的第一行就变成如下形式:
SELECT Region.Region_Name REGION, SUM(Store_Information.Sales) SALES
由此我们可以看出有效的使用数据表别名,可以极大的简化对多个数据表
进行操作的SQL命令。
上述查询命令的第3行为WHERE从句,正是该从句设定了两个数据表的
连接条件。因为我们希望确保Region数据表中的Store_Name字段能够与
Store_Information数据表中的同名字段相对应,所以我们规定两个字段的记录
值应当相等。在连接多个数据表时,一定要准确设定数据表的连接条件,如果
WHERE从句设定不正确,则可能导致查询结果中出现众多不相关的数据 .
③ SQL的语法 详细 介绍
SELECT 子句
指定由查询返回的列。
语法
SELECT [ ALL | DISTINCT ]
[ TOP n [ PERCENT ] [ WITH TIES ] ]
< select_list >
< select_list > ::=
{ *
| { table_name | view_name | table_alias }.*
| { column_name | expression | IDENTITYCOL | ROWGUIDCOL }
[ [ AS ] column_alias ]
| column_alias = expression
} [ ,...n ]
参数
ALL
指定在结果集中可以显示重复行。ALL 是默认设置。
DISTINCT
指定在结果集中只能显示唯一行。为了 DISTINCT 关键字的用途,空值被认为相等。
TOP n [PERCENT]
指定只从查询结果集中输出前 n 行。n 是介于 0 和 4294967295 之间的整数。如果还指定了 PERCENT,则只从结果集中输出前百分之 n 行。当指定时带 PERCENT 时,n 必须是介于 0 和 100 之间的整数。
如果查询包含 ORDER BY 子句,将输出由 ORDER BY 子句排序的前 n 行(或前百分之 n 行)。如果查询没有 ORDER BY 子句,行的顺序将任意。
WITH TIES
指定从基本结果集中返回附加的行,这些行包含与出现在 TOP n (PERCENT) 行最后的 ORDER BY 列中的值相同的值。如果指定了 ORDER BY 子句,则只能指定 TOP ...WITH TIES。
< select_list >
为结果集选择的列。选择列表是以逗号分隔的一系列表达式。
*
指定在 FROM 子句内返回所有表和视图内的所有列。列按 FROM 子句所指定的由表或视图返回,并按它们在表或视图中的顺序返回。
table_name | view_name | table_alias.*
将 * 的作用域限制为指定的表或视图。
column_name
是要返回的列名。限定 column_name 以避免二义性引用,当 FROM 子句中的两个表内有包含重复名的列时会出现这种情况。例如,Northwind 数据库中的 Customers 和 Orders 表内都有名为 ColumnID 的列。如果在查询中联接这两个表,可以在选择列表中将客户 ID 指定为 Customers.CustomerID。
expression
是列名、常量、函数以及由运算符连接的列名、常量和函数的任意组合,或者是子查询。
IDENTITYCOL
返回标识列。有关更多信息,请参见 IDENTITY(属性)、ALTER TABLE 和 CREATE TABLE。
如果 FROM 子句中的多个表内有包含 IDENTITY 属性的列,则必须用特定的表名(如 T1.IDENTITYCOL)限定 IDENTITYCOL。
ROWGUIDCOL
返回行全局唯一标识列。
如果在 FROM 子句中有多个表具有 ROWGUIDCOL 属性,则必须用特定的表名(如 T1.ROWGUIDCOL)限定 ROWGUIDCOL。
column_alias
是查询结果集内替换列名的可选名。例如,可以为名为 quantity 的列指定别名,如"Quantity"或"Quantity to Date"或"Qty"。
别名还可用于为表达式结果指定名称,例如:
USE Northwind
SELECT AVG(UnitPrice) AS 'Average Price'
FROM [Order Details]
column_alias 可用于 ORDER BY 子句。然而,不能用于 WHERE、GROUP BY 或 HAVING 子句。如果查询表达式是 DECLARE CURSOR 语句的一部分,则 column_alias 不能用在 FOR UPDATE 子句中。
INTO 子句
创建新表并将结果行从查询插入新表中。
用户若要执行带 INTO 子句的 SELECT 语句,必须在目的数据库内具有 CREATE TABLE 权限。SELECT...INTO 不能与 COMPUTE 子句一起使用。有关更多信息,请参见事务和显式事务。
通过在 WHERE 子句中包含 FALSE 条件,可以使用 SELECT...INTO 创建没有数据的相同表定义(不同表名)。
语法
[ INTO new_table ]
参数
new_table
根据选择列表中的列和 WHERE 子句选择的行,指定要创建的新表名。new_table 的格式通过对选择列表中的表达式进行取值来确定。new_table 中的列按选择列表指定的顺序创建。new_table 中的每列有与选择列表中的相应表达式相同的名称、数据类型和值。
当选择列表中包含计算列时,新表中的相应列不是计算列。新列中的值是在执行 SELECT...INTO 时计算出的。
在此次发布的 SQL Server 版本中,select into/bulk 数据库选项对是否可以使用 SELECT INTO 创建永久表没有影响。对包括 SELECT INTO 在内的某些大容量操作的记录量,取决于对数据库有效的恢复模式。有关更多信息,请参见使用恢复模型。
在以前发布的版本中,如果设置了 select into/bulk ,则可用 SELECT INTO 创建永久表。
④ SQL的基本语法
一、基础
1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_admpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、说明:删除新表
drop table tabname
6、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
8、说明:创建索引:create [unique] index idxname on tabname(col….)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的sql语句
选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
A、left (outer) join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right (outer) join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full/cross (outer) join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
12、分组:Group by:
一张表,一旦分组 完成后,查询后只能得到组相关的信息。
组相关的信息:(统计信息) count,sum,max,min,avg 分组的标准)
在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据
在selecte统计函数中的字段,不能和普通的字段放在一起;
13、对数据库进行操作:
分离数据库: sp_detach_db; 附加数据库:sp_attach_db 后接表明,附加需要完整的路径名
14.如何修改数据库的名称:
sp_renamedb 'old_name', 'new_name'
二、提升
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1<>1(仅用于SQlServer)
法二:select top 0 * into b from a
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..
4、说明:子查询(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
5、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
6、说明:外连接查询(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
7、说明:在线视图查询(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2
9、说明:in 的使用方法
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)
10、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
11、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
12、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5
13、说明:一条sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
具体实现:
关于数据库分页:
declare @start int,@end int
@sql nvarchar(600)
set @sql=’select top’+str(@end-@start+1)+’+from T where rid not in(select top’+str(@str-1)+’Rid from T where Rid>-1)’
exec sp_executesql @sql
注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引)
14、说明:前10条记录
select top 10 * form table1 where 范围
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)
17、说明:随机取出10条数据
select top 10 * from tablename order by newid()
18、说明:随机选择记录
select newid()
19、说明:删除重复记录
1),delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
2),select distinct * into temp from tablename
delete from tablename
insert into tablename select * from temp
评价: 这种操作牵连大量的数据的移动,这种做法不适合大容量但数据操作
3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段
alter table tablename
--添加一个自增列
add column_b int identity(1,1)
delete from tablename where column_b not in(
select max(column_b) from tablename group by column1,column2,...)
alter table tablename drop column column_b
20、说明:列出数据库里所有的表名
select name from sysobjects where type='U' // U代表用户
21、说明:列出表里的所有的列名
select name from syscolumns where id=object_id('TableName')
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3
23、说明:初始化表table1
TRUNCATE TABLE table1
24、说明:选择从10到15的记录
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
⑤ SQL语句语法大全
我整理的一些比较常用的SQL语句语法 需要的朋友可以过来参考下
一 数据控制语句 (DML) 部分
INSERT (往数据表里插入记录的语句)
INSERT INTO 表名(字段名 字段名 ……) VALUES ( 值 值 ……);
INSERT INTO 表名(字段名 字段名 ……) SELECT 字段名 字段名 …… FROM 另外的表名;
字符串类型的字段值必须用单引号括起来 例如: GOOD DAY
如果字段值里包含单引号 需要进行字符串转换 我们把它替换成两个单引号
字符串类型的字段值超过定义的长度会出错 最好在插入前进行长度校验
日期字段的字段值可以用当前数据库的系统时间SYSDATE 精确到秒
或者用字符串转换成日期型函数TO_DATE(‘ YYYY MM DD )
TO_DATE()还有很多种日期格式 可以参看ORACLE DOC
年 月 日 小时:分钟:秒 的格式YYYY MM DD HH :MI:SS
INSERT时最大可操作的字符串长度小于等于 个单字节 如果要插入更长的字符串 请考虑字段用CLOB类型
方法借用ORACLE里自带的DBMS_LOB程序包
INSERT时如果要用到从 开始自动增长的序列号 应该先建立一个序列号
CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记) INCREMENT BY START WITH
MAXVALUE CYCLE NOCACHE;
其中最大的值按字段的长度来定 如果定义的自动增长的序列号 NUMBER( ) 最大值为
INSERT 语句插入这个字段值为: 序列号的名称 NEXTVAL
DELETE (删除数据表里记录的语句)
DELETE FROM表名 WHERE 条件;
注意 删除记录并不能释放ORACLE里被占用的数据块表空间 它只把那些被删除的数据块标成unused
如果确实要删除一个大表里的全部记录 可以用 TRUNCATE 命令 它可以释放占用的数据块表空间
TRUNCATE TABLE 表名;
此操作不可回退
UPDATE (修改数据表里记录的语句)
UPDATE表名 SET 字段名 =值 字段名 =值 …… WHERE 条件;
如果修改的值N没有赋值或定义时 将把原来的记录内容清为NULL 最好在修改前进行非空校验;
值N超过定义的长度会出错 最好在插入前进行长度校验
注意事项:
A 以上SQL语句对表都加上了行级锁
确认完成后 必须加上事物处理结束的命令 MIT 才能正式生效
否则改变不一定写入数据库里
如果想撤回这些操作 可以用命令 ROLLBACK 复原
B 在运行INSERT DELETE 和 UPDATE 语句前最好估算一下可能操作的记录范围
应该把它限定在较小 (一万条记录) 范围内 否则ORACLE处理这个事物用到很大的回退段
程序响应慢甚至失去响应 如果记录数上十万以上这些操作 可以把这些SQL语句分段分次完成
其间加上MIT 确认事物处理
二 数据定义 (DDL) 部分
CREATE (创建表 索引 视图 同义词 过程 函数 数据库链接等)
ORACLE常用的字段类型有
CHAR 固定长度的字符串
VARCHAR 可变长度的字符串
NUMBER(M N) 数字型M是位数总长度 N是小数的长度
DATE 日期类型
创建表时要把较小的不为空的字段放在前面 可能为空的字段放在后面
创建表时可以用中文的字段名 但最好还是用英文的字段名
创建表时可以给字段加上默认值 例如 DEFAULT SYSDATE
这样每次插入和修改时 不用程序操作这个字段都能得到动作的时间
创建表时可以给字段加上约束条件
例如 不允许重复 UNIQUE 关键字 PRIMARY KEY
ALTER (改变表 索引 视图等)
改变表的名称
ALTER TABLE 表名 TO 表名 ;
在表的后面增加一个字段
ALTER TABLE表名 ADD 字段名 字段名描述;
修改表里字段的定义描述
ALTER TABLE表名 MODIFY字段名 字段名描述;
给表里的字段加上约束条件
ALTER TABLE 表名 ADD CONSTRAINT 约束名 PRIMARY KEY (字段名);
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE (字段名);
把表放在或取出数据库的内存区
ALTER TABLE 表名 CACHE;
ALTER TABLE 表名 NOCACHE;
DROP (删除表 索引 视图 同义词 过程 函数 数据库链接等)
删除表和它所有的约束条件
DROP TABLE 表名 CASCADE CONSTRAINTS;
TRUNCATE (清空表里的所有记录 保留表的结构)
TRUNCATE 表名;
三 查询语句 (SELECT) 部分
SELECT字段名 字段名 …… FROM 表名 [表名 ……] WHERE 条件;
字段名可以带入函数
例如: COUNT(*) MIN(字段名) MAX(字段名) AVG(字段名) DISTINCT(字段名)
TO_CHAR(DATE字段名 YYYY MM DD HH :MI:SS )
NVL(EXPR EXPR )函数
解释:
IF EXPR =NULL
RETURN EXPR
ELSE
RETURN EXPR
DECODE(AA﹐V ﹐R ﹐V ﹐R )函数
解释:
IF AA=V THEN RETURN R
IF AA=V THEN RETURN R
…
ELSE
RETURN NULL
LPAD(char n char )函数
解释:
字符char 按制定的位数n显示 不足的位数用char 字符串替换左边的空位
字段名之间可以进行算术运算
例如: (字段名 *字段名 )/
查询语句可以嵌套
例如: SELECT …… FROM
(SELECT …… FROM表名 [表名 ……] WHERE 条件) WHERE 条件 ;
两个查询语句的结果可以做集合操作
例如: 并集UNION(去掉重复记录) 并集UNION ALL(不去掉重复记录) 差集MINUS 交集INTERSECT
分组查询
SELECT字段名 字段名 …… FROM 表名 [表名 ……] GROUP BY字段名
[HAVING 条件] ;
两个以上表之间的连接查询
SELECT字段名 字段名 …… FROM 表名 [表名 ……] WHERE
表名 字段名 = 表名 字段名 [ AND ……] ;
SELECT字段名 字段名 …… FROM 表名 [表名 ……] WHERE
表名 字段名 = 表名 字段名(+) [ AND ……] ;
有(+)号的字段位置自动补空值
查询结果集的排序操作 默认的排序是升序ASC 降序是DESC
SELECT字段名 字段名 …… FROM 表名 [表名 ……]
ORDER BY字段名 字段名 DESC;
字符串模糊比较的方法
INSTR(字段名 ‘字符串 )>
字段名 LIKE ‘字符串% [‘%字符串% ]
每个表都有一个隐含的字段ROWID 它标记着记录的唯一性
四 ORACLE里常用的数据对象 (SCHEMA)
索引 (INDEX)
CREATE INDEX 索引名ON 表名 ( 字段 [字段 ……] );
ALTER INDEX 索引名 REBUILD;
一个表的索引最好不要超过三个 (特殊的大表除外) 最好用单字段索引 结合SQL语句的分析执行情况
也可以建立多字段的组合索引和基于函数的索引
ORACLE 字符串可以索引的最大长度为 单字节
ORACLE 字符串可以索引的最大长度为 单字节
ORACLE DOC上说字符串最大可以建索引的长度约是:数据块的大小(db_block_size)* %
视图 (VIEW)
CREATE VIEW 视图名AS SELECT … FROM … ;
ALTER VIEW视图名 PILE;
视图仅是一个SQL查询语句 它可以把表之间复杂的关系简洁化
同义词 (SYNONMY)
CREATE SYNONYM同义词名FOR 表名;
CREATE SYNONYM同义词名FOR 表名@数据库链接名;
数据库链接 (DATABASE LINK)
CREATE DATABASE LINK数据库链接名CONNECT TO 用户名 IDENTIFIED BY 密码 USING ‘数据库连接字符串 ;
数据库连接字符串可以用NET EASY CONFIG或者直接修改TNSNAMES ORA里定义
数据库参数global_name=true时要求数据库链接名称跟远端数据库名称一样
数据库全局名称可以用以下命令查出
SELECT * FROM GLOBAL_NAME;
查询远端数据库里的表
SELECT …… FROM 表名@数据库链接名;
五 权限管理 (DCL) 语句
GRANT 赋于权限
常用的系统权限集合有以下三个:
CONNECT(基本的连接) RESOURCE(程序开发) DBA(数据库管理)
常用的数据对象权限有以下五个:
ALL ON 数据对象名 SELECT ON 数据对象名 UPDATE ON 数据对象名
DELETE ON 数据对象名 INSERT ON 数据对象名 ALTER ON 数据对象名
GRANT CONNECT RESOURCE TO 用户名;
GRANT SELECT ON 表名 TO 用户名;
GRANT SELECT INSERT DELETE ON表名 TO 用户名 用户名 ;
REVOKE 回收权限
REVOKE CONNECT RESOURCE FROM 用户名;
REVOKE SELECT ON 表名 FROM 用户名;
lishixin/Article/program/MySQL/201311/29570