SQL基础使用
result = executeQuery(“ SELECT FName, FSalary FROM T_Employee ”); for(i=0;i<result.count;i++) { salary = result[i].get(“ FSalary ”); if(salary<5000) { name = result[i].get(“ FName ”); print(name+”的工资少于 5000 元,为:”+salary); } }
SQL 中提供了聚合函数来完成计算统 计结果集条数、某个字段的最大值、某个字段的最小值、某个字段的平均值以及某个字段的合计 值等数据统计的功能,SQL 标准中规定了下面几种聚合函数:
函数名 说明 MAX 计算字段最大值 MIN 计算字段最小值 AVG 计算字段平均值 SUM 计算字段合计值 COUNT 统计数据条数
SELECT COUNT(*),COUNT(FNumber) FROM T_Employee
可以看到COUNT(*)、COUNT(FNumber)两个表达式的计算结果都是9,而COUNT(FName) 的计算结果是 8。也就反应出了两种使用方式的区别:COUNT(*)统计的是结果集的总条数,而 COUNT(FName)统计的则是除了结果集中 FName 不为空值(也就是不等于 NULL)的记录的总
SELECT * FROM T_Employee WHERE FName LIKE '_erry' like的匹配字符 第一个任意字符
进行多字符匹配的通配符为半角百分号“%”,它匹配任意次数(零或多个)出现的 任意字符。比如通配符表达式“k%”匹配以“k”开头、任意长度的字符串,“k”、“kerry”、 “kb” 都能匹配这个表达式,
b%t”匹配以“b”开头、以“t”结尾
集合匹配 集合匹配只在 MSSQLServer 上提供支持,在 MYSQL、Oracle、DB2 等数据库中不支持, 必须采用变通的手段来实现。
[bt]%”匹配第一个字符为 b 或者 t、长度不限的 字符串,“bed”、“token”、“t”都能匹配这个表达式,而“at”、“lab”、“lot”等则不能匹配 这个表达式。
;例子 SELECT * FROM T_Employee WHERE FName LIKE '[SJ]%'
比如通配符表达式“[^bt]%”匹配第一个字符不为 b 或者 t、长度不限的字符串, 相反匹配
其他sql上要集合匹配 需要这样写 很字符的匹配 SELECT * FROM T_Employee WHERE FName LIKE 'S%' OR FName LIKE 'J%'
sql上查询NULL 不能直接使用NULL 需要使用关键字 IS NOT SELECT * FROM T_Employee WHERE FNAME IS NULL
不为空 SELECT * FROM T_Employee WHERE FNAME IS NOT NULL
不含字符的匹配 SELECT * FROM T_Employee WHERE NOT(FName LIKE 'S%') AND NOT(FName LIKE 'J%')
SELECT * FROM T_Employee WHERE FNAME IS NOT NULL AND FSalary <5000
反义运算符就是关键字 “!< !> !=”
NOT(表达去翻 相同于!)
SELECT * FROM T_Employee WHERE NOT(FAge=22) AND NOT(FSALARY<2000)
在数据库上需要注意一个词 不大于”表示成“<”, 而忘记了“不大于”是包含“小于”和“等于”这两个意思的,这样就会造成检索数据的错误 这时候使用NOT就可以很好的排除BUG
不等于”的运算符“<>”
使用!运算符 智能在MSSQL上使用 其他sql不能使用 所以需要使用NOT
多值检测 SELECT FAge,FNumber,FName FROM T_Employee WHERE FAge=23 OR FAge=25 OR FAge=28
SQL提供了IN语句,使用IN我们只要指定要匹配的数据集 合就可以了,使用方法为“IN (值1,值2,值3……)” 使用IN 是为了解决 多个OR 区间的值
SELECT FAge,FNumber,FName FROM T_Employee WHERE FAge IN (23,25,28)
范围值检测
检索所有年龄介于20岁到60 岁之间的员工信息”就要列出20到60之间的每一个值,这个工作量是非常大的。 IN就不好实现 SELECT * FROM T_Employee WHERE FAGE>=23 AND FAGE <=27 不过SQL提供了一个专门用语范围值检 测的语句“BETTWEEN AND”,它可以用来检测一个值是否处于某个范围中(包括范围的边界 值,也就是闭区间)。 SELECT * FROM T_Employee WHERE FAGE BETWEEN 23 AND 27
多个范围检测 SELECT * FROM T_Employee WHERE (FSalary BETWEEN 2000 AND 3000) OR (FSalary BETWEEN 5000 AND 8000)
低效的“WHERE 1=1”
这个事动态显示SQL 跟随用户的选择而查询sql SELECT * FROM T_Employee WHERE FNumber BETWEEN 'DEV001' AND 'DEV008' AND FName LIKE '%J%' AND FSalary BETWEEN 3000 AND 6000 而如果不选中姓名和年龄前的复选框的时候就要使用下面的SQL语句: SELECT * FROM T_Employee WHERE FNumber BETWEEN 'DEV001' AND 'DEV008' AND FSalary BETWEEN 3000 AND 6000
判断复选框是否被选择 String sql = " SELECT * FROM T_Employee WHERE 1=1"; if(工号复选框选中) { sql.appendLine("AND FNumber BETWEEN '"+工号文本框1内容+"' AND '"+工号 文本框2内容+"'"); } if(姓名复选框选中) { sql.appendLine("AND FName LIKE '%"+姓名文本框内容+"%'"); } if(年龄复选框选中) { sql.appendLine("AND FAge BETWEEN "+年龄文本框1内容+" AND "+年龄文本框2 内容); } executeSQL(sql); 上面,I这种方法由于使用where 条件 会限制条件查询, 不高效
----------------------------------
所以使用另一种方法 private void doQuery() { Bool hasWhere = false; StringBuilder sql = new StringBuilder(" SELECT * FROM T_Employee"); if(工号复选框选中) { hasWhere = appendWhereIfNeed(sql, hasWhere); sql.appendLine("FNumber BETWEEN '"+工号文本框1内容+"' AND '"+工号 文本框2内容+"'"); } if(姓名复选框选中) { hasWhere = appendWhereIfNeed(sql, hasWhere); sql.appendLine("FName LIKE '%"+姓名文本框内容+"%'"); } if(年龄复选框选中) { hasWhere = appendWhereIfNeed(sql, hasWhere); sql.appendLine("FAge BETWEEN "+年龄文本框1内容+" AND "+年龄文本框2 内容); } executeSQL(sql); }
private Bool appendWhereIfNeed(StringBuilder sql,Bool hasWhere) { if(hasWhere==false) { sql. appendLine("WHERE"); } else { sql. appendLine("AND"); } }
分组语句 必须和聚合一起使用 GROUP BY子句必须放到WHERE语句的之后
SELECT FAge FROM T_Employee WHERE FSubCompany = 'Beijing' GROUP BY FAge
使用聚合函数,下面的SQL语句是正确的: SELECT FAge,AVG(FSalary) FROM T_Employee GROUP BY FAge
SELECT FSubCompany,FDepartment FROM T_Employee GROUP BY FSubCompany,FDepartment
分数 和聚合函数一起使用实现查询每个年龄段的人数 SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge
SELECT FDepartment,MIN(FAge) AS FAgeMIN,MAX(FAge) AS FAgeMAX FROM T_Employee GROUP BY FDepartment
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge WHERE COUNT(*)>1 可以在数据库系统中执行下面的SQL的时候,数据库系统会提示语法错误,这是因为聚合函 数不能在WHERE语句中使用,必须使用HAVING子句来代替,比如: SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*)>1 执行完毕我们就能在输出结果中看到下面的执行结果:
HAVING使用 SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*) =1 OR COUNT(*) =3
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*) IN (1,3)
需要注意 不过使用WHERE的时候GROUP BY
限制结果行数查询 MYSQL中提供了LIMIT关键字用来限制返回的结果集,LIMIT放在SELECT语句的最后位置, 语法为“LIMIT 首行行号,要返回的结果集的最大数目”。 SELECT * FROM T_Employee ORDER BY FSalary DESC LIMIT 2,5 第二行开始 最多5条数据
MSSQLServer2000中提供了TOP关键字用来返回结果集中的前N条记录
select top 5 * from T_Employee order by FSalary Desc
top使用 子查询方式 比如要实现检索按照工资从高到低排序检索从第六名开始一共 三个人的信息,那么就可以首先将前五名的主键取出来,在检索的时候检索排除了这五名员 工的前三个人,SQL如下: SELECT top 3 * FROM T_Employee WHERE FNumber NOT IN (SELECT TOP 5 FNumber FROM T_Employee ORDER BY FSalary DESC) ORDER BY FSalary DESC MYSQL中提供了LIMIT关键字用来限制返回的结果集,LIMIT放在SELECT语句的最后位置, 语法为“LIMIT 首行行号,要返回的结果集的最大数目”。 子句要位于WHERE子句之后,而使用HAVING子句的时候GROUP BY子句要位于HAVING子句之 后,
在MSSQL使用 ROW_NUMBER()。 来查询行数
ROW_NUMBER()函数可以计算每一行数据在结果集中的行号(从1开始计数),其使用语法 如下: ROW_NUMBER OVER(排序规则) 比如我们执行下面的SQL语句: SELECT ROW_NUMBER() OVER(ORDER BY FSalary),FNumber,FName,FSalary,FAge FROM T_Employee
ROW_NUMBER()不能用在WHERE语句中。我们可以用子查询来解决这个问题, 要用下面 的SQL语句用来返回第3行到第5行的数据: SELECT * FROM ( SELECT ROW_NUMBER() OVER(ORDER BY FSalary DESC) AS rownum, FNumber,FName,FSalary,FAge FROM T_Employee ) AS a WHERE a.rownum>=3 AND a.rownum<=5
数据库分页处理
SELECT DISTINCT FDepartment FROM T_Employee 查询结果排除相同
SQL基础使用的更多相关文章
- [SQL] SQL 基础知识梳理(一)- 数据库与 SQL
SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...
- [SQL] SQL 基础知识梳理(二) - 查询基础
SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(三) - 聚合和排序
SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...
- [SQL] SQL 基础知识梳理(四) - 数据更新
SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(五) - 复杂查询
SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...
- 黑马程序员+SQL基础(上)
黑马程序员+SQL基础 ---------------<a href="http://edu.csdn.net"target="blank">ASP ...
- Oracle SQL 基础学习
oracel sql 基础学习 CREATE TABLE USERINFO ( ID ,) PRIMARY KEY, USERNAME ), USERPWD ), EMAIL ), REDATE DA ...
- 第一章 SQL基础
第一部分:SQL基础1. 为什么学习SQL自人类社会形成之日起,社会的运转就在不断地产生和使用各种信息(文献.档案.资料.数据等):在如今所谓的信息时代,由于计算机和互联网的作用,信息的产生和使用达到 ...
- SQL基础--> 约束(CONSTRAINT)
--============================= --SQL基础--> 约束(CONSTRAINT) --============================= 一.几类数据完 ...
- SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR)[转]
--====================================================== --SQL基础-->层次化查询(START BY ... CONNECT BY ...
随机推荐
- C# windows ce编程-----我的第一次
最近公司要求开发抄表软件,软件分为PC端和手持终端(简称HHU),HHU是基于英文版的windows ce6.0操作系统,开发环境要求VS2005+SQLite数据库,开发语言为C#,因为是第一次基本 ...
- Android实现视频录制
安卓实现视频录制,有两种方法,一种是调用自带的视频功能,一种是使用MediaRecorder. 每种方法都有自己的优缺点.接下来,把两种方法的代码写出来. 先说第一种方法,也是最简单的方法,那就是直接 ...
- ansible变量
ansible变量 (部分内容摘自互联网,非官方,描述不一定正确) 变量种类: 内置变量facts: 自定义变量: 命令行传递的变量 roles传递的变量 主机变量 组变量 内置变量facts: 由远 ...
- Android Studio does not point to a valid jvm
环境变量 JAVA_HOME的值,去掉后面的分号,一般情况下就可以启动
- 我的Python成长之路---第六天---Python基础(20)---2016年2月20日(晴)
一.面向对象基础 面向对象名词解释: 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公 ...
- (Problem 33)Digit canceling fractions
The fraction 49/98 is a curious fraction, as an inexperienced mathematician in attempting to simplif ...
- 启动(Startup)
Startup Chrome是一个单一的可执行程序.它清楚如何运行其它进程. 下面是chrome启动的概述: 1. 首先,chrome有一个平台相关的入口点:在windows上是wWinMain(): ...
- 转: cmd和amd的区别
AMD 规范在这里:https://github.com/amdjs/amdjs-api/wiki/AMDCMD 规范在这里:https://github.com/seajs/seajs/issues ...
- QT 遍历目录查找指定文件(比较简单)
QString FindFile(const QString &strFilePath, const QString &strNameFilters){ if (strFilePath ...
- File中操作路径的API(转)
这几天一直在搞Java,模板引擎系列和程序猿执业修养系列都暂停了,在Java上忙的不亦乐乎!由于对Java还不太熟悉,经历了各种纠结终于完成了任务.以下是关于Java获取当前目录的方法的备忘录. 原文 ...