數據庫簡單概念
數據庫是存儲數據的集合的單獨的應用程序。每個數據庫具有一個或多個不同的API,用于創建,訪問,管理,檢索和復制所保存數據。
其他類型的數據存儲,可以使用,如獲取文件系統上的文件或內存中的大的哈希表,但數據并寫入不會那么快,但這些類型的系統易于使用。
所以今天,我們使用關系數據庫管理系統(RDBMS)來存儲和管理體積龐大的數據。這就是所謂關系數據庫,因為所有的數據存儲到不同的表和關系建立使用主鍵或外鍵等其它鍵。
一個關系數據庫管理系統(RDBMS)是一種軟件是:
能夠實現具有表,列和索引的數據庫
保證了各種表的行之間的引用完整性
自動更新索引
解釋SQL查詢和聯合各表的信息。
簡單的說數據庫就是裝數據、管理數據的地方,每個網站的資源(比如圖像、聲音、視屏、軟件等)、每個游戲的資源,都是放在服務器里的數據庫中的。
什么是 SQL?
SQL 指結構化查詢語言
SQL 使我們有能力訪問數據庫
SQL 是一種 ANSI (美國國家標準化組織
)的標準計算機語言
SQL 能做什么?
SQL 面向數據庫執行查詢
SQL 可從數據庫取回數據
SQL 可在數據庫中插入新的記錄
SQL 可更新數據庫中的數據
SQL 可從數據庫刪除記錄
SQL 可創建新數據庫
SQL 可在數據庫中創建新表
SQL 可在數據庫中創建存儲過程
SQL 可在數據庫中創建視圖
SQL 可以設置表、存儲過程和視圖的權限
SQL 是一種標準 - 但是...
SQL 是一門 ANSI 的標準計算機語言,用來訪問和操作數據庫系統。SQL 語句用于取回和更新數據庫中的數據。SQL 可與數據庫程序協同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他數據庫系統。
不幸地是,存在著很多不同版本的 SQL 語言,但是為了與 ANSI 標準相兼容,它們必須以相似的方式共同地來支持一些主要的關鍵詞(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等)。
注釋:除了 SQL 標準之外,大部分 SQL 數據庫程序都擁有它們自己的私有擴展!
MySql簡單概念
MySQL 數據庫
MySQL是一個快速,易于使用的RDBMS,被用于許多小型和大型企業。MySQL由一個瑞典公司MySQL AB支持。正在開發,銷售。MySQL變得如此受歡迎,因為許多很好的理由:
MySQL在一個開源許可下發布。所以使用它不要擔心什么問題。
MySQL本身是非常強大的程序。它擁有可處理最昂貴,最強大的數據庫軟件包的相當大一部分功能。
MySQL使用眾所周知的SQL數據語言的標準形式。
MySQL可運行在許多類操作系統和許多語言,包括 C#, PHP, PERL, C, C++, JAVA ,Python等
MySQL運行得非常快,甚至在大型數據集也可以運行得很好。
MySQL支持大型數據庫,可達5千萬行以上的表。 表的默認文件大小限制為4GB,但可以增加(如果操作系統可以處理它),800萬TB是一個理論極限(TB).
MySQL是定制的。開源GPL許可允許程序員修改MySQL軟件,以適應自己的特定環境。
MySQL 為關系型數據庫(Relational Database Management System), 這種所謂的"關系型"可以理解為"表格"的概念, 一個關系型數據庫由一個或數個表格組成, 如圖所示的一個表格:
表頭(header): 每一列的名稱;
列(row): 具有相同數據類型的數據的集合;
行(col): 每一行用來描述某個人/物的具體信息;
值(value): 行的具體信息, 每個值必須與該列的數據類型相同;
主鍵(key): 表中用來識別某個特定的人\物的方法, 主鍵的值在當前列中具有唯一性。
**外鍵: **外鍵是兩個表之間的連接值。
MySQL服務 DOS下的啟動、停止與卸載
在 Windows 命令提示符下運行:
啟動: net start MySQL
停止: net stop MySQL
卸載: sc delete MySQL
MySql中的數據類型
- 整形
MySql數據類型 | 含義(有符號) |
---|---|
tinyint | 1個字節 范圍(-128~127) |
smallint | 2個字節 范圍(-32768~32767) |
mediumint | 3個字節 范圍(-8388608~8388607) |
int | 4個字節 范圍(-2147483648~2147483647) |
bigint | 8個字節 范圍(+-9.22*10的18次方) |
2、浮點型(float和double)
MySQL數據類型 | 含義 |
---|---|
float(m,d) | 單精度浮點型 8位精度(4字節) m總個數,d小數位 |
double(m,d) | 雙精度浮點型 16位精度(8字節) m總個數,d小數位 |
設一個字段定義為float(5,3),如果插入一個數12.45678,實際數據庫里存的是12.457,但總個數還以實際為準,即5位。
3、定點數
浮點型在數據庫中存放的是近似值,而定點類型在數據庫中存放的是精確值。
4、字符串(char,varchar,_text)
MySQL數據類型 | 含義 |
---|---|
char(n) | 固定長度,最多255個字符 |
varchar(n)固定長度,最多65535個字符 | |
tinytext | 可變長度,最多255個字符 |
text | 可變長度,最多65535個字符 |
mediumtext | 可變長度,最多2的24次方-1個字符 |
longtext | 可變長度,最多2的32次方-1個字符 |
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:
1.varchar可指定n,text不能指定,內部存儲varchar是存入的實際字符數+1個字節(n<=255)或2個字節(n>255),text是實際字符數+2個字節。
2.text類型不能有默認值。
3.varchar可直接創建索引,text創建索引要指定前多少個字符。varchar查詢速度快于text,在都創建索引的情況下,text的索引似乎不起作用。
5.二進制數據(_Blob)
1._BLOB和_text存儲方式不同,_TEXT以文本方式存儲,英文存儲區分大小寫,而_Blob是以二進制方式存儲,不分大小寫。
2._BLOB存儲的數據只能整體讀出。
3._TEXT可以指定字符集,_BLO不用指定字符集。
6.日期時間類型
MySQL數據類型 | 含義 |
---|---|
date | 日期 '2008-12-2' |
time | 時間 '12:25:36' |
datetime | 日期時間 '2008-12-2 22:06:44' |
timestamp | 自動存儲記錄修改時間 |
若定義一個字段為timestamp,這個字段里的時間數據會隨其他字段修改的時候自動刷新,所以這個數據類型的字段可以存放這條記錄最后被修改的時間。
數據類型的屬性
MySQL關鍵字 | 含義 |
---|---|
NULL | 數據列可包含NULL值 |
NOT NULL | 數據列不允許包含NULL值 |
DEFAULT | 默認值 |
PRIMARY KEY | 主鍵 |
AUTO_INCREMENT | 自動遞增,適用于整數類型 |
UNSIGNED | 無符號 |
CHARACTER SET name | 指定一個字符集 |
2. 使用數據庫
1> 創建數據庫
使用 create database 語句可完成對數據庫的創建, 創建命令的格式如下:
create database 數據庫名 [其他選項];
例如我們需要創建一個名為 samp_db 的數據庫, 在命令行下執行以下命令:
create database Person_DB character;
注意: MySQL語句以分號(;)作為語句的結束, 若在語句結尾不添加分號時, 命令提示符會以 -> 提示你繼續輸入(有個別特例, 但加分號是一定不會錯的);
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,
gender char(4) not null,
age tinyint unsigned not null,
tel char(13) null default "-"
);
對于一些較長的語句在命令提示符下可能容易輸錯, 因此我們可以通過任何文本編輯器將語句輸入好后保存為 createtable.sql 的文件中, 通過命令提示符下的文件重定向執行執行該腳本。
打開命令提示符, 輸入: mysql -D samp_db -u root -p < createtable.sql
(提示: 1.如果連接遠程主機請加上 -h 指令; 2. createtable.sql 文件若不在當前工作目錄下需指定文件的完整路徑。)
語句解說:
create table tablename(columns) 為創建數據庫表的命令, 列的名稱以及該列的數據類型將在括號內完成;
括號內聲明了5列內容, id、name、sex、age、tel為每列的名稱, 后面跟的是數據類型描述, 列與列的描述之間用逗號(,)隔開;
以 "id int unsigned not null auto_increment primary key" 行進行介紹:
- "id" 為列的名稱;
- "int" 指定該列的類型為 int(取值范圍為 -8388608到8388607), 在后面我們又用 * * "unsigned" 加以修飾, 表示該類型為無符號型, 此時該列的取值范圍為 0到16777215;
- "not null" 說明該列的值不能為空, 必須要填, 如果不指定該屬性, 默認可為空;
- "auto_increment" 需在整數列中使用, 其作用是在插入數據時若該列為 NULL, MySQL將自動產生一個比現存值更大的唯一標識符值。在每張表中僅能有一個這樣的值且所在列必須為索引列。
- "primary key" 表示該列是表的主鍵, 本列的值必須唯一, MySQL將自動索引該列。
下面的 char(8) 表示存儲的字符長度為8, tinyint的取值范圍為 -127到128, default 屬性指定當該列值為空時的默認值。
**提示: **1. 使用 show tables; 命令可查看已創建了表的名稱; 2. 使用 describe 表名; 命令可查看已創建的表的詳細信息。
操作MySQL數據庫
** 1. 向表中插入數據**
insert 語句可以用來將一行或多行數據插到數據庫表中, 使用的一般形式如下:
insert [into] 表名 [(列名1, 列名2, 列名3, ...)] values (值1, 值2, 值3, ...);
其中 [] 內的內容是可選的, 例如, 要給 Person_DB 數據庫中的 students 表插入一條記錄, 執行語句:
insert into students values(NULL, "王剛", "男", 20, "13811371377");
按回車鍵確認后若提示 Query Ok, 1 row affected (0.05 sec) 表示數據插入成功。 若插入失敗請檢查是否已選擇需要操作的數據庫。
有時我們只需要插入部分數據, 或者不按照列的順序進行插入, 可以使用這樣的形式進行插入:
insert into students (name, sex, age) values("孫麗華", "女", 21);
** 2. 查詢表中的數據**
select 語句常用來根據一定的查詢規則到數據庫中獲取數據, 其基本的用法為:
select 列名稱 from 表名稱 [查詢條件];
例如要查詢 students 表中所有學生的名字和年齡, 輸入語句
select name, age from students;
執行結果如下:
name | age |
---|---|
王剛 | 20 |
孫麗華 | 21 |
王永恒 | 23 |
鄭俊杰 | 19 |
陳芳 | 22 |
張偉朋 | 21 |
6 rows in set (0.00 sec) mysql>
也可以使用通配符 * 查詢表中所有的內容, 語句:
select * from students;
2.1按特定條件查詢:
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;
更新表中的數據
update 語句可用來修改表中的數據, 基本的使用形式為:
update 表名稱 set 列名稱=新值 where 更新條件;
使用示例:
將id為5的手機號改為默認的"-":
update students set tel=default where id=5;
將所有人的年齡增加1:
update students set age=age+1;
將手機號為 13288097888 的姓名改為 "張偉鵬", 年齡改為 19:
update students set name="張偉鵬", age=19 where tel="13288097888";
刪除表中的數據
delete 語句用于刪除表中的數據, 基本用法為:
delete from 表名稱 where 刪除條件;
使用示例:
刪除id為2的行:
delete from students where id=2;
刪除所有年齡小于21歲的數據:
delete from students where age<20;
**刪除表中的所有數據: **
delete from students;
創建后表的修改
alter table 語句用于創建后對表的修改, 基礎用法如下:
添加列
基本形式:
alter table 表名 add 列名 列數據類型 [after 插入位置];
示例:
在表的最后追加列 address:
alter table students add address char(60);
在名為 age 的列后插入列 birthday:
alter table students add birthday date after age;
修改列
基本形式:
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;
刪除列
基本形式: alter table 表名 drop 列名稱;
示例:
刪除 birthday 列:
alter table students drop birthday;
重命名表
基本形式:
alter table 表名 rename 新表名;
示例:
重命名 students 表為 workmates:
alter table students rename workmates;
刪除整張表
基本形式:
drop table 表名;
示例:
刪除 workmates 表:
drop table workmates;
** 刪除整個數據庫**
基本形式:
drop database 數據庫名;
示例:
刪除 samp_db 數據庫:
drop database samp_db;
C# 操作數據庫
先下載mysql針對 .net的命名空間 下載地址
下載完成之后,得到
v4.0和v4.5中,分別針對于.NetFramework的版本號。
這里我選用v4.0,在項目中添加引用:
導入命名空間:using MySql.Data.MySqlClient;
// Host 數據庫所在的ip地址 這里取本機的數據 , 數據庫名稱,就是我們將要操作的數據, UserName、Password就是登陸數據庫的賬號, 密碼。
string hostName = "Host=localhost;Database=bank;Username=root;Password=";
// 1. 創建一個數據庫連接對象
MySqlConnection con = new MySqlConnection(hostName);
// 打開該數據庫的連接
con.Open();
#region mysql執行插入語句
//2 . 創建出一個命令對象 。 通過該對象去執行sql語句 。
// 第一個參數,將要執行的sql語句, 第二個參數,是在哪個連接上面執行。 該連接包含了數據庫的名字,主機地址,還有登錄的賬戶
//MySqlCommand command = new MySqlCommand("insert into student (name, age, gender) values ('張三', 99, '女')", con);
//if (command.ExecuteNonQuery() > 0)
//{
// Console.WriteLine("插入數據成功");
//}
//else
//{
// Console.WriteLine("插入數據失敗");
//}
#endregion
#region mysql執行查詢語句
MySqlCommand command = new MySqlCommand("select * from student", con);
// 執行一個查詢命令, 獲取到的數據,存放在reader中。
MySqlDataReader reader = command.ExecuteReader();
// read方法, 如果獲取到數據,就返回True,否則 false。
while (reader.Read())
{
Console.WriteLine("id :" + reader["id"] + " name : " + reader["name"] + " age : " + reader["age"]);
}
#endregion
// 數據庫使用完畢要及時關閉 。 不然下次打開的時候會出異常
con.Close();
Console.WriteLine("程序執行完畢");
Console.ReadKey();