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 ...
随机推荐
- JAVA GUI学习 - JInternalFrame浮动窗口:可拖拽窗口(依赖于父窗口)
public class JInternalFrameKnow extends JInternalFrame { public JInternalFrameKnow() { this.setBound ...
- python3 ImageTk 安装方法
使用命令: $ sudo yum search PIL | grep python3 可显示得知: python3-dogpile-cache.noarch : A caching front-end ...
- c#简单的调试信息、日志信息输出
public static void ErrorLog(string mssg) { string FilePath = "D:/logs/ErrorLog.txt"; try { ...
- wpf全局异常
在App.xaml文件中 添加DispatcherUnhandledExceptionEventArgs 新增对应事件
- 上传图片到文件夹并显示在GridView控件里面
http://aspsnippets.com/Articles/Upload-images-to-folder-and-display-uploaded-images-in-ASPNet-GridVi ...
- ThinkPHP第十天(_initialize方法,SESSION销毁,分组配置,include文件引入,JOIN用法)
1.Action类中的_initialize()函数,先于任何自定义操作函数运行,可认为是控制器的前置操作.可用于检测用户是否登录等检测. 如果多个模块(Action)需要相同_initialize( ...
- ODBC、OLE DB、 ADO、ODAC、ODP.NET
面对各式各样.越来越多的数据来源和访问需求.软件开发框架中一般都提供了统一的访问接口和方法,来屏蔽数据库底层差异. 各式各样的Provider提供者. ODBC(Open Database Conne ...
- 1 初级.net web工程师,在工作中都做些什么
初级.Net Web工程师,在工作中都做些神马? 职责 初级.Net Web工程师的主要职责,就是按比较详细的要求去完成代码. 比较详细的要求是指:一般会把页面式样.功能的描述.数据库结构.性能要 ...
- ASP.NET jQuery 随笔 从DropDownList获取选择的text和value值
jQuery来获取DropDownList的Text/Value属性值,代码如下 <%@ Page Language="C#" AutoEventWireup="t ...
- linux下检测端口是否连通
检测tcp端口使用telnet命令 telnet 例:telnet 192.168.0.1 80 检测udp端口使用uc命令 uc -zu 例:uc -zu 192.169.0.1 80 以上命令 ...