博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【数据库学习】数据库平台:Access,mysql,sql server,neo4j
阅读量:236 次
发布时间:2019-03-01

本文共 10733 字,大约阅读时间需要 35 分钟。

数据库管理系统(DBMS):是系统软件,是数据库系统的核心。

常见数据库管理系统有:Access、mysql、sql server

1,Access

2,mysql

①通信协议

MySQL实现了四种通信协议:

i>TCP/IP协议

通常我们通过来连接MySQL,各种主要编程语言都是根据这个协议实现了连接模块

ii>Unix Socket协议

这个通常我们登入MySQL服务器中使用这个协议,因为要使用这个协议连接MySQL需要一个物理文件,文件的存放位置在配置文件中有定义,值得一提的是,这是所有协议中最高效的一个。

iii>Share Memory协议(共享内存协议)

这个只有windows可以使用,使用这个协议需要在配置文件中在启动的时候使用–shared-memory参数,注意的是,使用此协议,一个host上只能有一个server,所以这个东西一般没啥用的,除非你怀疑其他协议不能正常工作,实际上微软的SQL Sever也支持这个协议

iv>Named Pipes协议(命名管道协议)

这个协议也是只有windows才可以用,同shared memory一样,使用此协议,一个host上依然只能有一个server,即使是使用不同的端口也不行,Named Pipes 是为局域网而开发的协议。内存的一部分被某个进程用来向另一个进程传递信息,因此一个进程的输出就是另一个进程的输入。第二个进程可以是本地的(与第一个进程位于同一台计算机上),也可以是远程的(位于联网的计算机上)。正因为如此,假如你的环境中没有或者禁用TCP/IP环境,而且是windows服务器,那么好歹你的数据库还能工作。使用这个协议需要在启动的时候添加–enable-named-pipe选项

②mac安装及配置

i>

注意安装过程中记录下来弹窗中的密码。如果没有记住密码需要进入mysql修改,请查看后续。

ii>在终端中,open .bash_profile (没有需要touch该文件)

在该文件中添加mysql/bin的目录

PATH=$PATH:/usr/local/mysql/bin
source ~/.bash_profile

iii>通过mysql -uroot -p登录mysql, 输入之前保存的密码

重置mysql初始密码:

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpassword');

③mac mysql忘记密码

i>偏好设置关闭mysql

ii>终端进入mysql

$ cd /usr/local/mysql/bin$ sudo su

输入mac管理员密码。

iii>看到sh-3.2#时输入

sh-3.2#./mysqld_safe --skip-grant-tables &

iv>在新的终端中输入,此时不需要密码重新进入mysql

mysql -u -root

v>修改root密码

首先执行下面命令为了能够修改任意的密码

mysql> FLUSH PRIVILEGES;

之后执行修改密码的SQL语句:

mysql> SET PASSWORD FOR root@'localhost' = PASSWORD('newPsw');

vi>最后刷新

FLUSH PRIVILEGES;

Control+D退出mysql

vii>使用mysql

mysql -u root -p

输入新修改的密码。#

④mysql使用

sql语句基本和正常的语句相同。

i>终端进入mysql:

cd /usr/local/mysql/binmysql -u root -p

输入密码即可进入mysql

ii>增

建库:create database testDB character set utf8;

修改库编码:alter database app_relation character set utf8;
表的属性:

  • sql server的varchar(MAX)类型替换为text。
  • 自增:AUTO_INCREMENT。 id int AUTO_INCREMENT primary key not null

⑤备份与恢复

i> 打开Terminal,输入mysqldump,发现Terminal提示mysqldump: command not found 则进入ii,否则进入iii

ii> 之所以会出现mysql或者mysqldump这样的命令找不到,我们可以打开/usr/bin文件夹,发现bin目录中并没有Mysql打头的UEF文件,而在/usr/local/mysql/bin中可以找到这样的文件,说明mysql的命令默认安装路径是不在bin目录中的,因而我们需要在环境变量中配置mysql的所有命令。按照如下步骤配置:
打开terminal输入 open ~/.bash_profile
添加如下代码:

#mysql PATH=$PATH:/usr/local/mysql/bin export

保存并关闭。Terminal中执行以下代码:

source ~/.bash_profile

再次输入mysqldump确定可以使用。

iii> 备份

cd 要导出到的目录  (如:cd /Users/lwh/Desktop)mysqldump -u root -p databaseName>test.sql

iv>还原

