首页 > 代码库 > SQL基础使用

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基础使用