where sname like '刘%' 如图3- 1所示:
图3- 1所有姓刘的同学信息
名字必须是3个字: select * from s
where sname like '刘_ _' 如图3- 2所示:
图3- 2名字必须是3个字
如图所示,我们可以看到,查询出来的结果中不仅包含3个字的还包含2个字的,因此在百度的帮助下,我们找到另一种解决方案,如下:
select * from s
where sname like '刘%' and len(sname)=3 运行结果,如图3- 3所示:
图3- 3方案2
(2) 查找名字为刘某的学生信息,但是名字的第二个字不是“兰”
SQL语句: select * from s
where sname like '刘[^兰]%' 如 图3- 4所示:
图3- 4姓刘但第二个字不是‘兰’
4. 逻辑运算符(运算符的优先级为 NOT 、 AND 、OR,求值顺序自左向右,可以利用括号改变求
值顺序) 1) 逻辑运算符
逻辑运算符对某个条件进行测试,以获得其真实情况。逻辑运算符和比较运算符一样,返回带有 TRUE 或 FALSE 值的布尔数据类型。 运算符 ALL AND ANY BETWEEN EXISTS IN LIKE NOT OR SOME 2) 比较运算符
比较运算符测试两个表达式是否相同。除了 text、ntext 或 image 数据类型的表达式外,比较运算符可以用于所有的表达式。
运算符 =(等于) >(大于) <(小于) >=(大于或等于) <=(小于或等于) <>(不等于) !=(不等于) !< (不小于) !> (不大于) 等于 大于 小于 大于等于 小于等于 不等于 不等于(非 SQL-92 标准) 不小于(非 SQL-92 标准) 不大于(非 SQL-92 标准) 含义 含义 如果一系列的比较都为 TRUE,那么就为 TRUE。 如果两个布尔表达式都为 TRUE,那么就为 TRUE。 如果一系列的比较中任何一个为 TRUE,那么就为 TRUE。 如果操作数在某个范围之内,那么就为 TRUE。 如果子查询包含一些行,那么就为 TRUE。 如果操作数等于表达式列表中的一个,那么就为 TRUE。 如果操作数与一种模式相匹配,那么就为 TRUE。 对任何其它布尔运算符的值取反。 如果两个布尔表达式中的一个为 TRUE,那么就为 TRUE。 如果在一系列比较中,有些为 TRUE,那么就为 TRUE。
比较运算符的结果有布尔数据类型,它有三种值:TRUE、FALSE 及 UNKNOWN。那些返回布尔数据类型的表达式被称为布尔表达式。
和其它 SQL Server 数据类型不同,不能将布尔数据类型指定为表列或变量的数据类型,也不能在结果集中返回布尔数据类型。
当 SET ANSI_NULLS 为 ON 时,带有一个或两个 NULL 表达式的运算符返回 UNKNOWN。当 SET ANSI_NULLS 为 OFF 时,上述规则同样适用,只不过如果两个表达式都为 NULL,那么等号运算符返回 TRUE。例如,如果 SET ANSI_NULLS 是 OFF,那么 NULL = NULL 就返回 TRUE。
(1) 查找不是计算机学院和数学系的,成绩不及格或成绩为空的学生信息。
查找不是计算机学院和数学系的学生: select s.*,sc.grade from s,sc
where s.sno=sc.sno
and s.sdept<>'计算机学院' and s.sdept<> '数学系' 如图4- 1所示:
图4- 1查找不是计算机学院和数学系的学生
且成绩不及格或者成绩为空的学生信息: select s.*,sc.grade from s,sc
where s.sno=sc.sno
and s.sdept<>'计算机学院' and s.sdept<> '数学系' and (sc.grade <60 or sc.grade is null) 如 图4- 2所示:
图4- 2成绩不及格或者成绩为空
5. Group by 练习
1) 用 ROLLUP 汇总数据
在生成包含小计和合计的报表时,ROLLUP 运算符很有用。ROLLUP 运算符生成的结果集类似于 CUBE 运算符所生成的结果集。有关更多信息,请参见用 CUBE 汇总数据。 CUBE 和 ROLLUP 之间的区别在于:
?
CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
? ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。
2) 用 CUBE 汇总数据
CUBE 运算符生成的结果集是多维数据集。多维数据集是事实数据的扩展,事实数据即记录个别事件的数据。扩展建立在用户打算分析的列上。这些列被称为维。多维数据集是一个结果集,其中包含了各维度的所有可能组合的交叉表格。
CUBE 运算符在 SELECT 语句的 GROUP BY 子句中指定。该语句的选择列表应包含维度列和聚合函数表达式。GROUP BY 应指定维度列和关键字 WITH CUBE。结果集将包含维度列中各值的所有可能组合,以及与这些维度值组合相匹配的基础行中的聚合值。
(1) 查询各学院男生和女生的人数。
SQL语句: select sdept
,sum(case when ssex='男' then 1 else 0 end) as '男生人数' ,sum(case when ssex='女' then 1 else 0 end) as '女生人数' from s
group by sdept 如图5- 1所示:
图5- 1各学院男生和女生的人数
(2) 查询各个学院男生和女生人数,只显示人数超过1人的统计信息。
SQL语句:
select sdept,count(*)as 人数,ssex from s
group by sdept,ssex having count(*)>1 如图5- 2所示:
图5- 2如题要求
(3) 查询各个学院男生、女生的人数及其总人数。(rollup或cube)
SQL语句:
select sdept
,sum(case when ssex='男' then 1 else 0 end) as '男生人数' ,sum(case when ssex='女' then 1 else 0 end) as '女生人数'
,(sum(case when ssex='男' then 1 else 0 end)+sum(case when ssex='女' then 1 else 0 end))as total from s
group by sdept 如图5- 3所示:
图5- 3如题要求
(4) 统计各门课各个学院选修的人数、各学院选课人数、总人数。
SQL语句:
select s.sdept ,count (S.Sno) as 选课人数 from s,sc
where s.sno= sc.sno
group by S.Sdept with cube 如图5- 4所示:
图5- 4各学院选课人数、总人数
(5) 分别统计各学院男生、女生的平均年龄。
SQL语句:
select ssex,sdept,avg(2014-year(sbirthday))as 平均年龄 from S
group by ssex,sdept 如图5- 5所示: