1. 程式人生 > >MySql的相關資操作

MySql的相關資操作

01-MySql的前戲

 

MySql的前戲

在學習Mysql之前,我們先來想一下一開始做的登入註冊案例,當時我們把使用者的資訊儲存到一個檔案中:

#使用者名稱 |密碼
root|123321 alex|123123

上面檔案內容的規則是我自己定義的,你要想用我這個程式,必須按照我的規則去執行,但凡不是這個規則,就沒有交流的餘地。

在一開始的時候檔案格式的規定是沒有規範的,後面學到模組的時候逐漸知道了目錄規則,我們會把檔案放到db目錄下。

類似下面目錄結構:

 

對於上面db目錄中,是可以存放多個檔案的,並且檔案中可以有多行資料。

 

那麼問大家一個問題,如果說上面那個軟體是我寫好的,在一臺伺服器或者一臺機器上安裝了我寫好的軟體。

現在有張三和李四兩個人都安裝了我這個軟體,張三註冊了一個使用者,李四也註冊了一個使用者,那麼自己註冊的使用者應該是自己用的。那麼這兩個使用者是不共享的,

所以這個軟體證明我寫的不太好,它不能共享,這種類似單機的軟體是不好的。

然後呢,我現在將我寫的這個軟體中目錄修改一下,將db目錄移除。現在將單機程式(自己的DB)改變成也是單機程式(公用DB)。

 

那麼之前給大家介紹過,凡是互動操作,是離不開scoket的,那麼現在我這邊有個公用DB和一個scoket服務端,然後在張三和李四那邊有scoket客戶端。張三和李四此時輸入使用者名稱和密碼,現在我這邊scoket服務端某個目錄接收使用者輸入的使用者名稱和密碼,看一下該使用者名稱存在不存在,如果存在返回true,如果不存在返回false。也就是說重點的內容我們把db目錄放到某臺伺服器上。

那麼上面這個例子呢,其實就給大家慢慢的引出來mysql了,mysql呢其實就一個軟體,這個軟體安裝到某臺電腦上或者某臺伺服器上,那麼現在只要我告訴它建立一個檔案目錄或者建立檔案,那麼mysql就自動幫我們建立了,比如說我們再在檔案中新增一條資料,那麼它也幫我們完成。

 

總結一句話:其實mysql就是用於管理我們的檔案的一個軟體。

 

那麼對於mysql這個軟體來說有兩個軟體

複製程式碼
---伺服器軟體
     - socket服務端
     - 本地檔案操作
   - 解析指令(mysql語句) ---客戶端軟體 - socket客戶端 - 傳送指令
   - 解析指令(mysql語句)
複製程式碼

解釋:

對於伺服器軟體中的socket伺服器是一直開著,客戶端得需要連線,並且還有建立檔案、刪除檔案等等的操作

對於客戶端軟體中的scoket客戶端,我們得需要傳送指令去命令scoket服務端對檔案進行操作。

 

大家應該知道ftp的專案,上傳專案和下載專案的命令是不一樣的。那麼對於mysql中的客戶端和服務端也會有些指令的操作,那麼在這兩個端中應該是有解析指令的過程,這個指令只有mysql這個軟體知道,這種指令就是mysql語句。

再想想我們寫的html、css、js.這些好比就是我們客戶端寫好的語法,然後瀏覽器充當了服務端的角色去解析我們的的語法,最後來渲染出來結果。

 

接下來我們要學習這些技能:

- 安裝 服務端和客戶端
- 連線
- 學習SOL語句規則:命令服務端做任何的操作


  

02-資料庫概述

 

什麼是資料(Data)

複製程式碼
描述事物的符號記錄稱為資料,描述事物的符號既可以是數字,也可以是文字、圖片,影象、聲音、語言等,資料由多種表現形式,它們都可以經過數字化後存入計算機

在計算機中描述一個事物,就需要抽取這一事物的典型特徵,組成一條記錄,就相當於檔案裡的一行內容,如:

1 xiaomage,male,18,1999,山東,計算機系,2017,oldboy
複製程式碼

 

單純的一條記錄並沒有任何意義,如果我們按逗號作為分隔,依次定義各個欄位的意思,相當於定義表的標題

這樣通過表格我們很清楚的知道了某人的詳細資訊。

 

什麼是資料庫(DataBase,簡稱DB)

