S1/C#语言和数据库技术基础/08-用SQL语句操作数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了S1/C#语言和数据库技术基础/08-用SQL语句操作数据相关的知识,希望对你有一定的参考价值。

SQL语言主要由以下几部分组成:

DML(Data Manipulation Language,数据操作语言,也称为数据操纵语言):用来插入、修改和删除数据库中的数据,如INSERT、UPDATE及DELETE等。

DDL(Data Definition Language,数据定义语言):用来建立数据库、数据库对象和定义其列,大部分是以CREATE开头的命令,如CREATE TABLE,CREATE VIEW及DROP TABLE等。

DQL(Data Query Language,数据查询语言):用来对数据库中的数据进行查询,如SELECT等。

DCL(Data Control Language,数据控制语言):用来控制数据库组件的存取许可、存储权限等,如GRANT、REVOKE等。

除此之外,T-SQL还包括变量说明、内部函数等其他的命令。

 

使用T-SQL插入数据

1、使用INSERT插入数据

语法:INSERT  [INTO]  表名  [(列名列表)]  VALUES  (值列表);

其中:

1、[INTO]是可选的,也可以省略。

2、表名是必需的。

3、表的列名是可选的,如果省略,将依次插入所有列。

4、多个列名和多个值列表用逗号分隔。

5、分号(;)是T-SQL语句终止符,分号不是必需的。

例如,以下的语句为向学生表中插入一行数据。

INSERT INTO Students(Sname,Saddress,Sgrade,Semail,SSex)

VALUES(‘张青裁‘,‘上海松江‘,6,‘[email protected]‘,0)

注意:SQLServer中,默认T-SQL是不区分大小写的,本书所有的T-SQL关键字均采用了大写方式,以突出表现。

 

再插入数据的时候,需要注意以下事项。

  • 每次插入一整行数据,不可能只插入半行或者几列数据,但允许某些列为空或使用默认值。
  • 数据值的数目必须与列数相同,每个数据值的数据类型、精度和小数位数也必须与相应的列匹配。
  • INSERT语句不能为标识列指定值,因为它的数字是自动增长的。
  • 对于字符类型、日期类型的列,当插入数据的时候,用单引号(‘)将其引起来。
  • 尽管可以不指定列名,但是最好明确指定插入的列和对应的值,以便能够将列和值清晰的对应起来。
  • 若在设计表的时候指定某列不允许为空,则该列必须插入数据,否则将报告错误信息。
  • 插入的数据项,要求符合检查约束的要求,例如,我们在前面设置了Semail列必须包含一个字符@,如果插入语句修改为

INSERT  INTO  Students(SName,SAddress,SGrade,Semail,SSex)

VALUES(‘张青裁‘,‘上海松江‘,6,‘ZQC‘,0)

执行该语句后,将提示与表的约束相冲突,插入失败。

  • 如果指定了列明,如何为具有默认值的列插入数据?例如,以上学生信息表中的地址信息十句有默认值的。这个时候可以使用DEFAULT(默认)关键字来代替插入的数值,插入如下语句。

INSERT  INTO  Students(SName,SAddress,SGrade,SEmail,SSex)

VALUES(‘张青裁‘,DEFAULT,6,‘[email protected]‘,0)

 

2、一次插入多行数据

一次插入多行数据有三种方法,下面分别讲解。

1/通过INSERT SELECT语句向表中添加数据

例如,创建一张新表AddressList来存储本班的通讯录信息,则可以从学生表中提取相关的数据插入建好的AddressList表中,T-SQL语句如下。

INSERT  INTO  AddressList(姓名,地址,电子邮件)

SELECT  Sname,Saddress,Semail

FROM Students

SELECT语句用于查询,上面的SQL语句用来把学生信息表中的姓名、地址和E-mail信息读取并保存到新的AddressList表中。

需要注意以下两点。

  • 查询得到的数据个数、顺序、数据类型等,必须与插入的项保持一致。
  • AddressList表必须预先创建好,并且具有姓名、地址和电子邮件三个列。

2/通过SELECT  INTO语句将现有表中的数据添加到新表中

与上面的INSERT  INTO类似,SELECT  INTO语句也是从一个表中选择一些数据插入新表中,所不同的是,这个新表是执行查询语句的时候创建的,不能够预先存在。

例如,以下的T-SQL语句:

SELECT  Students.SName,Students.SAddress,Students.SEmail

INTO  AddressList

FROM  Students

将创建新表AddressList,吧Students表中的Sname、Saddress、Semail作为AddressList表的新列,并且把查询到的数据全部插入新表中。

在向一个新表插入数据的时候,又会牵涉到一个新的问题:如何插入标识列?

因为标识列的数据是不允许指定的,因此我们可以创建一个新的标识列,语法如下。

语法:

SELECT  IDENTITY(数据类型、标识种子、标识增长量)  AS  列名

INTO  新表

FROM  原始表

上面的语句不会复制关系与check约束,也可以修改为