进入mysql(由于修改过~/.bash_profile,所以可以直接在终端输入以下代码):

mysql -u root -puse newDatabaseName;source /Users/lwh/Desktop/test.sql;

⑥可视化工具

i>

免费的工具。这个工具界面比较简单。

先创建数据库characterDB,然后进行连接,如下图所示:
其中3306为默认端口。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190109111404190.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1N1bnNoaW5lVGFu,size_16,color_FFFFFF,t_70

ii>

Github下载,开源免费。这个界面比较丰富。

支持主流操作系统:Windows,Linux,Mac OS X,Solaris
支持所有流行的数据: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, Teradata, MongoDB, Cassandra, Redis, etc.

本地数据库连接:

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190109155304477.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1N1bnNoaW5lVGFu,size_16,color_FFFFFF,t_70

3,sql server

①应用

打开SQL Server 配置管理器:运行SQLServerManager10.msc命令。

SQL Server默认端口:1433

②备份与恢复

i>所有文件 备份与恢复

备份:数据库右击 -> 任务 -> 备份 -> 添加 -> 选择文件地址(文件类型选择所有文件) -> 依次确定

还原:新建数据库 右击 -> 任务 -> 还原 -> 数据库 -> 选项 -> 覆盖现有数据库 -> 常规 -> 源设备 -> 添加(文件类型选择全部文件,然后选择之前备份的文件) -> 还原

ii>sql文件 备份与恢复

备份:数据库右击 -> 任务 -> 生成脚本 -> 选择特定数据库对象 -> 选择表,然后下一步 -> 高级(在最后的要编写脚本的数据的类型,选择架构和数据) -> 选择文件名,依次下一步至完成。

还原:新建数据库,文件 -> 打开 -> 文件 -> 打开对应sql文件,执行即可。

4,android之sqlite

①概念

sqlite是一款轻量级数据库,是遵守ACID(指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability))的关系型数据库管理系统。在嵌入式设备中,可能只需要几百K的内存就够了。

SQLite默认是打开事务的。

②安全性

android手机root之后,就可以在/data/data/包名/database/目录中查看sqlite数据库。所以,对于敏感信息,应该考虑加密。

SQLite不支持加密,所以我们针对数据库文件加密。现有两种解决方案:

i>对数据库中的数据进行加密

①优点:

加密速度快。
程序无须变动,只针对数据进行加密。
②缺点:
来回加密,造成处理数据缓慢。
仅对数据加密,依然可以看到数据表的sql语句,可能猜测到表的作用。
③实现:
一是:对明文数据进行加密返回密文数据
二是:对密文数据进行解密返回明文数据

ii>对数据库文件进行加密

①优点

对整个文件进行了加密,用户通过编辑器看不到任何有用的数据。
进行数据库打开时,使用程序即可解密文件。
②缺点
需要修改sqlite源码,这个工作难度比较大。
③实现(太难,本人并没有进行实验)
a.修改sqlite源代码,追加对数据库文件进行加密的功能。
b.编译含有加密功能的程序源代码,生成各自平台需要使用的库文件。
c.将加密sqlite库文件引入各自平台中,修改数据库访问层代码。
d.进行程序的部署,测试。

③SQLiteDatabase

Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的api。

④SQLitOpenHelper

我们往往不会直接操作SQLiteDatabase这个类,而是自己创建一个继承自SQLitOpenHelper的子类来实现数据库操作。

这样做的目的一是为了以后如果数据库升级不至于要改动太多代码,已实现封装;二则是为了我们使用更方便。
通过getWriteableDatabase和getReadableDatebase()方法生成一个数据库,并对数据库进行管理。

i>在AndroidManifest.xml中添加权限

ii>添加继承SQLiteOpenHelper的MyHeper类,用于创建使用数据库。

需要实现两个抽象方法:OnCreate和OnUpgrade。

当Android应用运行时,SQLiteOpenHelper会先检查是否已经存在数据库,如果不存在,就创建数据库,然后打开数据库,最后调用OnCreate方法,所以我们需要再OnCreate中创建表(视图等);如果数据库已存在,而版本号比上次创建的数据库版本号高,就调用OnUpgrade,用于升级。