資料庫即存放資料的倉庫,只不過這個倉庫是在計算機儲存裝置上,而且資料是按一定的格式存放的

過去人們將資料存放在檔案櫃裡,現在資料量龐大,已經不再適用

資料庫是長期存放在計算機內、有組織、可共享的資料即可。

資料庫中的資料按一定的資料模型組織、描述和儲存,具有較小的冗餘度、較高的資料獨立性和易擴充套件性,並可為各種 使用者共享

 

什麼是資料庫管理系統(DataBase Management System)

在瞭解了Data與DB的概念後,如何科學地組織和儲存資料,如何高效獲取和維護資料成了關鍵

這就用到了一個系統軟體---資料庫管理系統

如MySQL、Oracle、SQLite、Access、MS SQL Server

mysql主要用於大型門戶,例如搜狗、新浪等,它主要的優勢就是開放原始碼,因為開放原始碼這個資料庫是免費的,他現在是甲骨文公司的產品。
oracle主要用於銀行、鐵路、飛機場等。該資料庫功能強大,軟體費用高。也是甲骨文公司的產品。
sql server是微軟公司的產品,主要應用於大中型企業,如聯想、方正等。

資料庫伺服器、資料管理系統、資料庫、表與記錄的關係(重點理解!!!)

記錄:1 xxx 324245234 22(多個欄位的資訊組成一條記錄,即檔案中的一行內容)

表:student,scholl,class_list(即檔案)

資料庫:oldboy_stu(即資料夾)

資料庫管理系統:如mysql(是一個軟體)

資料庫伺服器:一臺計算機(對記憶體要求比較高)

 

總結:

資料庫伺服器-:執行資料庫管理軟體

資料庫管理軟體:管理-資料庫

資料庫:即資料夾,用來組織檔案/表

表:即檔案,用來存放多行內容/多條記錄

 

03-MySql安裝和基本管理

 

本節掌握內容:

  • MySQL的介紹安裝、啟動

  • windows上製作服務
  • MySQL破解密碼

  • MySQL中統一字元編碼

 

MySQL是一個關係型資料庫管理系統,由瑞典MySQL AB 公司開發,目前屬於 Oracle 旗下公司。MySQL 最流行的關係型資料庫管理系統,在 WEB 應用方面MySQL是最好的 RDBMS (Relational Database Management System,關係資料庫管理系統) 應用軟體之一。

MySQL是一種關係資料庫管理系統,關係資料庫將資料儲存在不同的表中,而不是將所有資料放在一個大倉庫內,這樣就增加了速度並提高了靈活性。

  • Mysql是開源的,所以你不需要支付額外的費用。

  • Mysql支援大型的資料庫。可以處理擁有上千萬條記錄的大型資料庫。

  • MySQL使用標準的SQL資料語言形式。

  • Mysql可以允許於多個系統上,並且支援多種語言。這些程式語言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。

  • Mysql對PHP有很好的支援,PHP是目前最流行的Web開發語言。

  • MySQL支援大型資料庫,支援5000萬條記錄的資料倉庫,32位系統表文件最大可支援4GB,64位系統支援最大的表文件為8TB。

  • Mysql是可以定製的,採用了GPL協議,你可以修改原始碼來開發自己的Mysql系統。

由於其社群版的效能卓越,搭配Apache和PHP以及python 可組成良好的開發環境。

 

應用環境

與其他的大型資料庫例如 OracleDB2SQL Server等相比,MySQL [1]  自有它的不足之處,但是這絲毫也沒有減少它受歡迎的程度。對於一般的個人使用者和中小型企業來說,MySQL提供的功能已經綽綽有餘,而且由於 MySQL是開放原始碼軟體,因此可以大大降低總體擁有成本。

Linux作為 作業系統Apache 或 Nginx作為  Web 伺服器,MySQL 作為 資料庫,PHP/Perl/ Python作為伺服器端 指令碼 直譯器。由於這四個軟體都是免費或 開放原始碼軟體( FLOSS),因此使用這種方式不用花一分錢(除開人工成本)就可以建立起一個穩定、免費的 網站系統,被業界稱為“ LAMP“或“ LNMP”組合。

mysql是什麼?

總結:mysql就是一個基於socket編寫的C/S架構的軟體

資料庫管理軟體分類

