WEB开发网
开发学院数据库MSSQL Server SQL循序渐进(2) -表的基础知识 阅读

SQL循序渐进(2) -表的基础知识

 2007-11-13 14:39:32 来源:WEB开发网   
核心提示: SQL循序渐进(1) -介绍SQL SQL循序渐进(2) -表的基础知识 SQL循序渐进(3) -数据检索 SQL循序渐进(4) -创建表 SQL循序渐进(5) -插入数据到表 SQL循序渐进(6) -删除表 SQL循序渐进(7) -更新记录 SQL循序渐进(8) -删除记录 SQL循序渐进(9) -SELECT语句


本节学习目的:了解表的基础知识

  关系数据库通常包含多个表。数据库实际上是表的集合,数据库的数据或者信息都是存储在表中的。表是对数据进行存储和操作的一种逻辑结构,每一个表都代表一个对用户意义的对象。例如,一个公司数据库中,会有雇员表、部门表、库存表、销售表、工资表等等。我们经常见到的成绩表就是一种表,它是有行和列组成的,我们并且可以通过名字来识别数据。列包含了列的名字、数据类型以及列的其它属性;行包含了列的记录或者数据。下面给出一个成绩单,其中姓名、语文、数学、英语都是列,而行包含了这个表的数据,即每个人的各科成绩:


姓名


语文


数学


英语


王小童


78


100


87


张柳风


85


92


95


紫云飞


65


89


86


黄天龙


98


67


75




IN 和 BETWEEN 条件运算符

下面是IN条件运算符的SQL语句:

SELECT column1, SUM(column2)

FROM "list-of-tables"

WHERE column3 IN (list-of-values);

下面是BETWEEN条件运算符的SQL语句:

SELECT column1, SUM(column2)

FROM "list-of-tables"

WHERE column3 BETWEEN value1 AND value2;

实际上,IN条件运算符是一个设置成员测试运算符,也就是说,它用于测试是否一个数值处在IN关键字之后提供的数值之中。举个例子如下:

SELECT employeeid, lastname, salary

FROM employee_info

WHERE lastname IN (’Hernandez’, ’Jones’, ’Roberts’, ’Ruiz’);

这条语句是从employee_info表中选择lastname等于Hernandez、Jones、 Roberts或者 Ruiz名字之一的列employeeid、 lastname和 salary。如果它在其中就将返回行。

IN条件运算符可以使用混合条件来替代,比如你可以使用等号运算符或者使用OR运算符等等,但是结果是一样的,例如:

SELECT employeeid, lastname, salary

FROM employee_info

WHERE lastname = ’Hernandez’ OR lastname = ’Jones’ OR lastname = ’Roberts’ OR lastname = ’Ruiz’;

你可以观察到,利用IN运算符时语句会更加简短并且容易读,特别是在你测试两个或者三个数值以上的时候尤为突出。

当然你也可以使用NOT IN 来在你的列表中排除行的。


而BETWEEN条件运算符是用与测试一个数值是否处在BETWEEN关键字两边指定数值的中间,比如:

SELECT employeeid, age, lastname, salary

FROM employee_info

WHERE age BETWEEN 30 AND 40;

这条SQL语句是从employee_info表中选择age处于30到40岁之间(包括30岁和40岁)的列employeeid、age、 lastname和salary。

这条语句同样可以不用BETWEEN运算符,而使用混合条件来替代,例如:

SELECT employeeid, age, lastname, salary

FROM employee_info

WHERE age >= 30 AND age <= 40;

当然,你也可以类似于NOT IN的方法,使用NOT BETWEEN来排除一些数据。


JOIN子句

  不知你有没有发现直到现在我们利用SELECT语句来检索的时候只能从一个表中进行。如果你想从两个表或者更多的表中进行检索,该怎么办呢?好在我们可以使用SQL和关系数据库系统的一个很有用的特性,即"Join"。 为了简单说明,实际上"Join"就是使得关系数据库系统相关的东东。"Join"允许你从两个表或者更多的表连接数据进行数据检索,而只需要利用一个SELECT语句。如果在FROM关键字之后有多个表的话,"Join"可以在SQL SELECT语句中识别它们。

下面举个例子:

SELECT "list-of-columns"

FROM table1,table2

WHERE "search-condition(s)"

"Join"

通过示范当你只处理一个表的时候会发生什么事情可以使得"Join"的解释更简单,所以这里我没有使用"Join"。这个单一的数据库有事也被称为"flat table"(平表)。现在你有一个表的数据库用来检索所有顾客的信息以及他们从你的商店买了什么,下面就是这个表的所有列:



