mysql基礎第一課

 

數據庫課程體系


在PHP階段,將數據庫分紅三個階段:

基礎階段:mysql數據的基礎操做(增刪改查),以及一些高級操做(視圖、觸發器、函數、存儲過程等),和PHP操做mysql數據庫mysql

優化階段:如何提升數據庫效率,如索引,分表等redis

 部署階段:如何搭建真實的環境系統,如服務器集羣,負載均衡sql

 

數據庫基礎

一、什麼是數據庫?mongodb

數據庫:database,存儲數據的倉庫。
數據庫:高效存儲和處理數據的介質(介質主要是兩種:磁盤和內存)。數據庫

 

二、數據庫分類?apache

數據庫基於存儲介質的不一樣,可分爲兩類:
關係型數據庫(SQL)和非關係型數據庫(NoSqQL:Not Only SQL,不是關係型的數據都叫非關係型數據庫)。瀏覽器

 

三、不一樣的數據庫陣營中的產品有哪些?安全

關係型數據庫:
  大型:Oracle,DB2
  中型:SQL-SERVER,Mysql等
  小型:access等服務器

非關係型數據庫:memcached,mongodb,redis(同步到磁盤,內存不運行時存儲到磁盤,解決了不安全的問題)數據結構

 

四、兩種數據陣營的區別?

關係型數據庫:安全(保存磁盤基本不可能丟失),符合人的思惟習慣,容易理解,比較浪費空間(二維表)

非關係型數據庫:效率高,不安全(斷電丟失)

 

 

關係型數據庫

一、什麼是關係型數據庫?

關係型數據庫:是一種創建在關係模型(數學模式)上的數據庫


關係模型:是一種所謂創建在關係上的模型,關係模型包含三個方面:

  數據結構:數據存儲的問題,二維表(行和列)

  操做指令集合:全部SQL語句

  完整性約束:表內數據約束(字段與字段),表與表之間約束(外鍵)

 

二、關係型數據庫的設計?

關係型數據庫:從須要存儲的數據需求中分析,若是是一類數據(實體)應該設計成一張二維表:表是由表頭(字段名:用來規定數據的名字)和數據部分組成(實際存儲的數據單元)

 

二維表:行和列

表頭

字段名1

字段名2

數據單元

數據1

數據2

 

案例分析:分析一個教學系統,講師負責教學,教學生,在教師教學生

(1)找出系統中所存在的實體:講師表,學生表,班級表

(2)找出實體中應該存在的數據信息

    a) 講師:姓名,性別,年齡,工資

    b) 學生:姓名,性別,學號,學科

    c) 班級:班級名字,教師編號

 

注:關係型數據庫:維護實體內部,實體與實體之間的聯繫

 

*實體內部聯繫:每一個學生都有姓名、性別、學號、學科信息

姓名

性別

學號

學科

年齡

陳明

Ictast0001

PHP

20

陳晶晶

Ictast0002

PHP

 

王威

 

Ictast0003

UI

 

 

第二行的全部字段,都是在描述陳明這個學生(內部聯繫);第二列只能放性別(內部約束)

 

關係型數據庫的特色之一:若是表中對應的某個字段沒有值(數據),可是系統依然要分配空間(關係型數據庫比較浪費空間)

 

*實體與實體之間的聯繫:每一個學生確定屬於某個班級,每一個班級必定有多個學生(一對多)

 

學生表

姓名

性別

學號

學科

年齡

陳明

Ictast0001

PHP

20

陳晶晶

Ictast0002

PHP

 

王威

 

Ictast0003

UI

 

 

班級表

班級名稱

教室編號

PHP0810

B205

PHP0710

A203

UI0710

B330

 

如何將學生表和班級表關聯起來?

解決方案:在學生表中增長一個班級字段,來指向班級(必須可以惟一的找到一個班級信息)

姓名

性別

學號

學科

年齡

班級名稱

陳明

Ictast0001

PHP

20

PHP0810

陳晶晶

Ictast0002

PHP

 

PHP0810

王威

 

Ictast0003

UI

 

UI0710

 

學生實體與班級實體的關聯關係:實體與實體之間的關係

 

 

關鍵字說明

數據庫:database

數據庫系統:DBS(Database System)是一種虛擬系統,將多種內容關聯起來的稱呼

DBS = DBNS + DB

DBMS:Database Mangement System數據庫管理系統,專門管理數據庫

DBA:Database Adminstrator數據庫管理員