複製程式碼
分兩大類:
  關係型:如sqllite,db2,oracle,access,sql server,MySQL,注意:sql語句通用
  非關係型:mongodb,redis,memcache

總結兩句話:
    關係型資料庫需要有表結構
    非關係型資料庫是key-value儲存的,沒有表結構

所以,現在我們使用關係型資料庫管理系統(RDBMS)來儲存和管理的大資料量。所謂的關係型資料庫,是建立在關係模型基礎上的資料庫,藉助於集合代數等數學概念和方法來處理資料庫中的資料。

RDBMS即關係資料庫管理系統(Relational Database Management System)的特點:

  • 1.資料以表格的形式出現

  • 2.每行為各種記錄名稱

  • 3.每列為記錄名稱所對應的資料域

  • 4.許多的行和列組成一張表單

  • 5.若干的表單組成database

RDBMS 術語

在我們開始學習MySQL 資料庫前,讓我們先了解下RDBMS的一些術語:

  • 資料庫: 資料庫是一些關聯表的集合。.

  • 資料表: 表是資料的矩陣。在一個數據庫中的表看起來像一個簡單的電子表格。

  • 列: 一列(資料元素) 包含了相同的資料, 例如郵政編碼的資料。

  • 行:一行(=元組,或記錄)是一組相關的資料,例如一條使用者訂閱的資料。

  • 冗餘:儲存兩倍資料,冗餘降低了效能,但提高了資料的安全性。

  • 主鍵:主鍵是唯一的。一個數據表中只能包含一個主鍵。你可以使用主鍵來查詢資料。

  • 外來鍵:外來鍵用於關聯兩個表。

  • 複合鍵:複合鍵(組合鍵)將多個列作為一個索引鍵,一般用於複合索引。

  • 索引:使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構。類似於書籍的目錄。

  • 參照完整性: 參照的完整性要求關係中不允許引用不存在的實體。與實體完整性是關係模型必須滿足的完整性約束條件,目的是保證資料的一致性。

複製程式碼

 

mysql的下載安裝

想要使用MySQL來儲存並儲存資料,則需要做幾件事情:

  a. 安裝MySQL服務端
  b. 安裝MySQL客戶端
  b. 【客戶端】連線【服務端】
  c. 【客戶端】傳送命令給【服務端MySQL】服務的接受命令並執行相應操作(增刪改查等)

下載地址:

https://dev.mysql.com/downloads/mysql/

 

window版本

1、官網去下載

 

2、針對作業系統的不同下載不同的版本

 

 

3.解壓

如果想要讓MySQL安裝在指定目錄,那麼就將解壓後的資料夾移動到指定目錄,如:C:\mysql-5.6.40-winx64

4.新增環境變數 

5.初始化

1 mysqld  - - initialize - insecure

 

 6.啟動mysql服務

mysqld #啟動MySQL服務

 

7.啟動mysql客戶端並連線mysql服務端(新開一個cmd視窗)

mysql -u root -p # 連線MySQL伺服器

 

上一步解決了一些問題,但不夠徹底,因為在執行【mysqd】啟動MySQL伺服器時,當前終端會被hang住,那麼做一下設定即可解決此問題,即將MySQL服務製作成windows服務

複製程式碼
注意:--install前,必須用mysql啟動命令的絕對路徑
# 製作MySQL的Windows服務,在終端執行此命令:
"c:\mysql-5.6.40-winx64\bin\mysqld" --install

# 移除MySQL的Windows服務,在終端執行此命令:
"c:\mysql-5.6.40-winx64\bin\mysqld" --remove


註冊成服務之後,以後再啟動和關閉MySQL服務時,僅需執行如下命令:
# 啟動MySQL服務
net start mysql

# 關閉MySQL服務
net stop mysql
複製程式碼

 

windows下登入設定密碼

 

開啟終端,輸入mysql

輸入mysql提供的函式:select user(); # 檢視當前登入的賬號

當前登入的預設賬號為[email protected]

 

 

如果想切到root賬號登入

執行命令:

mysql -uroot -p

再檢視當前使用者:

select user();

管理員為root(擁有最高許可權,管理員賬號),密碼為空,以無密碼的方式登入了管理員賬號,是非常危險的一件事情,所以要為管理員賬號設定密碼

設定管理員root賬號密碼為123

