一、检索数据
关键字 SELECT 、FROM 、AS 、TOP 、DISTINCT 、WHERE 、ORDER 、BY 、ASC 、DESC 、GROUP、HAVING
INNER 、JOIN 、ON 、LEFT 、RIGHT 、FULL
单表查询
格式一:SELECT listname FROM tablename
listname 列名或列名列表,使用逗号分隔各列。也可以用通配符(*)表示所有列。
tablename 表名或表名列表,使用逗号分隔各表。
Example1: SELECT * FROM 用户
Example2: SELECT 用户姓名 , 用户年龄 FROM 用户
按照SELECT语句中列出的列的次序检索数据。
Example3: SELECT 用户年龄 , 用户姓名 FROM 用户
用字符串连接符号(+)格式化数据类型为字符串的列,字符串用单引号('')包含。
Example4: SELECT 用户姓名+ '是' + 用户性别 + '性' FROM 用户
使用AS定义列的别名。
格式二:SELECT expression AS alias FROM tablename
expression:表达式,可以是字符串连接或聚合函数的结果等。
alias:列或表达式结果的别名。
Example5: SELECT 用户姓名+ '是' + 用户性别 + '性' AS 用户信息 FROM 用户
使用TOP限制返回的行数。
格式三:SELECT TOP number listname FROM tablename
number: 返回的行数,为数字。
Example6: SELECT TOP 3 * FROM 用户
使用DISTINCT返回不重复的数据。
格式四:SELECT DISTINCT listname FROM tablename
Example7: SELECT DISTINCT 操作 , 说明 FROM 用户收支
如果根据listname得到的数据中的一行与另一行完全相同,就删除其中的一个。listname中没有列出的数
据不进行比较。
使用WHERE 返回满足条件的数据。
格式五:SELECT listname FROM tablename WHERE condition
condition: 条件表达式,包括关系运算符,布尔运算符,函数等。
条件表达式在后面总结。
Example8: SELECT * FROM 用户 WHERE 用户年龄 > 30
使用ORDER BY … ASC | DESC 根据列进行排序
不指定 ASC 或 DESC 默认为ASC按升序排序
格式六: SELECT listname FROM tablename ORDER BY orderlist ASC[DESC]
SELECT listname FROM tablename ORDER BY orderlist
orderlist: 指定排序的列,可以为多个列
说明 在 ORDER BY 子句中不能使用 ntext、text 和 image 数据类型的列。
Example9: SELECT * FROM 用户 ORDER BY 用户年龄
Example10: SELECT * FROM 用户 ORDER BY 用户年龄 DESC
按多列排序规则:优先顺序按从左到右依次降低,根据第一个排序列分组,再在每个分组中进行第二个排
序列的排序,依次类推。如下例,先用 用户性别 排序 ,得到二个组,男组与女组,然后再在二个组内
分别用用户年龄 排序。如果前次排序得到的组大于本次排序得到的组,那么本次排序没有任何意义,如
Example11。
Example11: SELECT * FROM 用户 ORDER BY 用户性别 DESC ,用户年龄
Example12: SELECT * FROM 用户 ORDER BY 用户年龄 , 用户性别 DESC
在SELECT中使用聚合函数
Example13: SELECT AVG( 用户年龄 ) As 用户平均年龄 FROM 用户
AVG计算字段平均值
计算符合条件的列
Example14: SELECT AVG( 用户年龄 ) AS 用户平均年龄 FROM 用户 WHERE 用户性别 = '男'
使用GROUP BY 进行分组
格式七:SELECT listname FROM tablename GROUP BY group_by_expression
listname:包含聚合函数的列表列
group_by_expression:不在聚合函数中的列的列表
SQL要求,在聚合函数所在的查询中,任何列名要么加入聚合函数,要么包含在 GROUP BY中。
为了使用聚合函数,SQL必须对列进行分组,然后在每个组中使用聚合函数。
上面的两个例子中,实际上SQL在幕后秘密的建立了一个组,组的数据为
在Example13中,SELECT 用户年龄 FROM 用户
在Example14中,SELECT 用户年龄 FROM WHERE 用户性别 = '男'
然后再对组中的数据进行计算。
Example15: SELECT 用户性别 , AVG( 用户年龄 ) As 用户平均年龄 FROM 用户
这个例子会产生一个错误消息,用户姓名 列 在选择列表中是非法的,因为它不再聚合函数中,也没有
GROUP BY 字句。因为SQL尝试用其他列名匹配这个汇总值,但没有办法匹配。你可能想要分别得到性别为
男和女的用户的平均年龄。那么就要对用户性别进行分组,使SQL按照用户性别所分得组进行汇总。所谓
分组,就是对一列中相同的数据进行进行整合,有多少种相同的数据,就有多少个组,用户性别列的分组
,我们得到 男 组 与 女 组。然后SQL分别对这两个组进行汇总,我们就得到了男组的品均年龄与女组的
平均年龄。
Example16: SELECT 用户性别,AVG( 用户年龄 ) As 用户平均年龄 FROM 用户 GROUP BY 用户性别
我们还可以根据多个列分组,组的构成是根据 GROUP BY 后面列出现的顺序进行的。先根据第一个列分组
,在再每个分组中用第二的列进行分组,依次类推。如果第一个列可分为四组,第二个列可分为二组,则
最终的到八组。
Example17: SELECT 用户标识 , 操作 , SUM( 金额 ) As 金额总和 FROM 用户收支 GROUP BY 用户标识
, 操作
Example18: SELECT 用户标识 , 操作 , SUM( 金额 ) As 金额总和 FROM 用户收支 GROUP BY 操作 ,
用户标识
Example17和Example18的到的数据是一样的。
对唯一表识列,或分组不明确的列分组是没有意义的,如对用户IP.
SUM计算字段的和。
使用HAVING 为组指定条件
格式八:SELECT listname FROM tablename GROUP BY group_by_expression HAVING search_condition
search_condition:指定组应满足的搜索条件。
通过为作为一个整体的组指定条件(即 HAVING 子句),可限定查询中出现的组。在对数据进行分组和聚
合后,将用到 HAVING 子句中的条件。只有符合条件的组才出现在查询中。
Example19: SELECT 用户标识 , 操作 , SUM( 金额 ) As 金额总和 FROM 用户收支 GROUP BY 用户标识
, 操作 HAVING AVG(金额) > 1000
首先用 用户标识 列 分组,再对得到的组用 操作列 分组,然后选出每组中金额列的平均值 大与1000的
,最后对选出的组,进行 金额 列的汇总。
至此,检索数据的基本格式 为:
SELECT [DISTINCT][TOP n] select_list FROM tablename WHERE condition GROUP BY
group_by_expression HAVING search_condition
多表查询
一、内联接
格式一:SELECT listname FROM tablename WHERE condition
listname: 列名或列名列表,使用逗号分隔各列。也可以用通配符(*)表示所有列。
tablename: 表名或表名列表,使用逗号分隔各表。
condition: 联接条件。
Example20: SELECT 用户收支.收支标识 , 用户.用户姓名 , 用户收支.操作 ,用户收支.说明 ,用户收
支.金额 ,用户收支.日期 FROM 用户 , 用户收支 WHERE 用户.用户标识 = 用户收支.用户标识
格式二: SELECT listname FROM tablename1 INNER JOIN tablename2 ON condition
listname: 列名或列名列表,使用逗号分隔各列。也可以用通配符(*)表示所有列。
tablename1:表名1。
tablename2:表名2。
condition: 联接条件。
Example21: SELECT 用户收支.收支标识 , 用户.用户姓名 , 用户收支.操作 ,用户收支.说明 ,用户收
支.金额 ,用户收支.日期 FROM 用户 INNER JOIN 用户收支 ON 用户.用户标识 = 用户收支.用户标识
这种不返回所有表中的所有行,只返回满足联接条件的行的联接称为内联接。
二、外联接
格式一:SELECT listname FROM tablename1 LEFT JOIN tablename2 ON condition
格式二:SELECT listname FROM tablename1 RIGHT JOIN tablename2 ON condition
格式三:SELECT listname FROM table