行/記錄:row/record,本質是一個東西:都是指表中的一行(一條記錄)

  行:是從結構角度出發

  記錄:是從數據角度出發

列/字段:column/field,本質是同一個東西

 

 

 

 

SQL

SQL:Structured Query Language結構化查詢語言(數據以查詢爲主,99%是在進行查詢操做)

 

SQL分爲三個部分

  • DDL:Data Definition Language,數據定義語言,用來維護存儲數據的結構(數據庫,表)。表明指令:create,drop,alter等
  • DML: Data Manipulation Language 數據操做語言,用來對數據進行操做(數據表中的內容),表明指令:insert,delete,update等;其中DML內部又單獨進行了一次分類:DQL(Data Query Language:數據查詢語言,如select)
  • DCL:Data Control Language,數據控制語言,主要負責權限管理(用戶),表明指令:grant,revoke等。

 

SQL是關係型數據庫的操做指令,SQL是一種約束,但不強制(相似W3C):不一樣的數據庫產品(如Oracle,mysql)內部可能會有一些細微的區別。

 

 

Mysql數據庫

Mysql數據庫是一種c/s結構(客戶端/服務端)的軟件,若想訪問服務器必須經過客戶端(服務器一直運行,客戶端在須要使用的時候運行),扁平化的方式。

交互方式:
  一、客戶端鏈接認證:鏈接服務器,認證身份:mysql.exe -hpup  #h找主機,p端口找軟件,u用戶,p密碼

      

   二、客戶端發送SQL指令

  三、服務器接收SQL指令:處理SQL指令,返回操做結果
  四、客戶端接收結果:顯示結果

      

   五、斷開鏈接(釋放資源:服務器併發限制):exit/quit/\q

       

 

 

問題解決方案:'mysql' 不是內部或外部命令,也不是可運行的程序或批處理文件。

      

      

win7下進入系統環境變量設置

將安裝的mysql程序的bin文件路徑填入path變量當中,上圖是D:\mysql57\soft\bin;(記得末尾的分號)

 關閉cmd後,從新登陸

      

 

 

Mysql服務器對象

服務器是C語言編譯好的結果,沒法進行反編譯,沒有辦法徹底瞭解服務器內部的內容:只能粗略的去分析數據庫服務器的內部結構。

 

將Mysql服務器內部對象分紅四層:系統(DBMS)——>數據庫(DB)——>數據表(Table)——>字段(field)

      

 

 

SQL基本操做


基本操做: CRUD

將SQL的基本操做,根據操做對象進行分類 ,分爲三類: 庫操做, 表操做(字段), 數據操做


庫操做

對數據庫的增刪改查。


新增數據庫


基本語法

Create database 數據庫名字 [庫選項];

庫選項: 用來約束數據庫, 分爲兩個選項

  字符集設定: charset/character set 具體字符集(數據存儲的編碼格式): 經常使用字符集: GBK和UTF8

  校對集設定: collate 具體校對集(數據比較的規則)

 

-- 雙中劃線 + 空格 :註釋(單行註釋),也可使用#號

-- 建立數據庫
create database mydatabase charset utf8;

      

 

其中:數據庫名字不能用關鍵字(已經被使用的字符)或者保留字(未來可能會用到的字符)