C:\Users\mjj>mysqladmin -uroot -p password "123"  #設定初始密碼 由於原密碼為空,因此-p可以不用 Mysql版本的不同,可能執行這句指令不起作用,請使用update mysql.user set authentication_string =password('') where User='root'; 

ps:⚠️不用管它。翻譯為:在命令列介面使用密碼不安全,暴露在終端當中。

 

然後再登入賬號,不輸入密碼則會出現如下結果:

 再次執行如下操作:

 

再檢視一下當前登入的賬號:

 

如果想將原始密碼123,設定新密碼為456

C:\Users\mjj>mysqladmin -uroot -p"123" password "456"  #修改mysql密碼,因為已經有密碼了,所以必須輸入原密碼才能設定新密碼

 依次執行如下操作:

mysql -uroot -p456

select user();

 

密碼忘記——破解密碼

 

跳過授權方式,直接登入!!

0.以管理員身份開啟cmd

 

2.停掉mysql服務端

C:\WINDOWS\system32>net stop mysql
MySQL 服務正在停止.
MySQL 服務已成功停止。

3.執行如下命令跳過授權表

#跳過授權表
C:\WINDOWS\system32>mysqld --skip-grant-tables
2018-06-09 17:12:38 0 [Warning] Insecure configuration for --secure-file-priv: Current value does not restrict location of generated files. Consider setting it to a valid, non-empty path.
2018-06-09 17:12:38 0 [Note] mysqld (mysqld 5.6.40) starting as process 6052 ...4.

 4.再次檢視

5. 現在可以任意的更改密碼,執行如下命令

 update mysql.user set authentication_string =password('') where User='root'; 

 

6.重新整理許可權,執行命令

flush privileges;

7.退出mysql。執行命令:exit,

 

8.讓使用者去載入許可權,以管理員身份進入cmd,檢視當前mysql程序

1 tasklist |findstr mysql   #檢視當前mysql的程序

 

9.殺死當前的程序,執行如下命令

taskkill /F /PID 6052  # 殺死當前的程序pid

10.再次執行如下操作,還原

 

統一字元編碼

進入mysql客戶端,執行\s

 

 

為了統一字元編碼,請執行如下操作:

(1)my.ini檔案是mysql的配置檔案,

在C:\mysql-5.6.40-winx64檔案下建立my.ini檔案

(2)將如下程式碼拷貝儲存。

複製程式碼

[mysqld]
# 設定mysql的安裝目錄 **後面的路徑一定是安裝sql的目錄(自己電腦的)**
basedir=C:\mysql-5.7.22-winx64\mysql-5.7.22-winx64
# 設定mysql資料庫的資料的存放目錄,必須是data
datadir=C:\mysql-5.7.22-winx64\mysql-5.7.22-winx64\data
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

# mysql埠
port=3306
# 字符集
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

複製程式碼

 

(3)以管理員身份重啟服務,執行如下命令 

複製程式碼
C:\Windows\system32>net stop MySQL
MySQL 服務正在停止..
MySQL 服務已成功停止。

C:\Windows\system32>net start MySQL
MySQL 服務正在啟動 .
MySQL 服務已經啟動成功。
複製程式碼

(4)在cmd中輸入mysql進入mysql環境,執行\s,顯示如下資訊,表示成功

 

04-基本的mysql語句

 

本節課先對mysql的基本語法初體驗。

操作資料夾(庫)

create database db1 charset utf8;

# 檢視當前建立的資料庫
show create database db1;
# 檢視所有的資料庫
show databases;

alter database db1 charset gbk;

drop database db1;

 

 

 

操作檔案(表)

use db1; #切換資料夾

select database(); #檢視當前所在資料夾

create table t1(id int,name char);

查 

複製程式碼
#檢視當前的這張t1表
show create table t1;

# 檢視所有的表
show tables;

# 查看錶的詳細資訊
desc t1;
複製程式碼

# modify修改的意思
alter table t1 modify name char(6);
# 改變name為大寫的NAME
alter table t1 change name NAMA char(7);

# 刪除表
drop table t1;

 

 

操作檔案內容(記錄)

 增

# 插入一條資料,規定id,name資料leilei
insert t1(id,name) values(1,"mjj01"),(2,"mjj02"),(3,"mjj03");

 查

select id from db1.t1;
select id,name from db1.t1;
select * from db1.t1; 

