加载中...
学习使用数据库
发表于:2012-12-13 | 分类: 网络应用
字数统计: 4.2k | 阅读时长: 15分钟 | 阅读量:

 

基本知识

数据库(DataBase,DB)是一个长期存储在计算机内的、有组织的、有共享的、统一管理的数据集 从发展的历史看,数据库是数据管理的高级阶段,它是由文件管理系统发展起来的。 数据库就好比一个容器,盛装着你需要的数据,当你想要查看的时候,通过程序代码调出来。 查询”功能是一个信息管理系统的核心,将信息存入数据表中是为了在需要的时候从中提取有用的信息,如何满足用户层出不穷的各种查询要求,是设计查询功能的目标。本软件提供的查询窗口是真正意义上的任意条件查询,而不是简单的多重条件查询,因为我们允许用户在建立查询条件时不但可以使用任意多的“并且”、“或者”概念,还允许用户进行单个,多个筛选查询,这个功能看似简单,但要做到却并不容易,因此大多数同类软件没有提供此功能。在软件中输入查询条件更简单,只要用鼠标在相应内容上双击即可。 MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购。而2009年,SUN又被Oracle收购。对于Mysql的前途,没有任何人抱乐观的态度。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。 SQLite,是一款非常流行的嵌入式数据库,它支持 SQL 查询,并且只用很少的内存。Android 在运行时集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。对数熟悉 SQL 的开发人员来时,使用 SQLite 相当简单。SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。 不像常见的客户-服务器范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分。所以主要的通信协议是在编程语言内的直接API调用。这在消耗总量、延迟时间和整体简单性上有积极的作用。整个数据库(定义、表、索引和数据本身)都在宿主主机上存储在一个单一的文件中。它的简单的设计是通过在开始一个事务的时候锁定整个数据文件而完成的

实践

常用程序与软件

mysql  phpmyadmin   Navicat      EMS SQL Manager fo MySQL sqlite SQLiteExpert

数据源

可以自己在excel中建立初始数据或者将现有excel数据导入到数据库中 常用方法: 将源数据另存为cvs格式,然后记事本另存为UTF-8格式,然后像phpmyadmin或sqlite expert等中导入进来,为保证不乱码,包括源数据、数据库编码、数据库表格编码、字段编码都一致采用UTF-8 选中将首行作为字段名称的选项,比如phpmyadmin中为“文件首行包含数据表的字段名(若未选此项,首行将被视为是数据)”

软件中导出

软件中建立视图或报表进行输出使用 上述程序或软件中都有输出的功能,比如导出excel、html格式

程序自己调用

像mysql可以用php中进行调用然后用网页显示 示例 单个项目任务情况"; echo "

