向瑜
摘要:本文针对关系数据库管理系统中SQL查询语句的一些基本用法,作了一些简单的介绍,起着抛砖引玉的功效。通过本文的介绍,力图帮助学生更好地掌握此语句的用法。
关键词:SELECT语句查询连接
在关系数据库管理系统中,SQL查询语句——SELECT的使用是非常重要的一部分内容,是任何SQL语言中使用频率最高的语句,它是SQL语言的灵魂。SELECT语句可以使数据库服务器根据客户的要求搜索所需要的信息,并按规定的格式返回给客户。使用T—SQL的SELECT语句,不仅可以查询普通数据库中的表格和视图信息,还可以查询SQL Server的系统信息。在Transact-SQL中绝大多数的语句都是由SELECT构成的。
然而笔者在近几年对关系数据库管理软件(如Access、SQL Server、Oracle等)的教学中,发现对于这部分的内容学生掌握得并不是很好。为此,笔者根据多年的教学经验,将SQL查询语句的一些使用技巧列出来,供学生参考和同行借鉴。
由于SELECT语句的完整语句比较复杂,故在这里只列举出它的主要子句。SELECE语句的主要子句格式如下:
SELECT [ALL|DISTINCT][TOP n] select_list
[INTO new_table]
[FROM table_condition]
[WHERE search_condition]
[GROUP BY group_by_expression]
[HAVING search_condition]
[ORDER BY order_by_expression [ASC|DESC]]
[COMPUTE expression]
下面笔者就结合简单查询、联合查询和连接查询三方面通过举例的形式来谈谈有关Transact-SQL语句的用法。(注:以下所有例子的数据表来自示例数据库“图书管理系统”或“northwind”,在进行查询前,先用USE关键字将相关数据库打开。)
1 简单查询
Transact-SQL的簡单查询包括选择列表、FROM子句和WHERE子句三部分内容。由此说明要查询的列、所查询的表或视图以及检索条件等。
例如,从数据库“图书管理系统”的“图书明细表”中查询定价大于50的“图书编号”、“图书名称”、“出版日期”和“定价”字段的信息。
SELECT图书编号,图书名称,出版日期,定价
FROM 图书明细表
WHERE 定价>50
1.1 选择列表
简单查询中的选择列表(select_list)指出要查询的字段列,可以由一组字段名列表、星号、表达式或变量(包括局部变量和全局变量)等构成。
1.1.1 查询表中所有的字段列
星号(*)在选择列表中有特殊含义,它代表列表中的所有行。
例如,从数据库“图书管理系统”中查询“出版社信息表”的所有行。
SELECT *
FROM 出版社信息表
1.1.2 查询表中指定的列
可以从表中检索指定的列,只需将这些列放在选择列表中。
例如,从数据库“图书管理系统”的“作者表”中查询列为“作者姓名”、“性别”和“电话”的作者信息。
SELECT作者姓名,性别,电话
FROM作者表
1.1.3 改变列名
在选择列表中,通过使用AS关键字创建更具可读性的别名来取代默认的列名。
定义格式为:列标题AS列名或列名列标题
注意:如果指定的列名不是标准的标识符格式,应使用引号定界符。
例如,从数据库“图书管理系统”的“图书明细表”中,查询列“图书名称”和“定价”为八折后的“新价格”的图书信息。
SELECT图书名称,定价*0.8 AS新价格
FROM图书明细表
1.1.4 消除重复行
如果希望一个列表没有重复值,则可以使用DISTINCT子句来消除结果集中的重复行。
例如,从数据库“northwind”的“suppliers”表中检索所有的行,但每个国家只显示一次。
SELECT DISTINCT country
FROM suppliers
1.1.5 使用TOPn列出前n个记录
用TOPn[PERCENT]关键字列出结果集中前n个记录。其中TOPn表示返回结果集中前n行记录,而TOP n PERCENT中的n表示一百分数,指定返回的记录数等于总记录数的百分之几。
例如,从数据库“northwind”的“order details”表中查询出前5条记录,只显示orderid、productid、quantity三列内容。
SELECT TOP 5 orderid,roductid,quantity
FROM [order details]
1.2 FROM子句
1.2.1 FROM子句指定从中查询行和列所属的源表或视图。可以指定多个,最多达256个,其间用“,”分隔。当FROM子句同时指定多个表或视图时,如果在选择列表中有相同的列,则应使用对象名限定这些列所属的表或视图。
例如,在数据库“northwind”的“orders”和“customers”两个表中均有customerid(顾客id)列,在查询两个表中的顾客id时应使用下面语句格式来限定。
SELECT DISTINCT customerid,companyname,orderdate,
FROM orders,customers
WHERE orders. customerid = customers. customerid
1.2.2 在FROM子句中可以为表或视图指定别名。格式:<表名> as <别名>或<表名> <别名>
例如,上面例中的查询语句也可表示为如下形式:SELECT DISTINCT customerid,companyname,orderdate,
FROM orders a,customers b
WHERE a.customerid = b. customerid
1.3 WHERE子句
1.3.1 使用WHERE子句,可以根据给定的搜索条件检索特定的行。
例如,下面的查询将从数据库“northwind”中的“employees”表中检索所有居住在美国的职员的姓和居住的城市。
SELECT lastname,city
FROM employees
WHERE country=USA
1.3.2 在WHERE子句中可包括以下一些运算符:①比较运算符(用于比较大小):>(大于)、>=(大于或等于)、=(等于)、<(小于)、<=(小于或等于)、<>(不等于)。②范围运算符(检索在指定取值范围内的行):BETWEEN…AND…和NOT BETWEEN…AND…。例:unitprice BETWEEN 10 AND 30等价于unitprice>=10 AND unitprice<=30。③列表运算符(检索与指定值列表相匹配的行):IN (项1,项2,……)和NOT IN (项1,项2,……)。例:country IN ('Germany','China')。④字符串比较符(通过字符串比较来选择符合条件的行):LIKE和NOT LIKE,适用于char、nchar、varchar、nvarchar、binary、varbinary、datetime或smalldatetime等数据类型的查询,以及在特定条件下对text、ntext和image数据类型进行的查询。
采用以下四种通配符来形成字符串搜索条件:a百分号%:包含零个或更多字符的任意字符串。b下划线_:匹配任何单个字符。c方括号[]:指定的范围或集合内的任何单个字符。d[^]:不在指定的范围或集合内的任何单个字符。
例如,用LIKE ‘N%来表示以N开头的任意字符串;
用LIKE ‘N[xy]%表示以N开头,第二个字符是x或y的字符串;
用LIKE ‘N[^xy]%表示以N开头,第二个字符不是x或y的字符串;
用LIKE ‘N_M%表示以N开头,第三个字符是M,第二个为任意一个字符的字符串。
⑤空值判断符(检索那些指定列中遗漏信息的行):IS NULL和NOT IS NULL。
例如,从数据库“northwind”的“suppliers”表中检索fax列为空的公司列表。
SELECT companyname,fax
FROM suppliers
WHERE fax IS NULL
⑥逻辑运算符(用于组合多个条件,简化查询处理):NOT、AND和OR,优先级从左到右依次降低。
1.4 ORDER BY子句
用ORDER BY子句对结果集中的行进行升序(ASC)或降序(DESC)排列。
格式:ORDER BY {order_by_expression [ASC|DESC]} [,…n]
注意:不可以在ORDER BY子句中使用ntext、text或image类型的列。
例如,下面从数据库“northwind”的 “products”表中检索每个产品的产品标识、产品名、类别和单价。先将结果集按照类别进行升序排列,对于同一类别,再按照单价进行降序排列。
SELECT productid,productname,categoryid,unitprice
FROM products
ORDER BY categoryid,unitprice DESC
2 联合查询
使用UNION子句的查询称为联合查询。它可以将两个或更多个SELECT语句的返回结果组合到一个单个结果集中,该结果集包含了联合查询中所有查询结果集中的全部行数据。
联合查询的语法格式如下:
select_statement
UNION [ALL] select_statement
[UNION [ALL] select_statement][…n]
其中,select_statement为待联合的SELECT查询语句。ALL选项表示将所有行都合并到结果集中,若缺省,则被联合查询结果集合中的重复行将只保留一行。
注意:①在用UNION子句查询时,查询结果的列标题为第一个查询语句的列标题。因此,必须在第一个SELECT语句中指定列标题;②SQL Server要求所引用的表必须具有相似的数据类型、相同的列数,且每个查询中的选择列表也必须具有相同的列顺序;③如果希望结果集中的行按一定顺序排列,则必须在最后一个有UNION操作符的语句中包含ORDER BY子句,以指定排序方式。
例如:从数据库“经销商”的“顾客信息表”中,查询姓王的顾客的姓名和家庭住址,并为其增加一个类型列TYPE,列的内容为“顾客”;从“销售人员表”中,查询姓王的销售人员的姓名和家庭住址,并增加一个列,列的内容为“营业员”;然后,将两个查询结果合并在一起。
SELECT姓名,家庭住址,顾客AS TYPE
FROM顾客信息表
WHERE姓名LIKE‘王%
UNION
SELECT姓名,家庭住址,营业员
FROM销售人员表
WHERE姓名LIKE ‘王%
3 连接查询
连接操作可以同时查询两个或多个表中的数据,所生成的结果集将多个表中的行和列合并在一起。
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,建议在FROM子句中指定连接,这样有助于将指定的连接条件与WHERE子句中的搜索条件区分开来。
SQL-92标准所定义的FROM子句的连接语法格式为:
FROM table_source1 join_type table_source 2
[ON (join_condition)]
其中,table_source1和table_source 2指定要查询的表;join_type 指定所执行的连接类型,可分为三类:内连接(Inner Join)、外连接(Outer Join)、交叉连接(Cross Join);join_condition指定连接条件。
3.1 内连接
内连接通过比较两个表共同拥有的列的值,把两个表连接起来。SQL Server将只返回满足连接条件的行。它是SQL Server默认的连接方式。根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。
3.1.1 等值连接即在连接条件中使用“=”运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括重复列。
例如,列出数据库“图书管理系统”的“作者表”和“出版社信息表”中位于同一城市的作者和出版社信息。
SELECT *
FROM 作者表AS a INNER JOIN 出版社信息表AS b
ON a.籍贯=b.出版社所在城市
3.1.2 不等连接即在连接条件中使用除等于运算符外的其它比较运算符来比较被连接的列的列值。
3.1.3 自然连接即在连接条件中使用等于运算符比较被连接列的列值,但它使用选择列表指出查询。
例:列出数据库“图书管理系统”的“作者表”和“出版社信息表”中位于同一城市的作者和出版社,并删除重复列“籍贯”。
SELECT a.*,b.出版社编号,b.出版社名称,b.出版社电话
FROM 作者表AS a INNER JOIN 出版社信息表AS b
ON a.籍贯=b.出版社所在城市
3.2 外连接
若要创建一个查询,以返回一个或多个表中的所有行(无论在另外的表中是否含有相匹配的行),则需要使用外连接。外连接有三种类型:左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和完全外连接(FULL OUTER JOIN或FULL JOIN)。
例如,在数据库“图书管理系统”中,以在同一个城市的出版社和作者为条件,对“出版社信息表”和“作者表”进行左外连接查询。
SELECT a.姓名,a.性别,a.籍贯as 所在城市,b.出版社名称
FROM 作者表as a LEFTJOIN 出版社信息表as b
ON a. 籍贯=b. 出版社所在城市
ORDER BY 姓名
在查询结果窗口中,显示左表中指定列的所有行和对应连接列的所有行,在左表中没有找到相匹配的右表的对应位置填上NULL。
例如,在数据库“图书管理系统”中,以在同一个城市的出版社和作者为条件,对“出版社信息表”和“作者表”进行完全外连接查询。
SELECT a.姓名,a.性别,a.籍贯as 所在城市,b.出版社名称
FROM 作者表as a FULLJOIN 出版社信息表as b
ON a.籍贯=b.出版社所在城市
ORDER BY 姓名
在查询结果窗口中显示相连接的两个表的所有记录,在没有找到相匹配的位置上填上NULL。
3.3 交叉连接
交叉连接(CROSS JOIN)不带WHERE子句,返回的是被连接的两个表所有数据行的笛卡尔积,即返回到结果集中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
例如,下面将显示数据库“northwind”中“shippers”和“suppliers”表交叉连接后的结果集,以列出供应商运输其产品的所有可能方式。
SELECT suppliers.companyname,shippers.companyname
FROM suppliers CROSS JOIN shippers
3.4 自连接
在连接查询时,當table_source1和table_source 2是同一个表时,即对同一个表进行连接操作,则称此连接为自连接。
例如,使用自连接在数据库“图书管理系统”的“作者表”中查找籍贯是“河北石家庄”的作者。
SELECT a.姓名,a.性别,b. 姓名,b.性别
FROM 作者表as a INNER JOIN作者表as b
ON a.籍贯=b.籍贯
WHERE a.籍贯=河北石家庄
ORDER BY 姓名
以上对于SELECT用法的介绍只是其最基本的,学生在学习时,还应多参考其它的一些例子,加强这方面的练习,才能真正达到熟练掌握其用法的目的。