数据存储到数据库中之后,如果不对其进行分析和处理,数据就是没有价值的。最终用户对数据库中数据进行的操作大多是查询和修改,修改包括增加新数据、删除旧数据和更改已有的数据。SQL语言提供了功能强大的数据查询和修改的功能,本文将详细介绍这些功能。
之后文章用到的表的内容
查询语句的基本结构
命令格式:SELECT <目标列名序列> --需要哪些列
FROM <数据源> --来自于哪些源
[WHERE <检索条件表达式>] -- 依据什么条件
[GROUP BY <分组依据列>]
[HAVING <组提取条件>]
[ORDER BY <排序依据列>] -- 查询结果进行排序
指定列别名的语法格式如下
命令格式:列名 | 表达式 | [AS] 列别名
命令格式:列别名 = 列名 | 表达式
WHERE常用的查询条件
查询条件 | 谓词 |
比较运算符 | =、>、>=、<、<=、<>(或者!=) |
确定范围 | BETWEEN AND(X<=x<=Y)、NOT BETWEEN AND(x<X,x>Y) |
确定集合 | IN 、NOT IN |
字符匹配 | LIKE、NOT LIK 可以包含任意字符常量,也可使用以下通配符 _:匹配任意一个字符 %:匹配0个或多个字符 [ ]:匹配“[ ]”其中的任意一个字符,假如匹配连续的abcd可写成"[a-d]" [ ^ ]:不匹配“[ ]”中任意的一个字符,假如不匹配连续的abcd可写成"[^a-d]" |
空值 | IS NULL、IS NOT NULL |
多重条件(逻辑谓词) | AND、OR |
聚合函数也称为集合函数或者统计函数、聚集函数,其作用是对一组值进行计算并返回一个单值。且不能出现在WHERE子句中
函数名 | 作用 |
COUNT(*) | 统计表中元组(每一行)的个数 ,计算过程不忽略NULL值 |
COUNT([DISTINCT]<列名>) | 统计本列非空列值个数,计算过程忽略NULL值 |
SUM(<列名>) | 计列值总和(必须是数值型列),计算过程忽略NULL值 |
AVG(<列名>) | 计算列值平均值(必须是数值型列),计算过程忽略NULL值 |
MAX(<列名>) | 求列值最大值,计算过程忽略NULL值 |
MIN(<列名>) | 求列值最小值,计算过程忽略NULL值 |
理解WHERE、HAVING 、GROUP BY
名称 | 介绍 |
WHERE子句 | 用来筛选FROM 子句中指定数据源所产生的行数据 |
GROUP BY子句 | 用来对经WHERE子句筛选后的结果数据进行筛选 |
HAVING子句 | 用来对分组后的结果数据再进行筛选 |
对于可以在分组操作之前应用的搜索条件,在WHERE子句中指定它们更有效,这样可以减少参与分组的数据行。在HAVING子句中指定的搜索条件应该是那些必须在执行分组操作之后应用的搜索条件。因此,建议将所有应该在分组之前进行的搜索条件放在WHERE子句中而不是HAVING子句中。 |
单表查询
- 1、查询指定列
- 2、查询全部列
- 3、查询经过计算的列
- 4、增加常量列
- 5、为3和4无列名的列通过别名增加列名或者起别名
- 6、对某列查询后去重复
- 7、查询满足某个条件下的数据
- 8、查询满足多个条件下的数据
AND的运算优先级比OR高
属性 | 作用 |
AND | 条件均满足 |
OR | 条件满足其一即可 |
- 9、确定集合
- 10、字符匹配操作
- 11、涉及空值的查询 空值(NULL)在数据库中有特殊的含义,表示不确定的值。判断某个属性的值是否为NULL,不能使用普通的比较运算符(=、!=等)。只能使用专门的判断NULL值得子句来完成。
判断取值为空的语句格式为:列名IS NULL
判断取值不为空的语句格式为:列名IS NOT NULL - 12、对查询结果进行排序 如果在ORDER BY子句中使用多个列进行排序,则这些列在该子句中出现的顺序决定了对结果集进行排序的方式。当指定多个排序依据列时,首先按排在最前面的列的值进行排字,如果排序后存在两个或两个以上列值相同的记录,则将值相同的记录再依据排在第二位的列的值进行排序,依此类推。
- 13、统计表中记录的条数
- 14、计算总和
- 15、计算平均值
- 16、计算最大值、最小值
- 17、分组统计查询
- 18、使用HAVING子句 HAVING子句用于对分组后的结果再进行筛选,它的功能有点像WHERE子句,但它用于组而不是单个记录。在HAVING子句中可以使用聚合函数对分组后的数据进行筛选,但在WHERE子句中则不能。HAVING通常与GROUP BY子句一起使用。
单表查询
查询指定列
SELECT Sno,Sname FROM Student;
查询全部列
SELECT * FROM Student;
SELECT Sno,Sname, Ssex,Sage,Sdept FROM Student;
查询经过计算的列(如下通过年龄计算出生月份)
SELECT Sname,2020-Sage FROM Student;
增加常量列###
SELECT Sname,'出生年月',2020-Sage FROM Student;
为3和4无列名的列通过别名增加列名
SELECT Sname AS 姓名,2020-Sage AS 出生年月 FROM Student;
SELECT Sname AS 姓名,'出生年份' AS 常量列,2020-Sage AS 日期 FROM Student;
对某列查询后去重复
命令格式:SELECT DISTINCT <列名> FROM <数据源>
举例: SELECT DISTINCT Sno FROM Student;
查询满足某个条件下的数据
SELECT * FROM Student WHERE Sdept='计算机系';
查询满足多个条件下的数据
SELECT * FROM Student WHERE Sdept='计算机系' AND Sno='1512101';
SELECT * FROM Student WHERE Sdept='计算机系' OR Sno='1512101';
确定集合
命令格式:列名 [ NOT ] IN ('常量1','常量2','常量3')
举例: SELECT * FROM Student WHERE Sdept IN('计算机系','信息系');
字符匹配操作
命令格式:[ NOT ] LIKE <匹配串>
举例: SELECT * FROM Student WHERE Sname LIKE '张%'; --查询姓张的数据
举例: SELECT * FROM Student WHERE Sname LIKE '[张刘]%'; --查询姓王或者姓刘的数据
举例: SELECT * FROM Student WHERE Sname LIKE '_[小大]%'; --查询第二个字是小或者大的数据
举例: SELECT * FROM Student WHERE Sname LIKE '_[^小大]%'; --查询第二个字既不是小也不是大的数据
举例: SELECT * FROM Student WHERE Sname LIKE '王_'; --查询姓王的且名字为两个字的数据
当我们查询姓王的且名字为三个字的会出现以下情况
SELECT * FROM Student WHERE Sname LIKE '王__'
原因:因为在定义数据类型的时候定义Sname是非Unicode的定长char(10)类型,当存入“”时会在其后补6个空格,空格也是字符。
解决:使用SQL Server提供的RTRIM函数去掉多余空格
SELECT * FROM Student WHERE RTRIM(Sname) LIKE '王__'
涉及空值的查询
SELECT * FROM SC WHERE GRADE IS NULL;
对查询结果进行排序
命令格式:ORDER BY <列名> [ASC|DESC] [,...N] --默认是ASC升序排序
举例:SELECT * FROM Student ORDER BY Sage;
举例:SELECT * FROM Student ORDER BY Sage,Sno;
举例:SELECT * FROM SC WHERE Cno='c002' ORDER BY Grade; --指定某个成员进行排列
举例:SELECT * FROM SC WHERE Cno='c002' ORDER BY Grade DESC; --降序
统计表中记录的条数
命令格式:COUNT(*)
举例: SELECT COUNT(*) AS 学生人数 FROM Student; --统计学生人数,采用了别名
举例: SELECT COUNT(DISTINCT Sno) AS 选课人数 FROM SC; --去重复值
计算总和
命令格式:SUM(<列名>)
举例: SELECT SUM(Grade) AS 总成绩 FROM SC WHERE Sno='1512101'; --计算某位学生的总成绩
举例: SELECT SUM(Grade) FROM SC; --计算某一列的总和
计平均值
命令格式:AVG(<列名>)
举例:SELECT AVG(Grade) FROM SC WHERE Cno='c001'; --计算课程c001的平均值
举列:SELECT AVG(Grade) FROM SC WHERE Sno='1512101'; --计算某个学生的平均成绩
计算最大值、最小值
命令格式:MAX(<列名>)、MIN(<列名>)
举例: SELECT MAX(Grade),MIN(Grade) FROM SC WHERE Sno='1512101'; --某个学生成绩的最大值最小值
分组统计查询
命令格式:GROUP BY <分组依据列> [, ... n] --分组依据列不能是text、ntexxt、image类型
[HAVING <组筛选条件>]
举例: SELECT Cno AS 课程号,COUNT(Sno) AS 选课人数 FROM SC GROUP BY Cno;-- 先对Cno进行分组,再对每组进行统计
举例: SELECT Sno,COUNT(Cno) AS 选课门数,AVG(Grade) AS 平均成绩 FROM SC GROUP BY Sno; -- 先对Sno分组,再对分组的Grade求平
带WHERE子句的统计查询
举例:SELECT Sdept, COUNT(*) AS 女生人数 FROM Student WHERE Ssex='女' GROUP BY Sdept;
先执行WHERE 子句,再执行GROUP BY ,最后对每组进行统计
使用HAVING子句
举列:SELECT Sno ,COUNT(*) AS 选课门数 FROM SC GROUP BY Sno HAVING COUNT(*) >3;