update db1.t1 set name='zhangsan';
update db1.t1 set name='alex' where id=2;

 刪

delete from t1;
delete from t1 where id=2;

 

05-庫的操作

 

本節重點:

  • 掌握庫的增刪改查

 

一、系統資料庫

執行如下命令,檢視系統庫

show databases;

information_schema: 虛擬庫,不佔用磁碟空間,儲存的是資料庫啟動後的一些引數,如使用者表資訊、列資訊、許可權資訊、字元資訊等
performance_schema: MySQL 5.5開始新增一個數據庫:主要用於收集資料庫伺服器效能引數,記錄處理查詢請求時發生的各種事件、鎖等現象
mysql: 授權庫,主要儲存系統使用者的許可權資訊
test: MySQL資料庫系統自動建立的測試資料庫

二、建立資料庫

1、求救語法:

help create database;

2、建立資料庫語法

CREATE DATABASE 資料庫名 charset utf8;

3、資料庫命名規則:

複製程式碼
可以由字母、數字、下劃線、@、#、$
區分大小寫
唯一性
不能使用關鍵字如 create select
不能單獨使用數字
最長128位
# 基本上跟python或者js的命名規則一樣
複製程式碼

三、資料庫相關操作

複製程式碼
#檢視資料庫
show databases;
#檢視當前庫
show create database db1;
#檢視所在的庫
select database();

#選擇資料庫
use 資料庫名

#刪除資料庫
DROP DATABASE 資料庫名;
# 修改資料庫
alter database db1 charset utf8;
複製程式碼

 

四、瞭解內容

SQL語言主要用於存取資料、查詢資料、更新資料和管理關係資料庫系統,SQL語言由IBM開發。SQL語言分為3種類型:
1、DDL語句    資料庫定義語言: 資料庫、表、檢視、索引、儲存過程,例如CREATE DROP ALTER

2、DML語句    資料庫操縱語言: 插入資料INSERT、刪除資料DELETE、更新資料UPDATE、查詢資料SELECT

3、DCL語句    資料庫控制語言: 例如控制使用者的訪問許可權GRANT、REVOKE
複製程式碼
SQL語言主要用於存取資料、查詢資料、更新資料和管理關係資料庫系統,SQL語言由IBM開發。SQL語言分為3種類型:
1、DDL語句    資料庫定義語言: 資料庫、表、檢視、索引、儲存過程,例如CREATE DROP ALTER

2、DML語句    資料庫操縱語言: 插入資料INSERT、刪除資料DELETE、更新資料UPDATE、查詢資料SELECT

3、DCL語句    資料庫控制語言: 例如控制使用者的訪問許可權GRANT、REVOKE

 

06-表的操作

 

本節掌握

  • 儲存引擎介紹(瞭解)
  • 表的增刪改查

一、儲存引擎(瞭解)

前幾節我們知道mysql中建立的庫===》資料夾,庫中的表====》檔案

現實生活中我們用來儲存資料的檔案有不同的型別,每種檔案型別對應各自不同的處理機制:比如處理文字用txt型別,處理表格用excel,處理圖片用png等

資料庫中的表也應該有不同的型別,表的型別不同,會對應mysql不同的存取機制,表型別又稱為儲存引擎。

ps: 儲存引擎說白了就是如何儲存資料、如何為儲存的資料建立索引和如何更新、查詢資料等技術的實現方法。因為在關係資料庫中資料的儲存是以表的形式儲存的,所以儲存引擎也可以稱為表型別(即儲存和操作此表的型別)

在Oracle 和SQL Server等資料庫中只有一種儲存引擎,所有資料儲存管理機制都是一樣的。而MySql
資料庫提供了多種儲存引擎。使用者可以根據不同的需求為資料表選擇不同的儲存引擎,使用者也可以根據
自己的需要編寫自己的儲存引擎

SQL 解析器、SQL 優化器、緩衝池、儲存引擎等元件在每個資料庫中都存在,但不是每 個數據庫都有這麼多儲存引擎。MySQL 的外掛式儲存引擎可以讓儲存引擎層的開發人員設 計他們希望的儲存層,例如,有的應用需要滿足事務的要求,有的應用則不需要對事務有這 麼強的要求 ;有的希望資料能持久儲存,有的只希望放在記憶體中,臨時並快速地提供對資料 的查詢。

 

