Linux应用开发 08 数据库编程

一.MYSQL 数据库编程
  1. 什么是数据库?
     数据库是数据管理的一个软件。作用就是存储和管理数据的。
  2. 常见的数据库软件:
     Oracle
     MYSQL
     SQL Srever
     DB2
  3.数据库的核心是什么?
     DBMS  数据库管理系统,数据库管理系统给用户提供了非常多的功能,、
     用户主要是通过 SQL 与数据库管理系统交互,从而达到访问数据库的目的;

   4. SQL 语句的功能
      4.1  DDL  (数据定义语言)
      4.2  DML  (数据操作语言)
      4.3  DQL  (数据查询语言)
      4.4  DCL  (数据控制语言)

    5. 数据库中数据的管理方式:       
       库  ---> 表 ----> 数据

    6. MYSQL 数据库环境搭建
        sudo apt-get install mysql-server mysql-client 
        sudo apt-get install libmysqlclient-dev

    7. MYSQL 数据库操作:
        7.1  启动mysql:
         terry@ubuntu16: mysql [-h 主机地址] -u 用户名  -p
                       省略-h  表明访问的本地的数据库
    7.2  退出mysql:
           mysql> quit   或者   mysql> exit

    7.3  库的操作:
         1). 查看库
              mysql> show databases;
         2).  创建库
              mysql> create database [if not exists] 库名;
         3).  删除库
              mysql> drop database [if exists] 库名;
         4).  选择库
              mysql> use 库名;
       7.4  表的操作:
            预备知识:
          1.  MYSQL支持的数据类型
              1.1  数值类型         tinyint  int  float ...
          1.2  字符串类型       char    varchar  Blob text ...
          1.3  时间日期型       date  time  datatime ...
          1.4  空值类型         null
          2.  MYSQL支持的六大关键约束
               2.1  主键约束 (primary key)     用于区分一条记录
           2.2  非空约束 (not null)        要求被约束的字段值不能为NULL
           2.3  唯一约束 (unique key)      要求被约束的字段值不能重复
           2.4  自增约束 (auto_increment)  要求被约束的字段值自动增加
           2.5  默认约束 (default)         被约束的字段值如果不填充数据则以默认值填充
           2.6  外键约束 (foreign key)     应用于主表与子表之间的操作
         1) 表的创建
              mysql>  create table [if no exists] 表名 (字段名1 字段类型 [约束],字段名2 字段类型 [约束]...);
         2) 在库中查看表
              mysql>  show tables;
         3) 删除表
              mysql>  drop table 表名;
         4) 查看表结构
              mysql>  describe 表名;  / desc 表名;
          mysql>  show create table 表名;
         5) 修改表结构
             5.1   修改表名称
               mysql> alter table 表名  rename  to  新名称;
         5.2   修改表中字段名称
               mysql> alter table 表名  change  旧字段名称  新字段名称  字段类型;
         5.3   增加新字段
               mysql> alter table 表名  add  字段名 字段类型 [first / after 已有字段];
                 5.4   删除字段
               mysql> alter table 表名  drop  字段名 ; 
         5.5   调整字段顺序
               mysql> alter table 表名  modify  字段名 字段类型  first / after 已有字段;
         5.6   修改字段类型
               mysql> alter table 表名  modify  字段名 字段新类型;

         5.7   修改字段约束
               1) 设置
                   1.1   设置主键/唯一 约束
                      mysql> alter table 表名  add  primary key / unique key (字段名);
                   1.2   设置自增/非空 约束
                      mysql> alter table 表名  modify  字段名 字段类型 auto_increment / not null;
               1.3   设置默认 约束
                      mysql> alter table 表名  alter  字段名 set default '默认值';
               1.4   设置外键约束
                      mysql> ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(字段) REFERENCES 主表名(主键列) [ON DELETE 参数]

               2) 取消
                   1.1   取消主键/外键 约束
                      mysql> alter table 表名  drop  primary key / foreign key 外键名;
                   1.2   取消自增/非空 约束
                      mysql> alter table 表名  modify  字段名 字段类型;
               1.3   取消默认 约束
                      mysql> alter table 表名  alter  字段名 drop default;
               1.4   取消唯一约束
                      mysql> alter table 表名  drop  index 字段名;
                   5.8   修改表的字符集(charset)
                    mysql> alter table 表名 convert to character set utf8;
         7.5  数据的操作:
          1. 数据的增加
              mysql>   insert into 表  [(字段1,字段2...)] values (值1,值2...);
          mysql>   insert into 表  [(字段1,字段2...)] values (值11,值12...),(值21,值22...)...;

          insert into stu (name,sex,age,birth,addr) values('杨玉环','female',28,'19030809','唐长安城'),('王昭君','female',22,'18800509','汉长安城');

          2. 数据的删除
               mysql> delete from 表;
           mysql> delete from 表 where 条件;

           条件的构建: 
              mysql 支持如下的运算符,我们可以借助于这些运算符,来构建一个条件:

              关系运算符:  >  <  >=  <=  =  !=
              逻辑运算符:   &&(and)  ||(or)  !(not)   XOR
          
              3. 数据的更新
                 mysql> update 表 set 字段名1=值1,字段名2=值2,...  ;
             mysql> update 表 set 字段名1=值1,字段名2=值2,... where 条件;

          4. 数据的查询
               4.1   查找所有数据
                  mysql>  select * from  表;
               4.2   查找指定字段的数据:
                  mysql>  select 字段1,字段2,... from  表;
           4.3   带条件的数据查询
                  mysql>  select 字段1,字段2,... from  表 where 条件;
           4.4   避免重复的数据查询
                   mysql>  select distinct 字段1,字段2,... from  表;
           4.5   四则运算数据查询
                   mysql>  select 字段1 运算符 操作数,.... from  表;
           4.6   多条件的数据查询
                  mysql>  select 字段1,字段2,... from  表 where 条件1  and / &&  条件2 ;
           4.7   数据范围查询
                   mysql>  select 字段1,字段2,... from 表 where  字段  between  值1 and  值2 ;
               mysql>  select 字段1,字段2,... from 表 where  字段 not  between  值1 and  值2 ;
           4.8   空值查询
                               mysql>  select 字段1,字段2,... from 表 where  字段 is null ;
                        mysql>  select 字段1,字段2,... from 表 where  字段 is not  NULL; 
           4.9   集合查询
                           mysql>  select 字段 …... from 表名 where 字段名 in (值1,值2, …...);
               mysql>  select 字段 …... from 表名 where 字段名 not in (值1,值2, …...);

                  例子: select name from tb where salary in (3000,5000,8000);
                  select name from tb where salary =值1 ||  salary =值2 || salary =值3;
          4.10   模糊查询
                           mysql>  select 字段 …... from 表名 where 字段名 like '值1'

               LIKE 关键字支持的通配符 
                
               _ : 通配单个字符;
               % :   通配任意字符,可以是0个字符,1个字符,或多个字符

               注意: like 关键字后的 值 需要以字符串类型出现;

          4.11   排序查询
                         mysql>  select 字段 …... from 表名 order by 字段  asc / desc [where 条件 ];
              
          4.12   分组查询
                 mysql>  select 字段 …... from 表名 group by 字段  [having 条件 ];
           
                  4.13   分页查询
                   mysql>  select 字段 …... from 表名   limit  [start,] num;
      5. 多表联查
          思路:  将多张表利用相关字段连接起来,形成一张 "大表",然后针对"大表"进行基础数据查询。

              1. 内连接
                又称为简单连接,或者自然连接,是一种常见的连接查询.内连接使
            用比较运算符,对两个表中的数据,进行比较,并列出与连接条件匹
            配的数据行,组合成新的记录;
            简单理解:返回表1和表2同时满足条件的记录。

             mysql> select 字段... from 表1 [inner] join 表2 on 连接条件
                                            [inner] join 表3 on 连接条件;

          缺点:无法保证表1或者表2 全部数据都出现在连接后的临时 "大表" 中。
          2. 外连接:
                内连接查询,返回的结果,只包含符合查询条件和连接条件的数据
             有时需要返回的查询结果,不仅包含符合条件的数据,而且,包括左
             表和右表中的所有数据,此时,需要使用外连接.

                  2.1  左外连接
                  以左边的表为主,在右边的表中找到所有满足条件的元素,并把他们连接起来,如果没有对应的元素,则在相应位置上的值为null

                          mysql> select 字段... from 表1 left join 表2 on 连接条件
                                             left join 表3 on 连接条件;

          2.2  右外连接
                     与左外连接相反,以右边的表为主,在左边的表中找到所有满足条件的元素,并把他们连接起来,如果没有对应的元素,则在相应位置上的值为null。
               mysql> select 字段... from 表1 right join 表2 on 连接条件
                                              right join 表3 on 连接条件;
    6. 子查询

       子查询: 将一个查询语句嵌套到另一个查询语句之内的查询,
                嵌套的查询(子查询)的结果是作为外层查询的条件;

       1. 带有any(some) 关键字的子查询
           外层条件只要满足子查询结果中的一个就可以执行外层查询;
                 select 字段名...  FROM 表 where 字段 运算符 ANY(select 字段名...  FROM 表);
         例子:select 字段名...  FROM 表 where 字段 = ANY(select 字段名...  FROM 表);

       2. 带有all 关键字的子查询
           外层条件满足子查询所有结果就可以执行外层查询;
                 select 字段名...  FROM 表 where 字段 运算符 ALL(select 字段名...  FROM 表);
         例子:select 字段名...  FROM 表 where 字段 = ALL(select 字段名...  FROM 表);
       3. 带有exists 关键字的子查询
             只要子查询存在结果,就可以执行外层查询;
         子查询不生成数据,只是一个条件的判断,带有exists 关键字的子查询返回两个值
         true 或 false,只有当返回为 true 的时候,才会执行外层查询;

                 select 字段名...  FROM 表 where exists(select 字段名...  FROM 表);        

           4.带有in 关键字的子查询:
           子查询的结果作为集合数据 供外层查询进行集合查询:

             select 字段名...  FROM 表where 字段 IN (select 字段名...  FROM 表);
          等价于:
                 select 字段名...  FROM 表where 字段 = any(select 字段名...  FROM 表);

      5. 带有比较运算符(单独使用)关键字的子查询
                select 字段名...  FROM 表where 字段 比较运算符 (select 字段名...  FROM 表);

         注意:带有比较运算符(单独使用)关键字的子查询,往往需要子查询的结果是唯一的,
               也就是说结果数据只有一个。

      7.5  MYSQL 的备份和加载:
           1)   MYSQL 的数据备份:
             需要使用工具:  mysqldump
         备份方法:
            terry@ubuntu16: mysqldump -u 数据库用户 -p  需备份的数据库 > 备份文件路径

       2)  MYSQL 的数据加载:
             1. 将备份文件迁移到目标主机;
         2. 在MYSQL中新增一个库
              mysql>  create database 库名;
         3. 导入备份文件中的数据
             3.1  在系统命令行输入:
                           terry@ubuntu16: mysql -u 数据库用户 -p  新创建的数据库 < 备份文件路径

             3.2  在mysql命令行输入:
                  mysql>  use 新创建的数据库;
              mysql>  source 备份文件路径;

     8. MYSQL 数据库编程
          MYSQL 数据库编程需要借助 MYSQL 提供的 API 函数;

      MYSQL所提供的相关的数据类型:

      MYSQL :       数据库连接对象的类型:
      MYSQL_RES:     结果集类型
      MYSQL_FIELD:   字段信息类型
      MYSQL_ROW:     记录类型

      my_ulonglong:   unsigned long long

    编程流程步骤:
      1.   初始化连接对象(连接句柄);
           mysql_init
                    头文件:       #include <mysql/mysql.h>
            函数原型:     MYSQL* mysql_init(MYSQL* mysql);
            函数功能:      创建或者初始化连接对象
            函数参数:     mysql:       待初始化的连接对象的指针,NULL 表示让创建并初始化
                                        并返回初始化后的连接对象
             函数返回值: 成功:返回初始化后的连接对象
                          失败: 返回NULL
                      注意:如果使用mysql_init 创建了连接对象,在数据库访问结束后,使用mysql_close
                            来释放连接对象
      2.   连接数据库
            mysql_real_connect            
                头文件:       #include <mysql/mysql.h>
            函数原型:     MYSQL* mysql_real_connect(MYSQL* mysql,const char* host,const char* user,
                                                     const char* passwd,const char* db,
                                 unsigned int port, const char *unix_socket, unsigned long client_flag);
            函数功能:      连接MYSQL数据库
            函数参数:     mysql:    连接对象,
                           host :   目标主机   NULL 代表连接本地MYSQL数据库
                       user:    MYSQL登录用户名
                       passwd:   MYSQL登录密码
                       db:       连接的数据库名,NULL代表连接缺省库  
                       port:     端口,一般设为0,采用默认端口
                                       unix_socket: 套接字或管道,一般设为 NULL
                                       client_flag: 客户端标志,一般设为0
            函数返回值:   成功返回 连接对象的地址 (第一个参数);
                           失败返回NULL

      3.   数据库的操作 (如果不是查询操作,转入最后一步)
                   mysql_real_query
                头文件:       #include <mysql/mysql.h>
            函数原型:     int mysql_real_query(MYSQL* mysql,const char* query,unsigned long length);
            函数功能:      执行由 query 所代表的 SQL语句
            函数参数:     mysql:    连接对象,
                           query:   待执行的SQL语句
                       length:  SQL语句的长度
            函数返回值:   成功返回 0;
                           失败返回非0值
           接下来的操作是基于查询:
             4.  存储结果集
               mysql_store_result
                头文件:       #include <mysql/mysql.h>
            函数原型:     MYSQL_RES* mysql_store_result(MYSQL* mysql);
            函数功能:      存储结果集
            函数参数:     mysql:    连接对象,
            函数返回值:   成功返回 指向结果集的指针;
                           失败NULL
         5.  获取结果数据
               5.1   获取结果集字段的数量
                       mysql_num_fields
                头文件:       #include <mysql/mysql.h>
                函数原型:     unsigned int mysql_num_fields(MYSQL_RES* res);
                函数功能:      获取结果集字段的数量
                函数参数:     res:    结果集指针,
                函数返回值:   结果集中字段的数量
               5.2   获取结果集字段的名称
                        mysql_fetch_fields
                头文件:       #include <mysql/mysql.h>
                函数原型:     MYSQL_FIELD* mysql_fetch_fields(MYSQL_RES* res);
                函数功能:      获取结果集字段的信息
                函数参数:     res:    结果集指针,
                函数返回值:   结果集中字段的信息数组的首地址

               5.3   获取结果集记录的数量
                     mysql_num_rows
                头文件:       #include <mysql/mysql.h>
                函数原型:     my_ulonglong mysql_num_rows(MYSQL_RES* res);
                函数功能:      获取结果集记录的数量
                函数参数:     res:    结果集指针,
                函数返回值:   结果集中记录的数量

               5.4   获取结果集记录的数据
                                mysql_fetch_row
                头文件:       #include <mysql/mysql.h>
                函数原型:     MYSQL_ROW mysql_fetch_row(MYSQL_RES* res);
                函数功能:      获取结果集中一条记录的数据
                函数参数:     res:    结果集指针,
                函数返回值:   表示当前记录的 MYSQL_ROW 类型数据,同时移动游标到下一行
                               注意: mysql_fetch_row内部会隐藏一个指向记录的游标指针,
                                 当前记录被获取后,游标指针会自动下移到下一行,直到返回
                             NULL,代表已经获取到所有记录数据。
         6.  释放结果集
                         mysql_free_result
                头文件:       #include <mysql/mysql.h>
            函数原型:     void mysql_free_result(MYSQL_RES* res);
            函数功能:      释放结果集
            函数参数:     res:    结果集指针
            函数返回值:   无

       7.  关闭数据库
                  mysql_close
                    头文件:       #include <mysql/mysql.h>
            函数原型:     void mysql_close(MYSQL* mysql);
            函数功能:      关闭数据库连接,回收连接对象
            函数参数:     mysql:    待关闭的连接对象的指针,
            函数返回值:   无    

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值