句:SELECT * FROM T_Employee WHERE FAge<>22 AND FSALARY>=2000 。
因此要完成下面的功能“检索所有年龄不等于22岁并且工资不小于2000元”,我们可以编写下面的SQL语句:
SELECT * FROM T_Employee WHERE NOT(FAge=22) AND NOT(FSALARY<2000) 。
1.2.4多值检测
可以使用OR语句来连接多个等于判断。SQL语句如下:SELECT FAge,FNumber,FName FROM T_EmployeeWHERE FAge=23 OR FAge=25 OR FAge=28 。
SELECT FAge,FNumber,FName FROM T_Employee WHERE FAge IN(23,25,28) 。
1.2.5范围检测
检索所有年龄介于23岁到27岁之间的员工信息” ,可以使用下面的SQL语
句:SELECT * FROM T_Employee WHERE FAGE>=23 AND FAGE <=27 。SQL提供了一个专门用语范围值检
测的语句“BETTWEEN AND”,它可以用来检测一个值是否处于某个范围中(包括范围的边界值,也就是闭区间)。使用方法如下“字段名 BETTWEEN 左范围值 AND 右范围值”。SELECT * FROM T_Employee
WHERE FAGE BETWEEN 23 AND 27 。
检索所有工资介于2000元到3000元之间以及5000元到8000元的员工信息” ,可以使用下面的SQL语句:
SELECT * FROM T_Employee WHERE (FSalary BETWEEN 2000 AND 3000)OR (FSalary BETWEEN 5000 AND 8000) 。
数据库系统对“BETTWEEN AND”进行了查询优化,使用它进行范围值检测将会得到比其他方式更好的性能,因此在进行范围值检测的时候应该优先使用“BETTWEEN AND”。需要注意的就是“BETTWEEN AND”在进行检测的时候是包括了范围的边界值的(也就是闭区间),如果需要进行开区间或者半开半闭区间的范围值检测的话就必须使用其他的解决方案了。
1.2.6低效的where 1=1
因为使用添加了 “1=1”的过滤条件以后数据库系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描 (也就是全表扫描) 以比较此行是否满足过滤条件, 当表中数据量比较大的时候查询速度会非常慢。 因此如果数据检索对性能有比较高的要求就不要使用这种 “简便” 的方式。
1.3数据分组
SQL语句中使用GROUP BY子句进行分组,使用方式为“GROUP BY 分组字段”。分组语句必须和聚合函数一
起使用,GROUP BY子句负责将数据分成逻辑组,而聚合函数则对每一个组进行统计计算。
SELECT FAge FROM T_Employee GROUP BY FAge。 GROUP BY子句将检索结果划分为多个组,每个组是所有记录的一个子集。GROUP BY子句必须放到SELECT语句的之后,如果SELECT语句有WHERE子句,则GROUPBY子句必须放到WHERE语句的之后。
SELECT FAge FROM T_Employee WHERE FSubCompany = 'Beijing'GROUP BY FAge 需要分组的所有列都必须位于GROUP BY子句的列名列表中,也就是没有出现在GROUP BY子句中的列(聚合函数除外)是不能放到SELECT语句后的列名列表中的。
SELECT FAge,AVG(FSalary) FROM T_Employee GROUP BY FAge 。GROUP BY子句中可以指定多个列,只需要将多个列的列名用逗号隔开即可。指定多个分组规则以后, 数据库系统将按照定义的分组顺序来对数据进行逐层分组, 首先按照第一个分组列进行分组,然后在每个小组内按照第二个分组列进行再次分组……逐层分组,从而实现“组中组”的效果, 而查询的结果集是以最末一级分组来进行输出的。
SELECT FSubCompany,FDepartment FROM T_Employee GROUP BY FSubCompany,FDepartment 。
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge 。
SELECT FSubCompany,FAge,COUNT(*) AS CountOfThisSubCompAge FROM T_Employee GROUP BY FSubCompany,FAge 。
SELECT FSubCompany,FAge,COUNT(*) AS CountOfThisSubCompAge FROM T_Employee GROUP BY FSubCompany,FAge ORDER BY FSubCompany 。
“COUNT(*)”对每一个分组统计总数,这样就可以统计出每个公司每个年龄段的员工的人数了。SUM、AVG、MIN、MAX也可以在分组中使用。比如下面的SQL可以统计每个公司中的工资
的总值:SELECT FSubCompany,SUM(FSalary) AS FSalarySUM FROM T_Employee GROUP BY FSubCompany 。
1.3.1having子句
有的时候需要对部分分组进行过滤,可以在数据库系统中执行下面的SQL的时候, 数据库系统会提示语法错误, 这是因为聚合函数不能在WHERE语句中使用,必须使用HAVING子句来代替,比如:SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*)>1 。
HAVING语句中也可以像WHERE语句一样使用复杂的过滤条件,比如下面的SQL用来检索人数为1个或者3个的年龄段,可以使用下面的SQL:SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee
GROUP BY FAge HAVING COUNT(*)=1 OR COUNT(*)=3 。
MYSQL中提供了LIMIT关键字用来限制返回的结果集, LIMIT放在SELECT语句的最后位置,语法为 “LIMIT 首行行号,要返回的结果集的最大数目” 。比如下面的SQL语句将返回按照工资降序排列的从第二行开始(行号从0开始)的最多五条记录:SELECT * FROM T_Employee ORDER BY FSalary DESC LIMIT 2,5 。
DISTINCT关键字是用来进行重复数据抑制的最简单的功能,而且所有的数据库系统都支持DISTINCT,DISTINCT的使用也非常简单,只要在SELECT之后增加DISTINCT即可。 DISTINCT是对整个结果集进行数据重复抑制的, 而不是针对每一个列, 执行下面的SQL语句:SELECT DISTINCT FDepartment,FSubCompany FROM T_Employee 。DISTINCT是对整个结果集进行数据重复抑制的。
联合结果集
有的时候我们需要组合两个完全不同的查询结果集, 而这两个查询结果之间没有必然的联系,只是我们需要将他们显示在一个结果集中而已。在SQL中可以使用UNION运算符