二、mysql支援的儲存引擎

mysql> show engines\G;# 檢視所有支援的引擎
mysql> show variables like 'storage_engine%'; # 檢視正在使用的儲存引擎

 

1、InnoDB 儲存引擎

支援事務,其設計目標主要面向聯機事務處理(OLTP)的應用。其

特點是行鎖設計、支援外來鍵,並支援類似 Oracle 的非鎖定讀,即預設讀取操作不會產生鎖。 從 MySQL 5.5.8 版本開始是預設的儲存引擎。

InnoDB 儲存引擎將資料放在一個邏輯的表空間中,這個表空間就像黑盒一樣由 InnoDB 儲存引擎自身來管理。從 MySQL 4.1(包括 4.1)版本開始,可以將每個 InnoDB 儲存引擎的 表單獨存放到一個獨立的 ibd 檔案中。此外,InnoDB 儲存引擎支援將裸裝置(row disk)用 於建立其表空間。

InnoDB 通過使用多版本併發控制(MVCC)來獲得高併發性,並且實現了 SQL 標準 的 4 種隔離級別,預設為 REPEATABLE 級別,同時使用一種稱為 netx-key locking 的策略來 避免幻讀(phantom)現象的產生。除此之外,InnoDB 儲存引擎還提供了插入緩衝(insert buffer)、二次寫(double write)、自適應雜湊索引(adaptive hash index)、預讀(read ahead) 等高效能和高可用的功能。

對於表中資料的儲存,InnoDB 儲存引擎採用了聚集(clustered)的方式,每張表都是按 主鍵的順序進行儲存的,如果沒有顯式地在表定義時指定主鍵,InnoDB 儲存引擎會為每一 行生成一個 6 位元組的 ROWID,並以此作為主鍵。

InnoDB 儲存引擎是 MySQL 資料庫最為常用的一種引擎,Facebook、Google、Yahoo 等 公司的成功應用已經證明了 InnoDB 儲存引擎具備高可用性、高效能以及高可擴充套件性。對其 底層實現的掌握和理解也需要時間和技術的積累。如果想深入瞭解 InnoDB 儲存引擎的工作 原理、實現和應用,可以參考《MySQL 技術內幕:InnoDB 儲存引擎》一書。

2、MyISAM 儲存引擎

不支援事務、表鎖設計、支援全文索引,主要面向一些 OLAP 數 據庫應用,在 MySQL 5.5.8 版本之前是預設的儲存引擎(除 Windows 版本外)。資料庫系統 與檔案系統一個很大的不同在於對事務的支援,MyISAM 儲存引擎是不支援事務的。究其根 本,這也並不難理解。使用者在所有的應用中是否都需要事務呢?在資料倉庫中,如果沒有 ETL 這些操作,只是簡單地通過報表查詢還需要事務的支援嗎?此外,MyISAM 儲存引擎的 另一個與眾不同的地方是,它的緩衝池只快取(cache)索引檔案,而不快取資料檔案,這與 大多數的資料庫都不相同。

3、NDB 儲存引擎

年,MySQL AB 公司從 Sony Ericsson 公司收購了 NDB 儲存引擎。 NDB 儲存引擎是一個叢集儲存引擎,類似於 Oracle 的 RAC 叢集,不過與 Oracle RAC 的 share everything 結構不同的是,其結構是 share nothing 的叢集架構,因此能提供更高級別的 高可用性。NDB 儲存引擎的特點是資料全部放在記憶體中(從 5.1 版本開始,可以將非索引數 據放在磁碟上),因此主鍵查詢(primary key lookups)的速度極快,並且能夠線上新增 NDB 資料儲存節點(data node)以便線性地提高資料庫效能。由此可見,NDB 儲存引擎是高可用、 高效能、高可擴充套件性的資料庫集群系統,其面向的也是 OLTP 的資料庫應用型別。

4、Memory 儲存引擎

正如其名,Memory 儲存引擎中的資料都存放在記憶體中,資料庫重 啟或發生崩潰,表中的資料都將消失。它非常適合於儲存 OLTP 資料庫應用中臨時資料的臨時表,也可以作為 OLAP 資料庫應用中資料倉庫的維度表。Memory 儲存引擎預設使用雜湊 索引,而不是通常熟悉的 B+ 樹索引。

5、Infobright 儲存引擎

