1. 程式人生 > >SQL 的基本操作CRUD

SQL 的基本操作CRUD

SQL基本操作

基本操作: CRUD.
將SQL 的基本操作根據操作物件進行分類: 分為三類: 庫操作, 表操作(欄位), 資料操作.

庫操作:

對資料庫的增刪改查.

新增資料庫

Create database 資料庫名字 [庫選項];
庫選項: 用來約束資料庫,分為兩個選項
字符集設定: charset/character set 具體字符集 (資料儲存的編碼格式).
校對級設定: collate 具體校對集(資料比較的規則)

這裡寫圖片描述
其中:資料庫名字不能用關鍵字或者保留字
這裡寫圖片描述

如果非要使用關鍵字 或者保留字, 那麼必須使用 反引號(esc鍵下面的鍵在 英文狀態下的)
這裡寫圖片描述


中文資料庫是可以的,但是有前提條件: 但是保證伺服器能夠識別 (不建議使用)
這裡寫圖片描述

當建立資料庫的SQL語句執行之後,發生了什麼?
1. 在資料庫系統中,增加了對應的資料庫資訊.
2. 會在儲存資料的資料夾下: Data 目錄,建立一個對應資料庫名字的資料夾
這裡寫圖片描述
3. 每個資料庫下都有一個 opt 檔案,
這裡寫圖片描述

檢視資料庫

  1. 檢視所有資料庫: show databases;這裡寫圖片描述
  2. 檢視指定部分的資料庫: 模糊查詢
    Show databases like ‘pattern’; – pattern 是匹配模式
    %: 表示匹配多個字元
    _ ; 表示匹配單個字元, _ 需要被轉義
    這裡寫圖片描述
  3. 檢視資料庫的建立語句:: 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(或其他程式語言)來做.
這裡寫圖片描述