每次一个新行被插入到表中,所有的列都将被更新,这样就导致了不必要的”多余数据”。比如,每次Jenny买东西,下面的行都将被插入到表中:


    ·SQL循序渐进(15)IN 和 BETWEEN 条件运
    ·SQL循序渐进(17)JOIN子句
    ·SQL循序渐进(5)插入数据到表
    ·SQL循序渐进(11)GROUP BY子句
    ·SQL循序渐进(9)SELECT语句
    ·SQL循序渐进(23)UNION 和 外部连接
    ·SQL循序渐进(12)HAVING子句
    ·SQL循序渐进(22)EXISTS 和 ALL
    ·SQL循序渐进(1)介绍SQL
    ·SQL循序渐进(14)组合条件和布尔运算符
数学运算符

标准的ANSI SQL-92支持下面四个基本的算术运算符:


+




-




*




/




%


求余


其中求余运算符决定除法的余数。这个运算符不是ANSI SQL支持的,但是,绝大多数的数据库支持他。下面是一些有用的数学函数,因为可能要用到它,所以我这里要集中提一下。在ANSI SQL-92中不支持这些函数,但是它们可能对于某些特殊的RDBMS是有效的。然而它们对于几个主要的数据库系统都是有效的。下面就说说这些数学函数吧:

ABS(x)


返回x的绝对值


SIGN(x)


当x为负数、零、正数的时候分别返回x的符号-1、0或者1


MOD(x,y)


返回x除以y的余数,跟x%y作用一样


FLOOR(x)


返回小于等于x的最大整数


CEILING(x) 或 CEIL(x)


返回大于等于x的最小整数


POWER(x,y)


返回x的y次方的数值


ROUND(x)


返回最接近于x的数


ROUND(x,d)


返回小数点数为4的接近于x的数


SQRT(x)


返回x的平方根


下面举个例子:

SELECT round(salary), firstname

FROM employee_info

上面这条语句将从employee_info表中选择salary最接近的数以及firstname列。


插入数据到表


Insert语句用于往表格中插入或者增加一行数据,它的格式为:

insert into "tablename"

(first_column,...last_column)

values (first_value,...last_value);

[] = optional

简单举个例子:

insert into employee

(first, last, age, address, city)

values (’Luke’, ’Duke’, 45, ’2130 Boars Nest’, ’Hazard Co’);

这里要注意:每一个字符窜都要用单引号括起来。

为了往表中插入数据,要在关键字insert into之后紧跟着表名,然后是左圆括号,接着是以逗号分开的一系列的列名,再是一个右圆括号,然后在关键字values之后跟着一系列用圆括号括起的数值。这些数值是你要往表格中填入的数据,它们必须与指定的列名相匹配。字符串笔译用单引号括起来,而数字就不用。在上面的例子中,’Luke’必须与列first相匹配,而45必须与列age相匹配。

假如你想往employee表格中插入以下数据;

Zhang Weiguo,28,北京601信箱,北京

那么你要使用以下的SQL语句:

insert into employee

(first, last, age, address, city)

values (’ Zhang’, ’ Weiguo’ ,28, ’北京601信箱’, ’北京’);


GROUP BY子句

首先讲讲GROUP BY 子句语法:

SELECT column1, SUM(column2)

FROM "list-of-tables"

GROUP BY "column-list";

这个GROUP BY子句将集中所有的行在一起,它包含了指定列的数据以及允许合计函数来计算一个或者多个列。当然最好解释的方法是给出一个例子啦:

假设我们将从employee表中搜索工资最高的列,可以使用以下的SQL语句:

SELECT max(salary), dept

FROM employee

GROUP BY dept;

这条语句将在每一个单独的部门中选择工资最高的工资。结果他们的salary和dept将被返回。


SELECT语句

  在上面的教程中已经有用到SELECT语句。在本节教程中将详细对它进行阐述。SELECT语句是SQL的核心,在你的SQL语句中可能用的最多的就是SELECT语句了。由于大量的选项可以用于SELECT语句,所以整个教程好象就是围这SELECT语句转。 当我们构造SQL查询语句(利用了SELECT语句)的时候,认识所有的可能选项和最好的或者最有效率的方法来实现是很有用的。这个教程将为你提供这些技能。

  SELECT语句用于查询数据库并检索匹配你指定条件的选择数据。SELECT语句有五个主要的子句子你可以选择,而FROM是唯一必须的子句。每一个子句有大量的选择项、参数等等。这些子句将罗列在下面,而且它们每一个都将在以后的教程有更为详细的描述。

