【資料庫學習】資料庫平臺:mysql,sql server

兔兔西發表於2019-01-09

資料庫管理系統(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/bin
mysql -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

iii>刪

iv>查

v>改

⑤備份與恢復

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 -p
use newDatabaseName;
source /Users/lwh/Desktop/test.sql;

⑥視覺化工具

i>Sequel Pro

免費的工具。這個工具介面比較簡單。
先建立資料庫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>DBeaver

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中新增許可權

    <!-- 在SDCard中建立與刪除檔案許可權 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />    
    <!-- 往SDCard寫入資料許可權 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

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<args.length;i++){
                c.put(column[i], args[i]);
            }
            dbServices.insert("_today_plan", null, c);

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)

是指一個或多個更改資料庫的擴充套件。例如,如果您正在建立一個記錄或者更新一個記錄或者從表中刪除一個記錄,那麼您正在該表上執行事務。重要的是要控制事務以確保資料的完整性和處理資料庫錯誤。

相關文章