SQL 的基本操作CRUD
SQL基本操作
基本操作: CRUD.
將SQL 的基本操作根據操作物件進行分類: 分為三類: 庫操作, 表操作(欄位), 資料操作.
庫操作:
對資料庫的增刪改查.
新增資料庫
Create database 資料庫名字 [庫選項];
庫選項: 用來約束資料庫,分為兩個選項
字符集設定: charset/character set 具體字符集 (資料儲存的編碼格式).
校對級設定: collate 具體校對集(資料比較的規則)
其中:資料庫名字不能用關鍵字或者保留字
如果非要使用關鍵字 或者保留字, 那麼必須使用 反引號(esc鍵下面的鍵在 英文狀態下的)
中文資料庫是可以的,但是有前提條件: 但是保證伺服器能夠識別 (不建議使用)
當建立資料庫的SQL語句執行之後,發生了什麼?
1. 在資料庫系統中,增加了對應的資料庫資訊.
2. 會在儲存資料的資料夾下: Data 目錄,建立一個對應資料庫名字的資料夾
3. 每個資料庫下都有一個 opt 檔案,
檢視資料庫
- 檢視所有資料庫: show databases;
- 檢視指定部分的資料庫: 模糊查詢
Show databases like ‘pattern’; – pattern 是匹配模式
%: 表示匹配多個字元
_ ; 表示匹配單個字元, _ 需要被轉義
- 檢視資料庫的建立語句:: show create database 資料庫名字;
更新資料庫(修改資料庫)
資料庫名字不可以修改.
資料庫的修改僅限庫選項: 字符集 和校對集 (校對集依賴字符集.)
Alter database 資料庫名字 [庫選項];
Chartset / character set [=] 字符集
Collate 校對集
刪除資料庫
所有的操作中刪除最簡單.
Drop database 資料庫的名字;
當刪除資料庫執行語句之後,發生了設麼?
1.在資料庫內部看不到該資料庫了
2.在對應的資料庫儲存的資料夾內: 資料庫的名字的資料夾也被刪除(級聯刪除:裡面的資料表全部被刪除.)
注意: 資料庫的刪除危害很大,不要隨意刪除,應該先備份後再操作,(刪除不可逆.)
表操作
表與欄位是密不可分的,
新增資料表
Create table [if not exist] 表名(
欄位名字 資料型別,
欄位名字 資料型別 - - 最後一行不需要逗號
)[表選項];
If not exist: 若果表名不存在,那麼建立,否則不執行建立程式碼: 具有檢查功能
表選項: 控制表的表現
字符集: charset / character set 集體字符集; - - 保 證表中資料儲存的字符集.
校對集: collate 具體校對集;
儲存引擎: engine 具體的儲存引擎(innodb 和 myisam)
任何一個表的設計都必須指定資料庫.
方案1. 顯示的指定表所屬的資料庫
Create table 資料庫.表名(); - - 將當前資料庫建立到 指定的資料庫下.
方案2: 隱式的指定表所屬資料庫: 先進入到某個資料庫環境,再執行建立語句.
Use database 資料庫名稱;
當建立資料庫表的SQL指令執行之後到底發生了什麼?
1. 指定資料庫下已經存在指定的表
2. 在資料庫對應的資料夾下,會產生對應的結構檔案(跟儲存引擎有關係).
檢視資料表:
資料庫能檢視的方式,表都可以檢視
1>檢視所有表: show tables;
2>檢視部分表: 模糊匹配: show tables like ‘pattern’;
3> 查看錶的建立語句: show create table 表名;
4> 查看錶結構: 查看錶中的欄位資訊
Desc 表名/describe 表名/ show columns from表名;
修改資料表
表本身存在,還包含欄位: 表的修改分為兩個部分: 修改表本身 和 修改欄位.
修改表本身
表本身可以修改: 表名 和 表選項.
修改表名: rename table 老表名 to 新表名;
修改選項: rename table 老表名 to 新表名;
Alter table 表名 表選項 [=] 值;
修改欄位
欄位操作很多: 新增, 修改, 重新命名, 刪除
新增欄位
Alter table 表名 add[column] 欄位名 資料型別 [列屬性] [位置];
位置: 欄位名可以存放表中的任意位置.
First: 第一個位置.
after: 在那個欄位之後: after 欄位名; 預設的是在最後一個欄位之後.
修改欄位:
修改通常是修改屬性 或者資料型別
Alter table 表名 modify 欄位名 資料型別 [屬性][位置];
重新命名欄位:
Alter table 表名 change 舊欄位 新欄位名 資料型別[屬性][位置];
刪除欄位:
Alter table 表名 drop 欄位名;
小心: 如果表中已經存在資料,那麼刪除欄位會清空該欄位的所有資料(不可逆).
刪除資料表
Drop table 表名1, 表名2….; – 可以一次性刪除多張表
當刪除 資料表的指令執行之後發生了什麼?
1> 在表空間中,沒有了指定的表(資料也沒有了).
2> 在資料庫對應的檔案下,表對應的檔案(與儲存引擎有關)也會被刪除.
注意:刪除有危險,操作需謹慎.(不可逆.).
資料操作
新增資料
有兩種方案:
方案1: 給全表字段插入資料, 不需要指定欄位列表: 要求資料的值出現的順序必須與表中設計的欄位出現的順序一致: 凡是非數值資料,都需要用引號(建議是單引號)包裹.
Insert into 表名 values(值列表)[,(值列表)]; – 可以一次性插入多條記錄.
方案2: 給部分欄位插入資料,需要選定欄位列表: 欄位列表出現的順序與欄位順序無關;
但是值列表的順序,必須與選定的欄位列表的順序一致.
Insert into 表名 (欄位列表) values (值列表) [,(值列表)];
檢視資料
Select */欄位列表 from 表名 [where 條件];
– 檢視所有資料
select * from my_student;
檢視指定欄位,指定條件的資料
– 檢視指定欄位,指定條件資料
select id,number,sex,name from my_student where id = 1; –id為1的對應欄位資料
更新資料
Update 表名 set 欄位 = 值 [where 條件]; – 建議都有where;要不是更新全部..
更新不一定會成功:如沒有要真正更新的資料..
刪除資料
刪除是不可以逆的: 需謹慎刪除
Delete from 表名 [where條件].
中文資料問題
中文資料問題本質是字符集問題.
計算機只識別二進位制,: 人類更多的是識別符號: 需要有一個二進位制與字元的對應關係(字符集.).
客戶端向伺服器插入中文資料: 沒有成功.
原因:\XD5\XC5\XD4\XBD 代表的是’張悅’在當前編碼(字符集)下對應的二進位制編碼轉化而成的;
十六進位制:兩個漢字對應 ===> 四個位元組.
報錯: 伺服器沒有識別對應的四個位元組: 伺服器認為資料是utf8, 一個漢字有三個位元組;
讀取三個位元組.轉換成漢字(失敗),剩餘的再讀三個位元組(不夠);所以最終失敗.
所有的資料庫伺服器認為(表現)的一些特性都是通過伺服器端的變數來儲存:系統先讀取自己的變數,看看應該怎麼表現.
// 檢視伺服器到底識別哪些字符集
Show character set;
基本上:伺服器是萬能的,什麼字符集都支援.
//既然伺服器識別這麼多: 總有一種是伺服器預設的跟客戶端打交道的字符集
Show variables like ‘character_set%’;
問題根源:客戶端資料只能是GBK,而伺服器認為是utf8; 矛盾產生;
解決方案: 改變伺服器,預設, 預設的接收字符集為GBK;
Set character_set_client = GBK;
插入中文的效果
檢視資料效果: 依然是亂碼
原因: 資料來源是伺服器,解析資料是客戶端 (而客戶端值識別GBK: 只會兩個位元組一個漢字): 但是事實伺服器給的是資料卻是utf8,三個位元組一個漢字,所以出現亂碼
解決方案:修改伺服器給客戶端的資料字符集為GBK;
Set character_set_results = GBK;
再檢視資料效果:
Set 變數 = 值; 修改只是會話級別(當前客戶端,當次連線有效: 關閉失效.), 關閉對話方塊再重新開啟後顯示 客戶端字符集 和 結果集的字符集恢復原狀.
設定伺服器對客戶端的字符集的認識: 可以使用快捷方式: set names 字符集.
Set names gbk; =======>character_set_client, character_set_results, character_set_connection.
Set names gbk; 執行後如下圖.
connection: 連線層:是字符集轉變的中間者,如果統一了效率更高, 不統一也沒有問題.
校對集
校對集: 資料比較的方式;
校對集有三種形式
_bin; binary, 二進位制比較,取出二進位制位,一位一位的比較,區分大小寫.
_cs: case sensitive, 大小寫敏感.區分大小寫
_ci: case insensitive 大小寫不敏感, 不區分大小寫.
檢視資料庫所支援的校對集: show collation;
校對集的應用:只有當資料產生比較的時候,校對集才會生效.
對比: 使用utf8的_bin 和 _ci 來驗證兩種不同的校對集的效果.
1. 建立不同校對集對應的表
create table my_collate_bin(
name char(1)
)charset utf8 collate utf8_bin;
create table my_collate_ci(
name char(1)
)charset utf8 collate utf8_general_ci;
2. 插入資料:
3. 比較:根據某個欄位進行排序: order by 欄位名[asc|desc]; asc升序; desc 降序;
預設是升序..
校對集: 必須在沒有資料之前宣告好,如果有了資料,再修改校對集,則修改無效.
web亂碼問題
動態網站由三部分組成: 瀏覽器, Apache伺服器, 資料庫伺服器, 三個部分都有自己的字符集(中文),. 資料需要在三個部分之間來回傳遞, 很容易產生亂碼.
如何解決亂碼問題: 統一編碼(三碼合一)
但是事實上不可能: 瀏覽器是使用者管理(根本不可能控制),
但是必須要解決這些問題: 主要靠PHP(或其他程式語言)來做.