-- 建立關鍵字數據庫
create database database charset utf8;

      

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual thatcorresponds to your MySQL server version for the right syntax to use near 'database charset utf8' at line 1

 

 若是非要使用關鍵字或者保留字,必須使用反引號(esc鍵下面的鍵,在英文狀態下的輸出:`)

       

 

中文數據庫是能夠的,可是有前提條件: 保證服務器可以識別(建議不用)

      

 

若是建立不了,解決方案:告訴服務器當前中文的字符集是什麼

set names gbk;
create database 中國3 charset utf8;

      

 

當建立數據庫的SQL語句執行以後,發生了什麼?

一、在數據庫系統中,增長了對應的數據庫信息
二、會在保存數據的文件夾下: Data目錄,建立一個對應數據庫名字的文件夾

      

 

三、每一個數據庫下都有一個opt文件: 保存了庫選項

       

 

 

查看數據庫

 

一、查看全部數據庫: show databases;

show databases; -- 查看全部數據庫

      

 

二、查看指定部分的數據庫:模糊查詢
Show databases like 'pattern'; -- pattern是匹配模式
    %: 表示匹配多個字符
    _: 表示匹配單個字符

 

-- 建立數據庫

create database informationtest charset utf8;
show databases;

-- 查看以information_開始的數據庫
show databases like 'information_%';

      

 

-- 查看以information_開始的數據庫:_須要被轉義

show databases like 'information_%';   -- 至關於information%
show databases like 'information\_%';

      

       

 

三、查看數據庫的建立語句:
show create database 數據庫名字;

-- 查看數據庫建立語句
show create database mydatabase;
show create database database;   -- 報錯,ERROR 1064 (42000):
show create database `database`; -- 關鍵字須要使用反引號
show create database 中國;

       

數據庫在執行SQL語句以前會優化SQL:系統保存的結果是優化的結果。

 

 

更新/修改數據庫

數據庫名字不能夠修改.
  修改數據庫名不安全,再建立。

數據庫的修改僅限庫選項: 字符集和校對集(校對集依賴字符集)

alter database 數據庫名字 [庫選項];
    charset/ character set [=] 字符集
    collate 校對集


-- 修改數據庫informationtest的字符集
alter database informationtest charset GBK;

      

      

 不要隨意改校對集。

 

 

刪除數據庫


全部的操做中,刪除是最簡單的。

drop database 數據庫名字;

 

-- 刪除數據庫
drop database informationtest;

      

 

當刪除數據庫語句執行以後,發生了什麼?

一、在數據庫內部看不到對應的數據庫

二、在對應的數據庫存儲的文件夾內: 數據庫名字對應的文件夾也被刪除(級聯刪除:裏面的數據表所有刪除)

      

注意:數據庫的刪除不是鬧着玩的,不要隨意刪除,應該先進行備份後操做.(刪除不可逆)

 

 

表操做

表與字段是密不可分的。

 

新增數據表

create table [if not exists] 表名(
字段名 數據類型,
字段名 數據類型 -- 最後一行不須要逗號
)[表選項];

 

If not exists: 若是表名不存在,那麼就建立,不然不執行建立代碼: 檢查功能

表選項: 控制表的表現
  字符集: charset/character set 具體字符集; -- 保證表中數據存儲的字符集
  校對集: collate 具體校對集;
  存儲引擎: engine 具體的存儲引擎(innodb和myisam)

 

       

-- 建立表
create table if not exists student(
name varchar(10),
gender varchar(10),
number varchar(10),
age int
)charset utf8;

ERROR 1046 (3D000): No database selected
View Code

DBMS管理數據庫,數據庫管理表,沒有指定數據庫,管理不了表。

 

任何一個表的設計都必須指定數據庫。

方案1: 顯示的指定表所屬的數據庫

Create table 數據庫名.表名(); -- 將當前數據表建立到指定的數據庫下

      

-- 建立表
create table if not exists mydatabase.student( -- 顯示的將student表放到mydatabase數據庫下
name varchar(10),
gender varchar(10),
number varchar(10),
age int
)charset utf8;
View Code

 

 

方案2: 隱式的指定表所屬數據庫: 先進入到某個數據庫環境,而後建立的表自動歸屬到該指定的數據庫.

進入數據庫環境: use 數據庫名字; -- 能夠沒有分號

       

 

-- 建立數據表
-- 進入數據庫
use mydatabase;

-- 建立表
create table class(
name varchar(10),
room varchar(10)
)charset utf8;
View Code

 

當建立數據表的SQL指令執行以後,到底發生了什麼?

  一、指定數據庫下已經存在對應的表
  二、在數據庫對應的文件夾下,會產生對應表的結構文件(跟存儲引擎有關係)

       

 

 

 

查看數據表


數據庫能查看的方式,表均可以查看.

一、查看全部表: show tables;

-- 查看全部表
show tables;

      

 

二、查看部分表: 模糊匹配: show tables like 'pattern';

--查看以s結尾的表
show tables like '%s';

      

效率低(索引失效,不推薦使用)


三、查看錶的建立語句: show create table 表名;

-- 查看錶建立語句
show create table student\g   -- \g ==;等價於分號
show create table student\G   -- 將查到的結構旋轉90度變成縱向,字段多,折行時用

      

 

四、查看錶結構: 查看錶中的字段信息
desc/describe/show columns from 表名;

-- 查看錶結構
desc class;
describe class;
show columns from class;

       

 

 

修改數據表

表自己存在, 還包含字段,表的修改分爲兩個部分: 修改表自己和修改字段


修改表自己

表自己能夠修改: 表名和表選項

 

修改表名: rename table 老表名 to 新表名;

-- 重命名錶:student表 --> my_student(取數據庫名字前兩個字母)
rename table student to my_student;

       

 

修改表選項: 字符集,校對集和存儲引擎

alter table 表名 表選項 [=] 值;

       

-- 修改表選項:字符集
alter table my_student charset = GBK;

show create table my_student;
alter table my_student charset = GBK;
show create table my_student;
View Code

 

修改字段

字段操做不少: 新增, 修改, 重命名, 刪除

 

新增字段

alter table 表名 add [column] 字段名 數據類型 [列屬性] [位置];

  位置: 字段名能夠存放表中的任意位置

      First: 第一個位置

      After: 在哪一個字段以後: after 字段名; 默認的是在最後一個字段以後

      

desc my_student;

-- 給學生表增長ID放到第一個位置
alter table my_student
add column id int
first;  -- mysql會自動尋找分號:語句結束符

desc my_student;
View Code

 

修改字段: 修改一般是修改屬性或者數據類型

Alter table 表名 modify 字段名 數據類型 [屬性] [位置];

      

desc my_student;

-- 將學生表中的number學號字段變成固定長度,且放到第二位(id以後)
alter table my_student
modify number char(10) after id;

desc my_student;
View Code

 

重命名字段

Alter table 表名 change 舊字段 新字段名 數據類型 [屬性] [位置];

      

desc my_student;

-- 修改學生表中的gender字段爲sex
alter table my_student
change gender sex varchar(10);

desc my_student;
View Code

 

刪除字段

Alter table 表名 drop 字段名;

      

desc my_student;

-- 刪除學生表中的年齡字段(age)
alter table my_student drop age;

desc my_student;
View Code

 

當心: 若是表中已經存在數據,那麼刪除字段會清空該字段的全部數據(不可逆)

 

 

  1. 刪除數據表

    Drop table 表名1,表名2...;    -- 能夠一次性刪除多張表

    當刪除數據表的指令執行以後發生了什麼?

  2. 在表空間中,沒有了指定的表(數據也沒有了)
  3. 在數據庫對應的文件夾下, 表對應的文件(與存儲引擎有關)也會被刪除

    注意: 刪除有危險,操做需謹慎(不可逆)

 

 

 

數據操做

 

新增數據

有兩種方案

方案1: 給全表字段插入數據, 不須要指定字段列表: 要求數據的值出現的順序必須與表中設計的字段出現的順序一致: 凡是非數值數據,都須要使用引號(建議是單引號)包裹

Insert into 表名 values(值列表)[,(值列表)];    -- 能夠一次性插入多條記錄

 

方案2: 給部分字段插入數據,須要選定字段列表: 字段列表出現的順序與字段的順序無關; 可是值列表的順序必須與選定的字段的順序一致.

Insert into 表名 (字段列表) values (值列表)[,(值列表)];

 

 

查看數據

Select */字段列表 from 表名 [where條件];

查看全部數據

 

查看指定字段,指定條件的數據.

 

 

 

更新數據

Update 表名 set 字段 = 值 [where條件];    -- 建議都有where: 要不是更新所有

 

更新不必定會成功: 如沒有真正要更新的數據

 

刪除數據

刪除是不可逆的: 謹慎刪除

Delete from 表名 [where條件];

 

 

中文數據問題

中文數據問題本質是字符集問題.

計算機只識別二進制: 人類更可能是識別符號: 須要有個二進制與字符的對應關係(字符集)

客戶端向服務器插入中文數據: 沒有成功

緣由: \xD5\xC5\xD4\xBD表明的是"張越"在當前編碼(字符集)下對應的二進制編碼轉換成的十六進制: 兩個漢字 => 四個字節(GBK)

報錯: 服務器沒有識別對應的四個字節: 服務器認爲數據是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

Connection鏈接層: 是字符集轉變的中間者,若是統一了效率更高,不統一也沒問題.

校對集問題

校對集: 數據比較的方式

校對集有三種格式

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

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

_ci: case insensitice,大小寫不敏感,不區分大小寫

查看數據庫所支持的校對集: show collation;

校對集應用: 只有當數據產生比較的時候,校對集纔會生效.

對比: 使用utf8 的_bin和_ci來驗證不一樣的校對集的效果

  1. 建立不一樣校對集對應的表

  2. 插入數據

  3. 比較: 根據某個字段進行排序: order by 字段名 [asc|desc]; asc升序,desc降序,默認是升序

    校對集: 必須在沒有數據以前聲明好,若是有了數據,那麼再進行校對集修改: 那麼修改無效.

    Web亂碼問題

    動態網站由三部分構成: 瀏覽器, apache服務器(PHP),數據庫服務器, 三個部分都有本身的字符集(中文), 數據須要在三個部分之間來回傳遞: 很容易產生亂碼.

    如何解決亂碼問題: 統一編碼(三碼合一)

    可是事實上不可能: 瀏覽器是用戶管理(根本不可能控制).

    可是必需要解決這些問題: 主要靠PHP來作

     ---------------------------------------------------------------------------------------------------------------------

 

對應的sql腳本代碼:

-- 雙中劃線+空格: 註釋(單行註釋),也可使用#號

 

-- 建立數據庫

create database mydatabase charset utf8;

 

-- 建立關鍵字數據庫

create database database charset utf8;

 

-- 使用反引號

create database `database` charset utf8;

 

-- 建立中文數據庫

create database 中國 charset utf8;

create database `中國` charset utf8;

 

-- 解決方案: 告訴服務器當前中文的字符集是什麼

set names gbk;

create database 中國 charset utf8;

 

-- 查看全部數據庫

show databases;

 

-- 建立數據庫

create database informationtest charset utf8;

 

-- 查看以information_開始的數據庫: _須要被轉義

show databases like 'information\_%';

show databases like 'information_%';    -- 至關於information%

 

-- 查看數據庫建立語句

show create database mydatabase;

show create database `database`;    -- 關鍵字須要使用反引號

 

-- 修改數據庫informationtest的字符集

alter database informationtest charset GBK;

 

-- 刪除數據庫

drop database informationtest;

 

-- 建立表

create table if not exists mydatabase.student(    -- 顯示的將student表放到mydatabase數據庫下

name varchar(10),

gender varchar(10),

number varchar(10),

age int

)charset utf8;

 

-- 建立數據表

-- 進入數據庫

use mydatabase;

 

-- 建立表

create table class(

name varchar(10),

room varchar(10)

)charset utf8;

 

-- 查看全部表

show tables;

 

-- 查看以s結尾的表

show tables like '%s';

 

-- 查看錶建立語句

show create table student\g    -- \g ==== ;

show create table student\G    -- 將查到的結構旋轉90度變成縱向

 

-- 查看錶結構

desc class;

describe class;

show columns from class;

 

-- 重命名錶: student表 -> my_student(取數據庫名字前兩個字母)

rename table student to my_student;

 

-- 修改表選項: 字符集

alter table my_student charset = GBK;

 

-- 給學生表增長ID放到第一個位置

alter table my_student

add column id int

first;    -- mysql會自動尋找分號: 語句結束符

 

-- 將學生表中的number學號字段變成固定長度,且放到第二位(id以後)

alter table my_student

modify number char(10) after id;

 

-- 修改學生表中的gender字段爲sex

alter table my_student

change gender sex varchar(10);

 

-- 刪除學生表中的年齡字段(age)

alter table my_student drop age;

 

-- 刪除數據表

drop table class;

 

-- 插入數據

insert into my_student values(1,'itcast0001','Jim','male'),

(2,'itcast0002','Hanmeimei','female');

 

-- 插入數據: 指定字段列表

insert into my_student(number,sex,name,id) values

('itcast0003','male','Tom',3),

('itcast0004','female','Lily',4);

 

-- 查看全部數據

select * from my_student;

 

-- 查看指定字段,指定條件數據

select id,number,sex,name from my_student where id = 1;    -- 查看知足id爲1的學生信息

 

-- 更新數據

update my_student set sex = 'female' where name = 'jim';

 

-- 刪除數據

delete from my_student where sex = 'male';

 

-- 插入數據(中文)

insert into my_student values(5,'itcast0005','張越','');

 

-- 查看全部字符集

show character set;

 

-- 查看服務器默認的對外處理的字符集

show variables like 'character_set%';

 

-- 修改服務器認爲的客戶端數據的字符集爲GBK

set character_set_client = gbk;

 

-- 修改服務器給定數據的字符集爲GBK

set character_set_results = gbk;

 

-- 快捷設置字符集

set names gbk;

 

-- 查看全部校對集

show collation;

 

-- 建立表使用不一樣的校對集

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;

 

-- 插入數據

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;

 

-- 有數據後修改校對集

alter table my_collate_ci collate = utf8_bin;

alter table my_collate_ci collate = utf8_general_ci;
View Code
相關文章
相關標籤/搜索