第二讲:结构化查询语言SQL(一)在数据库中的所有的数据都是由DBMS进行管理的。
那么程序员如何通过DBMS与数据库进行交互呢?这就需要程序员和DBMS之间有一个相互交流和沟通的语言,我们将这个语言称之为结构化查询语言,即Structured Query Language,英文简称SQL。
作为一个合格的程序员,SQL指令是我们在开发基于数据库的应用时使用的最多的与数据库打交道的命令。
因此数量掌握SQL语句是必要的。
【SQL语句的分类】通常我们将SQL中的指令分为数据定义语句(DDL)、数据操纵语句(DML)、数据控制语句(DCL)。
它们各自的描述如下:数据定义语句(DDL):数据定义语句DDL用于定义和修改数据库对象。
数据库对象包括模式(表)、外模式(视图)和内模式(索引)。
常用的数据定义语句有create、alter、drop 等数据操纵语句(DML):数据操纵语句DML用于完成数据查询和数据更新的功能,数据的查询功能包括查询语句SELECT,数据更新功能包括插入语句INSERT、删除语句DELETE、更新语句UPDATE。
数据控制语句(DCL):数据控制语句DCL用于定义数据的安全控制功能,主要是对数据库中的对象的存取控制,即其规定不同的用户对不同的数据库对象具有不同的存储权限。
常用的指令为GRANT、REMOVE。
【数据库的生命周期】数据库的生命周期是指数据库从创建、使用直至消亡的过程。
通常在这个过程中我们需要使用以下的数据库指令:数据库的生命周期一般由程序员自己掌握,但是在某一些大型应用中也会将应用程序与数据库分离为两个独立的服务器,由专门的数据库管理员负责管理数据库的生命周期。
【SQL语句的注释】SQL语句中的注释通常有两种:单行注释和多行注释。
单行注释:单行注释通常使用两个横线表示,即“--注释内容”只能对SQL语句中的某一行进行注释。
多行注释:多行注释采用和C程序一样的注释即“/*注释内容*/”,通常可以对SQL中的一段进行注释。
【创建数据库】数据库的创建通常使用数据定义语句CREATE进行。
基本格式如下:其中CREATE是数据定义语句,意思为创建,后跟DATABASE关键字进行说明,此时创建的对象为数据库。
DATABASE_NAME是指由用户创建的数据库名称。
通常命名规则与C++等高级语言中的命名规则相同。
[例] 创建一个学生数据库下面我们在SQL Server中运行,查看结果:【使用数据库对象】此时我们可以看到我们已经成功的创建了数据库Student。
接下来就是需要新建某一个数据表了,但是由于SQL Server每次启动时都使用的是上一次操作保存的数据库,所以对于数据库Student来说,要想进行操作,就必须要先被使用。
通常我们采用USE关键字完成这件事情,格式如下:[例] 使用Student数据库:【创建数据表】在正确使用数据库之后,我们就可以在数据库中建立表格了。
当然表格的名字可以和数据库名称相同,但是我奉劝大家不要这么做,毕竟这样调试代码的时候不容易看出错误。
我们所定义的名称应该具有唯一性。
那么如何在数据库中建立一张表格呢?同样我们需要使用CREATE关键字,但是不同的是我们使用TABLE描述表名,同时使用一对小括号描述数据库的每个属性(即每个列)。
创建数据表的格式如下:其中COLUMN指示了属性的名称,而COLUMN_TYPE指示了属性的类型。
在SQL Server中,属性的类型可支持29种,由于大家的记忆力也是很有限的,故此在这里仅介绍几种常用的类型。
接下来我们将以新建一张学生信息表为例,说明CREATE TABLE指令的用法。
实例如下:在执行完上述指令后我们将看到数据库系统中多出了如下的表格:接下来我们可以选中这张表格,右击鼠标,选择“编辑前200行”命令进入数据表。
此时我们将会看到如下的空表:当然,此时你也可以通过该窗口向数据表中添加元组,你只需要将每一组元组设置好,然后按下回车就可以保存了。
如下图:当然此时我们也可以看到在这张手动添加的数据表中出现了一个很严重的逻辑错误。
我们的学号是唯一的,因此通过我们的学号可以唯一的确定我们的姓名,但是现在学号出现了不唯一的情况而且数据库系统并没有出现报错的情况。
怎么办呢?此时我们需要回顾到我们以前学过的一个知识点了。
通常我们将唯一能够确定某一个元组的属性称之为主码,也称之为主键,在SQL语句中常使用PRIMARY KEY作为关键字进行描述。
在上述表格中,我们可以发现学号即ID是该表格的主码,因此我们需要将它设置为主码。
【设置主键】设置主键通常使用两种方式,第一种是在新建表格时直接指定主键,当然,每个数据表中的主键只能有一个。
例如我们在新建上述学生信息表时可以将ID 设置为主键,代码如下:当然如果你的数据表已经建立好,并且其中已经含有了一些数据,此时你的数据表就不能再重新删除新建了,倘若这个时候你想修改主码就必须要借助于数据定义语句中的ALTER命令对数据表中的主键进行重新定义。
如上述的学生信息表,你可以使用以下指令修改:上述指令中的第一句是修改学生信息表中的属性ID为非空的意思,由于设置主键需要在非空列上进行,因此我们首先需要将原先允许为空的主键列设置为不允许为空。
最后一句是为学生信息表添加一个主键,并且设置主键列为ID。
其中CONSTRAINT关键字用于指示约束的别名。
NEW_PK是这个约束的别名。
在设置完主键之后我们再一次进入表格,并且添加两个相同的学号查看一下结果:此时我们发现数据库终于报错了,报错的内容如下:在这里我们可以发现指定主键的好处是可以保证数据的唯一性,当出现相同数据时,数据库系统会为我们及时报错,进而防止了在数据库中插入重复数据的操作。
毕竟两个人不能够有同一个学号啊!【数据表的删除】那么如何在DBMS中删除一个数据表呢?此时我们可以使用数据定义语句中的DROP指令来实现。
通常删除表格的格式如下:其中TABLE关键字说明删除的是一张表格,而TABLE_NAME是一张具体的并且真实存在的表格的名称。
对于不存在的表格,或者因权限不足而无法删除的表格,在执行DROP指令时程序将会报错![例] 删除学生信息表【数据库的删除】DBMS中删除数据库同样使用DROP指令进行,格式如下:当然在删除数据库之前我们需要对正在使用的数据库进行释放,而DBMS 无论在某一个时刻都必须要是与一个数据库进行捆绑,此时你可以使用USE指令选择其他的数据库进行使用,之后再对你的数据库进行删除操作。
实例代码如下:【数据的新增】那么如何新增一条记录呢?通常我们需要借助数据操纵语言中的INSERT 语句进行。
插入操作可以插入完整的一行,也可以对该元组中某几个固定的列进行插入操作,但是如果你需要操作的列被定义为主键或者不允许为空(not null),那么此时该列就必须要有数据插入,否则你将插入失败。
完整的数据插入:完整插入一行元组的格式如下:其中INSERT关键字指示操作为插入操作,INTO后加入需要进行插入操作的表名,V ALUES关键字用于指示需要插入的值集合,两个小括号中指定了具体插入的值。
这里值得说明的是小括号中的值的插入顺序需要和表中的属性顺序以及属性类型一致,即第一列为学号,则value1也必须为学号;第二列为姓名,则value2也必须为姓名……否则将会导致数据插入的逻辑错误。
[例] 某关系为:学生信息表(学号,姓名,年龄,地址),请使用SQL语句新建并且插入一条完整的记录。
执行完成后我们可以查看表格中的内容如下:部分列的数据插入:有时候我们会遇到一些信息统计不全的情况,此时我们需要插入一条不完整的元组,此时我们就需要对某一些特定的列进行操作。
格式如下:[例] 在上述学生信息表中插入一条新纪录,已知该生的学号为“211501002”,姓名为“李四”,其他未知。
在执行完成后我们可以打开数据表查看插入结果:【数据的删除】在SQL中,通常使用DELETE指令完成对数据库中的一个元组的删除。
通常我们为了精确的删除相关的数据我们需要在DELETE语句后使用WHERE关键字指定相关的条件。
完全删除:完全删除即清空整个数据表中的记录,其格式如下:其含义为:从名为TABLE_NAME的表格中删除,由于语句后面没有使用WHERE关键字指定删除的条件,故此将会清空表格中的所有数据。
部分删除:部分删除即仅仅删除数据表中的一条或者多条记录,其格式如下:此处需要说明的是WHERE关键字又称之为WHERE子句,用于指定筛选记录的条件,其后的条件可以是单纯的关系表达式,也可以是由任意关系表达式通过逻辑运算符连接起来的逻辑表达式。
关系表达式:SQL语句和其他程序设计语言一样,支持关系表达式,其关系运算符与Visual Basic中的关系运算符如出一辙。
常用的关系运算符如下:[例] 删除学生信息表中年龄大于18岁的元组[例] 删除学生信息表中学号为“211501002”的元组[例] 删除学生信息表中地址不为“江苏省徐州市”的元组逻辑表达式:在SQL中支持的逻辑运算符共有三个,具体如下:关于这三个运算符的详细含义我在这里就不再多说了,如果大家有疑惑的,可以参见C++教材上对于逻辑运算符的解释。
[例] 删除学生信息表中学号为211501013且地址不为“江苏省南通市”的元组[例] 删除学生信息表中年龄大于25或者姓名为“李四”的元组至此我们已经了解到了程序员如何通过SQL语句对数据库以及数据表进行新建、删除、插入和修改等操作,由于查询方面涉及到的方式较多,因此我们将单独在下一讲为大家讲述如何使用SQL语句中的SELECT指令进行数据查询的操作。
希望大家拭目以待哦!。