第三方的儲存引擎。其特點是儲存是按照列而非行的,因此非常 適合 OLAP 的資料庫應用。其官方網站是 http://www.infobright.org/,上面有不少成功的資料 倉庫案例可供分析。

6、NTSE 儲存引擎

網易公司開發的面向其內部使用的儲存引擎。目前的版本不支援事務, 但提供壓縮、行級快取等特性,不久的將來會實現面向記憶體的事務支援。

7、BLACKHOLE

黑洞儲存引擎,可以應用於主備複製中的分發主庫。

MySQL 資料庫還有很多其他儲存引擎,上述只是列舉了最為常用的一些引擎。如果 你喜歡,完全可以編寫專屬於自己的引擎,這就是開源賦予我們的能力,也是開源的魅 力所在。

 

指定表型別/儲存引擎

create table t1(id int)engine=innodb;# 預設不寫就是innodb

 

小練習:

建立四張表,分別使用innodb,myisam,memory,blackhole儲存引擎,進行插入資料測試 

create table t1(id int)engine=innodb;
create table t2(id int)engine=myisam;
create table t3(id int)engine=memory;
create table t4(id int)engine=blackhole;

檢視data檔案下db1資料庫中的檔案:

複製程式碼
#.frm是儲存資料表的框架結構

# .ibd是mysql資料檔案 

#.MYD是MyISAM表的資料檔案的副檔名

#.MYI是MyISAM表的索引的副檔名

#發現後兩種儲存引擎只有表結構,無資料

#memory,在重啟mysql或者重啟機器後,表內資料清空
#blackhole,往表內插入任何資料,都相當於丟入黑洞,表內永遠不存記錄
複製程式碼

 

三、表介紹

表相當於檔案,表中的一條記錄就相當於檔案的一行內容,不同的是,表中的一條記錄有對應的標題,稱為表的欄位

id,name,sex,age,birth稱為欄位,其餘的,一行內容稱為一條記錄

 

四、建立表

語法:

複製程式碼
create table 表名(
欄位名1 型別[(寬度) 約束條件],
欄位名2 型別[(寬度) 約束條件],
欄位名3 型別[(寬度) 約束條件]
);

#注意:
1. 在同一張表中,欄位名是不能相同
2. 寬度和約束條件可選
3. 欄位名和型別是必須的
複製程式碼


1.建立資料庫

create database db2 charset utf8;


2.使用資料庫

use db2;


3.建立a1表

create table a1(
  id int,
  name varchar(50),
  age int(3)
);

4.插入表的記錄

insert into a1 values
(1,'mjj',18),
(2,'wusir',28);

ps:以;作為mysql的結束語

5.查詢表的資料和結構

(1)查詢a1表中的儲存資料

複製程式碼

mysql> select * from a1;
+------+-------+------+
| id | name | age |
+------+-------+------+
| 1 | mjj   | 18  |
| 2 | wusir | 28  |
+------+-------+------+
2 rows in set (0.02 sec)

mysql>

複製程式碼

 

(2)檢視a1表的結構

複製程式碼
mysql> desc a1;
+-------+-------------+------+-----+---------+-------+
| Field     | Type           | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id        | int(11)        | YES  |      | NULL    |       |
| name      | varchar(50)    | YES  |      | NULL    |       |
| age       | int(3)         | YES  |      | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.16 sec)
複製程式碼

(3)查看錶的詳細結構

複製程式碼
mysql> show create table a1\G;
*************************** 1. row ***************************
       Table: a1
Create Table: CREATE TABLE `a1` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  `age` int(3) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
複製程式碼

6.複製表

(1)新建立一個數據庫db3

mysql> create database db3 charset utf8;
Query OK, 1 row affected (0.00 sec)

(2)使用db3

mysql> use db3;
Database changed
複製程式碼
#這是上個建立的db2資料庫中的a1表
mysql> select * from db2.a1;
+------+-------+------+
| id   | name  | age  |
+------+-------+------+
|    1 | mjj   |   18 |
|    2 | wusir |   28 |
+------+-------+------+
複製程式碼

(3)複製db2.a1的表結構和記錄

# 這就是複製表的操作(既複製了表結構,又複製了記錄)
mysql> create table b1 select * from db2.a1;
Query OK, 2 rows affected (0.03 sec)

(4)檢視db3.b1中的資料和表結構

