關係型資料庫

1、今天講講MySQL資料庫:

MySQL 為關係型資料庫(Relational Database Management System), 這種所謂的”關係型”可以理解為”表格”的概念, 一個關係型資料庫由一個或數個表格組成。

表頭(header): 每一列的名稱;

列(row): 具有相同數據類型的數據的集合;

行(col): 每一行用來描述某個人/物的具體資訊;

值(value): 行的具體資訊, 每個值必須與該列的數據類型相同;

鍵(key): 表中用來識別某個特定的人/物的方法, 鍵的值在當前列中具有唯一性。

2、Mysql用戶設置:

如果需要添加 MySQL 用戶,只需要在 mysql 資料庫中的 user 表添加新用戶即可。

以下為添加用戶的的實例,用戶名為ly,密碼為123456,並授權用戶可進行 SELECT, INSERT 和 UPDATE操作許可權:

1) // 使用mysql資料庫

 use mysql;

2) // 添加用戶

insert into user(host, user, password, select_priv, insert_priv, update_priv) values(‘localhost’, ‘ly’, PASSWORD(‘123456’), ‘Y’,  ‘Y’,  ‘Y’); 

3) // 重新載入授權表

flush privileges;

4)  // 查詢

select host, user, password from user where user = ‘ly’;  

注意:

(1)在添加用戶時,請注意使用MySQL提供的 PASSWORD() 函數來對密碼進行加密。

(2)在添加後需要執行 FLUSH PRIVILEGES 語句。 這個命令執行後會重新載入授權表。如果不使用該命令,你就無法使用新          

創建的用戶來連接mysql伺服器,除非你重啟mysql伺服器。

(3)可以在創建用戶時,為用戶指定許可權,在對應的許可權列中,在插入語句中設置為 ‘Y’ 即可,用戶許可權列表如下:

 Select_priv   、  Insert_priv  、  Update_priv   、  Delete_priv    、  Create_priv    、   Drop_priv   、  Reload_priv

 Shutdown_priv    、  Process_priv     、  File_priv    、  Grant_priv    、   References_priv   、 Index_priv   、 Alter_priv 

3、管理MySql的命令:

use 資料庫名            //選擇要操作的Mysql資料庫,使用該命令後所有Mysql命令都只針對該資料庫。

show databases      //列出 MySQL 資料庫管理系統的資料庫列表。

Subtopic

show tables             //顯示指定資料庫的所有表,使用該命令前需要使用 use 命令來選擇要操作的資料庫。

4、MySQL數據類型:

1)整形 

2)浮點型

設一個欄位定義為float(5,3),如果插入一個數123.45678,實際資料庫里存的是123.457,但總個數還以實際為準,即6位。

3)定點型

浮點型在資料庫中存放的是近似值,而定點類型在資料庫中存放的是精確值。 

例:decimal(m,d) 參數m<65 是總個數,d<30且 d<m 是小數位

4)字元串

char和varchar:

(1).char(n) 若存入字元數小於n,則以空格補於其後,查詢之時再將空格去掉。所以char類型存儲的字元串末尾不能有空格,varchar不限於此。 

(2).char(n) 固定長度,char(4)不管是存入幾個字元,都將佔用4個位元組,varchar是存入的實際字元數+1個位元組(n<=255)或2個位元組(n>255),所以varchar(4),存入3個字元

將佔用4個位元組。 

(3).char類型的字元串檢索速度要比varchar類型的快。

varchar和text: 

a.varchar可指定n,text不能指定,內部存儲varchar是存入的實際字元數+1個位元組(n<=255)或2個位元組(n>255),text是實際字元數+2個位元組。 

b.text類型不能有默認值。 

c.varchar可直接創建索引,text創建索引要指定前多少個字元。varchar查詢速度快於text,在都創建索引的情況下,text的索引似乎不起作用。

5)二進位數據

(1).BLOB和text存儲方式不同,TEXT以文本方式存儲,英文存儲區分大小寫,而_Blob是以二進位方式存儲,不分大小寫。 