"; echo "
项目名称: "; $sql1 = "SELECT \`projectname\` FROM \`projecttable\` WHERE \`projectid\` = 1 "; $result1=mysql\_query($sql1,$mydb); if($arr1=mysql\_fetch\_array($result1)){ //while 改为if //循环输出数组 echo "  {$arr1\['projectname'\]} "; } else echo "   "; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; while($arr=mysql\_fetch\_array($result)){ //循环输出数组 echo ""; echo "";//OR $arr\[0\] echo ""; echo ""; //echo ""; $sql1 = "SELECT \`personname\` FROM \`persontable\` WHERE \`personid\` = {$arr\['performerid'\]} "; $result1=mysql\_query($sql1,$mydb); if($arr1=mysql\_fetch\_array($result1)){ //while 改为if //循环输出数组 echo ""; } else echo ""; //echo ""; $sql1 = "SELECT \`personname\` FROM \`persontable\` WHERE \`personid\` = {$arr\['checkerid'\]} "; $result1=mysql\_query($sql1,$mydb); if($arr1=mysql\_fetch\_array($result1)){ //while 改为if //循环输出数组 echo ""; } else echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; } echo "
ID任务名称截止日期执行者考核者考核依据积分百分比状态报告检查结果实际完成日期完成质量百分比追加追减积分备注
 {$arr\['taskid'\]} {$arr\['taskname'\]} {$arr\['taskdate'\]} {$arr\['performerid'\]} {$arr1\['personname'\]}  {$arr\['checkerid'\]} {$arr1\['personname'\]}  {$arr\['outputforcheck'\]} {$arr\['scorepercent'\]} {$arr\['statusreport'\]} {$arr\['checkresult'\]} {$arr\['realfinishdate'\]} {$arr\['qualitypercent'\]} {$arr\['signature'\]} {$arr\['scoreadd'\]} {$arr\['memo'\]}
"; ?>

memento

数据库管理Memento Database是Android平台上的一款个人数据库软件,通过它,你能够在你的手机上存储和管理你的所有个人资料,你还可以与Google文件同步和创建相关信息。 这款软件集支出、收入、食谱、任务等一切个人信息为一体,利用它你能轻松的管理几乎任何类型的数据。总之,这是一款非常强大的个人资料管理软件。 Memento Database是一款个人信息管理软件,通过它,你能够在你的手机上存储和管理你的所有个人资料,你还可以与Google文件同步和创建相关信息。这款软件集支出、收入、食谱、任务等一切个人信息为一体,利用它你能轻松的管理几乎任何类型的数据。总之,这是一款非常强大的个人资料管理软件,安装了它你绝对不会后悔的! 软件特色: - 自定义存储条目的字段; - 对任何项目进行排序、分组和筛选; - 19种类型的字段:文本、数字、日期/时间、等级、货币,图片,音频,联系,谷歌地图坐标及其他; - 可以和Google文档同步; - 支持导入和导出CSV文件; - 使用AES- 128加密技术来保护资料的安全; - 提醒功能; - 备份和恢复数据功能; - 其他更多功能。 很多人可能不知道这个到底是干嘛的,有人可能还以为数据库和日常用机没什么关系~~不过如果你以前用过Treo或者其他智能机器,就会知道数据库软件几乎是最实用、最强大的家伙。你可以用它来做笔记本、To-do、查列车时刻表、查医学名词解释、做思维导图、替换表格文件、做销售表格…只要你建立或下载到了对应的数据库(也可以是任意格式的表格). 使用memento做任务记录经验 定制字段 可方便导入导出cvs进行数据迁移 注意: cvs迁移的时候,格式是UTF-8无BOM编码格式的,用电子表格打开后会转化为ANSI,用记事本另存为UTF-8还不行,这样导入的时候找不到开头的字段,需要用notepad++等转化为UTF-8无BOM编码格式 另外,通过电子表格编辑再存储之后,引号会丢失,经过尝试,这并不影响使用

SQL实例

select projectname from projecttable where projectid=(select projectid from tasktable where taskid=37) select taskid,taskname,taskdate from tasktable where projectid in(select projectid from projecttable ) 给出人口多于Russia(俄国)的国家名称 以下为引用的内容: SELECT name FROM bbc WHERE population> (SELECT population FROM bbc WHERE name=’Russia’) 查询选学“101”课程的成绩高于“9505201”号学生成绩的所有学生记录, 并按成绩从高到低排列。 select x.* from sclass x,sclass y where x.cno=’’101’’ and x.degree>y.degree and y.sno=’’9505201’’ and y.cno=’’101’’ order by x.degree desc 给出’India’(印度), ‘Iran’(伊朗)所在地区的所有国家的所有信息 以下为引用的内容: SELECT * FROM bbc WHERE region IN (SELECT region FROM bbc WHERE name IN (‘India’,’Iran’)) 但是如何显示成名称呢 select taskid as kkk from tasktable as则输出列别名 select * from tasktable where projectid=(select projectid from projecttable where projectname like ‘远程控制终端’) select tasktable.taskid,tasktable.taskname,tasktable.taskdate,persontable.personname as performar,persontable.personname as checka   from tasktable inner JOIN  persontable  where tasktable.performerid=persontable.personid 查找与喻自强在同一个单位的员工姓名、性别、部门和职称 select emp_no,emp_name,dept,title from employee where  dept in (select dept from employee where emp_name=’喻自强’) 按部门进行汇总,统计每个部门的总工资 select dept,sum(salary) from employee group by dept 统计表中员工的薪水在4000-6000之间的人数 select count(*)as 人数 from employee where salary between 4000 and 6000 mysql中,多表间查询: 表A记录如下: aID        aNum 1           a20050111 2           a20050112 3           a20050113 4           a20050114 5           a20050115 表B记录如下: bID        bName 1            2006032401 2           2006032402 3           2006032403 4           2006032404 8           2006032408 实验如下: 1.left join sql语句如下: select * from A left join B on A.aID = B.bID 结果如下: aID        aNum                   bID           bName 1            a20050111         1               2006032401 2            a20050112         2              2006032402 3            a20050113         3              2006032403 4            a20050114         4              2006032404 5            a20050115         NULL       NULL (所影响的行数为 5 行) 结果说明: left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的. 换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID). B表记录不足的地方均为NULL. 2.right join sql语句如下: select * from A right join B on A.aID = B.bID 结果如下: aID        aNum                   bID           bName 1            a20050111         1               2006032401 2            a20050112         2              2006032402 3            a20050113         3              2006032403 4            a20050114         4              2006032404 NULL    NULL                   8              2006032408 (所影响的行数为 5 行) 结果说明: 仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充. 3.inner join sql语句如下: 结果如下: aID        aNum                   bID           bName 1            a20050111         1               2006032401 2            a20050112         2              2006032402 3            a20050113         3              2006032403 4            a20050114         4              2006032404 结果说明: 很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录. 暂无评论。 子查询: select * from a where 姓名 in (select 姓名 from b) 多表操作: 来说一下多表连接的方法。有两种方法笛卡尔乘积和join on连接。下面详细的介绍这两种连接方法。 1:笛卡尔乘积(交叉连接) 语法: Select 字段名列表 from 表名1,表名2 …… [where条件] (默认产生的记录总数=两个数记录乘积) 2 join in连接 Join on连接可以分为一下几种连接: 内连接:inner join 必须是满足条件的记录 左外连接:left join 显示左表所有的记录,如果右表没有与之相对应记录则相应字段为空 右外连接:right join显示右表所有的记录,如果左表没有与之相对应记录则相应字段为空 全外连接:显示所有记录,如果另一个表中没有与之相应得记录,则相应字段为空 联合: 联合的作用是显示几个表的内容在一个表上。 注意: 1:每个select语句字段必须要一致 2:如果字段名不同,则以第一个select语句为准 3:要合并的数据类型必须兼容,即类型可以不同,但必须可以转换 项目表:项目id 项目名称等 人员表:人员id 名称等 任务表:含所属项目id,执行人id,考核人id 期望输出:将任务表中执行人id 考核人id换成人员表中的名称 从网上搜索大量资料终于找到实现方法了!: select tasktable.taskid,tasktable.taskname,taskdate,t1.personname as performer, t2.personname as checker from tasktable,persontable as t1,persontable as t2 where t1.personid = tasktable.performerid and t2.personid = tasktable.checkerid /* 像下面的不能同时实现执行人和考核人两列 select tasktable.taskid,tasktable.taskname,persontable.personname as checker from tasktable,persontable where (tasktable.checkerid=persontable.personid) */ {网上有用参考: 求SQL查询语句,查询出表TB中所有id在TA对应的name值,表记录举例如下: 表名:TA id name ——- 1  A 2  B 3  C 表名:TB id1 id2 ——- 1   2 2   1 2   3 查询结果举例: name1 name2 A         B B         A B         C SELECT T1.name as name1,T2.name as name2 FROM TA as T1,TA as T2,TB WHERE T1.id = TB.id1 AND T2.id = TB.id2

软件

navicat 含多种 sql manager for mysql/

SQL语法

select * from persontable inner join tasktable

数据库视图

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。 行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。 对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。分布式查询也可用于定义使用多 个异类源数据的视图。如果有几台不同的服务器分别存储组织中不同地区的数据,而您需要将这些服务器上相似结构的数据组合起来,这种方式就很有用。 一、视图的作用 * 简单性。看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。 * 安全性。通过视图用户只能查询和修改他们所能见到的数据。数据库中的其它数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上: 使用权限可被限制在基表的行的子集上。 使用权限可被限制在基表的列的子集上。 使用权限可被限制在基表的行和列的子集上。 使用权限可被限制在多个基表的连接所限定的行上。 使用权限可被限制在基表中的数据的统计汇总上。 使用权限可被限制在另一视图的一个子集上,或是一些视图和基表合并后的子集上。 * 逻辑数据独立性。视图可帮助用户屏蔽真实表结构变化带来的影响。 二、视图的优点 (1)视图能简化用户的操作 (2)视图机制可以使用户以不同的方式查询同一数据 (3)视图对数据库重构提供了一定程度的逻辑独立性 (4)视图可以对机密的数据提供安全保护 三、视图的安全性 视图的安全性可以防止未授权用户查看特定的行或列,是用户只能看到表中特定行的方法如下: 1 在表中增加一个标志用户名的列; 2 建立视图,是用户只能看到标有自己用户名的行; 3 把视图授权给其他用户。 四、逻辑数据独立性 视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。视图可以在以下几个方面使程序与数据独立: 1 如果应用建立在数据库表上,当数据库表发生变化时,可以在表上建立视图,通过视图屏蔽表的变化,从而应用程序可以不动。 2 如果应用建立在数据库表上,当应用发生变化时,可以在表上建立视图,通过视图屏蔽应用的变化,从而使数据库表不动。 3 如果应用建立在视图上,当数据库表发生变化时,可以在表上修改视图,通过视图屏蔽表的变化,从而应用程序可以不动。 4 如果应用建立在视图上,当应用发生变化时,可以在表上修改视图,通过视图屏蔽应用的变化,从而数据库可以不动。 五、视图的书写格式 CREATE VIEW <视图名>[(列名组)] AS <子查询> DROP VIEW <索引名> 注意:视图可以和基本表一样被查询,但是利用视图进行数据增,删,改操作,会受到一定的限制。 (1)由两个以上的基本表导出的视图 (2)视图的字段来自字段表达式函数 (3)视图定义中有嵌套查询 (4)在一个不允许更新的视图上定义的视

上一篇:
App Engine 众生相, 看清GAE/SAE/ACE/BAE/TAE中浮躁的云即浮云
下一篇:
电动车的保养
本文目录
本文目录