精华内容
下载资源
问答
  • 掌握常见的 SQL 函数将会方便我们进行数据的处理和分析,避免重复实现已有的功能。本篇主要介绍了常见的数值函数,大多数函数都可以在不同的数据库之间通用,但是也存在一些数据库专有的函数实现。

    《SQL 从入门到精通》专栏目录


    上一篇我们讨论了如何利用 FETCH(或者 LIMIT)和 OFFSET 实现数据的 Top-N 排行榜和分页查询。

    SQL 语句主要的功能就是对数据进行处理和分析。为了避免重复造轮子,提高数据处理的效率,SQL 为我们提供了许多标准的功能模块:函数(Function)。实际上我们已经使用过 SQL 函数,例如将字符转换为大写形式的 UPPER 函数。

    函数概述

    SQL 函数是一种具有某种功能的模块,可以接收零个或多个输入值,并且返回一个输出值。函数处理数据的过程如下图所示:

    avatar

    在 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数据库 函数 ​ 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值。

    展开全文
  • VBA解决方案系列丛书中,我给大家以实际场景模拟的方式讲解如何利用代码提高自己的工作效率,在现实的工作中会面临很多的实际问题,各种问题如何快速准确的解决是VBA的课题,VBA作为一种寄生语言,在OFFICE应用中起着非常...

    6724b9907a0b3cca33570d0deaa36b2f.png

    VBA解决方案系列丛书中,我给大家以实际场景模拟的方式讲解如何利用代码提高自己的工作效率,在现实的工作中会面临很多的实际问题,各种问题如何快速准确的解决是VBA的课题,VBA作为一种寄生语言,在OFFICE应用中起着非常重要的作用.

    70d2cdf1230df1d37b5cbd3186f59bad.png

    我们每一次的数据处理都是数据的组织和重新结合的过程,我在《大数据时代的革命》中称之为”重组”,这个是非常重要的概念,数据重组后我们可以发现我们需要了解的信息,进而实现我们的优化管理。这种数据重组的过程就是实现数据自动化处理的过程.

    我今日和大家要谈的是在实现数据自动化处理的过程一个常见的函数SUM的价值。这个函数在工作表中应用的非常广泛,可以说和EXCEL是共生的,VBA代码直接利用的或许少些,但在数据库中又体现了自己强大的生命力。下面我们看看实际的例子:本实例中讲利用VBA代码方案之十三:如何利用VBA在单元格中录入公式的内容及VBA数据库解决方案中聚合函数以及工作表连接的相关内容,就不再一一截图说明,今日只是就下面实例内容讲解:

    实例,在工作表sheet1中有很多数据,杂乱无章,现在要求出每列数据的和,结果放在第二个工作表中,该如何解决?

    9ee775c359b5aef371a8ac2ecf26931a.png

    今日我讲解两套方案,让大家看到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变量来自于上面的列的符号提取、

    下面看代码的输出:

    dc92be7c33283bf701927a53e96fea94.png

    方案二:利用数据库的聚合函数来解决:

    思路:利用数据聚合函数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

    提出数据。

    下面看输出的结果:

    7f0a86b5d9899680e2a9cd271fae4058.png

    两种方案非常借助于SUM函数得到了一样的结果,可见,SUM函数在数据的统计中,无论是EXCEL的工作表计算,还是VBA代码的利用还是数据库的利用,都有着非常方便的实用性,我们要发掘其中的实用方法,好好利用。

    几点说明:

    1 这套VBA代码解决方案丛书是我多年实际经验的成果。

    2 经验是不能用价格来衡量的,大家要尊重成果。

    3 今日方案会作为资料提供给有志于学习和提高的朋友。

    展开全文
  • 众所周知,所有的网上信息都是储存在网站数据库中的,这些信息的查询、更新等操作的功能则是由数据库服务器提供的,显然,数据库服务器的性能将直接关系到网站的生存。网站搭建中用的最多的数据库服务器是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数据库服务器不失为一个最佳的选择。


    希望各位成功!!!!! 
    展开全文
  • 使用Severless无服务器架构搭建移动App、小程序和Web应用的后端服务,静态资源(如图片)存在OSS上通过CDN加速访问,动态数据通过API网关+函数计算访问RDS数据库,无需管理服务器和运行环境,弹性伸缩使用云资源。...
  • 利用HITRAN数据库提供的线谱信息计算了波长在0.3~20 μm范围内标准条件下的水汽折射率,针对该数据库缺乏高能谱线的缺点,利用非线性拟合的方法创建了一条新的紫外伪谱,以表征水汽的紫外能谱及光致电离能谱,提高了...
  • 如果我们数据库的ID设置为varchar型的 在查询的时候order by id的话 我们是不希望看到如下情况的 我们可以把varchar转换为int 然后进行排序 一、 [sql] select * from yourtable order by cast(yourcol as in...
  • 利用`group by`子句与`with rollup`一起进行统计 何云辉 CSDN MySQL的常用聚合函数包括count()、sum()、avg()、max()和min()等。 其中, count()用来统计记录的条数; sum()用来计算字段的值的总和; avg()用来计算...
  • 大家好,我们继续VBA数据库解决方案的学习,今天讲解第51讲:利用聚合函数和SQL语句完成多工作表的汇总查询计算。今日的内容看似简单,其实有些难度,希望大家不要放弃,在自己测试的时候要多测试几次。虽然本讲的...
  • 前两天在实现一个SQL的时候,需要计算平面上2点间的距离,如果使用SQL函数实现,代码比较长,于是想到能否利用空间数据库的结构来实现这个功能。 测试环境为11.1.0.6,如果是9i,由于没有创建同义词,还需要在S...
  • 获取集合中的所有待办事项清单:因为有默认 limit 100 条的限制,因此很可能一个请求无法取出所有数据,需要分批次取: 步骤 定义最大条数也就是 下面?...遍历batchTimes 利用skip() 向数据库取对应次...
  • 利用计算方法对粗糙关系数据库(Rough Relational Database,RRDB)的粗糙函数依赖进行研究。首先提出了两种类型的粗糙函数依赖及粗糙相似关系的概念,分析了如何利用位模式表示粗糙关系的属性值,在此基础上给出...
  • 问题描述:我们在写存储过程和函数的时候经常会碰到利用当前日期计算出上周开始日期、结束日期,或者计算上个月的开始日期结束日期等问题。最近写了几个存储过程和函数,其中都涉及到了日期计算问题,在这里简单做一...
  • Oracle数据库优化策略总结 SELECT时不利用函数 在做频繁的查询垄断时尽量直接select字段名然后利用C语言代码对查询收获做二次加工避免让Oracle来做混杂的函数可能数学计算因为Oracle出于通用性的琢磨其函数及数学...
  • 利用SQL语言进行结果运算与聚集运算 (1)结果计算 (2)聚集计算 聚集函数
  • VBA与数据库

    2015-11-19 18:07:38
    1-1 利用DAO创建数据库和数据表 7 1-2 利用ADOX创建数据库和数据表: 8 1-3 利用SQL语句创建数据库和数据表 9 1-4 在已有的数据库中创建数据表(DAO) 10 1-5 在已有的数据库中创建数据表(ADOX) 12 1-6 在已有的...
  • 利用这个特性,在从查询返回数据之前可以先处理数据。这个特性可以用于在不同格式之间转换,完成一些计算(否则使用纯SQL会很麻烦),以及重用应用代码。 import codecs import sqlite3 db_filename = 'todo.d...
  • 数据库某列数据相乘

    千次阅读 2019-11-18 09:32:37
    1.基本思路 Oracle、MySQL等数据库中只有sum、max、min等函数用于做某...该做法最大的好处是利用数据库预置函数,效率相对较高 该思路亦可应用到其他语言 2.对数加法原理 以下实验基于MySQL 3.查询结果代码 SELEC...
  • Oracle数据库优化策略总结 SELECTS不利用函数 在做频繁的查询垄断时尽H直接 select字段名然 后利用C语言代码对查询收获做二次加工避免让 Oracle 来做混杂的函数可能数学计算因为 Oracle出于通用性的 琢磨其函数及...
  • 数据库实验报告

    2017-12-14 23:37:15
    (2)数据库的设计过程并利用SQL SERVER2005建立数据库。 实验二 实验题目: 数据库的定义 实验目的:掌握数据表建立、修改、删除、索引的SQL语句。 实验内容: (1)数据表的建立 (2)数据表的修改 (3)...
  • 在做频繁的查询垄断时,尽量直接select字段名,然后利用C语言代码对查询收获做二次加工,避免让Oracle来做混杂的函数可能数学计算。因为Oracle出于通用性的琢磨,其函数及数学计算的速度远不及用C语言直接编译成机器...
  • 课件素材】认识函数-Excel入门之函数篇​huke88.com01、数据库函数打开案例文件,在文件中,我们来对函数算式来进行一个讲解,具体如图示。选择表格,这里我们可以理解Dcount和Dsum函数算式来进行一个计算统计,具体...
  • Oracle数据库综合应用

    2020-09-28 17:01:06
    Oracle数据库综合应用 查询员工的编号,姓名,雇佣日期,以及计算出每一位员工到今天为止被雇佣的年数,月数,天数。...利用MOD()函数可以求出余数。 select empno,ename,hiredate, TRUNC(MONTHS_BETWEEN
  • ClickHouse开源数据库

    2017-12-10 21:44:00
    ClickHouse是一个开源的面向列式数据的数据库管理系统,能够使用SQL查询并且生成实时数据报告。 优点: 1.并行处理单个查询(利用多核) ...7.一系列函数的支持,包括对近似计算的支持 8.不同的存储引擎的...
  • Awk 是一种优秀的文本... 借助于这些功能, 我们可以很方便地利用 awk 对各种文件 (如试验产生的数据文件,数据库文件等) 进行处理。 本文介绍了 awk 在数值计算方面的运用, 并通过几个实际的例子, 阐述了如何利用
  • 数据的管理和利用通常是通过计算机的数据管理软件——数据库管理系统来完成的。因此,数据库不单是指存有数据的计算机外存,而是指存放在外存上的数据集合及其管理软件的总和,通常称为数据库系统。  LabWindows/...
  • 9.3 使用函数调用的数据库程序设计:SQL/CLI和JDBC 207 9.3.1 以C语言为宿主语言,使用SQL/CLI进行数据库程序设计 208 9.3.2 JDBC:面向Java程序设计的SQL函数调用 211 9.4 数据库存储过程与SQL/PSM ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 483
精华内容 193
关键字:

利用数据库函数计算