(2).BLOB存儲的數據只能整體讀出。 

(3).TEXT可以指定字符集,BLOB不用指定字符集。

6)日期時間類型

若定義一個欄位為timestamp,這個欄位里的時間數據會隨其他欄位修改的時候自動刷新,所以這個數據類型的欄位可以存放這條記錄最後被修改的時間。

7)數據類型的屬性

MySql的使用:

(1)、登錄Mysql

當 MySQL 服務已經運行時, 我們可以通過MySQL自帶的客戶端工具登錄到MySQL資料庫中, 首先打開命令提示符, 輸入以下格式的命名:

mysql -h 主機名 -u 用戶名 -p

-h : 該命令用於指定客戶端所要登錄的MySQL主機名, 登錄當前機器該參數可以省略;

-u : 所要登錄的用戶名;

-p : 告訴伺服器將會使用一個密碼來登錄, 如果所要登錄的用戶名密碼為空, 可以忽略此選項。

以登錄剛剛安裝在本機的MySQL資料庫為例, 在命令行下輸入 mysql -u root -p 按回車確認, 如果安裝正確且MySQL正在運行, 會得到以下響應。

Enter password:

若密碼存在, 輸入密碼登錄, 不存在則直接按回車登錄, 按照本文中的安裝方法, 默認 root 帳號是無密碼的。登錄成功後你將會看到

Welecome to the MySQL monitor… 的提示語。

然後命令提示符會一直以 mysql> 加一個閃爍的游標等待命令的輸入, 輸入 exit 或 quit 退出登錄。

(2)、創建一個資料庫

使用 create database 語句可完成對資料庫的創建, 創建命令的格式如下:

create database 資料庫名 其他選項];

例如我們需要創建一個名為 my_db 的資料庫, 在命令行下執行以下命令:

create database my_db character set gbk;

為了便於在命令提示符下顯示中文, 在創建時通過 character set gbk 將資料庫字元編碼指定為 gbk。創建成功時會得到 Query OK, 1 row affected(0.02 sec) 的響應。

注意: MySQL語句以分號(;)作為語句的結束, 若在語句結尾不添加分號時, 命令提示符會以 -> 提示你繼續輸入(有個別特例, 但加分號是一定不會錯的); 

提示: 可以使用 show databases; 命令查看已經創建了哪些資料庫。

選擇所要操作的資料庫:

要對一個資料庫進行操作, 必須先選擇該資料庫, 否則會提示錯誤:

 ERROR 1046(3D000): No database selected

***兩種方式對資料庫進行使用的選擇:

a.在登錄資料庫時指定, 命令: mysql -D 所選擇的資料庫名 -h 主機名 -u 用戶名 -p

例如登錄時選擇剛剛創建的資料庫: mysql -D my_db -u root -p

b. 在登錄後使用 use 語句指定, 命令: use 資料庫名;

use 語句可以不加分號, 執行 use my_db 來選擇剛剛創建的資料庫, 選擇成功後會提示: Database changed。

(3)、創建資料庫表

使用 create table 語句可完成對錶的創建, create table 的常見形式:

create table 表名稱(列聲明);

以創建 students 表為例, 表中將存放 學號(id)、姓名(name)、性別(sex)、年齡(age)、聯繫電話(tel) 這些內容:

  create table students

  (

    id int unsigned not null auto_increment primary key,

    name char(8) not null,

    sex char(4) not null,

    age tinyint unsigned not null,

    tel char(13) null default “-“

  );   

對於一些較長的語句在命令提示符下可能容易輸錯, 因此我們可以通過任何文本編輯器將語句輸入好後保存為 createtable.sql 的文件中,

通過命令提示符下的文件重定向執行執行該腳本。 

打開命令提示符, 輸入: mysql -D my_db -u root -p < createtable.sql

 (提示: 1.如果連接遠程主機請加上 -h 指令; 2. createtable.sql 文件若不在當前工作目錄下需指定文件的完整路徑。)

