第4章 SQL基础
学习每一个数据库不能缺少的就是如何访问它的语言,学习一个访问数据库的语言,就是和数据库沟通的第一步。SQL(Structured Query Language)是每一个数据库都通用的语言,因此,学好Oracle 11g,SQL也是基础。使用SQL语言可以在数据库中创建表、检索数据、操作数据,并对权限进行控制。本章包括以下知识点:
❑ SQL语言概述以及分类
❑ SQL中4种类型的语言讲解(DDL、DML、DQL、DCL)
本章内容基本涵盖了对SQL中4种类型语言的讲解。通过本章的学习,读者可以熟练地使用SQL语言对Oracle 11g数据库进行操作。
4.1 SQL—数据库沟通的语言标准
SQL(结构化查询语言)的主要功能就是在各种数据库间建立联系,进行沟通。本节将学习什么是SQL及其分类。
4.1.1 什么是SQL
美国国家标准学会(American National Standards Institute)成立于1918年,SQL就是美国国家标准学会确定的。SQL主要用于存取数据以及查询、更新和管理关系数据库系统。SQL语言自IBM公司在1981年推出以后,由于其语法结构简洁又简单易学,在数据库中得到了广泛的应用。现行的所有数据库几乎都支持SQL语言,如Sybase、SQL Server、Oracle以及Visual FoxPro等数据库。但是这些数据库各自又对SQL语言进行了改进,如SQL Server数据库使用Transact-SQL语言。我们学习的Oracle数据库使用的是PL/SQL语言。
SQL语言本身可以分成4类,即:
❑ 定义要在数据库存储哪些信息的数据定义语言(DDL);
❑ 对数据库中的表进行操作的数据操纵语言(DML);
❑ 对数据库中的表进行检索的数据查询语言(DQL);
❑ 对数据库中对象进行权限管理的数据控制语言(DCL)。
4.1.2 了解SQL的种类
从SQL语言的种类来看,由数据库表的创建到给数据库中的对象进行权限管理全部都可以使用SQL语言,下面就按照SQL语言的使用顺序说明每种SQL语言的作用。
1. 数据定义语言(DDL)
数据定义语言(Data Definition Language,DDL)正如它字面上的意思,是定义数据库中数据要如何存储的。DDL语言包括对数据库中对象的创建、修改、删除的操作,这些对象主要有数据库、数据表、视图、索引等。
2. 数据操纵语言(DML)
数据操纵语言(Data Manipulation Language,DML)也像它字面上的意思,是对数据库表进行操作的。这些操作主要包括对数据库表中的数据进行增加、删除、修改的操作,并且在操作时一次可以把表中数据按条件进行多条或全部的处理,为数据库的使用提供方便。
3. 数据查询语言(DQL)
数据查询语言(Data Query Language,DQL)是对数据库表中的数据进行查询的,查询时既可以查询一个表也可以进行多表的查询,并且可以按不同的条件来检索数据,给数据库的查询统计工作带来了更多的便利。
4. 数据控制语言(DCL)
数据控制语言(Data Control Language,DCL)是对数据库中的对象权限进行权限设置和取消等操作,但是只有数据库的系统管理员才有权力去执行对数据库对象权限的操作。使用DCL可以为数据库中不同的用户设置不同的权限,这样也能够提高数据库的安全性。
4.2 Oracle 11g中支持的数据类型
数据类型是在向数据表中存储数据前必须设定好的,就像如果要使用记事本查看文件内容,那么文件就要是文本的,不能有图片,否则图片是查看不了的,因为记事本中只能查看文本文件。数据类型如此重要,本节中将首先介绍如何查看Oracle 11g中的全部数据类型,然后讲解其中常用的数据类型。
4.2.1 查看Oracle 11g中的数据类型
要使用数据库来存储数据,首先就要知道这个数据库都能存储什么类型的数据。首先在Oracle 11g的企业管理器中查看数据类型。查看的步骤如下所示。
1. 打开企业管理器
在安装完Oracle 11g后企业管理器就已经安装完成了,在【开始】菜单中的【程序】下找到安装的目录,单击其中的【Database Control-orcl】项,如图4.1所示。企业管理器的登录页面如图4.2所示。
注意
这里【Database Control-orcl】项中的orcl指的是安装数据库时的数据库实例名。
图4.1 打开企业管理器
图4.2 企业管理器登录页面
在图4.2所示的企业管理器登录页面中输入用户名和口令,并把连接身份设置为SYSDBA,单击【登录】按钮,登录到企业管理器的主界面,如图4.3所示。
图4.3 企业管理器主界面
2. 进入创建数据表界面
在图4.3所示的企业管理器主界面中,单击【方案】链接,进入方案界面,如图4.4所示。在“数据库对象”一栏里,单击【表】链接,进入创建表界面,如图4.5所示。
图4.4 企业管理器中方案界面
图4.5 创建表界面
3. 查看数据类型
为了查看表中的数据类型,单击创建表界面中的【创建】按钮,界面如图4.6所示。在界面中选中【标准】单选按钮,单击【继续】按钮,界面如图4.7所示。
在图4.7所示的界面中,在“数据类型”下拉列表中一共有23种数据类型,分别是VARCHAR2、NUMBER、DATE、CHAR、FLOAT、INTEGER、NCHAR、NVARCHAR2、LONG、LONG RAW、RAW、ROWID、UROWID、BLOB、CLOB、NCLOB、BFILE、TIMESTAMP、INTERVAL YEAR、INTERVAL DAY、BINARY_DOUBLE、BINARY_FLOAT、XML TYPE类型。
图4.6 创建表第一步
图4.7 创建表界面
4.2.2 常用数据类型
在Oracle 11g中提供的数据类型有23种,下面介绍常用的数据类型,并把数据类型分为字符型、数字型、日期类型和其他数据类型4类进行讲解。
1. 字符型
字符型在Oracle 11g中有varchar2、char、nchar、nvarchar2和long五种,它们在数据库中是以ASCII码的格式存储的。下面用一个表格来讲解每种数据类型的作用,如表4.1所示。
表4.1 字符型
说明
在Oracle11g中long类型很少使用,最常使用的字符数据类型就是varchar2。
2. 数字型
数字型在Oracle 11g中常用的有number和float类型两种,可以用它们来表示整数和小数。具体取值范围如表4.2所示。
表4.2 数字型
3. 日期类型
日期类型在Oracle 11g中常用的有date和timestamp两种类型,可以用它们来存放日期和时间。详细说明如表4.3所示。
表4.3 日期类型
4. 其他数据类型
除了上面讲过的字符型、数字型、日期类型之外,在Oracle 11g中还有存放大数据的数据类型以及存放二进制文件的数据类型。表4.4所示是对这些数据类型的详细说明。
表4.4 其他数据类型
4.3 数据定义语言(DDL)
DDL主要包括数据库对象的创建(create)、删除(drop)和修改(alter)的操作。本节中将以数据表为对象讲解创建、删除、修改的DDL语言,对于其他对象的操作将在后面的章节中详细介绍。
4.3.1 使用Create语句创建表
在DDL语言中第一次使用数据库要用到的就是创建表,创建表使用create table语句完成。具体语法如下:
CREATE TABLE table_name ( column_name datatype [null|not null], column_name datatype [null|not null], ... [constraint] )
【语法说明】
❑ table_name:在数据库中创建的数据表的名称,在一个数据库中数据表名是不能重复的。
❑ column_name:表中的列名,列名在一个表中也是不能重复的。
❑ datatype:该列存放数据的数据类型。
❑ [null|not null]:允许该列为空或者不允许该列为空,在创建表时默认为不允许该列为空。
❑ [constraint]:为表中的列设置约束,约束主要包括主键约束、外键约束、检查约束等,在第3章中有简要的介绍,在4.4节中将详细讲解如何创建这些约束。
下面利用上面的语句创建一个商品信息表。首先打开sql/plus并以scott用户的身份登录,商品信息表中有商品编号、商品名称、商品价格、商品数量、商品类型、商品描述、产地7个字段。这些字段的数据类型定义如表4.5所示。
表4.5 商品信息表(productinfo)
按照设置好的字段名和数据类型在sql/plus中创建表productinfo,结果如图4.8所示。
图4.8 产品信息表
4.3.2 使用Alter语句修改表
如果要对已经创建好的表进行修改,那么就需要使用alter table语句来修改。修改表的基本语法如下:
ALTER TABLE table_name ADD column_name | MODIFY column_name|DROP COLUMN column_name;
【语法说明】
❑ ADD:用于向表中添加列。
❑ MODIFY:用来修改表中已经存在的列的信息。
❑ DROP COLUMN:删除表中的列,在删除表中的列时经常要加上CASCADE CONSTRAINTS,是要把与该列有关的约束也一并删除掉。
下面就利用上面的知识分别完成下面几个例子。
【示例1】修改productinfo商品信息表,向该表中增加一列
向表中添加列使用的是ADD子句,向表中增加一列备注remark信息,字段类型是varchar2。修改操作如图4.9所示。
图4.9 添加列remark
这样,就完成了在productinfo表中增加一列的修改操作。
注意
这里在登录SQL*Plus时使用的用户是sys,所以在修改表时需要在表的前面加上scott,如果使用scott用户登录就不用再添加scott了。
【示例2】修改productinfo商品信息表,修改列的字段类型
修改字段类型需要使用的是MODIFY子句,修改productinfo中刚添加的remark列的字段类型为number类型。修改操作如图4.10所示。
这样就完成了把remark字段的类型修改成number类型的操作了。
【示例3】修改productinfo商品信息表,删除表中的字段
删除表中的字段要使用DROP子句,下面就删除productinfo表中的remark字段。删除操作如图4.11所示。
图4.10 修改remark列
图4.11 删除remark列
这样就把remark列从表productinfo中删除了。
上面已经练习了如何修改表中的字段。实际上,对表的修改操作并不是一次只能修改一个字段,也可以同时完成对多个字段的修改。下面就运用上面的语句,完成一个综合的实例。
【示例4】修改productinfo商品信息表的多个字段
修改productinfo表中的ProductName字段,把字段的长度修改成25,并添加一个字段remark。具体操作如图4.12所示。
这样就同时修改了表中两个字段,除了修改和添加字段外,还可以删除多余的字段。这里就不一一演示了,请读者自行练习。
图4.12 修改多个字段
在对表的修改操作中还可以修改表中约束的信息,对于约束的修改将在4.4节中详细讲述。
4.3.3 使用Drop语句删除表
在使用数据库中的表时经常需要删除一些不需要的表,删除表需要使用DROP TABLE语句来完成。具体语句如下:
DROP TABLE table_name;
删除表的语句是非常简单的,只需要指定要删除的表名,即可删除该表。
下面就利用上面删除表的语句完成删除的操作。如果要删除上面创建的productinfo表,只需要下面的语句即可完成:
DROP TABLE productinfo;
以上就是对数据定义语言(DDL)基本操作的讲解。
4.4 约束的使用
约束是保证数据库表中数据的完整性和一致性的手段,在本书的第3章中已经介绍过Oracle 11g中的5个约束,即主键约束、外键约束、唯一约束、检查约束、非空约束。在本节中将一一讲解每一个约束是如何创建、修改、删除的。
4.4.1 主键约束
主键约束在每一个数据表中只有一个,但是一个主键约束可以由数据表中多个列组成。下面就学习主键约束的使用。
(1)使用主键约束创建商品类型信息表在创建表时就创建主键约束,只需要使用primary key(字段名)即可完成。商品类型信息表主要用来存放商品类型信息,包括商品类型编号和商品类型名称,并把商品类型编号设置成主键。这两个字段的数据库类型定义如表4.6所示。
表4.6 商品类型信息表(categoryinfo)
按照设置好的字段名和数据类型,在sql/plus中创建表categoryinfo,并把商品类型编号(CategoryId)设置成主键,结果如图4.13所示。
图4.13 商品类型信息表
(2)使用ALTER TABLE语句为表添加主键约束
在创建表时如果没有创建主键约束,可以在修改表时为表添加主键约束。添加主键约束的语法如下:
ALTER TABLE table_name ADD CONSTRAINTS constraint_name PRIMARY KEY(column_name);
【语法说明】
❑ constraint_name:约束的名称。
❑ column_name:主键约束指定数据表中的列名。
下面就假设在创建商品类型信息表categoryinfo时没有添加主键约束,在修改表时为表添加主键约束,结果如图4.14所示。
图4.14 添加主键约束
这样就创建了主键约束,主键约束的名称是pk_category,创建的主键列是categoryid。
(3)移除主键约束
如果需要移除表中现有的主键约束,可以使用如下所示的语句完成:
ALTER TABLE table_name DROP CONSTRAINT constraint_name;
【语法说明】
constraint_name:要移除的约束名称,这个名称可以是在表中任意约束的名称。
下面利用上面的语句,移除商品类型信息表中的主键约束pk_category。具体语句如下:
ALTER TABLE categoryinfo DROP CONSTRAINT pk_category;
这样,就完成了主键约束pk_category的移除操作。
4.4.2 外键约束
外键约束可以保证使用外键约束的数据库列与所引用的主键约束的数据列一致,外键约束在一个数据表中可以有多个。下面就来讲述外键约束的使用。
(1)使用外键约束创建商品信息表
外键约束是建立在两张表中的约束,需要在创建表的语句后面加上如下语句:
CONSTRAINT constraint_name FOREIGN KEY(column_name) REFERENCE table_name(column_name) ON DELETE CASCADE;
【语法说明】
❑ constraint_name:创建的外键约束名字。
❑ FOREIGN KEY (column_name):指定外键约束的列名。
❑ REFERENCE:要引用的表名(列名)。
❑ ON DELETE CASCADE:设置级联删除,当主键的字段被删除时,外键所对应的字段也被同时删除。
下面就利用上面的语句完成外键约束的创建。在创建商品信息表时有一个字段叫做商品类型,如果要让商品信息表中类型全部来源于商品类型信息表中的类型,就可以把商品信息表中商品类型设置成外键约束。这里为了不删除原有的表,新创建一张商品信息表(productinfo1)。具体操作语句如图4.15所示。
图4.15 创建外键约束
这样,在商品信息表productinfo1的category字段中的数据就必须是商品类型信息表中已经存在的商品类型,也就保证了商品类型信息的一致性。
(2)在修改数据库表时添加外键约束
在已经存在的数据库表中也是可以添加外键约束的。添加外键约束是在ALTER TABLE语句后面加上如下语句:
ADD CONSTRAINT constraint_name FOREIGN KEY(column_name) REFERENCE table_name(column_name) ON DELETE CASCADE;
上面的语句和创建外键约束的语句一致,这里就不再详细讲解了。
下面就使用上面的语句,完成对之前已经创建好的商品信息表(productinfo)添加外键约束的操作。具体操作语句如图4.16所示。
图4.16 添加外键约束
这样,就为表productinfo中的category字段添加了外键约束。
(3)移除外键约束
移除外键约束与移除主键约束的语法一致,这里以删除productinfo1中的外键约束fk_pro为例删除外键约束。具体删除语句如下:
ALTER TABLE productinfo1 DROP CONSTRAINT fk_pro;
这样,就移除了表productinfo1中的外键约束fk_pro。
4.4.3 CHECK约束
CHECK约束是检查约束,能够规定每一个列能够输入的值,以保证数据的正确性。下面就详细讲解CHECK约束的使用。
(1)创建表时添加CHECK约束
创建CHECK约束可以设置在“性别”列中只能输入男或者女,在“年龄”列中只能输入18~30岁的年龄。创建CHECK约束的语句是在创建表的语句后面加上如下语句完成的:
CONSTRAINT constraint_name CHECK(condition);
其中,condition是检查约束的条件,检查约束的条件要建立在具体的字段中。例如,给字段Age设置为18~30岁,就可以写成age>=18 and age<=30。
下面创建一个顾客信息表,顾客信息表主要包括顾客编号、顾客姓名、顾客年龄、顾客性别、顾客电话、顾客住址6个字段信息。顾客信息表的详细信息如表4.7所示。
表4.7 顾客信息表(custominfo)
根据表4.7所示的顾客信息表的信息,创建顾客信息表,并设置Age列的取值范围是18~50岁。具体操作如图4.17所示。
图4.17 创建Age列的检查约束
这样就完成了年龄字段中检查约束的创建,在年龄的字段中只能输入18~50的数字,输入其他的数字就会出现错误。
(2)在修改数据表时添加CHECK约束
在修改数据表时添加检查约束的方法也比较简单,在ALTER TABLE语句的后面添加如下语句即可:
ADD CONSTRAINT constraint_name CHECK(condition);
下面利用上面语句为顾客信息表添加性别列的检查约束,要求性别列只能输入“男”或者“女”。具体操作如图4.18所示。
图4.18 添加Gender列的检查约束
这样就完成了Gender性别列检查约束的添加,也可以同时添加多个检查约束。
(3)移除CHECK约束
移除CHECK约束也与移除其他约束一样,只要知道CHECK约束的名字,就可以移除CHECK约束,下面就移除在顾客信息表中Gender列的检查约束chk_gender。具体语句如下:
ALTER TABLE custominfo DROP CONSTRAINT chk_gender;
这样,就可以移除CHECK约束chk_gender。
4.4.4 UNIQUE约束
UNIQUE约束称为唯一约束,可以设置在表中输入的字段值都是唯一的,这个约束和之前学习的主键约束非常相似。不同的就是唯一约束在一个表中可以有多个,而主键约束在一个表中只能有一个。下面就详细讲述UNIQUE约束的使用。
(1)在创建表时添加UNIQUE约束
在创建表时可以为表中的字段直接添加UNIQUE约束,具体的创建方法是在创建表的语句后面加上下面的语句:
CONSTRAINT constraint_name UNIQUE(column_name);
下面就创建一个订单信息表,订单信息表中主要包括订单编号、顾客编号、商品编号、订单日期、订货数量、发货日期,订单信息表的详细信息如表4.8所示。
表4.8 订单信息表(orderinfo)
根据表4.8所示订单信息,创建订单信息表,并把订单编号设置成UNIQUE约束。具体操作如图4.19所示。
这样,就为订单信息表中的订单编号设置了唯一约束,订单编号在订单信息表中的信息就不可以重复了。
(2)在修改表时添加UNIQUE约束
修改表时添加UNIQUE约束也是在ALTER TABLE语句后面加上如下语句完成的:
ADD CONSTRAINT constraint_name UNIQUE(column_name);
下面就对订单信息表中的顾客编号加入UNIQUE约束,具体操作如图4.20所示。
图4.19 添加唯一约束
图4.20 为顾客编号加入UNIQUE约束
这样,就说明了在一个表中可以添加多个UNIQUE约束。
(3)移除UNIQUE约束
移除UNIQUE约束的方法也和移除其他约束一样,这里移除为订单信息表添加的顾客编号的UNIQUE约束。移除UNIQUE约束的语句如下:
ALTER TABLE orderinfo DROP CONSTAINT unq_customid;
这样,就可以移除顾客编号的UNIQUE约束了。
4.4.5 NOT NULL约束
NOT NULL约束就是非空约束,经常会在创建表时添加非空约束以确保字段必须要输入值。该约束和之前的约束不同,是直接在创建列时设置字段的非空约束。下面就详细讲解NOT NULL约束的使用。
(1)创建NOT NULL约束
创建NOT NULL约束的语法在创建表时就已经解释过了,这里创建一个商品管理员信息表,主要包括管理员编号、管理员注册名、管理员密码、管理员真实姓名、管理员联系方式。详细信息如表4.9所示。
表4.9 管理员信息表(Managerinfo)
根据表4.9所示的信息,创建管理员信息表并且把LoginName和Password两个字段设置为非空约束。具体操作如图4.21所示。
这样,就完成了LoginName和Password两个字段的非空约束的设置,和非空约束对应的还可以设置该字段为空,也就是NULL。
(2)修改表时设置NOT NULL约束
在修改表时设置NOT NULL约束,也不需要再使用ADD关键字来添加约束,只要使用MODIFY关键字就可以设置表中字段的NOT NULL约束。具体语法如下:
ALTER TABLE table_name MODIFY column NOT NULL;
下面就利用上面的语句完成设置管理员信息表真实姓名列为NOT NULL的操作,具体操作如图4.22所示。
图4.21 设置非空约束
图4.22 为Name列设置NOT NULL约束
对于非空约束不需要删除,如果要取消某个列非空的约束,直接使用MODIFY语句把该列的非空约束写成NULL即可。
4.5 数据操纵语言(DML)和数据查询语言(DQL)
DML也就是用来操纵数据库中数据所使用的语言,对数据库中的数据操纵无非就是对数据进行增加、删除、修改、查询的操作。对于数据的查询也称为数据查询语言。本节将详细讲解数据操纵语言的使用。
4.5.1 添加数据就用INSERT
在创建好数据表之后,添加数据是首先要做的工作。在给表中添加数据时要与表中字段类型相匹配,也就是说,如果表中的字段是日期类型,那么在向该字段中添加数据时也要添加日期类型的数据。向表中添加数据的一般语法如下:
INSERT INTO table_name(column_name1, column_name2,...)VALUES(data1,data2...);
【语法说明】
❑ column_name1:指定表中要添加数据的列名,可以是1个到多个。
❑ data1:要填入指定列的数据值,这里要求添加值的数目要与列名的数量一致。
实际上,向数据表中添加数据不仅可以使用上面的语句来向表中添加值,也可以根据其他数据表中的数据来添加数据。下面就分别讲述这两种向表中添加数据的方法。
(1)直接添加数据
直接添加数据时使用上面的语句就可以完成。下面就完成向管理员信息表中添加数据的操作。具体操作如图4.23所示。
图4.23 增加数据
这样,在管理员信息表managerinfo中就增加了一条数据。
(2)通过其他数据表向表中添加数据
如果在数据库中需要新创建一个数据表,但是这个表中的数据又与其他表中的数据有些相似,那么就可以直接把其他表中的数据添加到新创建的数据表中,这样就能减少添加数据的工作量。具体语法如下:
INSERT INTO table_name1(column_name1, column_name2,...) select column_name1, column_name2... FROM table_name2;
【语法说明】
❑ table_name1:目标表的名称,也就是要插入数据的表名。
❑ table_name2:数据的来源表。
注意
在使用来源表向目标表中插入数据时,一定要确保两个表的列的个数和列的数据类型都一致,否则会出现错误。
【示例5】下面就利用上面的语句完成从管理员信息表中把数据添加到新创建的账号信息表中
首先要新创建一个账号信息表。账号信息表主要就是用来存放所有管理员的登录账号的,信息表中只有用户名和密码两个字段。详细信息如表4.10所示。
表4.10 账号信息表(LoginInfo)
根据表4.10所示的账号信息表的详细信息创建账号信息表,然后把管理员信息表中的注册名和密码添加到账号信息表中。具体操作如图4.24所示。现在表logininfo中也就含有了一条数据,并不是说向表中只能添加一条数据,而是因为表managerinfo中只包含了一条数据。
图4.24 从其他表中添加数据
上面介绍的这种添加数据的方式的前提是目标数据表已经存在,也就是logininfo这个表是先创建好的,如果想不创建表就直接通过源数据表在添加数据的同时创建表也是可以实现的。具体语法如下:
CREATE TABLE table_name AS SELECT column_name1, column_name2,...FROM source_table;
【语法说明】
❑ table_name:要新创建的目标表的名称。
❑ source_table:创建目标表时数据的来源表。这里可以指定查询表的字段,也可以用“*”代表查询表中的全部字段。
利用上面的语句创建一个表login,数据的来源表仍然选择managerinfo。具体的操作如图4.25所示。
图4.25 直接创建带数据的表
这样就创建了login表,并且可以使用SELECT语句查看到在login表已经存在了一条记录。
4.5.2 修改数据就用UPDATE
修改数据也是经常要使用的,在已经存在数据的表中修改数据使用UPDATE语句即可完成。具体语法如下:
UPDATE table_name SET column_name1=data1,column_name1=data2,...[WHERE condition] ;
【语法说明】
❑ column_name1:要修改数据列的字段名,可以是一个或多个。
❑ data1:要赋给字段的新值,这个值的数据类型要与数据表中字段的数据类型一致。
❑ WHERE:条件,这里如果省略了WHERE语句,那么就意味着要修改表中该字段的所有值,如果加上WHERE语句,那么就可以有选择地修改数据表中的某个字段。
下面就利用UPDADE语句完成修改表中字段的全部值和某一个字段的值的操作。
(1)修改表中指定字段的全部值
修改表中的全部值就是使用不带WHERE子句的语句完成。下面就修改新创建的表login中loginname注册名字段,把注册名都改写成“test”。具体操作如图4.26所示。这样就把表中所有的LoginName全部更改为test了。
图4.26 修改表中指定字段的全部值
(2)根据条件修改表中指定字段的值
根据条件修改表中的数据可使用WHERE子句来完成。下面就将表login中用户名是“XIAOMING”的密码更改为“654321”。具体操作如图4.27所示。
图4.27 根据条件修改表
这样,就把用户名是“XIAOMING”的密码修改成了“654321”。这里,需要注意的是在查询时要区分大小写。
4.5.3 删除数据就用DELETE
经常要删除数据表中一些没有用的数据,删除数据要使用DELETE关键字来完成。使用它可以根据条件删除指定的数据,也可以删除表中的全部数据。一般的语法如下:
DELETE FROM table_name [WHERE condition];
其中,[WHERE condition]子句是可以省略的,如果省略了[WHERE condition]子句,就意味着删除数据表中全部的数据,如果加上了[WHERE condition]子句就可以根据条件删除表中的数据。这里,删除数据都是指删除数据表中一条记录并不是删除表中某个字段。
下面就分别使用DELETE语句根据条件删除表中的记录和删除表中全部记录。
(1)根据条件删除表中的记录
根据条件删除表中的记录就是使用[WHERE condition]子句来完成。下面就删除LOGIN表中用户名是“AAA”的记录。具体操作如图4.28所示。
这样,再查看LOGIN表中的数据时就可以看出其中已经不存在用户名是“AAA”的记录了。
(2)删除表中全部记录
删除表中全部记录就是不使用[WHERE condition]子句来完成操作。下面就删除LOGIN表中的全部记录。具体操作如图4.29所示。
图4.28 根据条件删除记录
图4.29 删除全部记录
这样就删除了表LOGIN中的全部记录,再查询LOGIN表时就可以看到查询结果是“未选定行”,这代表LOGIN表中已经不存在数据了。
4.5.4 查询数据就用SELECT
数据查询语言也称为DQL,这部分内容将在第5章中详细介绍。在本小节中主要介绍SELECT语句的基本用法。SELECT的一般语法如下:
SELECT column_name1, column_name2,... FROM table_name WHERE[condition];
【语法说明】
❑ column_name1:代表的是数据表中的字段名,可以查询数据表中的一个或多个字段,同时可以使用“*”号代替数据表中所有的字段。
❑ WHERE[condition]:代表的是查询的条件,如果不指定查询条件则查询数据表中所有的记录;如果指定查询条件,那么就可以根据查询条件来查询记录了。
下面分别使用SELECT语句查询表中的记录。
(1)查询表中全部数据
查询表中全部数据可以直接使用SELECT语句完成。下面查询LOGIN表中的全部记录,具体操作如图4.30所示。从查询结果就可以看出查询了表LOGIN中全部字段的全部数据。
(2)查询表中某一字段的数据
查询表中某一个字段的数据可以直接在SELECT语句后面指定要查询的字段名。下面就查询LOGIN表中LOGINNAME的值,具体操作如图4.31所示。
图4.30 查询全部数据
图4.31 查询LOGINNAME列
在SELECT语句后面指定了列名LOGINNAME,这样就可以在LOGIN表中只查询LOGINNAME列的值。
说明
如果在实际应用中只需要表中某些列的值,最好是指定出列名来查询,不要使用“*”号来查询全部的记录,因为查询全部记录会影响查询的效率。
(3)根据条件查询数据
根据条件查询数据就是使用WHERE[condition]子句来完成操作。下面就查询LOGINNAME是“AAA”的记录。具体操作如图4.32所示。
图4.32 根据条件查询记录
通过带条件的查询可以看出,在LOGIN表中只查询出了LOGINNAME是“AAA”的记录。
4.5.5 其他数据操纵语句
在Oracle 11g中除了上面所讲述的INSERT、UPDATE、DELETE、SELECT语句之外,还有MERGE、TRUNCATE、LOCK TABLE等语句。在本小节中再讲述一下比较常用的TRUNCATE语句和MERGE语句的使用。
(1)TRUNCATE语句
TRUNCATE语句和DELETE语句一样都是用来完成删除数据表中数据的,但是二者是有区别的。使用TRUNCATE语句删除表中的记录都是要把表中的记录全部删除,但是TRUNCATE语句删除表中数据的速度要比使用DELETE语句删除表中的数据更快一点。具体语法如下:
TRUNCATE TABLE table_name;
这里,只要指定要删除的表名就可以删除表中的全部记录,它是无条件的删除。下面就使用该语句删除表LOGIN中的记录。具体操作如图4.33所示。
(2)MERGE语句
MERGE语句与UPDATE语句的功能类似,都是修改数据表中数据的,但是MERGE语句与UPDATE语句也是有区别的。使用MERGE语句可以对数据表同时进行增加和修改的操作。具体语法如下:
图4.33 删除表中记录
MERGE [INTO] table_name1 USING table_name2 ON(condition) WHEN MATCHED THEN merge_update_clause WHEN NOT MATCHED THEN merge_insert_clause;
【语法说明】
❑ table_name1:要修改或添加的表。
❑ table_name2:参照的更新的表。
❑ condition:table_name1和table_name2之间的关系,或其他的一些条件。
❑ merge_update_clause:如果和参照表table_name2中的条件匹配,就执行更新操作的SQL语句。
❑ merge_insert_clause:如果条件不匹配,就执行增加操作的SQL语句。
注意
这里merge_update_clause和merge_insert_clause都是可以省略的,但是在操作时只能省略一个,如果两个语句都省略,那么MERGE语句就失去意义了。
下面就使用MERGE语句完成对LOGIN表的操作。
(1)省略增加的语句
首先分别查询LOGIN与MANAGERINFO表中的全部数据,然后使用MERGE语句进行更新操作。更新的条件是两个表的编号列相同,当满足条件时把LOGIN表中满足条件记录的LOGINNAME列改写成MANAGERINFO表中的LOGINNAME列。具体操作如图4.34所示。
这样,更新操作完成后就可以把LOGIN_ID是1的记录中的LOGINNAME更新为表MANAGERINFO中的LOGINNAME的值“XIAOMING”。
(2)省略修改的语句
首先分别查询LOGIN与MANAGERINFO表中的全部数据,然后使用MERGE语句进行增加操作。增加的条件是两个表的编号列不相同,当满足条件时向LOGIN表中增加一条在MANAGERINFO中存在的数据。具体操作如图4.35所示。
这样,就可以看出LOGIN表中已经增加了两条记录,这两条记录编号是原来在LOGIN_ID中不存在的。在实际操作中,可以使用这种方法把数据表中不存在的记录添加到当前的数据表中。
图4.34 更新LOGIN表
图4.35 增加数据
(3)增加和修改同时进行
增加和修改同时进行是指当on后面的条件满足时执行修改的操作,不满足时执行增加的操作。首先也是分别查询LOGIN与MANAGERINFO表中的全部数据,然后使用MERGE语句进行增加和修改的操作。具体操作如图4.36所示。
图4.36 增加和修改数据
由于在LOGIN中存在的编号是1、2、3;在MANAGERINFO中存在的编号是1、4、5,所以在经过了MERGE操作后,LOGIN中一共存在了5条记录,并且把编号是1的记录的LOGINNAME更改成了MANAGERINFO中的“XIAOMING”。
4.6 数据控制语言(DCL)
数据控制离不开数据库的使用者,数据控制语言主要就是对数据库使用者赋予和撤销访问数据库的权限的设置,主要包括授予权限要使用的语句GRANT和收回权限的语句REVOKE。在第17章中详细介绍了如何使用GRANT和REVOKE设置用户权限,这里就不详细讲述了。
4.7 小结
本章详细介绍了与数据库密切相关的SQL语句,首先介绍了在Oracle 11g中支持的数据类型,然后详细介绍了DDL(数据定义语言)和DML(数据操纵语言)的使用,在DDL中还讲述了数据表中约束的使用。在本章的学习中,读者应尽可能多地使用所述的语句进行练习。SQL语句没有什么好的学习方法,只能多练习,以熟能生巧。
4.8 习题
简答题
1. SQL语言中一共有几种语言?
2. Oracle 11g中有哪些比较常用的数据类型?varchar2是什么类型?为什么要加上2呢?
3. 在Oracle中一共存在几种约束?能够确保字段输入的值是18~30的约束是下列( )约束?
A. Primary Key
B. CHECK
C. UNIQUE
4. 修改数据表时如果要添加一个约束,使用的语句是什么?
5. 向数据表中增加数据的方法有几种?分别都是什么?
6. DELETE与TRUNCATE语句的区别是什么?