精华内容
下载资源
问答
  • 数据库的应用详解三

    2013-01-03 17:22:00
    数据库的应用详解三 ...数据库的应用详解三 ... 承接上一篇文章:《ADO.NET实例教学二》中设计到多条件搜索内容,下面我们就...在生活中有没有遇到类似多条件搜索情况。在什么地方见到过呢? 在淘...

    数据库的应用详解三

      承接上一篇文章:《ADO.NET实例教学二》中设计到的多条件搜索的内容,下面我们就先针对这部分的内容进行深入的讲解。

                           

    一、做好准备

    在什么情况下会遇到多条件搜索呢?在生活中有没有遇到类似的多条件搜索的情况。在什么地方见到过呢?

    在淘宝上就有多条件搜索,还有就是像中关村在线的网站,还有就是我们去大的图书大厦也会遇到多条件搜索。

     

    二、画好我们做多条件搜索的界面

    那么当我点击搜索的时候,怎么来拼Sql语句呢?由于用户可能输入某一列,也可能不输某一列。这个组合就有很多种。如果我写很多种的sql语句,肯定能实现这个需求,但是写起来太麻烦。能不能有个简单的办法呢?

     

    三、不合适的地方

    这么解决这个问题,

     

    四、多条件搜索以及初步解决办法代码

    多条件搜索以及初步解决办法代码插入位置:

    View Code
     1 using System;
     2 using System.Collections.Generic;
     3 using System.ComponentModel;
     4 using System.Data;
     5 using System.Drawing;
     6 using System.Linq;
     7 using System.Text;
     8 using System.Windows.Forms;
     9 
    10 namespace _9._7多条件搜索
    11 {
    12     public partial class Form1 : Form
    13     {
    14         public Form1()
    15         {
    16             InitializeComponent();
    17         }
    18 
    19         private void button1_Click(object sender, EventArgs e)
    20         {
    21             //作者 书名 出版社 类别
    22 
    23             //列名:author作者 、bookName 书名、 Publish出版社、Category分类
    24 
    25             //1.假设我的sql语句放在StringBuilder里面。
    26             StringBuilder sbSql = new StringBuilder();
    27             //2.从哪张表里面查询
    28             //解决2增加where,如果用户什么都不输,写个空where也不合适。
    29             //where1=1这个条件永远成立,如果查询所有的条件加跟不加一样的。如果后面有子查询,后面用and拼就行了。
    30             sbSql.Append("select*from Books where 1=1 ");
    31             //3.判断用户是否输入
    32             if (txtAuthor.Text.Length>0)
    33             {
    34                 //解决1,把第一个换成and,where什么时候增加呢?
    35                 sbSql.Append(" and author like '%" + txtAuthor.Text.Trim() + "%'");
    36             }
    37             //这不能用else if
    38             if (txtBookName.Text.Length>0)
    39             {
    40                 sbSql.Append(" and bookname like '%" + txtBookName.Text.Trim() + "%'");
    41             }
    42             if (txtPublish.Text.Trim().Length>0)
    43             {
    44                 sbSql.Append(" and publish like '%" + txtPublish.Text.Trim() + "%'");
    45             }
    46             if (txtCategory.Text.Trim().Length>0)
    47             {
    48                 //大家思考一下由于这个类别,图书表中引用类别id,类别id不是模糊查询。
    49                 sbSql.Append(" and categoryId=" + txtCategory.Text.Trim() + "");
    50             }
    51             MessageBox.Show(sbSql.ToString());
    52         }
    53     }
    54 }

    五、多条件查询拼接字符串的代码

    多条件查询拼接字符串的代码插入位置:

    View Code
      1 using System;
      2 using System.Collections.Generic;
      3 using System.ComponentModel;
      4 using System.Data;
      5 using System.Drawing;
      6 using System.Linq;
      7 using System.Text;
      8 using System.Windows.Forms;
      9 
     10 namespace _9._7多条件搜索
     11 {
     12     public partial class Form1 : Form
     13     {
     14         public Form1()
     15         {
     16             InitializeComponent();
     17         }
     18 
     19         private void button1_Click(object sender, EventArgs e)
     20         {
     21             //作者 书名 出版社 类别
     22 
     23             //列名:author作者 、bookName 书名、 Publish出版社、Category分类
     24             #region 解决办法1
     25             ////1.假设我的sql语句放在StringBuilder里面。
     26             //StringBuilder sbSql = new StringBuilder();
     27             ////2.从哪张表里面查询
     28             ////解决2增加where,如果用户什么都不输,写个空where也不合适。
     29             ////where1=1这个条件永远成立,如果查询所有的条件加跟不加一样的。如果后面有子查询,后面用and拼就行了。
     30             //sbSql.Append("select*from Books where 1=1 ");
     31             ////3.判断用户是否输入
     32             //if (txtAuthor.Text.Length>0)
     33             //{
     34             //    //解决1,把第一个换成and,where什么时候增加呢?
     35             //    sbSql.Append(" and author like '%" + txtAuthor.Text.Trim() + "%'");
     36             //}
     37             ////这不能用else if
     38             //if (txtBookName.Text.Length>0)
     39             //{
     40             //    sbSql.Append(" and bookname like '%" + txtBookName.Text.Trim() + "%'");
     41             //}
     42             //if (txtPublish.Text.Trim().Length>0)
     43             //{
     44             //    sbSql.Append(" and publish like '%" + txtPublish.Text.Trim() + "%'");
     45             //}
     46             //if (txtCategory.Text.Trim().Length>0)
     47             //{
     48             //    //大家思考一下由于这个类别,图书表中引用类别id,类别id不是模糊查询。
     49             //    sbSql.Append(" and categoryId=" + txtCategory.Text.Trim() + "");
     50             //}
     51             //MessageBox.Show(sbSql.ToString());
     52             #endregion
     53 
     54             #region 解决办法2
     55             //解决办法,前面声明个list集合,
     56             List<string> listWheres = new List<string>();
     57             //1.假设我的sql语句放在StringBuilder里面。
     58             StringBuilder sbSql = new StringBuilder();
     59             //2.从哪张表里面查询
     60             //解决办法,前面不加where1=1,就是个查询
     61             sbSql.Append("select*from Books");
     62             //3.判断用户是否输入
     63             if (txtAuthor.Text.Length > 0)
     64             {
     65                 //把条件加到list集合里面了。
     66                 listWheres.Add(" author like '%" + txtAuthor.Text.Trim() + "%'");
     67             }
     68             //这不能用else if
     69             if (txtBookName.Text.Length > 0)
     70             {
     71                 listWheres.Add(" bookname like '%" + txtBookName.Text.Trim() + "%'");
     72             }
     73             if (txtPublish.Text.Trim().Length > 0)
     74             {
     75                 listWheres.Add(" publish like '%" + txtPublish.Text.Trim() + "%'");
     76             }
     77             if (txtCategory.Text.Trim().Length > 0)
     78             {
     79                 //大家思考一下由于这个类别,图书表中引用类别id,类别id不是模糊查询。
     80                 listWheres.Add(" categoryId=" + txtCategory.Text.Trim() + "");
     81             }
     82             //如果list的count>0,证明里面有条件,count<0,证明没有条件
     83             if (listWheres.Count>0)
     84             {
     85                 //如果有查询条件就让sql语句,append
     86                 //where后面还得增加其它的条件,这是个字符串的list集合,如果把集合中的每一个元素用and连起来就行了。
     87                 //但是每个元素用and连起来,我们想到了string.join了。
     88                 sbSql.Append(" where ");
     89                 //把后面变成字符串数组。返回值是条件
     90                 string where=string.Join(" and " ,listWheres.ToArray());
     91                 //然后再加上where
     92                 sbSql.Append(where);
     93                 MessageBox.Show(sbSql.ToString());
     94             }
     95             else
     96             {
     97                 MessageBox.Show(sbSql.ToString());
     98             }
     99            
    100             #endregion
    101         }
    102     }
    103 }

    六、带参数的Sql语句怎么写?如何调用SqlHelper?

     

    七、解决模糊查询怎么写,如何调用SqlHelper。

    解决模糊查询怎么写,如何调用SqlHelper的代码插入位置:

    View Code
      1 using System;
      2 using System.Collections.Generic;
      3 using System.ComponentModel;
      4 using System.Data;
      5 using System.Drawing;
      6 using System.Linq;
      7 using System.Text;
      8 using System.Windows.Forms;
      9 using _9._7复习内容;
     10 using System.Data.SqlClient;
     11 
     12 namespace _9._7多条件搜索
     13 {
     14     public partial class Form1 : Form
     15     {
     16         public Form1()
     17         {
     18             InitializeComponent();
     19         }
     20 
     21         private void button1_Click(object sender, EventArgs e)
     22         {
     23             //作者 书名 出版社 类别
     24 
     25             //列名:author作者 、bookName 书名、 Publish出版社、Category分类
     26             #region 解决办法1
     27             ////1.假设我的sql语句放在StringBuilder里面。
     28             //StringBuilder sbSql = new StringBuilder();
     29             ////2.从哪张表里面查询
     30             ////解决2增加where,如果用户什么都不输,写个空where也不合适。
     31             ////where1=1这个条件永远成立,如果查询所有的条件加跟不加一样的。如果后面有子查询,后面用and拼就行了。
     32             //sbSql.Append("select*from Books where 1=1 ");
     33             ////3.判断用户是否输入
     34             //if (txtAuthor.Text.Length>0)
     35             //{
     36             //    //解决1,把第一个换成and,where什么时候增加呢?
     37             //    sbSql.Append(" and author like '%" + txtAuthor.Text.Trim() + "%'");
     38             //}
     39             ////这不能用else if
     40             //if (txtBookName.Text.Length>0)
     41             //{
     42             //    sbSql.Append(" and bookname like '%" + txtBookName.Text.Trim() + "%'");
     43             //}
     44             //if (txtPublish.Text.Trim().Length>0)
     45             //{
     46             //    sbSql.Append(" and publish like '%" + txtPublish.Text.Trim() + "%'");
     47             //}
     48             //if (txtCategory.Text.Trim().Length>0)
     49             //{
     50             //    //大家思考一下由于这个类别,图书表中引用类别id,类别id不是模糊查询。
     51             //    sbSql.Append(" and categoryId=" + txtCategory.Text.Trim() + "");
     52             //}
     53             //MessageBox.Show(sbSql.ToString());
     54             #endregion
     55 
     56             #region 解决办法2
     57             //解决办法,前面声明个list集合,
     58             List<string> listWheres = new List<string>();
     59             //一开始写了一个list集合,存的是字符串,再存个东西
     60             //存参数对象
     61             List<SqlParameter> listParams=new List<SqlParameter>();
     62             //1.假设我的sql语句放在StringBuilder里面。
     63             StringBuilder sbSql = new StringBuilder();
     64             //2.从哪张表里面查询
     65             //解决办法,前面不加where1=1,就是个查询
     66             sbSql.Append("select*from Books");
     67             //3.判断用户是否输入
     68             if (txtAuthor.Text.Length > 0)
     69             {
     70                 //把条件加到list集合里面了。无论是模查询,还是用普通查询,直接写参数就可以了。模糊查询的话,变下面。
     71                 listWheres.Add(" author like @author");
     72                 //只要加了个参数,向参数集合里面也加一个
     73                 //这样的话最后,我让这个集合.toarray就参数数组了
     74                 listParams.Add(new SqlParameter("@author","%"+txtAuthor.Text.Trim()+"%"));
     75             }
     76             //这不能用else if
     77             if (txtBookName.Text.Length > 0)
     78             {
     79                 listWheres.Add(" bookname like @bkName");
     80                 listParams.Add(new SqlParameter("@bkName","%"+txtBookName.Text.Trim()+"%"));
     81             }
     82             if (txtPublish.Text.Trim().Length > 0)
     83             {
     84                 listWheres.Add(" publish like @pubName");
     85                 listParams.Add(new SqlParameter("@pubName","%"+txtPublish.Text.Trim()+"%"));
     86             }
     87             if (txtCategory.Text.Trim().Length > 0)
     88             {
     89                 //大家思考一下由于这个类别,图书表中引用类别id,类别id不是模糊查询。
     90                 listWheres.Add(" categoryId=@cid");
     91                 listParams.Add(new SqlParameter("@cid",txtCategory.Text.Trim()));
     92             }
     93             //如果list的count>0,证明里面有条件,count<0,证明没有条件
     94             if (listWheres.Count>0)
     95             {
     96                 //如果有查询条件就让sql语句,append
     97                 //where后面还得增加其它的条件,这是个字符串的list集合,如果把集合中的每一个元素用and连起来就行了。
     98                 //但是每个元素用and连起来,我们想到了string.join了。
     99                 sbSql.Append(" where ");
    100                 //把后面变成字符串数组。返回值是条件
    101                 string where=string.Join(" and " ,listWheres.ToArray());
    102                 //然后再加上where
    103                 sbSql.Append(where);
    104                 MessageBox.Show(sbSql.ToString());
    105             }
    106             else
    107             {
    108                 MessageBox.Show(sbSql.ToString());
    109             }
    110             //当使用带参数的Sql语句时
    111             //问题1:模糊查询怎么写?
    112             //如何调用SqlHelper?最后把参数数组传进来
    113             SqlHelper.ExecuteDataTable(sbSql.ToString(), listParams.ToArray());
    114             #endregion
    115         }
    116     }
    117 }

     关于ADO.net我们先告个小段落,下面我们看下CASE函数的用法:

    等值判断,相当于switch case

         

    八、case的最常用的写法

     

    九、case常规写法

     

    十、case的另外一种写法

    需要注意的地方,then后面的值的数据类型必须都得一样。

    接下来我们做这么几个练习,用下订单表。

    在订单表中,统计每个销售员的总销售金额(按销售员来分组),列出销售员名、总销售金额、称号(>6000金牌,>5500银牌,>4500铜牌,否则普通)

     

    十一、练习1答案

     

    十二、练习2

     

    十三、练习2思路

    接下来我们说下索引

    大家知道有这么个东西,它是干什么用的就行了。

    索引就是方便我们查找的,为了提高查找效率的。就相当于字典的目录。

    索引分两种,一种是聚集索引,一种是非聚集索引。

    聚集索引,索引的存储顺序跟实际物理顺序一样。

    非聚集索引,索引的存储顺序跟实际物理顺序不一样。

    一个表中可以建几个聚集索引呢?一个。

    非聚集索引可以有多个。

    按照某列建完索引以后,按照这列进行排序。

    请看下面这幅图:

     

    十四、需要我们看的图

    编号就是聚集索引,请从这张表中查询出年龄大于17岁的有谁?一个一个进行比对,效率会很低。

     

    十五、再看一张表

    看这张表就能快很多,计算机不是用线来识别的,一下子就定位到了。

    这就是一建索引就要排序的原因。

    按年龄建的索引叫非聚集索引。

    索引里面有个概念叫:填充因子。

    索引本身也要占一定得存储空间,也是按页来存储的。

     

    十六、填充因子图示

    为什么不存在一页上,要空出来一部分呢?要是插入进一个1.1,就能快速插进去了。填充因子,就是填充百分之多少,预留百分之多少。

    索引的缺点就是降低了,插入、更新、修改。

    在面试的时候,怎么样提高数据库的查询效率,就是建索引。但是是建完索引以后,速度就一定快了么?也不一定。比如说:按年龄建的索引,但是现在找出xyz开头的人,索引没用上。查询的时候,根据建的索引来查。

    (*)即使创建了索引,仍然有可能全表扫描,比如like、函数、类型转换等。

     

    十七、索引的代码写法

    --删除索引

    drop index T8.IX_T8_tage

    T8.IX表名

    _T8_tage索引名

    其实关于索引还有很多的东西,但是我们程序员理解到这里就足够用了。

    接下来我们看下子查询

    什么叫子查询呢?就是这个查询的数据来自上个查询,或者说这个查询中要用到另外个查询的结果。

    子查询基本分类:

    独立子查询

    -子查询可以独立运行

    相关子查询

    -子查询中引用了父查询中的结果

     下面我们看这么一个例子:

                           

    十八、独立子查询

    还记得我们之前做过个查询最高分,最低分,平均分那个么?

    我们用Union all把三个结果放在一起了,这个也叫做一个子查询。

    接下来我们看下这个问题,

     

    十九、需要用到的两张表

    请查询出高一三班的学生的信息

     

    二十、用子查询帮我们来完成

    请查询出所有高一三班和高二一班的同学。

     

    二十一、等于号不能同时等于两个值

     

    二十二、查询结果

    要是除了高一三班和高二一班呢?

     

    二十三、除了高一三班和高二一班

     

    二十四、这只能写一列

    现在我想查询秦叔宝,关羽,黄忠的考试成绩

     

    二十五、这三个人得成绩

    不仅查询的时候能用,删除的时候也能用。

    还是上面的问题,我们也可以改成相关子查询来做。

     

    二十六、where条件的执行过程

     

    二十七、用exists来验证

     

    二十八、更进一步证明exists

     

    二十九、看我们画的图去解释这段代码

     

    三十、相关子查询代码

    那么所有的查询,所有的子查询包括咱们后面一篇文章里面讲解的连接都可以用相关子查询来做。用普通子查询也能做,相关子查询也可以。

    接下来我们说下分页的问题:

    现在假如有这么一张表,

     

    三十一、表中有六万条记录

    假如现在我们要在一个界面上显示这些数据,是不是一次性的把这六万条数据都查询出来呢?

    第一是太大,第二是显示出来,用户一下子也看不了六万条。用户看个五条,十条就够了。所以说,当数据量特别大的时候,给用户显示一次只显示一部分就行了。不要一次显示那么大。

    分页怎么做呢?

    我们可以把数据都查询出来,然后平均分配。这样做效率太低了。

    真正分页的时候是要哪页的数据就查哪页的数据。

    题目:假设每页5条。

    当前我要查看

    第一页:

     

    三十二、查询前五条数据

    第三页:

     

    三十三、查询第三页数据

    第五页:查询第五页数据的方法跟查询第三页数据一样。

     

    三十四、这么写比较的麻烦

    假设自动编号没有问题的情况下,这么做的前提是stuId是连续的并且是不出错的。

     

    三十五、编号没问题的写法

    如果自动编号不连续这样做就不合理了。

    这时我们按照这个思路,自己加一列,就是把所有查出来的数据从头到尾编个号。

    数据库中有500条,只查出来20条,它会把你查出来的20条从头到尾编个号。

    如果把数据库中的数据都查出来,它会把表中所有的数据从头到尾编号。

     

    三十六、通过子查询实现分页

    之后我们学了存储过程,可以用存储过程封装一个查询分页。

     

    回到起始位置

     

    元旦快乐,本博主祝大家每天都有好心情!吃好,玩好,喝好!!!

    作者近期文章列表:

    C#中级进阶教程(完全免费,献给代码爱好者的最好礼物。注:本作者分享自己精心整理的C#中级进阶教程,无任何商业目的。希望与更多的代码爱好者交流心得,也请高手多多指点!!!)
    ASP.net项目 图书商城项目总论
    三层及其它内容 递归
    三层(一)
    三层相关案例(及常见的错误)
    三层实例(内涵Sql CRUD)
    手写代码生成器
    SQL数据库 ADO.net 数据库的应用图解一
    数据库的应用详解二
    ADO.NET(内涵效率问题)
    ADO.NET实例教学一
    ADO.NET实例教学二
    ADO.NET(内含存储过程讲解)
    面向过程,面向对象中高级 面向过程,面向对象的深入理解一
    面向过程,面向对象的深入理解二
    面向对象的深入理解三
    无处不在的XML
    winform基础 Winform基础
    winform中常用的控件
    面向过程 三种循环的比较
    C#中的方法(上)
    我们常见的数组
    面向对象 思想的转变
    C#中超级好用的类
    C#中析构函数和命名空间的妙用
    C#中超级好用的字符串
    C#中如何快速处理字符串
    值类型和引用类型及其它
    ArrayList和HashTable妙用一
    ArrayList和HashTable妙用二
    文件管理File类
    多态
    C#中其它一些问题的小节
    GDI+ 这些年我收集的GDI+代码
    这些年我收集的GDI+代码2
    HTML概述以及CSS 你不能忽视的HTML语言
    你不能忽视的HTML语言2精编篇
    你不能忽视的HTML语言3
    html-综合篇
    CSS基本相关内容--中秋特别奉献
    CSS基本相关内容2
    JavaScript基础 JavaScript基础一
    javascript基础二JavaScript DOM编程
    jQuery jQuery(内涵: jquery选择器)
    posted on 2013-01-03 17:22 小事好 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/zysbk/archive/2013/01/03/2842383.html

    展开全文
  • 据统计,目前大城市空巢家庭已接近30%,而京沪津三直辖市则高达33%以上。空巢老人生活能力差以及经济压力大,敬老院无疑是他们晚年生活的理想选择。将全面网络化监控理念引入敬老院,组建网络化智能监控系统...
  • 据统计,目前大城市空巢家庭已接近30%,而京沪津三直辖市则高达33%以上。空巢老人生活能力差以及经济压力大,敬老院无疑是他们晚年生活的理想选择。将全面网络化监控理念引入敬老院,组建网络化智能监控系统...
  • /* 写前面:本人咸鱼,反正估计也没人看我博客,纯粹作为学习/复习记录,如有大佬看到我写...举个例子,生活中常用的数据库:银行的数据库系统,学生教务处信息管理系统,HR人力资源管理系统(也许有? 所以...

    /*
    写在前面:本人咸鱼,反正估计也没人看我博客,纯粹作为学习/复习记录,如有大佬看到我写的不对请务指出
    参考资料:数据库系统概念(机械工业出版)
    数据库基础教程(机械工业黑皮书)
    */
    本讲概要:数据库系统的应用,数据视图(概),实例和模式,数据模型(概)

    • 1.1数据库系统的应用

      举个例子,生活中常用的数据库:银行的数据库系统,学生的教务处信息管理系统,HR的人力资源管理系统(也许有?
      所以,尽管我们很多人没有直接接触数据库,但是已经间接的接触了很多数据库,比如说,你在网上购买一本书,或者听一首歌,你就已经在访问这个公司开发的产品的数据库里的数据了。
      所以,尽管交互界面有意识的隐藏了访问数据库的细节(为了获得更好的用户体验)致使许多人并没有发现自己正在访问数据库,而如今,间接或直接接触数据库已经是很多人生活的标配

    • 1.2数据库系统的发展过程
      以后会详细讲,这篇塞不下

    • 1.3数据视图
      数据库系统的主要目的是给用户提供抽象的数据视图,也就是说,系统隐瞒关于数据存储和维护的某些细节

      • 1.3.1数据抽象
        一个可用的系统必须能高效的检索数据,所以设计者必须使用复杂的数据结构来表示数据,然而,不是所有用户都受过专业的计算机训练,因此开发人员通过几个层次的抽象来屏蔽复杂性,以简化用户和系统的交互
        因此,数据抽象的目的:
        对于用户来说是:简化用户和系统的交互,方便使用
        对于系统程序员来说是:高效的检索数据
        • 物理层:最低层次的抽象,描述数据是怎样存储的。
        • 逻辑层:比物理层稍微高层次的抽象,描述数据库存储什么数据,以及这些数据之间存在什么关系。这样逻辑层就能通过少量,并且相对简单的描述了整个数据库
          虽然逻辑层的简单实现可能需要涉及一些复杂的物理层,但是没关系,逻辑层的用户不必知道这些复杂性,这就是物理数据独立性
        • 视图层(也称为外部层)
          最高层次的抽象,只描述数据库的某一部分。
          这是因为用户不需要关心数据库的整体结构,只是需要访问某一部分而已,所以这样的做法能使系统和用户的交互更简单

      这样的结构,我们称为三层结构两级映射,是数据库常用的设计模式。这个模式我们在后续也会详细的去讲
      简单的抽象如图所示:
      在这里插入图片描述
      --------------------------------------------------------------举个例子去阐述这三个层次----------------------------------------------------
      大多数高级程序语言支持结构化类型的概念
      例如我们设计一个ADT去描述一个instructor

    type instructor = record
    	id = char(5);
    	name=char(20);
    	dept_name=char(20);
    	salary:numeric(8,2);
    	end
    

    以上代码定义了一个具有四个字段的新纪录instructor,每个字段有一个字段名和所属类型。
    例如对于一个学生来说,可能拥有的记录类型是:
    student:ID,name,credit,Class
    对于物理层来说,这些记录可能被描述为连续存储位置组成的存储块。编译器为程序设计人员屏蔽了这一细节,与此同时,数据库系统也为数据库设计人员屏蔽了存储细节,DBA可能需要了解某些细节
    逻辑层,每个这样的记录通过类型定义记录来实现,并且,逻辑层还要描述数据与数据之间的关系。程序设计人员就是在这一层面上实现工作
    至于用户视图,用户仅能看到屏蔽了数据库类型细节的一组应用程序,这一点也体现了安全性,例如学生用户不能访问老师的数据库。

    • 1.3.2实例,模式,视图,模型(补充:视图,我觉得书上这点讲的不够完备)
      我们知道,存储在数据库中的数据是在不断变动的,因此,我们称这些特定时刻存储在数据库中信息的集合称之为实例
      实例组成了我们的数据库,因此我们需要对数据库中的数据进行一个结构化的描述,而视图则相反,需要我们对数据库中的数据有一个具体的表现。
      因此,我们可以得出,模式是对视图的抽象,而视图是对模式的具体化展现
      然而直到了这个数据库的模式之后,我们还需要对这个模式进行近一步抽象,这样抽象的结果就是数据模型
      而数据模型本身包括:数据结构,约束和操作
      例如:关系模型中所有模式都可以用抽象表表示[数据结构],而每个模式都是由具体的,不同列名的表组成,这些表有一定的[约束]和[操作]

      • 数据结构

        • 数据结构描述的是数据库的组成对象以及它们之间的关系

        • 描述的是系统类型的集合,反应的是系统的数据静态特性

        • 按照数据结构的类型来命名数据模型

          • 层次结构——层次模型
          • 网状结构——网状模型
          • 关系结构——关系模型(最常用也最重要)
      • 数据操作
        是指对数据库中的对象(型)和实例(值)允许执行的操作以及规范化约束。
        一般的数据操作有增删改查

      • 完整性约束
        用以限定符合数据模型的状态和状态变化,以确保数据正确,有效,相容。

    • 总结:视图<----具体化------实例组成的数据库----抽象------>模式------二次抽象---->数据模型
      这些概念会具体应用在下节我们详细的讲数据库的三层模式两级映像。并且再对此进行复习

    • 1.3.3数据模型的类别
      根据不同的定义,数据模型可被划分为四类

      • 关系模型
        关系模型用表的集合来表示数据和数据之间的联系。每个表有多个列,每列有唯一的列名,并且每个表包含某种特定类型的记录。每个记录里面包含了固定数目的字段(属性),表的列对于记录类型的属性。
      • 实体-联系模型
        现实世界由一堆由具体事物组成的实体和实体之间的联系组成
      • 基于对象的数据模型
        面向对象程序设计方法已经成为主流软件开发方法,而这导致了面向对象数据模型的发展
        面向对象数据模型可以看做是给E-R模型增加了封装,方法(函数)和对象标识等概念的扩展。
        对象-关系数据模型结合了面向对象数据模型和关系模型的特征
        这个模型以后也会详细讲
      • 半结构化数据模型
        半结构化数据模型允许那些相同类型的数据项含有不同属性集的数据定义,XML被广泛的应用于半结构化数据结构。
      • 在历史上,网状模型和层次模型先于关系模型出现,这些模型与底层的联系紧密,并且是数据建模复杂化,如今已经很少使用
    • 总结:这一篇主要讲了数据库的应用,以及数据库的设计模式,以及设计过程中用到的概念和数据模型

    • 自检:

      • 数据库的应用
      • 数据库视图是什么
      • 数据库的设计模式(三层模式两级印象)
      • 其中物理层是什么?逻辑层是什么?用户层是什么?
      • 概念:字段,记录,模式,模型,视图,实例
      • 数据模型由什么组成?分别起到怎样的作用?
      • 数据模型分别有哪些?分别有什么特点?
    • 下一节我将会详述数据库的三层模式两级印象,以及数据库的发展历程,然后一一把这些概念攻破,最后我会把这些基本知识做一个具体的整理,写一篇文章

    • 加油:)

    展开全文
  •  如果将数据库称为现代数字生活的基础,那么这样说法一点也不夸张——大型企业应用、网站,所有这些东西背后,都是数据库在支撑。并且,最终说来,产生价值并不是绚丽界面和现代化输入方式,而是存放在...
  •  如果将数据库称为现代数字生活的基础,那么这样说法一点也不夸张——大型企业应用、网站,所有这些东西背后,都是数据库在支撑。并且,最终说来,产生价值并不是绚丽界面和现代化输入方式,而是存放在...
  • 数据库编程 数据库不仅支持各类数据长期保存,更重要是...本篇博客主要介绍SQLite和MySQL数据库的Python接口,并通过几个实例来演示如何通过Python代码实现对数据库的CURD(增删改查) 1. SQLite应用 SQLite是...

    数据库编程

    数据库不仅支持各类数据的长期保存,更重要的是支持各种跨平台,跨地域的数据查询、共享和修改,极大方便了认类生活与工作。金融、聊天系统、各类网站、办公自动化系统、各种管理信息系统等,都需要数据库的支持。

    在本篇博客中主要介绍SQLite和MySQL数据库的Python接口,并通过几个实例来演示如何通过Python代码实现对数据库的CURD(增删改查)

    1. SQLite应用

    SQLite是内嵌在Python中的轻量级、基于磁盘文件的数据库管理系统,不需要服务器支持,支持使用SQL语句来访问数据库。该数据库使用C语言开发,支持大多数SQL91标准,支持原子性、一致性、独立性和持久的事务,不支持外键限制;通过数据库级的独占性和共享锁来实现独立事务,当多个线程同时访问同一个数据库并写入数据时,每一时刻只有一个线程可以写入数据。

    SQLite支持2TB大小的单个数据库,每个数据库完全存储在单个磁盘文件类,以B+数数据结构的形式存储.一个数据库就是一个文件,通过简单复制即可实现数据库的备份。

    访问和操作SQLite数据时,需要首先导入sqlite3模块,然后就可以使用其中的接口来操作数据库了,该模块提供了与DB-API 2.0规范的SQL接口。
    Python sqlite3 模块 API

    序号 API & 描述
    1 sqlite3.connect(database [,timeout ,other optional arguments]) 该 API 打开一个到 SQLite 数据库文件 database 的链接。您可以使用 “:memory:” 来在 RAM 中打开一个到 database 的数据库连接,而不是在磁盘上打开。如果数据库成功打开,则返回一个连接对象。当一个数据库被多个连接访问,且其中一个修改了数据库,此时 SQLite 数据库被锁定,直到事务提交。timeout 参数表示连接等待锁定的持续时间,直到发生异常断开连接。timeout 参数默认是 5.0(5 秒)。如果给定的数据库名称 filename 不存在,则该调用将创建一个数据库。如果您不想在当前目录中创建数据库,那么您可以指定带有路径的文件名,这样您就能在任意地方创建数据库。
    2 connection.cursor([cursorClass]) 该例程创建一个 cursor,将在 Python 数据库编程中用到。该方法接受一个单一的可选的参数 cursorClass。如果提供了该参数,则它必须是一个扩展自 sqlite3.Cursor 的自定义的 cursor 类。
    3 cursor.execute(sql [, optional parameters]) 该例程执行一个 SQL 语句。该 SQL 语句可以被参数化(即使用占位符代替 SQL 文本)。sqlite3 模块支持两种类型的占位符:问号和命名占位符(命名样式)。例如:cursor.execute(“insert into people values (?, ?)”, (who, age))
    4 connection.execute(sql [, optional parameters]) 该例程是上面执行的由光标(cursor)对象提供的方法的快捷方式,它通过调用光标(cursor)方法创建了一个中间的光标对象,然后通过给定的参数调用光标的 execute 方法。
    5 cursor.executemany(sql, seq_of_parameters) 该例程对 seq_of_parameters 中的所有参数或映射执行一个 SQL 命令。
    6 connection.executemany(sql[, parameters]) 该例程是一个由调用光标(cursor)方法创建的中间的光标对象的快捷方式,然后通过给定的参数调用光标的 executemany 方法。
    7 cursor.executescript(sql_script) 该例程一旦接收到脚本,会执行多个 SQL 语句。它首先执行 COMMIT 语句,然后执行作为参数传入的 SQL 脚本。所有的 SQL 语句应该用分号 ; 分隔。
    8 connection.executescript(sql_script) 该例程是一个由调用光标(cursor)方法创建的中间的光标对象的快捷方式,然后通过给定的参数调用光标的 executescript 方法。
    9 connection.total_changes() 该例程返回自数据库连接打开以来被修改、插入或删除的数据库总行数。
    10 connection.commit() 该方法提交当前的事务。如果您未调用该方法,那么自您上一次调用 commit() 以来所做的任何动作对其他数据库连接来说是不可见的。
    11 connection.rollback() 该方法回滚自上一次调用 commit() 以来对数据库所做的更改。
    12 connection.close() 该方法关闭数据库连接。请注意,这不会自动调用 commit()。如果您之前未调用 commit() 方法,就直接关闭数据库连接,您所做的所有更改将全部丢失!
    13 cursor.fetchone() 该方法获取查询结果集中的下一行,返回一个单一的序列,当没有更多可用的数据时,则返回 None。
    14 cursor.fetchmany([size=cursor.arraysize]) 该方法获取查询结果集中的下一行组,返回一个列表。当没有更多的可用的行时,则返回一个空的列表。该方法尝试获取由 size 参数指定的尽可能多的行。
    15 cursor.fetchall() 该例程获取查询结果集中所有(剩余)的行,返回一个列表。当没有可用的行时,则返回一个空的列表。

    使用该模块,首先需要创建一个与数据库关联的Connection对象

    import sqlite3
    con = sqlite3.connect('example.db')
    

    成功创建Connection对象之后,再创建一个Cursor对象,并且调用Cursor对象的execute()方法来执行SQL语句创建数据表以及查询、插入、修改或删除数据库中的数据。

    c = con.cursor()
    # 创建表
    c.execute('''CREATE TABLE stocks(date text,trans text,symbol text,qty real,price real)''')
    
    <sqlite3.Cursor at 0x18d7a860180>
    
    # 插入一条记录
    c.execute("insert into stocks values('2020-4-12','BUY','RHAT',100,35.14)")
    # 提交当前事务,保存数据
    con.commit()
    # 关闭数据库连接
    con.close()
    

    如果需要查询表中内容,如下代码:

    import sqlite3
    conn = sqlite3.connect('example.db')
    c = conn.cursor()
    for row in c.execute('select * from stocks order by price'):
        print(row)
    
    ('2020-4-12', 'BUY', 'RHAT', 100.0, 35.14)
    

    1.1 Connection对象

    在各种数据库提供的接口中,Connection对象都是操作数据库中最基本也是最重要的一个类。其主要方法如下表:

    方法 说明
    Connection.execute(sql[,parameters]) 执行一条SQL语句
    Connection.executemany(sql[,parameters]) 执行多条SQL语句
    Connection.cursor() 返回连接的游标
    Connection.commit() 提交当前事务,如果不提交,那么自上次调用commit()方法之后的所有修改都不会真正保存到数据库中
    Connection.rollback() 事务的回滚,即撤销当前事务,将数据库恢复至上次调用commit()方法后的状态
    Connection.close() 关闭数据库连接
    Connection.create_function(name,num_params,func) 创建可在SQL语句中调用的函数,其中name为函数名,num_params表示该函数可以接收的参数个数,func表示Python可调用对象

    下面的代码演示了如何在sqlite3连接中创建并调用自定义函数:

    import sqlite3
    import hashlib
    
    def md5sum(t):
        return hashlib.md5(t).hexdigest()
    
    conn = sqlite3.connect(":memory:")
    conn.create_function("md5",1,md5sum) # 参数1--函数名,参数2--形参个数,参数3--函数本身即可调用对象
    cur = conn.cursor()
    cur.execute('select md5(?)',(b"foo",)) # 在SQL语句中调用自定义函数,注意,在SQLite数据库没有实际的虚表dual
    print(cur.fetchone()[0])
    
    acbd18db4cc2f85cedef654fccc4a4d8
    

    1.2 Cursor对象

    Cursor对象其实相当于JDBC中的Statement或PreStatement类

    Cursor也是sqlite3模块中比较重要的一个对象,该对象具有如下常用方法。

    (1) execute(sql[,parameters])

    该方法用于执行一条SQL语句,下面的代码演示了该方法的用法;以及为SQL语句传递参数的两种方法,分别使用问号和命名变量作为占位符。

    import sqlite3
    con = sqlite3.connect(":memory:")
    cur = con.cursor()
    cur.execute('create table people (name,age)')
    name = "ChanZany"
    age = 38
    # 使用问号?作为占位符
    cur.execute("insert into people values(?,?)",(name,age))
    # 使用命名变量:作为占位符
    cur.execute("select * from people where name =:name and age=:age",{"name":name,"age":age})
    print(cur.fetchone())
    
    ('ChanZany', 38)
    

    (2) executemany(sql,seq_of_parameters)

    该方法用来对所有给定参数执行同一个SQL语句,该参数序列可以使用不同的方法产生,例如,下面的代码使用迭代来产生参数序列:

    import sqlite3
    
    
    class IterChars:
        def __init__(self):
            self.count = ord('a')
    
        def __iter__(self):
            return self
    
        def __next__(self):
            if self.count > ord('z'):
                raise StopIteration
            self.count += 1
            return (chr(self.count - 1),)
    
    
    con = sqlite3.connect(":memory:")
    cur = con.cursor()
    cur.execute("create table characters(c)")
    theIter = IterChars()
    cur.executemany("insert into characters(c) values(?)",theIter)
    cur.execute("select c from characters")
    print(cur.fetchall())
    
    [('a',), ('b',), ('c',), ('d',), ('e',), ('f',), ('g',), ('h',), ('i',), ('j',), ('k',), ('l',), ('m',), ('n',), ('o',), ('p',), ('q',), ('r',), ('s',), ('t',), ('u',), ('v',), ('w',), ('x',), ('y',), ('z',)]
    

    下面的代码则使用了更为简洁的生成器来产生参数:

    import sqlite3
    import string
    
    
    def char_generator():
        for c in string.ascii_lowercase:
            yield (c,)
    
    con = sqlite3.connect(":memory:")
    cur = con.cursor()
    cur.execute("create table characters(c)")
    cur.executemany("insert into characters(c) values(?)", char_generator())
    cur.execute("select c from characters")
    print(cur.fetchall())
    
    [('a',), ('b',), ('c',), ('d',), ('e',), ('f',), ('g',), ('h',), ('i',), ('j',), ('k',), ('l',), ('m',), ('n',), ('o',), ('p',), ('q',), ('r',), ('s',), ('t',), ('u',), ('v',), ('w',), ('x',), ('y',), ('z',)]
    

    下面的代码则使用直接创建的序列作为SQL语句的参数:

    import sqlite3
    
    persons=[
        ("Stanly","Boss"),
        ("Calvin","Manager"),
        ("ChanZany","employee")
    ]
    
    con = sqlite3.connect(":memory:")
    
    # 创建表
    con.execute("create table emp(name,job)")
    # 插入数据
    con.executemany("insert into emp (name,job) values (?,?)",persons)
    
    # 查询刚刚插入的数据
    
    for row in con.execute("select name,job from emp"):
        print(row)
    
    # 删除数据
    print("I just deleted",con.execute("delete from emp").rowcount,"rows")
    
    ('Stanly', 'Boss')
    ('Calvin', 'Manager')
    ('ChanZany', 'employee')
    I just deleted 3 rows
    

    (3) fetchone(),fetchmany(size = cursor.arraysize),fetchall()

    这三个方法都可以用来读取数据。不同的是:

    • cursor.fetchone():该方法获取查询结果集中的下一行,返回一个单一的序列,当没有更多可用的数据时,则返回 None。
    • cursor.fetchmany(size=cursor.arraysize):该方法获取查询结果集中的下一行组,返回一个列表。当没有更多的可用的行时,则返回一个空的列表。该方法尝试获取由 size 参数指定的尽可能多的行。
    • cursor.fetchall():该方法获取查询结果集中所有(剩余)的行,返回一个列表。当没有可用的行时,则返回一个空的列表。
    import sqlite3
    conn = sqlite3.connect("D:/addressBook.db")
    cur = conn.cursor()
    cur.execute("create table if not exists addressList(name,sex,phon,QQ,address)")
    cur.execute("insert into addressList(name,sex,phon,QQ,address) values('张三','女','13889012987','66735','北京市')")
    conn.commit()
    conn.close()
    
    # 使用fetchall()读取数据
    import sqlite3
    conn = sqlite3.connect('D:/addressBook.db')
    cur = conn.cursor()
    cur.execute('select * from addressList')
    li = cur.fetchall()
    for line in li:
        for item in line:
            if type(item)!=str:
                s=str(item)
            else:
                s=item
            print(s+'\t',end=" ")
        print() # 换行
    conn.close()
        
    
    张三	 女	 13889012987	 66735	 北京市	 
    张三	 女	 13889012987	 66735	 北京市	 
    

    1.3 Row对象

    具体的细节可以查阅Python3的中文文档,下面通过一个示例来演示Row对象的用法。

    conn = sqlite3.connect("example.db")
    conn.row_factory = sqlite3.Row #设置数据库的映射工厂为sqlite3.Row
    cur = conn.cursor()
    cur.execute('select * from stocks')
    
    <sqlite3.Cursor at 0x18d7afb86c0>
    
    r =cur.fetchone() # 此时fetchone得到的对象就是Row对象
    type(r)
    
    sqlite3.Row
    
    tuple(r)
    
    ('2020-4-12', 'BUY', 'RHAT', 100.0, 35.14)
    
    len(r)
    
    5
    
    r[2]
    
    'RHAT'
    
    r.keys()
    
    ['date', 'trans', 'symbol', 'qty', 'price']
    
    r['qty']
    
    100.0
    
    for member in r:
        print(member,end=" ")
    
    2020-4-12 BUY RHAT 100.0 35.14 
    

    2. 操作MySQL数据库

    MySQL 是最流行的关系型数据库管理系统,在这里介绍通过PyMySQL库在Python中连接操作MySQL数据库的方式

    • PyMySQL库 :PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。

    在使用 PyMySQL 之前,我们需要确保 PyMySQL 已安装。
    可以直接使用如下命令安装PyMySQL:

        pip install PyMySQL
    

    2.1连接数据库表

    import pymysql
    
    # 打开数据库连接
    db = pymysql.connect("localhost", "root", "root", "test") #参数1:mysql服务器IP地址:端口号 参数2:mysql用户名,参数3:mysql密码,参数4:数据库名称
    
    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = db.cursor()
    
    # 使用 execute()  方法执行 SQL 查询
    cursor.execute("SELECT VERSION()")
    
    # 使用 fetchone() 方法获取单条数据.
    data = cursor.fetchone()
    
    print("Database version : %s " % data)
    
    # 关闭数据库连接
    db.close()
    
    
    Database version : 5.5.40 
    

    2.2 创建数据库表

    import pymysql
     
    # 打开数据库连接
    db = pymysql.connect("localhost","root","root","test" )
     
    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = db.cursor()
     
    # 使用 execute() 方法执行 SQL,如果表存在则删除
    cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
     
    # 使用预处理语句创建表
    sql = """CREATE TABLE EMPLOYEE (
             FIRST_NAME  CHAR(20) NOT NULL,
             LAST_NAME  CHAR(20),
             AGE INT,  
             SEX CHAR(1),
             INCOME FLOAT )"""
     
    cursor.execute(sql)
     
    # 关闭数据库连接
    db.close()
    

    2.3 数据库插入操作

    import pymysql
    
    # 打开数据库连接
    conn = pymysql.connect("localhost", "root", "root", "test")
    
    # 使用 cursor() 方法创建一个游标对象 cursor
    cur = conn.cursor()
    
    # # 使用预处理语句创建表
    # sql = """CREATE TABLE EMPLOYEE (
    #          FIRST_NAME  CHAR(20) NOT NULL,
    #          LAST_NAME  CHAR(20),
    #          AGE INT,
    #          SEX CHAR(1),
    #          INCOME FLOAT )"""
    
    sql ="""insert into EMPLOYEE(FIRST_NAME,LAST_NAME,AGE,SEX,INCOME) values('Chan','Zany',20,'M',2000)"""
    try:
        cur.execute(sql)
        # 需要使用commit提交事务
        conn.commit()
    except:
        # 如果发生错误立即回滚
        conn.rollback()
    
    # 关闭数据库连接
    conn.close()
    
    # 以一种更规范的方式操作数据库
    import pymysql
    import random
    
    conn = None
    cur = None
    
    
    def generateRandomName():
        # 中文名字中的第一第二第三个字
        first = tuple('赵陈孙李')
        middle = tuple('伟志子东')
        last = tuple('坤楠恙')
    
        r = random.randint(1, 100)
        name = random.choice(first)
        if r > 50:  # 按一定概率生成只有两个字的名字
            name = name + random.choice(middle)
        name = name + random.choice(last)  # 生成3个字的名字
    
        return name
    
    
    try:
        conn = pymysql.connect(host="localhost", user="root", passwd="root", port=3306)
        cur = conn.cursor()
        cur.execute('create database if not exists python')
        conn.select_db('python')
        cur.execute('create table test(id int,name varchar(10),info varchar(20))')
        value = [1, 'Chanzany', 'a teacher']  # 以列表作为参数
        cur.execute('insert into test values(%s,%s,%s)', value)
        # 批处理多条信息的插入
        values = []
        for i in range(20):
            values.append((i, generateRandomName(), 'student' + str(i)))
        cur.executemany('insert into test values(%s,%s,%s)', values)
        cur.execute('update test set info="i am rollen" where id = 3')
        conn.commit()
    except pymysql.MySQLError:
        print("something go wrong...")
        conn.rollback()
    finally:
        cur.close()
        conn.close()
    

    结果:
    在这里插入图片描述

    2.4 数据库查询操作

    Python使用pymysql查询Mysql的接口类似与SQLite提供的接口
    使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。

    • fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
    • fetchall(): 接收全部的返回结果行.
    • rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。

    例子:查询EMPLOYEE表中工资大于1000的所有数据

    import pymysql
     
    # 打开数据库连接
    conn = pymysql.connect("localhost","root","root","test" )
     
    # 使用cursor()方法获取操作游标 
    cur = conn.cursor()
     
    # SQL 查询语句
    sql = "SELECT * FROM EMPLOYEE WHERE INCOME > %s" % (1000)
    try:
       # 执行SQL语句
       cur.execute(sql)
       # 获取所有记录列表
       results = cur.fetchall()
       for row in results:
          fname = row[0]
          lname = row[1]
          age = row[2]
          sex = row[3]
          income = row[4]
           # 打印结果
          print ("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \
                 (fname, lname, age, sex, income ))
    except:
       print ("Error: unable to fetch data")
     
    # 关闭数据库连接
    conn.close()
    
    fname=Chan,lname=Zany,age=20,sex=M,income=2000.0
    
    # 以一种更规范的方式查询数据
    import pymysql
    global conn
    global cur
    try:
        conn = pymysql.connect(host ="localhost",user="root",passwd="root",db="db1",port=3306)
        cur=conn.cursor()
        cur.execute('select * from emp')
        li = cur.fetchall()
        for line in li:
            print(line)
    
    except pymysql.err.MySQLError as e:
        print(e)
        
    finally:
        cur.close()
        conn.close()
    
    
    (1, '孙悟空', '男', 7200.0, datetime.date(2013, 2, 24), 1)
    (2, '猪八戒', '男', 3600.0, datetime.date(2010, 12, 2), 2)
    (3, '唐僧', '男', 9000.0, datetime.date(2008, 8, 8), 2)
    (4, '白骨精', '女', 5000.0, datetime.date(2015, 10, 7), 3)
    (5, '蜘蛛精', '女', 4500.0, datetime.date(2011, 3, 14), 1)
    (6, '白龙马', '男', 3000.0, datetime.date(2014, 4, 23), None)
    

    2.5 数据库更新表数据操作

    以下实例将test表中 SEX 为 ‘M’ 的 AGE 字段递增 1

    import pymysql
     
    # 打开数据库连接
    conn = pymysql.connect("localhost","root","root","test" )
     
    # 使用cursor()方法获取操作游标 
    cur = conn.cursor()
     
    # SQL 更新语句
    sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
    try:
       # 执行SQL语句
       cur.execute(sql)
       # 提交到数据库执行
       conn.commit()
    except:
       # 发生错误时回滚
       conn.rollback()
     
    # 关闭数据库连接
    conn.close()
    

    2.6对表中数据删除操作

    以下实例演示了删除数据表 EMPLOYEE 中 AGE 大于 20 的所有数据:

    import pymysql
    
    conn = pymysql.connect("localhost","root","root","test")
    cur = conn.cursor()
    sql = "DELETE FROM EMPLOYEE WHERE AGE > 20"
    try:
        cur.execute(sql)
        conn.commit()
    except:
        conn.rollback()
    
    cur.close()
    conn.close()
    
    展开全文
  • 内容主要集中大多数企业常见问题之上,如安装和升级到oracle database 11g数据库软件、创建数据库、导出和导入数据、数据库的备份与恢复、性能调优,等等。  本书还提供了dba完成本职工作必备基本uniix...
  • 单例模式的应用

    2019-10-03 23:08:14
    简单说来,单例模式(也叫单件模式)的作用就是保证整个应用程序的生命周期,任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)。 使用单例模式需要注意三点:1、构造函数需要...

         现实生活中那在某些情况下,有些对象,我们只需要一个就可以了。比如你在做一个项目中,很多部分需要连接数据库,这样你就可以将数据库连接部分封装起来,用到单例模式。

         简单说来,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)。

        使用单例模式需要注意三点:1、构造函数需要声明为非public的形式。(防止使用new操作符来实例化一个对象)。2、拥有一个保存类的实例的静态成员变量$_instance。3、拥有一个访问这个实例的公共静态方法。

    <?php
        class Db{
            static private $_instance;
            private function __construct(){
            
            }
            static public function getInstance(){
                if(!(self::$_instance instanceof self)){
                    self::$_instance=new self();
                }
            return self::$_instance;
        };
    ?>





    转载于:https://www.cnblogs.com/hcxl/p/8321577.html

    展开全文
  • 1.3 开发数据库应用的正确(和不正确)方法 10 1.3.1 了解Oracle体系结构 11 1.3.2 理解并发控制 19 1.3.3 多版本控制 22 1.3.4 数据库独立性 28 1.3.5 怎么能让应用运行得更快 42 1.3.6 DBA与开发人员的关系...
  • 从更大的数据库中选择这些实例。特别是,这里所有患者都是皮马印第安人遗产至少21岁女性。” 并使用了简单。 动机 动机是尝试进行端到端机器学习项目,并获得有关和offcourse等部署平台一些想法,即“由于...
  •  本书面向从事Oracle数据库应用的所有开发人员或DBA。 作译者  Thomas Kyte是Oracle公司核心技术集团的副总裁,从Oracle 7.0.9版本开始就一直任职于Oracle公司,不过,其实他从5.1.5c版本就开始使用Oracle了。 ...
  • 现代社会,软件应用于多个方面。典型软件有电子邮件、嵌入式系统、人机界面、办公套件、操作系统、编译器、数据库、游戏等。同时,各个行业几乎都有计算机软件的应用,如工业、农业、银行、航空、政府部门等。...
  • Java实现登录查重实例

    2020-03-22 21:26:14
    现实生活中,我们登录注册时候,访问数据库,很多应用不允许ID或者用户名重复,注册操作时,如果用户名或者已存在,则抛出异常并提示:亲,该用户名已经被注册!如果没有被注册, 则可以正常注册。 异常类...
  • 作为 web 开发人员,我们的生活围绕着数据操作。我们建立数据库来存储数据,写编码来访问和...很好asp.net对数据库开发的应用,结合具体实例来进行讲解,通俗易懂。与大家分享。 例外附送html标记实例,一起学习一下
  • 随着软件技术快速发展,电子记账本在生活中得到了越来越广泛的应用,已经成为人们日常生活中最常见一种功能服务。它可以帮您轻松记录每天收入、支出,并进行分析,汇总,让您更容易对收入和支出进行预算!使用...
  • 其他一些兴趣包括:烘烤,跟踪生活在窗外蜂鸟,无法控制地尖叫着幼犬以及学习打曲棍球。 您Perfect Plant是Bekah第一个全栈Web应用程序。 技术堆栈:后端:Python,PostgreSQL,Flask,SQLAlchemy,精美...
  • 实例246 Update语句中应用子查询 10.14 联合语句UNION 实例247 使用联合查询 实例248 多表联合查询 实例249 对联合查询后结果进行排序 10.15 内联接查询 实例250 简单内联接查询 实例251 复杂内联接查询 实例252...
  • 该项目目标是使公民有能力有效地组织其城市生活质量,并确保可以获取有关抗议信息。 入门 该项目正在开发,分为三个主要部分-后端,前端和搜寻器。 当前,此存储库存在两个单独软件包-服务器(包括爬网...
  •  《PHP开发实战1200例》分为I、II两卷共计1200个例子,包括了开发各个方面最常用的实例,是目前市场上实例最全面的开发类图书;书实例来源于多位工程师的多年积累,具有很强的实用性。 本书是第I卷,以开发...
  •  《PHP开发实战1200例》分为I、II两卷共计1200个例子,包括了开发各个方面最常用的实例,是目前市场上实例最全面的开发类图书;书实例来源于多位工程师的多年积累,具有很强的实用性。 本书是第I卷,以开发...
  • 实例238 Update语句中应用子查询 7.14 联合语句UNION 实例239 使用联合查询 实例240 多表联合查询 实例241 对联合查询后结果进行排序 7.15 内联接查询 实例242 简单内联接查询 实例243 复杂内联接查询 ...
  • 实例238 Update语句中应用子查询 7.14 联合语句UNION 实例239 使用联合查询 实例240 多表联合查询 实例241 对联合查询后结果进行排序 7.15 内联接查询 实例242 简单内联接查询 实例243 复杂内联接查询 ...
  • 本书是第II卷,以开发人员项目开发经常遇到问题和必须掌握技术为核心,介绍了应用JavaWeb进行程序开发各个方面知识和技巧,主要内容包括流行组件应用数据库应用、图表统计、Ajax框架应用、流行框架、...
  • 本书是第II卷,以开发人员项目开发经常遇到问题和必须掌握技术为核心,介绍了应用JavaWeb进行程序开发各个方面知识和技巧,主要内容包括流行组件应用数据库应用、图表统计、Ajax框架应用、流行框架、...
  • 本书是第II卷,以开发人员项目开发经常遇到问题和必须掌握技术为核心,介绍了应用JavaWeb进行程序开发各个方面知识和技巧,主要内容包括流行组件应用数据库应用、图表统计、Ajax框架应用、流行框架、...
  • 完全解析jBPM4应用开发技术 9位工作流业内专家联袂推荐 随着现代企业管理对于信息化、流程化深度挖掘,具有业务流程管理技术和思想已经成为致力于全面掌控企业级应用系统人士“日常生活、居家旅行”必备...
  • Java开发实战1200例.第2卷.part3

    热门讨论 2013-05-08 22:46:34
    实例015 XSD设定元素出现顺序 25 实例016 XSD使用扩展数据类型 26 实例017 XSD使用元素条理化 29 实例018 XSD中的多属性打包 30 实例019 XSD对元素限定 32 实例020 XSD使用取值范围限定 ...

空空如也

空空如也

1 2 3 4 5 6
收藏数 118
精华内容 47
关键字:

数据库在生活中应用的实例