1. 程式人生 > >SQl學習筆記第一天

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

以實際案例來處理分析:分析一個教學系統,將是負責教學,教學生,在教室教學生。

  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 likecharacter_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)校對集有三種格式:

_bin:binary,二進位制比較,取出二進位制位,一位一位比較,區分大小寫。

u _cs:case sensitive 大小寫敏感,區分大小寫。

_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;