複製程式碼
#再去檢視db3資料夾下的b1表發現 跟db2檔案下的a1表資料一樣
mysql> select * from db3.b1;
+------+-------+------+
| id   | name  | age  |
+------+-------+------+
|    1 | mjj   |   18 |
|    2 | wusir |   28 |
+------+-------+------+
2 rows in set (0.00 sec)
複製程式碼

 

ps1:如果只要表結構,不要記錄

#在db2資料庫下新建立一個b2表,給一個where條件,條件要求不成立,條件為false,只拷貝表結構
mysql> create table b2 select * from db2.a1 where 1>5;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

查看錶結構:

複製程式碼
# 查看錶結構
mysql> desc b2;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(50) | YES  |     | NULL    |       |
| age   | int(3)      | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.02 sec)

#查看錶結構中的資料,發現是空資料
mysql> select * from b2;
Empty set (0.00 sec)
複製程式碼

 

ps2:還有一種做法,使用like(只拷貝表結構,不拷貝記錄)

複製程式碼
mysql> create table b3 like db2.a1;
Query OK, 0 rows affected (0.01 sec)

mysql> desc b3;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(50) | YES  |     | NULL    |       |
| age   | int(3)      | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.02 sec)

mysql> select * from db3.b3;
Empty set (0.00 sec)
複製程式碼

 

7.刪除表:

drop table 表名;

07-資料型別

 

介紹

儲存引擎決定了表的型別,而表記憶體放的資料也要有不同的型別,每種資料型別都有自己的寬度,但寬度是可選的

詳細參考連結:http://www.runoob.com/mysql/mysql-data-types.html

mysql常用資料型別概括:

複製程式碼
#1. 數字:
    整型:tinyint  int  bigint
    小數:
        float :在位數比較短的情況下不精準
        double :在位數比較長的情況下不精準
            0.000001230123123123
            存成:0.000001230000

        decimal:(如果用小數,則用推薦使用decimal)
            精準
            內部原理是以字串形式去存

#2. 字串:
    char(10):簡單粗暴,浪費空間,存取速度快
            root存成root000000
    varchar:精準,節省空間,存取速度慢

    sql優化:建立表時,定長的型別往前放,變長的往後放
                    比如性別           比如地址或描述資訊

    >255個字元,超了就把檔案路徑存放到資料庫中。
            比如圖片,視訊等找一個檔案伺服器,資料庫中只存路徑或url。


#3. 時間型別:
    最常用:datetime


#4. 列舉型別與集合型別
   enum 和set
複製程式碼

 

一、數值型別

整數型別:TINYINT SMALLINT MEDIUMINT INT BIGINT

作用:儲存年齡,等級,id,各種號碼等

複製程式碼
========================================
        tinyint[(m)] [unsigned] [zerofill]

            小整數,資料型別用於儲存一些範圍的整數數值範圍:
            有符號:
                -128 ~ 127
            無符號:
                0 ~ 255

            PS: MySQL中無布林值,使用tinyint(1)構造。



========================================
        int[(m)][unsigned][zerofill]

            整數,資料型別用於儲存一些範圍的整數數值範圍:
            有符號:
                    -2147483648 ~ 2147483647
            無符號:
                    0 ~ 4294967295



========================================
        bigint[(m)][unsigned][zerofill]
            大整數,資料型別用於儲存一些範圍的整數數值範圍:
            有符號:
                    -9223372036854775808 ~ 9223372036854775807
            無符號:
                    0  ~  18446744073709551615
複製程式碼

 

驗證1:有符號和無符號tinyint

複製程式碼
============有符號tinyint==============
# 建立資料庫db4
create database db4 charset utf8;

# 切換到當前db4資料庫
mysql> use db4;

# 建立t1 規定x欄位為tinyint資料型別(預設是有符號的)
mysql> create table t1(x tinyint);

# 驗證,插入-1這個數
mysql>   insert into t1 values(-1);

# 查詢 表記錄,查詢成功(證明預設是有符號型別)
mysql> select * from t1;
+------+
| x    |
+------+
| -1 |
+------+

#執行如下操作,會發現報錯。因為有符號範圍在(-128,127)
mysql>   insert into t1 values(-129),(128);
ERROR 1264 (22003): Out of range value for column 'x' at row 1


============無符號tinyint==============
# 建立表時定義記