教学前言
课程介绍
师资介绍
教材介绍
课程计划
教学大纲
教学计划
实训计划
课程总表
教学内容
作业考试
作业上传
在线测试
测验考试
互动讨论
学习论坛
疑难解答
意见建议
 
 
附:
SQL语言详解
内容:

常用的SQL命令语法
SQL(结构化查询语言)是一种在关系数据库中定义和操纵数据的标准语言。SQL语言的最大特点是直观、简单易学,初学者经过较短的学习就可以使用SQL进行数据库的存取操作。
SQL语言通常分成4类:查询语言(SELECT)、操纵语言(INSERT、UPDATE、DELETE)、定义语言(CREATE、ALTER、DROP)和控制语言(COMMIT、ROLLBACK)。
SQL语言中最主要、最核心的部分是它的查询功能。查询语言用来对已经存在于数据库中的数据按照特定的组合、条件表达式或次序进行检索,其基本格式是由SELECT子句、FROM子句和WHERE子句组成的查询块:
SELECT<列名表>
FROM<表或视图名>
WHERE<查询限定条件>
也就是说,SELECT指定了你想要看哪些列数据,FROM指定这些数据来自哪些表或视图,WHERE指定了你想看哪些行。在SQL语言中除了查询以外,许多其他功能也都离不开SELECT语句,如创建视图,实际上是利用查询语句来实现的,又比如插入数据时,有很多时候是从另外一张或多张表中选择符合条件的数据。所以,掌握查询语句是掌握SQL语言的关键。
以下是SQL Server中的SELECT语句的完整用法。
SELECT select_list
[INTO new_table_]
FROM table_source
[WHERE search_condition]
[GROUP BY group_by_expression]
[HAVING search_condition]
[ORDER BY order_expression [ASC | DESC]]
下面简单介绍一下常用的SQL查询语法。
1. 检索表中所有列
格式:
SELECT * FROM TABLE_NAME
例如查询所有作者的信息
SELECT* FROM AUTHORS
2. 检索表中特定列
格式:
SELECT COLUMN_NAME
FROM TABLE_NAME
例如查询所有作者的作者号、姓名信息
SELECT au_id, AU_FNAME, AU_LNAME FROM AUTHORS
在查找多列内容时,用‘,’将各字段分开。
3. 用单引号加入字符串
格式:
SELECT COLUMN_NAME 'STRING LITERAL'
FROM TABLE_NAME
例如查询所有作者的姓名和编号信息,并且在每个作者的作者号前面显示字符串“身份证号:”表明显示信息是身份证信息
SELECT AU_FNAME, AU_LNAME, '身份证号:', AU_ID
FROM AUTHORS
显示结果为:
AU_FNAME AU_LNAME AU_ID
Abraham Bennet 身份证号:409-56-7008
4. 改变列标题
在缺省情况下,显示的查询结果中的列标题是列名。但你可以改变列标题。总共有两种方法:
方法1 采用“列标题=列名”的格式
SELECT COLUMN_HEADING=COLUMN_NAME
FROM TABLE_NAME
方法2 采用“列名列标题”的格式
SELECT COLUMN_NAME COLUMN_HEADING
FROM TABLE_NAME
例如显示所有作者的姓名信息和作者编号信息,要求用名和姓来区别firstname和lastname,作者编号用来区分AU_ID
SELECT '名'=AU_FNAME, '姓'=AU_LNAME, '作者编号'=AU_ID
FROM AUTHORS
结果显示为:
名 姓 作者编号
Abraham Bennet 409-56-7008 S
5. 算术运算符
在列出现的位置上,我们可以使用算术运算符操纵列,对查询的结果进行计算。这些算术运算符包括:+(加)、-(减)、*(乘)、/(除)和%(取模)。
格式:
{CONSTANT | COLUMN_NAME | FUNCTION |(SUBQUERY)}
[{ARITHMETIC_OPERAOR | BITWISE_OPERATOR | STRING_OPERATOR} ……]
例如查询所有书在价格提高10%后的价格和书名信息。
SELECT (PRICE*1.1), TITLE FROM TITLES
6. 基于比较的选择行
格式:
SELECT SELECT_LIST
FROM TALBE_LIST
WHERE EXPRESSION COMPARISION_OPERATOR EXPRESSION
例如查询在加州的作者姓名和城市
SELECT AU_LNAME, CITY
FROM AUTHORS
WHERE STATE='CA'
7. 基于范围的选择行
格式:
SELECT SELECT_LIST
FROM TABLE_LIST
WHERE EXPRESSION [NOT] BETWEEN EXPRESSION AND EXPRESSION
例如查询出版日期在9/30/2002到10/3/2002之间的书名(限制为38字符)和出版日
SELECT convert (char (38), TITLE), PUBDATE
FROM TITLES
WHERE PUBDATE BETWEEN 'T' AND '10/3/2002'
8. 基于列表的选择行
格式:
SELECT SELECT_LIST
FROM TABLE_LIST
WHERE [NOT] EXPRESSION [NOT] IN( VALUE_LIST)
例查询书的类型是MOD_COOK或TRAD_COOK的书名和它的类型
SELECT TITLE, TYPE
FROM TITLES
WHERE TYPE IN ('MOD_COOK', 'TRAD_COOK')
9. 基于字符选择行
查找中,有时需要对字符串进行比较。使用LIKE运算符可以完成对字符串的模糊匹配。
格式:
SELECT SELECT_LIST
FROM TABLE_LIST
WHERE EXPRESSION [NOT] LIKE 'STRING'
例如查询店名中包含BOOK的店铺信息
SELECT STOR_NAME
FROM STORES
WHERE STOR_NAME LIKE '%BOOK%'
10. 基于多个搜索条件选择行
在WHERE子句中,也可以使用“逻辑运算符”连接多个条件,构成一个更复杂的条件进行查询。可以使用以下3种逻辑运算符:AND(逻辑与)、OR(逻辑或)、NOT(逻辑非)。
具体格式如下:
SELECT SELECT_LIST
FROM TABLE_LIST
WHERE [NOT] EXPRESSION {AND/OR} [NOT] EXPRESSION
例如查询书名以T开头或者出版号为0877,而且价格大于16美元的书信息
SELECT convert (char (20), TITLE), PUB_ID, PRICE, PUBDATE
FROM TITLES
WHERE (TITLE LIKE 'T%' OR PUB_ID='0877') AND (PRICE >$16.00)
11. 消除重复行
可以用DISTINCT消除重复行。格式为:
SELECT [ALL | DISTINCT] SELECT_LIST
FROM TABLE_NAME
WHERE SEARCH_CONDITIONS
例如查询所有作者的所在城市和州名,要求没有重复信息
SELECT DISTINCT CITY, STATE
FROM AUTHORS
12. 结果排序
通常对查询出来的数据,希望按照某种顺序显示,以便查找。通过ORDER BY子句,我们可以改变查询结果的显示顺序。ORDER BY子句的格式是:
SELECT COLUMN_NAME
FROM TABLE_NAME
[ORDER BY COLUMN_NAME | SELECT_LIST_NUMBER | EXPRESSION [ASC | DESC]
例如按照类型的升序和价格的降序来显示书的信息
SELECT PUB_ID, TYPE, PRICE, convert (char (30), TITLE)
FROM TITLES
ORDER BY TYPE, PRICE DESC
13. 分组查询
分组查询,就是将表中数据按照一定条件分类组合,再根据需要得到统计信息
格式:
SELECT COLUMN_NAME
FROM TABLE_NAME
WHERE SEARCH_CONDITION
[GROUP BY [ALL] AGGREGAT E_FREE_EXPRESSION]
例如计算每本书的书名及它的售书总量,并按照TITLE_ID分组
SELECT TITLE_ID, COPIES_SOLD=SUM (QTY)
FROM SALES
GROUP BY TITLE_ID
14. COMPUTE和COMPUTE BY
我们可以通过COMPUTE和COMPUTE BY计算出汇总数据。
语法:
COMPUTE ROW_AGGREGATE (COLUMN_NAME)
例如查询书类型是以COOK结尾的书的价格和总价
SELECT TYPE, PRICE
FROM TITLES
WHERE TYPE LIKE '%COOK'
ORDER BY TYPE, PRICE
COMPUTE SUM (PRICE)
15. 连接查询
在数据库应用中,经常要涉及从两个或更多的表中查询数据,这就需要使用连接查询。
其格式如下:
SELECT COLUMN_NAME
FROM TABLE_NAME
WHERE TABLE_NAME.COLUMN JOIN_OPERATOR TABLE_NAME.COLUMN
上述的连接操作符(JOIN_OPERATOR)可以是:=、>、<、> =、< =、! =、< >、! >、! <、= *、* =。在ANSI中,“=”连接应该写成Inner Join;“* =”连接应该写成LEFT OUT JOIN;“= *”连接应该写成“RIGHT OUT JOIN”。在SQL SERVER中,这些写法都可以用。但是,ANSI规定的写法是INNER JOIN等标志。一般而言,在任何连接中,都使用“主键=外键”的连接查询条件。
例如求某店销售某书的数量
SELECT STOR_NAME, QTY, title=convert (char (20), TITLE)
FROM TITLES, STORES, SALES
WHERE TITLES.TITLE_ID =SALES.TITLE_ID
AND STORES.STOR_ID =SALES.STOR_ID
或写为:
SELECT STOR_NAME, QTY, title=convert (char (20), TITLE)
FROM TITLES JOIN SALES
ON TITLES.TITLE_ID =SALES.TITLE_ID
JOIN STORES
ON STORES.STOR_ID =SALES.STOR_ID
16. 执行子查询
子查询是指一条SELECT语句作为另一条SELECT语句的一部分。外层的SELECT语句叫外部查询,内层的SELECT语句叫作内部查询(或子查询)。子查询分成两种:嵌套查询和相关子查询。子查询能够将比较复杂的查询分解为几个简单的查询。虽然,使用子查询能产生在表之间使用连接操作符相同的结果。但是,连接操作要比子查询快。
嵌套查询的流程是,首先执行内部查询,它查询出来的数据并不显示出来,而是传递给外层语句,作为该语句的查询条件来使用。子查询可以多层次嵌套。
例如查询每个书名ID号及拥有该书的最高百分比版权的作者ID。
SELECT TITLE_ID, AU_ID, ROYALTYPER
FROM TITLEAUTHORTA
WHERE ROYALTYPER = (SELECT MAX (ROYALTYPER)
FROM TITLEAUTHOR
WHERE TITLE_ID =TA.TITLE_ID)
17. 查询的基础上创建新表
SELECT INTO的作用是,在查询的基础上创建新表。若建永久表,必须设置“SELECT INTO / BULKCOPY”。若建临时表,必须在表前设置#(局部临时表)或##(全局临时表)。新表的行和列是来自查询结果。
例如创建#PHONYTABLE临时表,该表的数据由每个书名的前40个字符及月平均销售量组成。
SELECT TITLE = SUBSTRING (TITLE, 1, 40), MONTHLY = YTD_SALES/12
INTO #PHONYTABLE
FROM TITLES
18. 合并数据集
合并数据集(UNION)的作用是,把结果组合成一个结果集来操作两个或更多的查询结构。例如:
SELECT 'ANSI', CONVERT (varchar (30), GETDATE (), 102) AS style
UNION
SELECT 'Japanese', CONVERT (varchar (30), GETDATE (), 111)
UNION
SELECT 'Europen', CONVERT (varchar (30), GETDATE (), 113)
19. 插入数据
它的一般语法是:
INSERT [INTO]
{TABLE_NAME | VIEW_NAME} [(COLUMN_LIST)]
{VALUES | VALUES_LIST | SELECT_STATEMENT}
例如向authors表插入一行作者信息
INSERT AUTHORS
VALUES ('123-45-6789', 'YANG', 'ZH', '900555_1212', 'huilongguan', 'changping')
20. 修改数据
在SQL Server中,对数据的修改是通过UPDATE语句实现的。它的一般语法是:
UPDATE {TABLE_NAME | VIEW_NAME}
SET [{TABLE_NAME | VIEW_NAME}]
{COLUMN_LIST | VARIABLE_LIST} = expression
[WHERE CLAUSE]
例如数量超过100的商品增加10%折扣
UPDATE DISCOUNTS
SET DISCOUNT = DISCOUNT + 0.10
WHERE LOWQTY >= 100
21. 删除数据
对表中数据的删除是用DELETE语句实现的。它的语法是:
DELETE [FROM] TABLE_NAME
WHERE SEARCH_CONDITIONS
例如删除在2002年10月4日下订单的订单明细信息
USE northwind
DELETE FROM [order details]
FROM orders o
INNER JOIN [order details] od
ON o.orderid = od.orderid
WHERE orderdate = '10/4/2002'

~ 江西信息应用技术职业学院信息技术系制作 ~

E-Mail:lxlz2050@163.net Tel:0791-5275546