SELECT  Students.SName,Students.SAddress,Students.SEmail,IDENTITY(int,1,1)  AS

StudentID

INTO  AddressList

FROM  Students

上句的用法同SELECT   INTO新建表一样。

3/通过UNION关键字合并数据进行插入

UNION语句用于将两个不同的数据或查询结果合成一个新的结果集。

当然,不同的数据或查询结果,也要求数据个数、顺序、数据类型都一致,因此,当向表中多次插入数据的时候,可以使用SELECT…UNION来简化操作。

例如,以下的T-SQL语句:

INSERT Students(SName,SGrade,SSex)

SELECT  ‘张可‘,7,1  UNION

SELECT  ‘李扬‘,4,0  UNION

SELECT  ‘杨晓‘,2,0  UNION

SELECT  ‘汤美‘,3,0  UNION

SELECT  ‘苏三东‘,7,1  UNION

SELECT  ‘王立岩‘,3,1  UNION

SELECT  ‘张伟‘,7,1  UNION

SELECT  ‘陈刚‘,4,1  UNION

SELECT  ‘王娟娟‘,7,0;

这样的实际效果其实与上面INSERT…SELECT的效果是一样的,只不过多行数据是手写的,然后用UNION合并组成多行数据记录,最后把这些多行数据记录一起插入。此方法无法实现(默认值),DEFAULT,‘‘输入,日期也用‘‘字符方式。

 

使用T-SQL更新数据

使用T-SQL更新表中某行的语法格式如下。

语法:

UPDATE  表名  SET  列名  =  更新值  [WHERE  更新条件]

其中:

  • SET后面可以紧跟多个“列名=更新值”,修改多个数据列的值,不限一个,使用逗号分隔。
  • WHERE子句是可选的,用来限制更新数据的条件。若不限制,则整个表的所有数据行将被更新。

需要注意的是,使用UPDATE语句,可能更新一行数据,也可能更新多行数据,但也可能不会更新任何数据。

例如,在学生信息表中,要把所有学生的性别都改为0(女生)。

UPDATE  Students  SET  Ssex=0

对于地址为“北京女子职业技术学校刺绣班”的学生,若这个班级改为家政班了,则需要按照条件进行更新。

UPDATE  Students

SET  SAddress=‘北京女子职业技术学校刺绣班‘

WHERE  SAddress=‘北京女子职业技术学校刺绣班‘

前面已经提到,在T-SQL表达式中,可以使用列名和数值。如果学生在考试时,有一道题目的标准答案错了,导致评分失误,事后需要在成绩表中更新成绩,所有低于或等于95分的成绩都在原来的基础上加5分,更新的SQL语句如下。

UPDATE  Score

SET  Score = Score + 5

WHERE Score <= 95

提示:在更新数据的时候,一般都有条件限制,别忘了书写WHERE条件语句,否则将更新表中所有行的数据,这就可能导致有效数据的丢失。

 

使用DELETE删除数据

使用T-SQL删除表中的数据,语法如下所示。

语法:

DELETE  [FROM]  表名  [WHERE  <删除条件>]

在学生信息表中删除姓名为“张青裁”的数据的SQL语句如下。

DELETE  FROM  Students

WHERE  SName  =  ‘张青裁‘

还有一种情况,如果要删除的行的主键值被其他表引用,例如,分数表中的StudentID引用了学生信息表中的SCode列,那么删除被引用的行时:

DELETE  FROM  Students

WHERE  SCode  =  22

SQL Server将报告与约束冲突的错误信息

提示:DELETE语句删除的是整条记录,不会只删除单个列,所以在DELETE后不能出现列名,例如,以下语句:

DELETE  SAddress  FROM  Students

将报告错误信息。

 

使用TRUNCATE TABLE删除数据

TRUNCATE  TABLE用来删除表中的所有行,功能上它类似于没有WHERE子句的DELETE语句。

例如,要删除学生信息表中的所有记录行,可以使用以下语句。

TRUNCATE  TABLE  Students

但TRUNCATE  TABLE  比DELETE执行速度快,使用的系统资源和事务日志资源更少,并且删除数据后表的标识列会重新开始编号。

TRUNCATE  TABLE删除表中的所有行,但是表的结构、列、约束、索引等不会被改动。TRUNCATE  TABLE不能用于有外键约束引用的表,这种情况下,需要使用DELETE语句。

实际工作中,不建议使用TRUNCATE  TABLE语句,因为使用他删除的数据不能恢复还原。

以上是关于S1/C#语言和数据库技术基础/08-用SQL语句操作数据的主要内容,如果未能解决你的问题,请参考以下文章

S1/C#语言和数据库技术基础/02-C#语法快速热身

S1/C#语言和数据库技术基础/10-模糊查询和聚合函数

S1/C#语言和数据库技术基础/09-数据查询基础

S1/C#语言和数据库技术基础/01-第一个C#程序

S1/C#语言和数据库技术基础/03-使用属性升级MyBank

S1/C#语言和数据库技术基础/06-程序数据集散地:数据库