-
第 08 篇 什么是函数?如何利用函数提高数值计算的效率?
2020-09-22 12:10:47掌握常见的 SQL 函数将会方便我们进行数据的处理和分析,避免重复实现已有的功能。本篇主要介绍了常见的数值函数,大多数函数都可以在不同的数据库之间通用,但是也存在一些数据库专有的函数实现。《SQL 从入门到精通》专栏目录
- 第 01 篇 和数据打交道的你,一定要学会 SQL
- 第 02 篇 在 SQL 的世界里一切都是关系
- 第 03 篇 使用 SELECT 语句初步探索数据库
- 第 04 篇 通过查询条件实现数据过滤
- 第 05 篇 如何使用 SQL 语句进行模糊查找?
- 第 06 篇 利用 ORDER BY 对数据进行排序显示
- 第 07 篇 如何实现排行榜和前端分页效果
- 第 08 篇 什么是函数?如何利用函数提高数值计算的效率?
- 第 09 篇 SQL 常见函数之文本数据处理
- 第 10 篇 日期和时间的存储与格式转换
- 第 11 篇 如何为 SQL 增加 IF-THEN-ELSE 逻辑,并且实现行列转换?
- 第 12 篇 轻松完成数据报表中的汇总分析
- 第 13 篇 按照部门或者职位进行分组统计
- 第 14 篇 实战案例:世界银行全球 GDP 数据分析
- 第 15 篇 小心 SQL 中的空值陷阱!
- 第 16 篇 如何同时查询多个表中的相关数据?
- 第 17 篇 子查询:多表查询的另一种方式
- 第 18 篇 你知道表也能进行加减运算吗?
- 第 19 篇 将表当作一个变量,实现递归调用和层次遍历
- 第 20 篇 销售数据的多维度交叉分析
- 第 21 篇 高级报表之移动分析和累计求和
- 第 22 篇 高级报表之分类排名和环比/同比分析
- 第 23 篇 分析股票 K 线图与检测可疑的银行转账
- 第 24 篇 什么是 ER 图,如何进行数据库规范化设计?
- 第 25 篇 SQL 支持哪些数据类型,使用时如何进行选择?
- 第 26 篇 使用 DDL 管理数据库中的对象
- 第 27 篇 使用 DML 执行数据的增删改合
- 第 28 篇 为什么数据库事务如此重要?
- 第 29 篇 索引一定能提高性能吗?
- 第 30 篇 视图有哪些优缺点,什么时候使用视图?
- 第 31 篇 该不该使用存储过程封装业务接口?
- 第 32 篇 如何通过触发器记录和审核用户的操作?
- 第 33 篇 什么是执行计划,如何查看执行计划?
- 第 34 篇 了解常见 SQL 查询优化技巧
- 第 35 篇 使用 SQL 处理 NoSQL 数据
- 第 36 篇 在 Python 中运行 SQL 进行数据分析
- 第 37 篇 在 Java 中使用 SQL 执行增删改查
- 第 38 篇 动态 SQL 语句与防止 SQL 注入
- 第 39 篇 结束语:SQL 编程的道与术
上一篇我们讨论了如何利用 FETCH(或者 LIMIT)和 OFFSET 实现数据的 Top-N 排行榜和分页查询。
SQL 语句主要的功能就是对数据进行处理和分析。为了避免重复造轮子,提高数据处理的效率,SQL 为我们提供了许多标准的功能模块:函数(Function)。实际上我们已经使用过 SQL 函数,例如将字符转换为大写形式的 UPPER 函数。
函数概述
SQL 函数是一种具有某种功能的模块,可以接收零个或多个输入值,并且返回一个输出值。函数处理数据的过程如下图所示:
在 SQL 中,函数主要分为两种类型:
- 标量函数(scalar function)。标量函数针对每个输入参数,返回一个输出结果。例如,ABS(x) 可以计算 x 的绝对值。
- 聚合函数(aggregate function)。聚合函数基于一组数据进行计算,返回一个输出结果。例如,AVG 函数可以计算一组数据的平均值。
我们先介绍标量函数,聚合函数将会在第 12 篇中进行介绍。为了方便学习,我们将常见的 SQL 标量函数分为以下几类:数值函数、字符函数、日期函数以及类型转换函数。本篇只涉及数值函数。
数值函数
数值函数通常接收数字类型的参数,执行数学计算并返回一个数值结果。以下是 SQL 中常见的数值函数及不同数据库中的实现:
函数 描述 Oracle MySQL SQL Server PostgreSQL ABS(x) 计算 x 的绝对值 支持 支持 支持 支持 CEIL(x) / CEILING(x) 计算大于等于 x 的最小整数 支持 CEIL(x) 支持 支持 CEILING(x) 支持 EXP(x) 计算 e 的 x 次幂,e 约等于 2.71828 支持 支持 支持 支持 FLOOR(x) 计算小于等于 x 的最大整数 支持 支持 支持 支持 LN(x) 计算 x 的自然对数,底数为 e 支持 支持 LOG(x) 支持 LOG(y, x) 计算以 y 为底的 x 的对数 支持 支持 LOG(x, y) 支持 MOD(x, y) 计算 x 除以 y 的余数,即求模运算 支持 支持 x % y 支持 POWER(x, y) 计算 x 的 y 次幂 支持 支持 支持 支持 ROUND(x, y) 将 x 四舍五入到 y 位小数 支持 支持 支持 支持 SQRT(x) 计算 x 的平方根 支持 支持 支持 支持 GREAST(x, y, …) 计算参数列表中的最大值 支持 支持 不支持 支持 LEAST(x, y, …) 计算参数列表中的最小值 支持 支持 不支持 支持 RANDOM( ) 返回一个大于等于 0 小于 1 的随机数 DBMS_RANDOM.VALUE RAND() RAND() 支持 我们通过一些示例来说明这些函数的作用。
绝对值函数
ABS 函数计算输入参数的绝对值:
SELECT ABS(-2), ABS(2) FROM employee WHERE emp_id = 1; ABS(-2)|ABS(2)| -------|------| 2| 2|
2 和 -2 的绝对值都是 2。
取整函数
CEIL 和 CEILING 函数向上取整,FLOOR 函数向下取整,ROUND 函数执行四舍五入运算:
SELECT CEIL(1.9), -- SQL Server 使用 CEILING(1.9) FLOOR(4.5), ROUND(9.456, 1) FROM employee WHERE emp_id = 1; CEIL(1.9)|FLOOR(4.5)|ROUND(9.456, 1)| ---------|----------|---------------| 2| 4| 9.5|
1.9 向上取整为 2,4.5 向下取整为 4,9.456 四舍五入到一位小数得到 9.5。
Oracle 只实现了 CEIL 函数,SQL Server 只实现了 CEILING 函数。
指数函数
EXP 函数计算自然常数 e 的 N 次方,POWER 函数计算指定底数的 N 次方:
SELECT EXP(1), POWER(2, 4) FROM employee WHERE emp_id = 1; EXP(1) |POWER(2, 4)| -----------------|-----------| 2.718281828459045| 16|
自然常数 e 约等于 2.71828,2 的 4 次方等于 16。
对数函数
LN 函数计算以 e 为底的自然对数,LOG 函数计算指定底数的对数:
-- Oracle、MySQL 以及 PostgreSQL 实现 SELECT LOG(6, 36), LN(2.7182818285) FROM employee WHERE emp_id = 1; -- SQL Server 实现 SELECT LOG(36, 6), LOG(2.7182818285) FROM employee WHERE emp_id = 1;
该查询的结果如下:
LOG(6, 36)|LN(2.7182818285)| ----------|----------------| 2| 1|
SQL Server 中对数函数的实现有所不同,它使用 LOG(x) 计算 x 的自然对数 LN(x);并且使用 LOG(x, y) 计算以 y 为底的 x 的对数,其他数据库使用 LOG(y, x)。
平方根函数
SQRT 函数计算数据的平方根:
SELECT SQRT(25) FROM employee WHERE emp_id = 1; SQRT(25)| --------| 5|
25 的平方根是 5。
求余函数
MOD 函数用于计算两个数相除的余数:
-- Oracle、MySQL 以及 PostgreSQL 实现 SELECT MOD(7,3) FROM employee WHERE emp_id = 1; MOD(7,3)| --------| 1| -- MySQL、SQL Server 以及 PostgreSQL 实现 SELECT 7 % 3 FROM employee WHERE emp_id = 1; 7 % 3| -----| 1|
7 除以 3 的余数是 1。SQL Server 使用 % 运算符进行求余运算,MySQL 和 PostgreSQL 也支持 % 运算符。
最大值与最小值
GREAST 和 LEAST 函数分别计算参数列表中的最大值和最小值:
-- Oracle、MySQL 以及 PostgreSQL 实现 SELECT GREATEST(1, 2, 3), LEAST(1, 2, 3) FROM employee WHERE emp_id = 1; GREATEST(1, 2, 3)|LEAST(1, 2, 3)| -----------------|--------------| 3| 1|
1、2、3 中最大的是 3,最小的是 1。SQL Server 目前没有提供这两个函数。
生成随机数
生成随机数的函数在各种数据库中的实现不同:
-- MySQL 和 SQL Server 实现 SELECT RAND() FROM employee WHERE emp_id = 1; RAND() | ------------------| 0.8572325947296178| -- Oracle 实现 SELECT DBMS_RANDOM.VALUE FROM employee WHERE emp_id = 1; VALUE | ----------------------------------------| 0.33095309998157211073097228949436162842| -- PostgreSQL 实现 SELECT RANDOM() FROM employee WHERE emp_id = 1; random | ------------------| 0.7409744057804346|
随机数函数每次都会返回不同的结果,所以你的结果应该和上面的数据并不相同。
其他常见的数值函数还有三角函数,例如 sin(x)、cos(x) 等。它们都是一些通用的数学函数,需要时可以查看数据库相关的文档。
小结
掌握常见的 SQL 函数将会方便我们进行数据的处理和分析,避免重复实现已有的功能。本篇主要介绍了常见的数值函数,大多数函数都可以在不同的数据库之间通用,但是也存在一些数据库专有的函数实现。
思考题:如何实现查询语句,每次执行时从员工表中返回随机的 5 条不同的数据?
-
-
mysql数据库笔记(六) 函数
2019-12-13 14:49:31mysql数据库 函数 SQL支持利用函数来处理数据。函数一般是在数据上执行的,它给数据的转换和处理提供了方便 。 dual:哑表。 dual是一个虚拟表,用来构成select的语法规则。mysql中可以不使用 dual。 例如: ...mysql数据库 函数
SQL支持利用函数来处理数据。函数一般是在数据上执行的,它给数据的转换和处理提供了方便 。
dual:哑表。
- dual是一个虚拟表,用来构成select的语法规则。mysql中可以不使用 dual。
例如:
显示1+1的结果,可以看出,dual很多时候是为了构成select的标准语法。
#计算1+1 select 1+1; select 1+1 from dual;
字符串函数
函数 说明 例子 lower(str) 把字符转为小写 select LOWER(‘ABC’); upper(str) 把字符转换为大写 select UPPER(‘hello’); trim(str) 去掉开始和结尾处的空格 select TRIM(’ abc '); concat(str,str2,…) 多个字符串合并为一个字符串 select concat(‘a’,‘b’,‘c’); length(str) 返回字符串的长度, select LENGTH(‘hello’); substr(str,start,length) 截取start 位置长度为 length 的子字符串 select substr(‘hello’,2,3); #显示员工的id和姓名 格式如下: id|last_name|first_name SELECT CONCAT( a.id, '|', a.last_name, '|', a.first_name ) FROM s_emp a;
数字函数
- round(arg1,arg2):四舍五入
- arg1: 四舍五入操作的数字
- arg2:保留到哪一位。负数表示整数位,正数表示小数位。
#3.1415保留3位小数:3.142 select ROUND(3.1415,3); #127.57保留到个位:128 select ROUND(127.57,0); #127.57保留到十位:130 select ROUND(127.57,-1);
- truncate(arg1,arg2) 截取到某一位
- 和round的用法一样,但是trunc只舍去不进位。
#3.1415截取3位小数:3.141 select truncate(3.1415,3); #127.57保留到个位:128 select ROUND(127.57,0); #127.57保留到十位:130 select ROUND(127.57,-1);
日期函数
函数 说明 例子 curtime() 返回当前时间 select curtime(); now() 返回当前时间和日期 select curtime(); curdate() 返回当前日期 select curdate(); date(exp) 返回时间的日期部分 select date(now()); time(exp) 返回时间的时间部分 select time(now()); #查询当前的年份,月份,星期,小时,分钟 SELECT YEAR (now()), MONTH (now()), WEEKDAY(now()) + 1, HOUR (NOW()), MINUTE (now()), SECOND (now()) FROM DUAL; #查询入职时间为1991的员工id,名字和入职年份 SELECT a.id, a.last_name, YEAR (a.start_date) AS start_year FROM s_emp a WHERE YEAR (a.start_date) = 1991 #查询入职时间在1991年5月1日到1991年11月15日份入职的员工信息 #如果比较的字段是日期类型。请使用Date()函数对日期进行比较。 SELECT a.id, a.last_name, a.start_date FROM s_emp a WHERE DATE(a.start_date) BETWEEN '1991-05-01' AND '1991-11-15' ORDER BY a.start_date; #查询入职时间在1991年2月份的员工信息 SELECT * FROM s_emp a WHERE YEAR (a.start_date) = 1991 AND MONTH (a.start_date) = 2;
系统函数
函数 作用 version() 查看数据库的版本号 user() 查看当前用户 cast(x AS type) 数据类型转换 #显示当前登录用户 select user(); #显示当前数据库版本 select version(); #将'2019-10-10'转换成日期类型 select CAST('2019-10-10' AS date); #
组函数
用作统计使用,又称为聚合函数或统计函数或组函数。
组函数 说明 avg() 返回某列的平均值 count() 返回某列的行数 sum() 返回某列值的和 max() 返回某列值的最大值 min() 返回某列值的最小值 #查询所有员工的平均工资 select avg(a.salary) from s_emp a; #查询员工中最低工资 select min(a.salary) from s_emp a; #查询员工最晚入职时间。 select max(a.start_date) from s_emp a; # max() 可以使用在文本值上吗? #查询员工的总人数 select count(*) from s_emp a; select count(a.id) from s_emp a; #查询41号部门员工的工资总额。 SELECT sum(a.salary) FROM s_emp a WHERE a.dept_id = 41; #查询员工表中员工所属的部门的数量。 SELECT count(DISTINCT a.dept_id) FROM s_emp a; #显示员工表中员工的最大工资,最小工资,和平均工资的信息 SELECT max(a.salary) AS max_salary, min(a.salary) AS min_salary, avg(a.salary) AS avg_salary FROM s_emp a;
count(*) 和count(colunm) 的区别:
使用count(column)对特定列中具有值的行进行计数,忽略null值 。使用COUNT(*)对表中行的数目进行计数 。不忽悠null值。
- dual是一个虚拟表,用来构成select的语法规则。mysql中可以不使用 dual。
-
编写函数实现员工信息录入和输出_SUM函数在数据库中作为聚合函数一样体现出自己强大的计算功能...
2020-12-11 17:07:32VBA解决方案系列丛书中,我给大家以实际场景模拟的方式讲解如何利用代码提高自己的工作效率,在现实的工作中会面临很多的实际问题,各种问题如何快速准确的解决是VBA的课题,VBA作为一种寄生语言,在OFFICE应用中起着非常...VBA解决方案系列丛书中,我给大家以实际场景模拟的方式讲解如何利用代码提高自己的工作效率,在现实的工作中会面临很多的实际问题,各种问题如何快速准确的解决是VBA的课题,VBA作为一种寄生语言,在OFFICE应用中起着非常重要的作用.
我们每一次的数据处理都是数据的组织和重新结合的过程,我在《大数据时代的革命》中称之为”重组”,这个是非常重要的概念,数据重组后我们可以发现我们需要了解的信息,进而实现我们的优化管理。这种数据重组的过程就是实现数据自动化处理的过程.
我今日和大家要谈的是在实现数据自动化处理的过程一个常见的函数SUM的价值。这个函数在工作表中应用的非常广泛,可以说和EXCEL是共生的,VBA代码直接利用的或许少些,但在数据库中又体现了自己强大的生命力。下面我们看看实际的例子:本实例中讲利用VBA代码方案之十三:如何利用VBA在单元格中录入公式的内容及VBA数据库解决方案中聚合函数以及工作表连接的相关内容,就不再一一截图说明,今日只是就下面实例内容讲解:
实例,在工作表sheet1中有很多数据,杂乱无章,现在要求出每列数据的和,结果放在第二个工作表中,该如何解决?
今日我讲解两套方案,让大家看到SUM函数强大的生命力;
方案一:利用工作表函数解决
思路:我们在第二个工作中,录入一个工作表函数,这个工作表函数要等于对应的第一个工作表列的总和,问题是如何能自动的计算出第一个工作表中有多少列,以及工作表函数在VBA中如何表示。下面看我给出的代码:
Sub MYNZ()
Sheets("SHEET2").Select
i = 1
k = 1
Range("a2:aa2").ClearContents
Do While Sheets("SHEET1").Cells(1, i) <> ""
LL = Sheets("SHEET1").Cells(1, i).Address
TT = Mid(LL, 2, Application.WorksheetFunction.Find("$", LL, 2) - 2)
TT = TT & ":" & TT
Cells(2, k).Formula = "=SUM(Sheet1!" & TT & ")"
i = i + 1
k = k + 1
Loop
End Sub
代码解析:
1 上述代码实现了用VBA录入公式的方法,这个方法在《VBA代码解决方案》中有讲解了。
2 Do While Sheets("SHEET1").Cells(1, i) <> ""
LL = Sheets("SHEET1").Cells(1, i).Address
TT = Mid(LL, 2, Application.WorksheetFunction.Find("$", LL, 2) - 2)
TT = TT & ":" & TT
Cells(2, k).Formula = "=SUM(Sheet1!" & TT & ")"
i = i + 1
k = k + 1
Loop
上述的循环语句实现了在第二个工作表中录入工作表函数的方法。其中LL = Sheets("SHEET1").Cells(1, i).Address 将获取单元格的地址,此地址是$a$1的格式.我们要从中提取出列的符号
3 Cells(2, k).Formula = "=SUM(Sheet1!" & TT & ")"
上述代码实现了了公式的录入。此处的TT变量来自于上面的列的符号提取、
下面看代码的输出:
方案二:利用数据库的聚合函数来解决:
思路:利用数据聚合函数SUM来解决,这是数据库方案的内容,思路更加清晰。难点是对数据连接及SQL语句的写法,好在我希望大家能利用我提出的搭积木的方法,代码语句尽可能不要去写,而是去复制和修改。
下面看我给出的代码:
Sub MYNZS()
Sheets("SHEET1").Select
Dim cnADO, rsADO, Z As Object
Dim strPath, strTable, strSQL As String
Set cnADO = CreateObject("ADODB.Connection")
strPath = ThisWorkbook.FullName
strTable = "[Sheet1$]"
i = 1
Do While Sheets("SHEET1").Cells(1, i) <> ""
TT = TT & "sum(f" & i & "),"
i = i + 1
Loop
TT = Left(TT, Len(TT) - 1)
'建立连接,提取数据
cnADO.Open "provider=Microsoft.ACE.OLEDB.12.0;extended properties='excel 8.0;hdr=no;imex=1';data source=" & strPath
strSQL = "select " & TT & " from " & strTable
Set Z = cnADO.Execute(strSQL)
Sheets("SHEET2").Select
Range("a5:aa5").ClearContents
[a5].CopyFromRecordset Z
cnADO.Close
Set cnADO = Nothing
End Sub
代码解析:
1上述过程代码看似多些,但其实非常的清晰,利用一个循环完成列数的聚合函数的书写,然后利用SQL语句完成一个查询,直接的输出结果。
2 Do While Sheets("SHEET1").Cells(1, i) <> ""
TT = TT & "sum(f" & i & "),"
i = i + 1
Loop
TT = Left(TT, Len(TT) - 1)
上述代码是完成了聚合函数SUM的书写过程,不清楚的要查阅《VBA数据库解决方案》
3 cnADO.Open "provider=Microsoft.ACE.OLEDB.12.0;extended properties='excel 8.0;hdr=no;imex=1';data source=" & strPath
strSQL = "select " & TT & " from " & strTable
Set Z = cnADO.Execute(strSQL)
建立连接实现查询
4 [a5].CopyFromRecordset Z
提出数据。
下面看输出的结果:
两种方案非常借助于SUM函数得到了一样的结果,可见,SUM函数在数据的统计中,无论是EXCEL的工作表计算,还是VBA代码的利用还是数据库的利用,都有着非常方便的实用性,我们要发掘其中的实用方法,好好利用。
几点说明:
1 这套VBA代码解决方案丛书是我多年实际经验的成果。
2 经验是不能用价格来衡量的,大家要尊重成果。
3 今日方案会作为资料提供给有志于学习和提高的朋友。
-
利用MySQL自带的C API函数实现数据库功能调用
2007-11-02 16:53:00众所周知,所有的网上信息都是储存在网站数据库中的,这些信息的查询、更新等操作的功能则是由数据库服务器提供的,显然,数据库服务器的性能将直接关系到网站的生存。网站搭建中用的最多的数据库服务器是oracle和...随着现代计算机软硬件及网络技术的发展,在网上查找资料已成为现在获取信息的最重要手段之一。众所周知,所有的网上信息都是储存在网站数据库中的,这些信息的查询、更新等操作的功能则是由数据库服务器提供的,显然,数据库服务器的性能将直接关系到网站的生存。网站搭建中用的最多的数据库服务器是oracle和MySQL,前者功能强大,属于旗舰型数据库服务器,但前期投入太大;后者功能不断完善,简单易用而又不失性能,并且可以免费获得。因此,许多中小型网站的数据库服务器选用MySQL,而且,由于MySQL性能出色,一些大型网站也选用了MySQL。
由此可见,MySQL数据库服务器在网站建设中的表现是十分出色的。但是,正因为这样,几乎很少有人将MySQL用于应用软件的开发中。本文将详细介绍VC环境中MySQL数据库服务器不同接口的应用,并最终将产生一个CDatabase类封装MySQL数据库接口功能。
利用MySQL自带的C API函数实现数据库功能调用
本程序利用VC.NET的控制台项目来实现:
实现步骤:
1、打开VC.NET,选择新建-》项目,在出现的对话框的模板中选择WIN32控制台项目,在名称中填项目名称mysqltest,在位置中选择项目放置的路径,点击确认,出现下一个对话框,直接点击完成,项目就自动生成了。
2、展开mysqltest项目,在右击头文件,选择添加新项,在出现的对话框中从右边的模板中选择头文件(.h),在名字中输入头文件的名字:database,点击打开。在database.h输入代码如下:
// Database.h: interface for the CDatabase class.
//
//
#ifndef H_DATABASE_H
#define H_DATABASE_H
#include <stdio.h>
#include <string.h>
#include <winsock.h>
#include <mysql.h>
#include <windows.h>
struct Data_Param //数据库操作参数
{
char *db_name; //数据库名
char *tab_name; //表名
char *col_name; //列名
char *select_exp; //选择表达式
char *where_def; //选择限定条件
char *insert_val; //插入值
char *set_exp; //更新数据库内容的表达式
};
struct Database_Param //数据库参数
{
char *host; //主机名
char *user; //用户名
char *password; //密码
char *db; //数据库名
unsigned int port; //端口,一般为0
const char *unix_socket; //套接字,一般为NULL
unsigned int client_flag; //一般为0
};
class CDatabase
{
public:
char* GetState(); //服务器状态
char* GetServerInfo(); //服务器信息
int GetProtocolInfo(); //协议信息
char* GetHostInfo(); //主机信息
char * GetClientInfo(); //客户机信息
char* GetFieldName(int FieldNum); //字段名
BOOL IsEnd(); //是否最后
int DropDB(char *db); //删除数据库,返回错误信息
void SeekData(int offset); //查找指定数据
int CreateDB(char *db); //创建数据库,返回错误信息
void FreeRecord(); //释放结果集
unsigned int GetFieldNum(); //得到字段数
BOOL ConnectDB(Database_Param *p); //连接数据库
MYSQL_ROW GetRecord(); //得到结果(一个记录)
my_ulonglong GetRowNum(); //得到记录数
BOOL SelectDB(Data_Param *para); //选择数据库
BOOL UpdateRecord(Data_Param *para); //更新记录
BOOL SelectRecord(Data_Param *para); //选择记录
BOOL InsertRecord(Data_Param *para); //插入记录
BOOL DelRecord(Data_Param *para); //删除记录
BOOL SelectAll(Data_Param *para); //选择所有记录
char * OutErrors(); //输出错误信息
CDatabase();
virtual ~CDatabase();
private:
MYSQL mysql; //数据库连接句柄
MYSQL_RES *query; //结果集
MYSQL_ROW row; //记录集
MYSQL_FIELD *field; //字段信息(结构体)
BOOL FindSave(char *str); //查找并保存结果集
};
#endif
#include <stdio.h>
#include <string.h>
#include <winsock.h>
#include <mysql.h>
#include <windows.h>
struct Data_Param //数据库操作参数
{
char *db_name; //数据库名
char *tab_name; //表名
char *col_name; //列名
char *select_exp; //选择表达式
char *where_def; //选择限定条件
char *insert_val; //插入值
char *set_exp; //更新数据库内容的表达式
};
struct Database_Param //数据库参数
{
char *host; //主机名
char *user; //用户名
char *password; //密码
char *db; //数据库名
unsigned int port; //端口,一般为0
const char *unix_socket; //套接字,一般为NULL
unsigned int client_flag; //一般为0
};
class CDatabase
{
public:
char* GetState(); //服务器状态
char* GetServerInfo(); //服务器信息
int GetProtocolInfo(); //协议信息
char* GetHostInfo(); //主机信息
char * GetClientInfo(); //客户机信息
char* GetFieldName(int FieldNum); //字段名
BOOL IsEnd(); //是否最后
int DropDB(char *db); //删除数据库,返回错误信息
void SeekData(int offset); //查找指定数据
int CreateDB(char *db); //创建数据库,返回错误信息
void FreeRecord(); //释放结果集
unsigned int GetFieldNum(); //得到字段数
BOOL ConnectDB(Database_Param *p); //连接数据库
MYSQL_ROW GetRecord(); //得到结果(一个记录)
my_ulonglong GetRowNum(); //得到记录数
BOOL SelectDB(Data_Param *para); //选择数据库
BOOL UpdateRecord(Data_Param *para); //更新记录
BOOL SelectRecord(Data_Param *para); //选择记录
BOOL InsertRecord(Data_Param *para); //插入记录
BOOL DelRecord(Data_Param *para); //删除记录
BOOL SelectAll(Data_Param *para); //选择所有记录
char * OutErrors(); //输出错误信息
CDatabase();
virtual ~CDatabase();
private:
MYSQL mysql; //数据库连接句柄
MYSQL_RES *query; //结果集
MYSQL_ROW row; //记录集
MYSQL_FIELD *field; //字段信息(结构体)
BOOL FindSave(char *str); //查找并保存结果集
};
#endif
3、展开mysqltest项目,在右击源文件,选择添加新项,在出现的对话框中从右边的模板中选择C++文件(.CPP),在名字中输入源文件的名字:database,点击打开。在database.cpp输入代码如下:
// Database.cpp: implementation of the CDatabase class.
//
//
#include "stdafx.h"
#include "Database.h"
//
// Construction/Destruction
//
CDatabase::CDatabase()
{
mysql_init(&mysql);
}
CDatabase::~CDatabase()
{
mysql_free_result(query);
mysql_close(&mysql);
}
BOOL CDatabase::SelectAll(Data_Param *para)
{
//mysql_free_result(query);
unsigned int i=0;
char str[50];
sprintf(str,"select * from %s",para->tab_name);
if(!FindSave(str))
{
return false;
}
return true;
}
BOOL CDatabase::DelRecord(Data_Param *para)
{
char str[80];
sprintf(str,"delete from %s where %s",para->tab_name,para->where_def);
if(mysql_query(&mysql,str))
{
return false;
}
return true;
}
BOOL CDatabase::InsertRecord(Data_Param *para)
{
char str[80];
sprintf(str,"insert into %s values(%s)",para->tab_name,para->insert_val);
if(mysql_query(&mysql,str))
{
return false;
}
return true;
}
BOOL CDatabase::SelectRecord(Data_Param *para)
{
// mysql_free_result(query);
unsigned int i=0;
char str[80];
sprintf(str,"select %s from %s where %s",para->select_exp,para->tab_name,para->where_def);
if(!FindSave(str))
{
return false;
}
return true;
}
BOOL CDatabase::SelectDB(Data_Param *para)
{
if (mysql_select_db(&mysql,para->db_name))
return false;
else
return true;
}
char * CDatabase::OutErrors()
{
return(mysql_error(&mysql));
}
BOOL CDatabase::FindSave(char *str)
{
if(mysql_query(&mysql,str))
return false;
query=mysql_store_result(&mysql);
return true;
}
BOOL CDatabase::UpdateRecord(Data_Param *para)
{
char str[150];
sprintf(str,"update %s set %s where %s",para->tab_name,para->set_exp,para->where_def);
if(mysql_query(&mysql,str))
{
return false;
}
return true;
}
my_ulonglong CDatabase::GetRowNum()
{
return (mysql_num_rows(query));
}
MYSQL_ROW CDatabase::GetRecord()
{
return (row = mysql_fetch_row(query));
}
BOOL CDatabase::ConnectDB(Database_Param *p)
{
if (!mysql_real_connect(&mysql,p->host,p->user,p->password,p->db,p->port,p->unix_socket,p->client_flag))
{
OutErrors();
return false;
}
return true;
}
unsigned int CDatabase::GetFieldNum()
{
return (mysql_num_fields(query));
}
void CDatabase::FreeRecord()
{
mysql_free_result(query);
}
int CDatabase::CreateDB(char *db)
{
return (mysql_create_db(&mysql,db));
}
void CDatabase::SeekData(int offset)
{
mysql_data_seek(query,offset);
}
int CDatabase::DropDB(char *db)
{
return (mysql_drop_db(&mysql,db));
}
BOOL CDatabase::IsEnd()
{
return mysql_eof(query);
}
char* CDatabase::GetFieldName(int FieldNum)
{
field=mysql_fetch_field_direct(query,FieldNum);
return field->name;
}
char * CDatabase::GetClientInfo()
{
return mysql_get_client_info();
}
char* CDatabase::GetHostInfo()
{
return mysql_get_host_info(&mysql);
}
int CDatabase::GetProtocolInfo()
{
return mysql_get_proto_info(&mysql);
}
char* CDatabase::GetServerInfo()
{
return mysql_get_server_info(&mysql);
}
char* CDatabase::GetState()
{
char* state=mysql_stat(&mysql);
if(!state)
return OutErrors();
return state;
}
4、展开mysqltest项目,在mysqltest.cpp输入代码如下:
// mysqltest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "Database.h"
int _tmain(int argc, _TCHAR* argv[])
{
struct Data_Param *dp = new Data_Param();
struct Database_Param *dbp= new Database_Param();
MYSQL_ROW row;
//Database_Param 初始化参数
dbp->host = "localhost";
dbp->user = "root";
dbp->password = "";
dbp->db = "testdb";
dbp->port = 3306;
dbp->unix_socket = NULL;
dbp->client_flag = 0;
//Data_Param 初始化参数
dp->db_name = "testdb";
dp->tab_name = "user";
CDatabase cdb;
try
{
//连接mysql数据库
if(cdb.ConnectDB(dbp) == false)
{
printf("connect failed!/n");
delete dp;
delete dbp;
return -1;
}
else
printf("connect success!/n");
//获得mysql版本信息
printf("mysql version is [%s]/n",cdb.GetServerInfo());
//查询user表
if( !cdb.SelectAll(dp) )
printf("select failed/n");
else
printf("select success/n");
//打印user表中的数据
printf("%s/t/t%s/t%s/t%s/n",cdb.GetFieldName(0),cdb.GetFieldName(1),cdb.GetFieldName(2),cdb.GetFieldName(3));
while(row = cdb.GetRecord())
{
for (int i=0 ; i < cdb.GetFieldNum(); i++)
{
printf("%s/t/t",row[i]);
}
printf("/n");
}
delete dp;
delete dbp;
}
catch(...)
{}
return 0;
}
其中连接的数据库名是testdb,用户名是root,密码为空,表名是user。
5、右击mysqltest项目,选择属性,在编译器-》命令行中加入:libmysql.lib wsock32.lib
6、下载mysql++-1.7.1-win32-vc++.zip开发包,把其中的mysql中的include和lib文件夹拷入项目的目录中,然后在VC.net的工具-》选项中的库文件和引用文件中加入上面的include和lib的绝对路径,最后把lib中的libmySQL.dll拷到项目的debug中,一切都OK了
调试-》开始执行,结果如下:
connect success!
mysql version is [5.0.7-beta-nt]
select success
userid username password email
1 aaa aaa aaaa
2 bbb bbbb bbbb@sina.com
Press any key to continue
MySQL作为一个免费的SQL数据库,虽然功能不够十分强大,且灵活性较差,但是,已经能够满足一般应用软件的要求,而且MySQL数据库的开发者也在力求使之更加完善。并且,由MySQL性能测试可以看出,它对数据的处理速度明显快于其它数据库服务器。因此,如果应用软件对数据库的性能要求较高,而同时对数据库操作的功能及灵活性的要求不是很高的话,并且前期投入资金较少时,MySQL数据库服务器不失为一个最佳的选择。
希望各位成功!!!!! -
使用函数计算搭建小程序Web应用后端服务
2020-08-21 17:58:45使用Severless无服务器架构搭建移动App、小程序和Web应用的后端服务,静态资源(如图片)存在OSS上通过CDN加速访问,动态数据通过API网关+函数计算访问RDS数据库,无需管理服务器和运行环境,弹性伸缩使用云资源。... -
基于HITRAN数据库的水汽折射率计算
2021-02-05 23:55:28利用HITRAN数据库提供的线谱信息计算了波长在0.3~20 μm范围内标准条件下的水汽折射率,针对该数据库缺乏高能谱线的缺点,利用非线性拟合的方法创建了一条新的紫外伪谱,以表征水汽的紫外能谱及光致电离能谱,提高了... -
SQL 关于如何利用聚合函数把nvarchar型转成int型进行统计计算的方法
2017-11-14 19:21:00如果我们数据库的ID设置为varchar型的 在查询的时候order by id的话 我们是不希望看到如下情况的 我们可以把varchar转换为int 然后进行排序 一、 [sql] select * from yourtable order by cast(yourcol as in... -
使用MySQL函数查询数据(聚合函数查询语句)——MySQL 5.7数据库
2020-03-28 00:23:49利用`group by`子句与`with rollup`一起进行统计 何云辉 CSDN MySQL的常用聚合函数包括count()、sum()、avg()、max()和min()等。 其中, count()用来统计记录的条数; sum()用来计算字段的值的总和; avg()用来计算... -
sql 聚合函数_利用聚合函数和SQL语句完成多工作表的汇总查询
2020-12-09 10:30:19大家好,我们继续VBA数据库解决方案的学习,今天讲解第51讲:利用聚合函数和SQL语句完成多工作表的汇总查询计算。今日的内容看似简单,其实有些难度,希望大家不要放弃,在自己测试的时候要多测试几次。虽然本讲的... -
利用空间数据库求两点距离
2009-02-14 23:06:32前两天在实现一个SQL的时候,需要计算平面上2点间的距离,如果使用SQL函数实现,代码比较长,于是想到能否利用空间数据库的结构来实现这个功能。 测试环境为11.1.0.6,如果是9i,由于没有创建同义词,还需要在S... -
小程序云开发服务端(云函数-函数式编程)数据库取出数据突破限制
2019-11-13 11:40:26获取集合中的所有待办事项清单:因为有默认 limit 100 条的限制,因此很可能一个请求无法取出所有数据,需要分批次取: 步骤 定义最大条数也就是 下面?...遍历batchTimes 利用skip() 向数据库取对应次... -
论文研究-粒计算支持的粗糙函数依赖的研究.pdf
2019-09-12 09:21:38利用粒计算方法对粗糙关系数据库(Rough Relational Database,RRDB)的粗糙函数依赖进行研究。首先提出了两种类型的粗糙函数依赖及粗糙相似关系的概念,分析了如何利用位模式表示粗糙关系的属性值,在此基础上给出... -
数据库SQL语句中根据当前日期计算其他日期小结
2016-04-26 14:10:00问题描述:我们在写存储过程和函数的时候经常会碰到利用当前日期计算出上周开始日期、结束日期,或者计算上个月的开始日期结束日期等问题。最近写了几个存储过程和函数,其中都涉及到了日期计算问题,在这里简单做一... -
Oracle数据库优化策略总结_数据库语法树及优化
2020-02-26 09:42:36Oracle数据库优化策略总结 SELECT时不利用函数 在做频繁的查询垄断时尽量直接select字段名然后利用C语言代码对查询收获做二次加工避免让Oracle来做混杂的函数可能数学计算因为Oracle出于通用性的琢磨其函数及数学... -
数据库笔记8--利用SQL语言结果聚集运算与分组查询过滤(哈工大)
2020-10-16 10:24:19利用SQL语言进行结果运算与聚集运算 (1)结果计算 (2)聚集计算 聚集函数 -
VBA与数据库
2015-11-19 18:07:381-1 利用DAO创建数据库和数据表 7 1-2 利用ADOX创建数据库和数据表: 8 1-3 利用SQL语句创建数据库和数据表 9 1-4 在已有的数据库中创建数据表(DAO) 10 1-5 在已有的数据库中创建数据表(ADOX) 12 1-6 在已有的... -
第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-在SQL中使用Python函数
2019-03-31 15:17:29利用这个特性,在从查询返回数据之前可以先处理数据。这个特性可以用于在不同格式之间转换,完成一些计算(否则使用纯SQL会很麻烦),以及重用应用代码。 import codecs import sqlite3 db_filename = 'todo.d... -
数据库某列数据相乘
2019-11-18 09:32:371.基本思路 Oracle、MySQL等数据库中只有sum、max、min等函数用于做某...该做法最大的好处是利用数据库预置函数,效率相对较高 该思路亦可应用到其他语言 2.对数加法原理 以下实验基于MySQL 3.查询结果代码 SELEC... -
Oracle数据库优化策略总结.docx
2020-07-24 23:22:32Oracle数据库优化策略总结 SELECTS不利用函数 在做频繁的查询垄断时尽H直接 select字段名然 后利用C语言代码对查询收获做二次加工避免让 Oracle 来做混杂的函数可能数学计算因为 Oracle出于通用性的 琢磨其函数及... -
数据库实验报告
2017-12-14 23:37:15(2)数据库的设计过程并利用SQL SERVER2005建立数据库。 实验二 实验题目: 数据库的定义 实验目的:掌握数据表建立、修改、删除、索引的SQL语句。 实验内容: (1)数据表的建立 (2)数据表的修改 (3)... -
Oracle数据库优化策略总结篇
2020-12-16 13:45:03在做频繁的查询垄断时,尽量直接select字段名,然后利用C语言代码对查询收获做二次加工,避免让Oracle来做混杂的函数可能数学计算。因为Oracle出于通用性的琢磨,其函数及数学计算的速度远不及用C语言直接编译成机器... -
evaluate函数使用无效_excel函数公式大全
2020-11-22 00:42:30课件素材】认识函数-Excel入门之函数篇huke88.com01、数据库函数打开案例文件,在文件中,我们来对函数算式来进行一个讲解,具体如图示。选择表格,这里我们可以理解Dcount和Dsum函数算式来进行一个计算统计,具体... -
Oracle数据库综合应用
2020-09-28 17:01:06Oracle数据库综合应用 查询员工的编号,姓名,雇佣日期,以及计算出每一位员工到今天为止被雇佣的年数,月数,天数。...利用MOD()函数可以求出余数。 select empno,ename,hiredate, TRUNC(MONTHS_BETWEEN -
ClickHouse开源数据库
2017-12-10 21:44:00ClickHouse是一个开源的面向列式数据的数据库管理系统,能够使用SQL查询并且生成实时数据报告。 优点: 1.并行处理单个查询(利用多核) ...7.一系列函数的支持,包括对近似计算的支持 8.不同的存储引擎的... -
利用 AWK 的数值计算功能提升工作效率
2012-02-04 22:37:14Awk 是一种优秀的文本... 借助于这些功能, 我们可以很方便地利用 awk 对各种文件 (如试验产生的数据文件,数据库文件等) 进行处理。 本文介绍了 awk 在数值计算方面的运用, 并通过几个实际的例子, 阐述了如何利用 -
详解基于Labwindows/CVI的测试系统数据库设计
2021-01-19 17:48:05数据的管理和利用通常是通过计算机的数据管理软件——数据库管理系统来完成的。因此,数据库不单是指存有数据的计算机外存,而是指存放在外存上的数据集合及其管理软件的总和,通常称为数据库系统。 LabWindows/... -
数据库系统基础:初级篇(第5版)(讲述数据库系统原理的经典教材)--详细书签版
2013-04-05 13:45:329.3 使用函数调用的数据库程序设计:SQL/CLI和JDBC 207 9.3.1 以C语言为宿主语言,使用SQL/CLI进行数据库程序设计 208 9.3.2 JDBC:面向Java程序设计的SQL函数调用 211 9.4 数据库存储过程与SQL/PSM ...
-
小秘密(学习)
-
响应式编程入门与实战(Reactor、WebFlux、R2DBC)
-
ReadKeeper-android:适用于ReadKeeper的Android应用-源码
-
朱老师C++课程第3部分-3.6智能指针与STL查漏补缺
-
Galera 高可用 MySQL 集群(PXC v5.7+Hapro)
-
echarts 柱状图 鼠标滑过显示 图标+数字每三位打千分号+单位
-
Head first Java多态显示找不到符号解决方法
-
基于模糊卡尔曼滤波的城市车辆选址方案的新模糊方法
-
Mysql数据库面试直通车
-
io-11.github.io-源码
-
朱老师c++课程第3部分-3.5STL的其他容器讲解
-
龙芯生态应用开发基础:C语言精要
-
Cakebrew:使用Cakebrew通过样式管理您的Homebrew公式-源码
-
基于Flink+Hudi构建企业亿级云上实时数据湖教程(PC、移动、小
-
智能停车场云平台(附vue+SpringBoot前后端项目源码)
-
SpringMVC的执行流程
-
ReactJS-TODO-源码
-
协同协同进化差分进化算法改进基于采样的图像消光
-
ACFD作业3_2018311045.pdf
-
基于计算机视觉的无人驾驶感知系统