關係型資料庫
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.總結:
有了資料庫,就可以把想要的數據存儲起來,想要用的時候直接取出來,多加練習,再接再厲。
改變自己,從現在做起———–久館