SQl學習筆記第一天
day1
1.資料庫的基礎
(1) 什麼是資料庫
(2)資料庫分類
(3) 不同的資料庫陣營中的產品有哪些
(4)兩種資料陣營的區別
1.1關係型資料庫
1.1.1什麼是關係型資料庫
1.1.2關係型資料庫的設計
1.2關鍵字說明
1.3SQL
1.4 Mysql資料庫
2.SQL基本操作
2.1庫操作:對資料庫的增刪改查
2.1.1新增資料庫
2.1.2檢視資料庫
2.1.3更新資料庫
2.1.4刪除資料庫
3表操作
3.1新增資料表
3.2檢視資料表
3.3修改資料表
3.3.1修改表本身
3.3.2修改表選項
3.3.3修改欄位
3.4刪除資料表
4.資料操作
4.1新增資料
4.2檢視資料
4.3更新資料
4.4刪除資料
5.中文資料問題
6.校對集
第一步:建立不同校對集表
第二步:插入資料
第三步:檢視資料
1、資料庫基礎
(1)什麼是資料庫
資料庫:database 儲存資料的倉庫。
資料庫::高效的儲存和處理資料的介質(介質主要是兩種:磁碟和記憶體)
(2)資料庫的分類?
資料庫基於儲存介質的不同,進行了分類,分為兩類:關係型資料庫(SQL)和 非關係型資料庫(NoSQL:Not only SQL,不是關係型的資料庫都叫做非關係型資料庫)
(3)不同的資料庫陣營中的產品有哪些?
關係型資料庫
大型:Oracle,DB2
中型:SQL-SERVER,Mysql等
小型:access等
非關係型資料庫:memcached,mongodb,redis(同步到磁碟)
(4)兩種資料庫陣營的區別?
關係型資料庫:安全(儲存磁碟基本不可能丟失),容易理解,比較浪費時間
非關係型資料庫:效率高,不安全(斷電丟失)
1.1關係型資料庫
1.1.1什麼是關係型資料庫
是一種建立在關係模型(數學模型)上的資料庫。關係模型包含三個方面:
資料結構:資料儲存的問題,二維表(有行和列)
操作指令集合:所有SQL語句
完整性約束:表內資料約束(欄位與欄位),表與表之間的約束(外來鍵)
1.1.2關係型資料庫的設計?
關係型資料庫:從需要儲存的資料需求中分析,如果是一類資料(實體)應該設計成一張二維表,表是由表頭(欄位名:用來規定資料的名字)和資料部分組成(實際儲存的資料單元)
二維表:行和列
表頭 | 欄位名1 | 欄位名2 |
資料單元 | 資料1 | 資料2 |
以實際案例來處理分析:分析一個教學系統,將是負責教學,教學生,在教室教學生。
- 找出系統中所存在的實體:講師表,學生表,班級表
- 找出實體中應該存在的資料資訊:
講師:姓名,性別,年齡,工資
學生:姓名,性別,學號,學科
班級:班級名字,教室編號
關係型資料庫:維護實體內部,實體與實體之間的聯絡。
實體內部聯絡:每個學生都有姓名,性別,學號,學科資訊。
姓名 | 性別 | 學號 | 學科 | 年齡 |
陳明 | 男 | 0001 | PHP | 20 |
王晶晶 | 女 | 0002 | PHP | |
王琦 | 0003 | UI |
第二行的所有欄位,都是在描述陳明這個學生(內部聯絡),第二列只能放性別(內部約束)
關係型資料庫特點之一:如果表中對應的某個欄位沒有值(資料),但是系統依然要分配空間,關係型資料庫比較浪費空間
實體與實體之間的聯絡:每個學生肯定屬於某個班級,每個班級一定有多個學生(一對多)
班級名稱 | 教室編號 |
PHP0810 | B205 |
PHP0710 | A205 |
解決方案:在學生表中增加一個班級欄位來只想班級(必須能夠唯一的找到一個班級資訊)
姓名 | 性別 | 學號 | 學科 | 年齡 | 班級編號 |
陳明 | 男 | 0001 | PHP | 20 | PHP0810 |
王晶晶 | 女 | 0002 | PHP | PHP0810 | |
王琦 | 0003 | UI |
UI0810 |
學生實體與班級實體的關聯關係:實體與實體之間的關係。
1.2關鍵字說明
資料庫:database
資料庫系統:DBS(Database System):是一種虛擬系統,將多種內容關聯起來的稱呼。
DBS=DBMS+DB
DBMS:Database Management System,資料庫管理系統,專門管理資料庫。
DBA:Database Administrator,資料庫管理員
行/記錄:row和record,本質是一個東西,都是指表中的一行(一條記錄),行是從結構角度出發,記錄是從資料角度出發。
列/欄位:column/field,本質是,一個東西
1.3SQL
SQL:Structured Query Language結構化查詢語言(資料以查詢為主,99%是在進行查詢操作)
SQL分為三個部分:
DDL:Data Definition Language,資料定義語言,用來維護儲存資料的結構(資料庫,表),代表指令:create,drop,alter等
DML:Data Manipulation Language,資料操作語言,用來對資料進行操作(資料表中的內容),代表指令:insert,delete,update等;其中DML內部又單獨進行了一個分類:DQL(Data QueryLanguage:資料查詢語言,如select)
DCL:Data Control Language,資料控制語言,主要是負責許可權管理(使用者),代表指令:grant,revoke等
SQL是關係型資料庫的操作指令,SQL是一種約束,但不強制(類似W3C),不同的資料庫產品(如Oracle,MySQL)可能內部會有一些細微的區別
1.4MySQL資料庫
Mysql資料庫是一種c/s結構的軟體,客戶端/服務端,若想訪問伺服器必須通過客戶端(伺服器一直執行,客戶端在需要使用的時候執行)
互動方式:
1、客戶端連線認證:連線伺服器,認證身份:mysql.exe-hPup
第一次啟動不用輸入password,直接回車,cmd要以管理員身份開啟。
2、傳送SQL指令
3、伺服器接收SQL指令:處理SQL指令:返回操作結果
4、客戶端接收結果,顯示結果
5、斷開連線(釋放資源,伺服器併發限制)exit/quit/q
2.SQL基本操作
基本操作:CRUD增刪改查
將SQL的基本操作根據操作物件進行分類,分為三類:庫操作,表操作(欄位),資料操作
2.1庫操作
對資料庫的增刪改查
2.1.1新增資料庫
create database 資料庫名字【庫選項】
庫選項:用來約束資料庫,分為兩個選項
字符集設定:charset/character set 具體字符集(資料儲存的編碼格式):常用字符集:GBK和UTF8
校對集設定:collate 具體校對集(資料比較的規則)
其中:資料庫名字不能用關鍵字(已經被使用的字元)或者保留字(將來可能用到的字元)
SQL語句報錯:只會告訴使用者出錯的大概位置,不會說明報錯原因(靜默模式),如果非要使用關鍵字或者保留字,那麼必須使用反引號(esc鍵下面的鍵在英文狀態下的輸出:`)
中文資料庫是可以的,但是有前提條件,保證伺服器能夠識別。
解決方案:告訴伺服器當前的中文字符集是什麼
set names gbk;create database 中國 charset utf8;
當建立資料庫的SQL語句執行在之後,發生了什麼?
1、在資料庫系統中,增加了對應的資料庫資訊
2、會在儲存資料的資料夾下:Data目錄,建立一個對應資料庫名字的資料夾。
3、每個資料庫下都有一個opt檔案:儲存了庫選項
2.1.2檢視資料庫
1、檢視所有資料庫:show databases;
2、檢視指定部分的資料庫:模糊查詢
show databases like 'pattern'; -- pattern 是匹配模式
%:表示匹配多個字元;
_:表示匹配單個字元;
--這裡的information_%相當於information%
3、檢視資料庫的建立語句:show create databases mydatabase;
資料庫在執行SQL語句之前會優化SQL,系統儲存的結果是優化後的結果。
2.1.3更新資料庫
資料庫名字不可以修改,資料庫的修改僅限庫選項:字符集和校對集(校對集依賴字符集)
alter database 資料庫名字【庫選項】;
charset/character set [=]字符集
collate 校對集
2.1.4刪除資料庫
所有的操作中,刪除是最簡單的
Drop database 資料庫名字
當刪除資料庫語句執行之後,發生了什麼?
1、在資料庫內部看不到對應的資料庫
2、對應的資料庫儲存的資料夾內,資料庫名字對應的資料夾也被刪除了(級聯刪除:裡面的資料表全部刪除)
注意:資料庫的刪除不是鬧著玩的,不要隨意刪除,應該進行備份後操作(刪除不可逆)
3.表操作
表與欄位是密不可分的
3.1新增資料表
create table【if not exists】表名(
欄位名字 資料型別,
欄位名字 資料型別--- 最後一行不需要逗號
)【表選項】;
if not exists :如果表名不存在,那麼就建立,否則不執行建立程式碼:檢查功能
表選項:控制表的表現
字符集:charset/character set具體字符集:--保證表中資料儲存的字符集
校對集:collate具體校對集
儲存引擎:engine具體的儲存引擎(innodb和myisam)
任何一個表的設計都必須指定資料庫,
方案1:顯示的指定表所屬的資料庫
create table 資料庫名.表名(); ---將當前資料表建立到指定的資料庫下
方案2:隱式的指定表所屬資料庫:先進入到某個資料庫環境,然後這樣建立的表自動歸屬到某個指定的資料庫
進入資料庫環境:use 資料庫名字;
當建立資料表的SQL指令執行後,到底發生了什麼?
1、指定資料庫下已經存在對應的表
2、在資料庫對應的資料夾下,會產生對應表的結構檔案(跟儲存引擎有關係)
3.2檢視資料表
資料庫能檢視的方式表都可以檢視
1、檢視所有表show tables;
2、檢視部分表:模糊匹配:show tables like 'pattern';
查看錶的建立語句:show cerate table student\g -- \g ==== ;
show cerate table student\G -- \G表示將查到的結構旋轉90度變成縱向的
4、查看錶結構:查看錶中的欄位資訊
Desc/describe/show columns from 表名;
Field---欄位名
Type---資料型別
Null---列屬性:是否允許為Null(空)
Key---索引:索引型別(PRI主鍵,UNI唯一鍵等)
Default---列屬性:大部分欄位預設為Null(空)
Extra---列屬性:擴充(額外的),描述不下了
3.3修改資料表
表本身存在,還包含欄位,表的修改分為兩個部分:修改表本身和修改欄位
3.3.1修改表本身
表本身可以修改:表名和表選項
修改表名:rename table 老表名 to 新表名
3.3.2修改表選項:字符集,校對集和儲存引擎
Alter table 表名 表選項 【=】值;
3.3.3修改欄位
欄位操作很多,新增,修改,重名,刪除
(1)新增欄位:
alter table表名add [column]資料型別[列屬性][位置];
位置:欄位名可以存放在表中的任意位置
First:第一個位置
After 欄位名:在該欄位名之後,預設是最後一個欄位之後
(2)修改欄位:修改通常是修改屬性
alter table表名modify欄位名 資料型別 [屬性] [位置];
(3)重名欄位:
alter table表名change舊欄位 新欄位名 資料型別[屬性][位置];
(4)刪除欄位:
alter table表名drop欄位名;
小心:如果表中已經存在資料,那麼刪除欄位會清空該欄位的所有資料(不可逆)
3.4刪除資料表
Drop table表名1,表名2........; --可以一次刪除多張表
當刪除資料表的指令執行後發生了什麼?
(1)在表空間中,沒有了指定的表(資料也沒有了)
(2)在資料庫對應的資料夾下,表對應的檔案(與引擎有關)也會被刪除。
4. 資料操作
4.1新增資料
方案1:給全表字段插入資料,不需要指定欄位列表,需要資料的值出現順序必須與表中設計的欄位出現的順序一致。凡是非數值資料,都需要使用引號(建議單引號)包裹。可以一次性插入多條記錄
Insert into表名values(值列表)[,值列表];
方案2:給部分欄位插入資料,需要選定欄位列表:欄位列表出現的順序與欄位的順序無關。但是值列表的順序必須與選定的欄位順序一致。
Insert into表名(欄位列表)values(值列表)[,值列表];
4.2檢視資料
Select */欄位列表from表名[where條件];
檢視所有資料
檢視指定欄位,指定條件的資料
4.3更新資料
Update 表名 set 欄位=值 [where條件]; --建議都有where 要不是更新全部
注:更新不一定成功,有影響的才成功。
4.4刪除資料
刪除是不可逆的:謹慎刪除
Delete from表名[where條件];
5. 中文資料問題
中文資料問題本質是字符集問題。
計算機只識別二進位制:人類更多是識別符號,需要有個二進位制與字元的對應關係(字符集)
客戶端向伺服器插入中文資料:沒有成功
(1)檢視伺服器的所有字符集:show character set;
(2)檢視伺服器預設對我處理的字符集:
Show variables like‘character_set%’ ;
Character_set_client:伺服器預設的客戶端字符集
Character_set_connection:連線層字符集
Character_setdatabase:當前所在資料庫的字符集
Character_set_results:伺服器預設的給外部資料的字符集
表中出現亂碼分析1:
問題根源:客戶端資料只能是GBK,而伺服器認為是UTF8。
解決方案:改變伺服器,預設的接收字符集為GBK。
set character_set_client = gbk;
表中出現亂碼分析2:
檢視資料,中文為亂碼?
問題根源:資料來源是伺服器,解析資料的是客戶端(客戶端只識別gbk),但是伺服器給的資料是utf8
解決方案:修改伺服器給客戶端的資料字符集為GBK。
set character_set_results = gbk;
中文顯示正常!
(3)設定伺服器對客戶端字符集的認識可以使用快捷方式:
set names字符集
注:修改Character_set_client,Character_set_connection和Character_set_results
(4)connection連線層:是字符集轉變的中間者,如果統一了效率更高,不同意也沒問題。
6. 校對集
校對集:資料比較的方式
(1)校對集有三種格式:
u _bin:binary,二進位制比較,取出二進位制位,一位一位比較,區分大小寫。
u _cs:case sensitive 大小寫敏感,區分大小寫。
u _ci:case insensitive 大小寫不敏感,不區分大小寫。
(2)檢視資料庫所支援的校對集:Show collation;
(3)校對集應用:只有當資料產生比較的時候,校對集才會生效。
第一步:建立不同校對集表
校對集:utf8_bin
create table my_collate_bin(
name char(1)
)charset utf8 collate utf8_bin;
校對集:utf8_general_ci
create table my_collate_ci(
name char(1)
)charset utf8 collate utf8_general_ci;
第二步:插入資料
insert into my_collate_bin values('a'),('A'),('B'),('b');
insert into my_collate_ci values('a'),('A'),('B'),('b');
第三步:檢視資料
select * from my_collate_bin order by name;
select * from my_collate_ci order by name;