以下是SELECT语句的格式:

SELECT [ALL | DISTINCT] column1[,column2]

FROM table1[,table2]

[WHERE "conditions"]

[GROUP BY "column-list"]

[HAVING "conditions]

[ORDER BY "column-list" [ASC | DESC] ]

下面举个例子:

SELECT name, age, salary

FROM employee

WHERE age > 50;

上面的这个语句将从employee表中选择age大于50的所有的name、age和salary列的数值。

注意:一定要在SQL语句末尾加上一个分号。这个分号提示SQL语句已经结束并准备被解释。

以下的表格给出了各种比较运算符号:



=


等于


>


大于


<


小于


>=


大于等于


<=


小于等于


<>


不等于


LIKE


字符串比较测验


举个例子吧:

SELECT name, title, dept

FROM employee

WHERE title LIKE ’Pro%’;

上面的语句是从employee表中选择title是以’Pro’为开头的name、title和dept列中的所有行或者数值。

另外ALL和DISTINCT也是SQL中的关键字,它们用于在你的查询结果中选择ALL(缺省)或者"distinct"或者单一记录。如果你想在指定的列中检索单一记录,你可以使用"DISTINCT" 关键子。 因为DISTNCT 将会丢弃所有你在SELECT指定的列复制的记录,比如 :

SELECT DISTINCT age

FROM employee_info;

这条语句将返回所有在employee_info表中单一的age数据。

而ALL就将显示所有指定的类,包括所有的复制数据。在没有指定的时候,这个ALL关键字是缺省的。


UNION 和 外部连接

有些时候,你可以想一起看多个查询的结果、组合它们的输出,你可以使用UNION关键字。为了合并以下两个查询的输出:显示所有买方的ID和已经有定货的顾客,你可以使用以下语句:

SELECT BUYERID

FROM ANTIQUEOWNERS

UNION

SELECT OWNERID

FROM ORDERS;

这里要注意SQL要求SELECT的列表必须匹配,即列于数据类型匹配。在本例子中,BuyerID 和OwnerID都是相同的数据类型,同为Interger(整型)。同时还有一提的是,SQL但使用UNION的使用会进行自动复制排除。而在单一的查询中,你就必须使用DISTINCT。

Outer Join(外部连接)通常是在JOIN查询被联合,而行没有包括到JOIN中的时候使用,特别是在常量文本"flags"被包括的时候尤为有用。下面我们看看这个查询先:

SELECT OWNERID, ’is in both Orders & Antiques’

FROM ORDERS, ANTIQUES

WHERE OWNERID = BUYERID

UNION

SELECT BUYERID, ’is in Antiques only’

FROM ANTIQUES

WHERE BUYERID NOT IN


(SELECT OWNERID

FROM ORDERS);

第一个查询做了一个连接以列出两个表中的每个owener,并且在ID后面放置一个标记线来重复引用。这个UNION合并了这个列表以及以下第二个的列表。第二个列表是列出不是在Orders 表的ID,这样就产生了在JOIN查询之外的ID列表,它是利用引用标签列出的。这可能是一种最容易的方法来产生这个列表。

这个概念对于主键跟外码有关的状况是很有用的,但是有些主键的外码值是NULL。比如,在一个表中,主键是salesperson,而在其它的表中主键是customers,并且它们的salesperson列在相同的行。然而,如果salesperson没有customers的时候,这个人的名字就不会出现在customer表中。如果所有salespersons的列表要显示出来,那么就要外部连接了。


HAVING子句

下面先给出HAVING子句的语法:

SELECT column1, SUM(column2)

FROM "list-of-tables"

GROUP BY "column-list"

HAVING "condition";

这个HAVING子句允许你为每一个组指定条件,换句话说,可以根据你指定的条件来选择行。如果你想使用HAVING子句的话,它应该处再GROUP BY子句之后。

下面将以一个例子来解释HAVING子句。假设我们的employee表中包含雇员的name、departmen、salary和age。如果你想为每个部门中每个雇员选择平均工资的话,你可以使用下面的SQL语句:

SELECT dept, avg(salary)

FROM employee

GROUP BY dept;

当然,如果你还想只计算和显示salary大于20000的平均工资的话,你还可以加上HAVING子句:

SELECT dept, avg(salary)

FROM employee

GROUP BY dept

HAVING avg(salary) > 20000;


EXISTS 和 ALL

EXISTS使用了一个子查询作为条件,只有当子查询返回行的时候这个条件才为真,如果子查询不返回任何的行条件就为假。如果商店在处理Chair的时候,有个顾客想看看所有拥有者的列表,就可以使用EXSIST,语句如下:

SELECT OWNERFIRSTNAME, OWNERLASTNAME

FROM ANTIQUEOWNERS

WHERE EXISTS


(SELECT *

FROM ANTIQUES

WHERE ITEM = ’Chair’);

如果在Antiques列中有Chair,那么子查询就会返回一行或者多行,就使得EXISTS子句为真,然后让SQL列出拥有者来。如果没有搜索到Chair,则没有行被返回,条件就为假。

ALL是另外一个不寻常的关键字,因为ALL查询通常可以用不同的方法来进行,并且可能是一种更为简单的方法。举个例子来说明吧:

SELECT BUYERID, ITEM

FROM ANTIQUES

WHERE PRICE >= ALL


(SELECT PRICE

FROM ANTIQUES);

上面这条语句将返回最高价格的Item以及它的买方。子查询返回了Antiques表中的所有的Price列,而外层的查询逐行查询Antiques表,并且如果它的Price大于等于(或者ALL)列中的Prices,它就会被列出,它就是最好价格的Item。这里必须使用">="的原因是最高价格的Item要等于列表中的最高价格,因为这个Item在Price列中。


介绍SQL

  SQL(Structured Query Language,结构查询语言)是一个功能强大的数据库语言。SQL通常使用于数据库的通讯。ANSI(美国国家标准学会)声称,SQL是关系数据库管理系统的标准语言。 SQL语句通常用于完成一些数据库的操作任务,比如在数据库中更新数据,或者从数据库中检索数据。使用SQL的常见关系数据库管理系统有:Oracle(大型网站数据库平台)、 Sybase、 Microsoft sql server(WINDOWS平台上强大的数据库平台)、 Access、 Ingres等等。虽然绝大多数的数据库系统使用SQL,但是它们同样有它们自立另外的专有扩展功能用于它们的系统。但是,标准的SQL命令,比如"Select"、 "Insert"、 "Update"、 "Delete"、 "Create"和 "Drop"常常被用于完成绝大多数数据库的操作。

  但是,不象其它的语言,如C、Pascal等,SQL没有循环结构(比如if-then-else、do-while)以及函数定义等等的功能。而且SQL只有一个数据类型的固定设置,换句话说,你不能在使用其它编程语言的时候创建你自己的数据类型。

SQL功能强大,但是概括起来,它可以分成以下几组:

DML(Data Manipulation Language,数据操作语言):用于检索或者修改数据;

DDL(Data Definition Language,数据定义语言): 用于定义数据的结构,比如 创建、修改或者删除数据库对象;

DCL(Data Control Language,数据控制语言):用于定义数据库用户的权限。

DML组可以细分为以下的几个语句:

SELECT:用于检索数据;

INSERT:用于增加数据到数据库;

UPDATE:用于从数据库中修改现存的数据

DELETE:用于从数据库中删除数据。

DDL语句可以用于创建用户和重建数据库对象。下面是DDL命令:

CREATE TABLE

ALTER TABLE

DROP TABLE

CREATE INDEX

DROP INDEX

DCL命令用于创建关系用户访问以及授权的对象。下面是几个DCL命令:

ALTER PASSWORD

GRANT

REVOKE

CREATE SYNONYM

为了让你对SQL有一个直观的认识,下面先给出一个简单SQL语句的例子:

我们使用SQL语句来从Employees中检索Department ID为CS的姓名:

SELECT Employees.Name

FROM Employees

WHERE Employees.DeptID = "CS"

可能你现在一开始不太理解这些语句,也许你会一头雾水,不要紧的,通过本教程的学习后,你会发现这段语句是多么的普通。为了不让你困惑,下面我也进行一番解释:

先对FROM子句吧,语句中的FROM Employees意思是从Employees表中检索数据。

而语句WHERE Employees.DeptID = "CS"意思是检索Employees的DeptID列为”CS”的行,这样SQL语句检索的结果将是DeptID为CS的列的所有数据,比如:



EmpID


Name


Dept


123


Purple


CS


124


Zsc


CS



最后,我们来解释一个SELECT子句,它指定了从Name列检索来的所有数据,比如

Name


Purple


Zsc


下一课我们来学习-------数据检索

Tags:SQL 循序渐进 基础知识

编辑录入:coldstar [复制链接] [打 印]
赞助商链接