掌握SQL四条最基本的数据*作语句InsertSelectUpdate和Delete
练掌握SQL是数据库用户的宝贵财 富在本文中我们将引导你掌握四条最基本的数据*作语句—SQL的核心功能—来依次介绍比较*作符选择断言以及三值逻辑当你完成这些学习后显然你已经开始算是精通SQL了
在我们开始之前先使用CREATE TABLE语句来创建一个表DDL语句对数据库对象如表列和视进行定义它们并不对表中的行进行处理这是因为DDL语句并不处理数据库中实际的数据这些工作由另一类SQL语句—数据*作语言(DML)语句进行处理
SQL中有四种基本的DML*作INSERTSELECTUPDATE和DELETE由于这是大多数SQL用户经常用到的我们有必要在此对它们进行一一说明我们给出了一个名为EMPLOYEES的表其中的每一行对应一个特定的雇员记录请熟悉这张表我们在后面的例子中将要用到它
INSERT语句
用户可以用INSERT语句将一行记录插入到指定的一个表中例如要将雇员John Smith的记录插入到本例的表中可以使用如下语句
INSERT INTO EMPLOYEES VALUES
(SmithJohn
Los Angles);
通过这样的INSERT语句系统将试着将这些值填入到相应的列中这些列按照我们创建表时定义的顺序排列在本例中第一个值Smith将填到第一个列LAST_NAME中第二个值John将填到第二列FIRST_NAME中……以此类推
我们说过系统会试着将值填入除了执行规则之外它还要进行类型检查如果类型不符(如将一个字符串填入到类型为数字的列中)系统将拒绝这一次*作并返回一个错误信息
如果SQL拒绝了你所填入的一列值语句中其他各列的值也不会填入这是因为SQL提供对事务的支持一次事务将数据库从一种一致性转移到另一种一致性如果事务的某一部分失败则整个事务都会失败系统将会被恢复(或称之为回退)到此事务之前的状态
回到原来的INSERT的例子请注意所有的整形十进制数都不需要用单引号引起来而字符串和日期类型的值都要用单引号来区别为了增加可读性而在数字间插入逗号将会引起错误记住在SQL中逗号是元素的分隔符
同样要注意输入文字值时要使用单引号双引号用来封装限界标识符
对于日期类型我们必须使用SQL标准日期格式(yyyymmdd)但是在系统中可以进行定义以接受其他的格式当然年临近请你最好还是使用四位来表示年份
既然你已经理解了INSERT语句是怎样工作的了让我们转到EMPLOYEES表中的其他部分
INSERT INTO EMPLOYEES VALUES
(BunyanPaul
Boston);
INSERT INTO EMPLOYEES VALUES
(JohnAdams
Boston);
INSERT INTO EMPLOYEES VALUES
(SmithPocahontas
Los Angles);
INSERT INTO EMPLOYEES VALUES
(SmithBessie
Boston);
INSERT INTO EMPLOYEES VALUES
(JonesDavy
Boston);
INSERT INTO EMPLOYEES VALUES
(JonesIndiana
ChicagoNULLNULL);
在最后一项中我们不知道Jones先生的工薪级别和年薪所以我们输入NULL(不要引号)NULL是SQL中的一种特殊情况我们以后将进行详细的讨论现在我们只需认为NULL表示一种未知的值
有时像我们刚才所讨论的情况我们可能希望对某一些而不是全部的列进行赋值除了对要省略的列输入NULL外还可以采用另外一种INSERT语句如下
INSERT INTO EMPLOYEES(
FIRST_NAME LAST_NAME
HIRE_DATE BRANCH_OFFICE)
VALUE(
IndianaJones
Indianapolis);
这样我们先在表名之后列出一系列列名未列出的列中将自动填入缺省值如果没有设置缺省值则填入NULL请注意我们改变了列的顺序而值的顺序要对应新的列的顺序如果该语句中省略了FIRST_NAME和LAST_NAME项(这两项规定不能为空)SQL*作将失败
让我们来看一看上述INSERT语句的语法图
INSERT INTO table
[(column { column})]
VALUES
(columnvalue [{columnvalue}]);
和前一篇文?幸谎颐怯梅嚼ê爬幢硎究裳∠睿罄ê疟硎究梢灾馗慈我獯问南睿ú荒茉谑导实腟QL语句中使用这些特殊字符)VALUE子句和可选的列名列表中必须使用圆括号
SELECT语句
SELECT语句可以从一个或多个表中选取特定的行和列因为查询和检索数据是数据库管理中最重要的功能所以SELECT语句在SQL中是工作量最大的部分实际上仅仅是访问数据库来分析数据并生成报表的人可以对其他SQL语句一窍不通
SELECT语句的结果通常是生成另外一个表在执行过程中系统根据用户的标准从数据库中选出匹配的行和列并将结果放到临时的表中在直接SQL(direct SQL)中它将结果显示在终端的显示屏上或者将结果送到打印机或文件中也可以结合其他SQL语句来将结果放到一个已知名称的表中
SELECT语句功能强大虽然表面上看来它只用来完成本文第一部分中提到的关系代数运算选择(或称限制)但实际上它也可以完成其他两种关系运算—投影和连接SELECT语句还可以完成聚合计算并对数据进行排序
SELECT语句最简单的语法如下
SELECT columns FROM tables;
当我们以这种形式执行一条SELECT语句时系统返回由所选择的列以及用户选择的表中所有指定的行组成的一个结果表这就是实现关系投影运算的一个形式
让我们看一下使用EMPLOYEES表的一些例子(这个表是我们以后所有SELECT语句实例都要使用的而我们在图和图中给出了查询的实际结果我们将在其他的例子中使用这些结果)
假设你想查看雇员工作部门的列表那下面就是你所需要编写的SQL查询
SELECT BRANCH_OFFICE FROM EMPLOYEES;
由于我们在SELECT语句中只指定了一个列所以我们的结果表中也只有一个列注意结果表中具有重复的行这是因为有多个雇员在同一部门工作(记住SQL从所选的所有行中将值返回)要消除结果中的重复行只要在SELECT语句中加上DISTINCT子句
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES;
现在已经消除了重复的行但结果并不是按照顺序排列的如果你希望以字母表顺序将结果列出又该怎么做呢?只要使用ORDER BY子句就可以按照升序或降序来排列结果
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES
ORDER BY BRANCH_OFFICE ASC;
这一查询的结果如表所示请注意在ORDER BY之后是如何放置列名BRANCH _OFFICE的这就是我们想要对其进行排序的列为什么即使是结果表中只有一个列时我们也必须指出列名呢?这是因为我们还能够按照表中其他列进行排序即使它们并不显示出来列名BRANCH_ OFFICE之后的关键字ASC表示按照升序排列如果你希望以降序排列那么可以用关键字DESC
同样我们应该指出ORDER BY子句只将临时表中的结果进行排序并不影响原来的表
假设我们希望得到按部门排序并从工资最高的雇员到工资最低的雇员排列的列表除了工资括号中的内容我们还希望看到按照聘用时间从最近聘用的雇员开始列出的列表以下是你将要用到的语句
SELECT BRANCH_OFFICEFIRST_NAME
LAST_NAMESALARYHIRE_DATE
FROM EMPLOYEES
ORDER BY SALARY DESC
HIRE_DATE DESC;
这里我们进行了多列的选择和排序排序的优先级由语句中的列名顺序所决定SQL将先对列出的第一个列进行排序如果在第一个列中出现了重复的行时这些行将被按照第二列进行排序如果在第二列中又出现了重复的行时这些行又将被按照第三列进行排序……如此类推这次查询的结果如表所示
将一个很长的表中的所有列名写出来是一件相当麻烦的事所以SQL允许在选择表中所有的列时使用*号
SELECT * FROM EMPLOYEES;
这次查询返回整个EMPLOYEES表如表所示
下面我们对开始时给出的SELECT语句的语法进行一下更新(竖直线表示一个可选项允许在其中选择一项)
SELECT [DISTINCT]
(column [{ columns}])| *
FROM table [ { table}]