5、數據插入

insert 語句可以用來將一行或多行數據插到資料庫表中, 使用的一般形式如下: 

insert into] 表名 (列名1, 列名2, 列名3, …)] values (值1, 值2, 值3, …);

例如:

(1)要給 my_db 資料庫中的 students 表插入一條記錄, 執行語句:                 

         insert into students values(NULL, “王三”, “男”, 20, “13811371377”);

(2)需要插入部分數據, 或者不按照列的順序進行插入, 可以使用這樣的形式進行插入:

          insert into students (name, sex, age) values(“孫麗華”, “女”, 21);

6、數據查詢

(1)普通查詢:

select 語句常用來根據一定的查詢規則到資料庫中獲取數據, 其基本的用法為:

select 列名稱 from 表名稱 查詢條件];

例如:

要查詢 students 表中所有學生的名字和年齡, 輸入語句 select name, age from students;

也可以使用通配符 * 查詢表中所有的內容, 語句: select * from students;

(2)按特定條件查詢:

*where 關鍵詞用於指定查詢條件, 用法形式為: select 列名稱 from 表名稱 where 條件;

以查詢所有性別為女的資訊為例, 輸入查詢語句: select * from students where sex=”女”;

*where 子句不僅僅支援 “where 列名 = 值” 這種名等於值的查詢形式, 對一般的比較運算的運算符都是支援的,

例如 =、>、<、>=、<、!= 以及一些擴展運算符 is not] null、in、like 等等。 還可以對查詢條件使用 or 和 and 進行組合查詢。

示例:

查詢年齡在21歲以上的所有人資訊: select * from students where age > 21;

查詢名字中帶有 “王” 字的所有人資訊: select * from students where name like “%王%”;

查詢id小於5且年齡大於20的所有人資訊: select * from students where id<5 and age>20;

7、數據更新

update 語句可用來修改表中的數據, 基本的使用形式為:

update 表名稱 set 列名稱=新值 where 更新條件;

使用示例:

將id為5的手機號改為默認的”-“: update students set tel=default where id=5;

將所有人的年齡增加1: update students set age=age+1;

8、數據刪除

delete 語句用於刪除表中的數據, 基本用法為:

delete from 表名稱 where 刪除條件;

使用示例:

刪除id為2的行: delete from students where id=2;

刪除所有年齡小於21歲的數據: delete from students where age<20;

刪除表中的所有數據: delete from students;

9、資料庫表的修改

(1)添加列

基本形式: alter table 表名 add 列名 列數據類型 after 插入位置];

示例:

在表的最後追加列 address: alter table students add address char(60);

在名為 age 的列後插入列 birthday: alter table students add birthday date after age;

(2)修改列

基本形式: alter table 表名 change 列名稱 列新名稱 新數據類型;

示例:

將表 tel 列改名為 telphone: alter table students change tel telphone char(13) default “-“;

將 name 列的數據類型改為 char(16): alter table students change name name char(16) not null;

(3)刪除列

基本形式: alter table 表名 drop 列名稱;

示例:

刪除 birthday 列: alter table students drop birthday;

(4)重命名表

基本形式: alter table 表名 rename 新表名;

示例:

重命名 students 表為 workmates: alter table students rename workmates;

(5)刪除整張表

基本形式: drop table 表名;

示例: 刪除 workmates 表: drop table workmates;

10、刪除整個資料庫

基本形式: drop database 資料庫名; 

示例: 刪除 my_db 資料庫: drop database my_db;

— 創建用戶

create user “xt”@”localhost” identified by “xt”;

— 查詢資料庫

show databases;

— 使用資料庫

use mysql — 可不加分號

— 查詢表

show tables;

— 查詢用戶

select user from user;

— 修改密碼

set password for “xt”@”localhost” = PASSWORD(“123456”);

— 授權操作

grant insert , create , update on *.* to “xt”@”localhost”;

— 刪除用戶

drop user “xt”@”localhost”;

— 登錄用戶

mysql -u xt -p