import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.util.Log;public class MyHelper extends SQLiteOpenHelper {	private String Tag = "MyHelper";		private static String DB_NAME = "luoDB.db";  //数据库名称		public static String TABLE_NAME_TASK = "Task"; //联班任务_fra_task表名		/**super(参数1,参数2,参数3,参数4),其中参数4是代表数据库的版本,	 * 是一个大于等于1的整数,如果要修改(添加字段)表中的字段,则设置	 * 一个比当前的 参数4大的整数 ,把更新的语句写在onUpgrade(),下一次	 * 调用	 */	public MyHelper(Context context) {		super(context, DB_NAME, null, 1);	}	//用于第一次创建数据库	@Override	public void onCreate(SQLiteDatabase db) {		//Create table		try{			String sql = "CREATE TABLE "+TABLE_NAME_TASK + "("					  	  + "TaskCode TEXT PRIMARY KEY,"						  + "TaskState TEXT,"						  + "TaskName TEXT"						  + ");";			db.execSQL(sql); 		//创建表		}catch(Exception e){			LogUtil.i(Tag, "onCreate" + e.getMessage());		}	}	//用于数据库升级	@Override	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {	}}

iii>SQLite升级

数据库升级增加表和删除表都不涉及数据迁移,但是修改表涉及到对原有数据进行迁移。升级的方法如下所示:

将现有表命名为临时表。创建新表。将临时表的数据导入新表。删除临时表。

如果是跨版本数据库升级,可以由两种方式,如下所示:

逐级升级,确定相邻版本与现在版本的差别,V1升级到V2,V2升级到V3,依次类推。跨级升级,确定每个版本与现在数据库的差别,为每个case编写专门升级大代码。

iv>数据的增——insert

MyHelper类中:

public void insert(String table, String nullColumnHack, ContentValues values){    SQLiteDatabase db = this.getWritableDatabase();    db.insert(table, nullColumnHack, values);}

参数说明:

table:表名,直接使用字符串指定;
nullColumnHack:指定null值的列,SQLite里不允许空行,使用这个参数可以指定一个列的值为null,当存入行为空时,这个列的值就被指定为null;
values:使用类似map键值对映射的数据结构ContentValues来指定插入的数据

举例:

String[] args = {                    today,                    content,                    Boolean.toString(checked)            };            String[] column = {                    "[_Date]",                    "[Item]",                    "[Check]"            };            //数据库中添加数据            ContentValues c = new ContentValues();            for(int i=0;i

v>数据的删——delete

MyHelper类中:

public void delete(String table , String whereClause , String[] whereArgs){        SQLiteDatabase db = this.getWritableDatabase();        db.delete(table, whereClause, whereArgs);        Log.d("Delete",whereClause);    }

参数说明:

table:表名;
whereClause:可选,指定删除条件,相当于SQL语句WHERE语句之后的类容,可通过?来指定参数;
whereArgs:当whereClause指定了?参数,这个字符串数组里就是?所代表的参数,个数应与?数一致;

举例:

String args[] ={    today,        content,        Boolean.toString(checked)};dbServices.delete("_today_plan", "[_Date]=? and [Item]=? and [Check]=?",args);

vi>数据的修改——update

MyHelper类中:

public void update(String table, ContentValues values,        String whereClause, String[] whereArgs){        SQLiteDatabase db = this.getWritableDatabase();        db.update(table, values, whereClause, whereArgs);    }

参数说明:

table:表名;
values:同上,是需要修改的列和值的映射集合;
whereClause:修改的行所需符合的条件;
whereArgs:指定条件里的参数;

示例:

String args[] ={    today,        content,        Boolean.toString(!m)};ContentValues c = new ContentValues();c.put("[Check]", Boolean.toString(m));dbServices.update("_today_plan", c,"[_Date]=? and [StartTime]=? and [Item]=? and [Check]=?",args);

vii>数据的查询——read

MyHelper类中:

和前面有所不同了,读取数据所用的方法是直接执行查询语句,获取游标,然后通过游标来遍历数据库,方法如下:

public Cursor read(String sql ,String[] args){        SQLiteDatabase db = this.getReadableDatabase();        Cursor cursor = db.rawQuery(sql, args);        Log.d("Database",cursor.getColumnName(0));        return cursor;    }

方法说明:

请注意:在这里db获取的是只读的数据库(getReadableDatabase),而在上述三种操作里都是使用的可写数据库(getWritableDatabase);至于游标的用法此处就不再赘述,只需看一下API的名字就能掌握基本用法,但最后一定要记得将游标关闭(close)!

⑤模糊查询

i>使用这种query方法%号前不能加’

cursor = db.query(MyHelper.TABLE_NAME_TASK, 					new String[] { "TaskCode","TaskName"}, "TaskName like ?",					new String[]{"%" + TaskName + "%"}, null, null, null);

ii>使用这种query方法%号前必须加’

Cursor  c_test = mDatabase.query(tab_name, 					new String[]{tab_field02},					tab_field02+"  like '%" + str[0] + "%'", null, null, null, null);

iii>使用这种方式必须在%号前加’

String current_sql_sel = "SELECT  * FROM "+tab_name 									+" where "+tab_field02									+" like '%"+str[0]+"%'";			Cursor c_test = mDatabase.rawQuery(current_sql_sel, null);

⑥多重排序,字符串排序

cursor = db.query(MyHelper.TABLE_NAME_TASK, 					new String[] { "TaskCode",  "TaskName","TaskState"}, "TaskName like ?",					new String[]{"%" + TaskName+ "%"}, null, null,					"(case"					+ " when TaskState like '" + TaskState.STATE2 + "' then 2"					+ " when TaskState like '" + TaskState.STATE1 + "' then 1"					+ " else 3"					+ " end)"					+ ",TaskCode asc");

⑦事务(Transaction)

是指一个或多个更改数据库的扩展。例如,如果您正在创建一个记录或者更新一个记录或者从表中删除一个记录,那么您正在该表上执行事务。重要的是要控制事务以确保数据的完整性和处理数据库错误。

4,neo4j

1)标签属性图模型

在这里插入图片描述

Nodes – 节点

在其他图模型中称作“点”、“顶点”、“对象”。

语法:

节点必须包含在括号 () 内;

节点可以有属性:(n:Label {prop: 'value'})

Relationships – 关系

在其他图模型中也称作“边”、“弧”、“线”。关系拥有类型,关系在创建时必须指定方向 ,关系在查询时可以不指定方向表示双向关系。

语法:
关系两端各有一个短横线“-”,用方括包含关系类型,关系类型名前面必须有冒号 (😃 。在其中一端用 >或 < 代表关系的方向,也可以没有方向:

- -  ,<- -,- ->  -[:DIRECTED]- ->

关系也可以有属性:-[:KNOWS {since: 2010}]

Properties – 属性

可以定义在节点和关系上。

语法:

包含在{}中。

Labels – 标签

代表节点的类别,节点可以没有标签或者有多个标签。

标签对节点进行分类,似关系数据库中的表 标签对节点进行分类,类似关系数据库中的表。
语法:

标签名前必须有冒号;

模式

模式是由关系连接起来的节点构成的表达式。

() -[] -()    #没有方向的关系() -[] ->()   #有方向的关系()< -[] -()   #双向的关系
(n:Label {prop:'value'})-[:TYPE]- >(m:Label)

2)Cypher

Neo4j图形数据库的查询语言是Cypher(CQL), CQL看似简单,但由于图的结构可能在实际应用中比较复杂。

  • CQL遵循SQL语法。
  • 命名规范:关键字-全部大写;标签名-首字母大写;关系名-全部大写;属性名、变量名-全部小写

3)CQL-常用命令

CQL命令 用法
CREATE创建 创建节点,关系和属性
MATCH匹配 检索有关节点,关系和属性数据
RETURN返回 返回查询结果
WHERE哪里 提供条件过滤检索数据
DELETE删除 删除节点和关系
REMOVE移除 删除节点和关系的属性
ORDER BY以…排序 排序检索数据
SET组 添加或更新标签
limit 10 只显示10条数据
MATCH (m:Movie)  #Movie为标签,m为节点变量RETURN m, m.title #属性以{variable}.{property_key}的方式访问 .title返回属性
MATCH (p:Person)-[r:ACTED_IN]->(m:Movie)  #r是变量,保存关系;ACTED_IN为关系类型RETURN p, r, m
MATCH path = (:Person)-[:ACTED_IN]->(:Movie)  #path是变量,保存路径RETURN path

4)CQL-常用函数

函数 用法
String字符串 用于使用String字面量。
Aggregation聚合 用于对CQL查询结果执行一些聚合操作。
Relationship关系 用于获取关系的细节,如startnode,endnode等。

5)清空所有数据

match (n) detach delete n

6)常用shell命令

#重启./bin/neo4j start   #restart stop#修改密码./bin/neo4j-admin set-initial-password  psw  #psw为密码#The client is unauthorized due to authentication failure.问题解决停止neo4j服务,并且删除data/dbms/auth,重新启动

转载地址:http://luqt.baihongyu.com/

你可能感兴趣的文章