— 創建資料庫

create database xxtt;

— 刪除資料庫

drop database xxtt;

— 創建表

create table student(

id int unsigned not null primary key auto_increment,

name char(10) not null,

age tinyint unsigned not null);

— 查看錶結構

describe student;

— 修改表

alter table student add birthday date after id;

alter table student drop id;

alter table student add id int unsigned not null primary key auto_increment first;

alter table student add tel char(11) default “-“;

alter table student rename stu;

— 插入數據

insert into student(id , birthday , name , age , tel) values (1 , “1998-12-17” , “xt” , 21 , “111”);

insert into student(birthday , name , age , tel) values (“1995-9-17” , “twb” , 24 , “222”);

insert into student values

(3 , “2010-3-12” , “許苗苗” , 8 , “333”),

(4 , “1997-9-7” , “陳秋芝” , 22 , “444”);

— 刪除表

drop table student;

— 刪除資料庫

delete from student where id = 4;

— 查詢數據

select * from student;

select name from student where id > 3;

MySql介面使用:

1、獲取錯誤資訊

mysql_errno

mysql_error

2、連接遠程伺服器

mysql_init

mysql_close

mysql_real_connect

3、數據查詢

mysql_query(&mysql, “set names utf8”);                      //解決顯示中文亂碼

mysql_store_result                                                      //檢索完整的結果集至客戶端

mysql_fetch_fields                                                       //返回所有欄位結構的數組

mysql_num_fields                                                        //返回結果集中的列數

mysql_field_count                                                        //返回上次執行語句的結果列的數目

mysql_fetch_row                                                          //從結果集中獲取下一行

mysql_fetch_lengths                                                   //返回當前行中所有列的長度

mysql_use_result                                                        //初始化逐行的結果集檢索

mysql_free_result                                                       //釋放結果集使用的記憶體

4、MySql的事務處理

開啟事務:START TRANSACTION

禁止自動提交:set autocommit=0

開啟自動提交:set autocommit=1

提交事務:commit

事務回滾:rollback

事務封裝:

#define BEGIN_TRAN “START TRANSACTION”

#define SET_TRAN “SET AUTOCOMMIT=0”

#define UNSET_TRAN “SET AUTOCOMMIT=1”

#define COMMIT_TRAN “COMMIT”

#define ROLLBACK_TRAN “ROLLBACK”

int mysql_BeginTran(MYSQL *mysql)

{

int ret = 0;

//–執行事務開始SQL

ret = mysql_query(mysql, BEGIN_TRAN);

if (ret != 0)

{

printf(“func mysql_query() err: %d\n”, ret);

return ret;

}

//–設置事務手動提交

ret = mysql_query(mysql, SET_TRAN);

if (ret != 0)

{

 

printf(“func mysql_query() err: %d\n”, ret);

return ret;

}

return ret;

}

int mysql_Rollback(MYSQL *mysql)

{

int ret = 0;

//–事務回滾操作

ret = mysql_query(mysql, ROLLBACK_TRAN);

if (ret != 0)

{

printf(“func mysql_query() err: %d\n”, ret);

return ret;

}

//–恢復事務自動提交標誌

ret = mysql_query(mysql, UNSET_TRAN);

if (ret != 0)

{

printf(“func mysql_query() err: %d\n”, ret);

return ret;

}

return ret;

}

int mysql_Commit(MYSQL *mysql)

{

int ret = 0;

//–執行事務提交SQL

ret = mysql_query(mysql, COMMIT_TRAN);

if (ret != 0)

{

printf(“func mysql_query() err: %d\n”, ret);

return ret;

}

//–恢復自動提交設置

ret = mysql_query(mysql, UNSET_TRAN);

if (ret != 0)

{

printf(“func mysql_query() err: %d\n”, ret);

return ret;

}

return ret;

}

11.總結:

有了資料庫,就可以把想要的數據存儲起來,想要用的時候直接取出來,多加練習,再接再厲。

                              改變自己,從現在做起———–久館

Tags: