目錄
一,認識MySQL資料庫
1,什麼是資料庫
2,作用
3,常見的資料庫
4,MySQL概述
5,MySQL基本操作
二,win10安裝MySQL和圖形工具
1,安裝MySQL
2,安裝navicate
三,Mac系統安裝MySQL資料庫
方法一:官網下載下傳安裝包安裝
方法二:使⽤Mac中的Homebrew進⾏mysql的安裝
更換國内鏡像源位址
解除安裝MySQL
四,MySQL基本操作指令
1,簡單介紹
2,操作資料庫步驟
3,資料庫操作
4,資料表操作
5,資料操作 增删查改
五,MySQL中的資料類型
1,字元串資料類型
1.1 定長串:char
1.2 變長串:varchar
1.3 Text 變長文本類型存儲
2,數值類型
無符号與有符号數
3,日期和時間類型
4,二進制資料類型(不常用)
六,MySQL中的類型限制和運算
1,字段限制
2,主鍵
3,MySQL運算符
七,MySQL資料表操作詳解
1,資料庫操作
1.1 建立資料庫
1.2 檢視所有庫
1.3 打開庫/進入庫/選擇庫
1.4 删除庫
2,資料表操作
2.1 建立表
2.2 修改表結構
2.3 修改表名
2.4 更改表中自增的值
2.5 修改表引擎
2.6 删除表
八,MySQL資料庫中的表引擎
1,伺服器處理用戶端請求
2,存儲引擎
3,MyISAM和InnoDB表引擎的差別
九,MySQL中的字元集utf8
1,字元集簡介
2,MySQL中的utf8和utf8mb4
3,字元集檢視
十,MySQL中的DML操作-資料的增删改
1,添加資料
2,修改資料
3,删除資料
十一,MySQL查詢
使用圖形界面建立表示例
使用資料庫語句建立表示例
1,檢索資料select
1.1 檢索單個列
1.2 檢索多個列
1.3 檢索所有列
1.4 檢索有多少不同的行DISTINCT
1.5 限制結果LIMIT
1.6 使用完全限定的表名
2,對檢索資料進行排序ORDER BY
2.1 排序資料ORDER BY
2.2 按多列進行排序
2.3 注意
3,資料檢索條件過濾Where
3.1 WHERE用法
3.2 WHERE子句操作符
3.3 AND與OR操作符
3.4 IN與NOT
4,Like與通配符
4.1 百分号(%)
4.2 下劃線(_)
4.3 了解MySql的正則REGEXP
5,字段計算
5.1 簡介
5.2 字段拼接concat
5.3 使用别名AS
6,常用函數介紹
6.1 文本處理函數
6.2 日期和時間處理函數
6.3 數值處理函數
7,聚集函數與GroupBy分組
7.1 聚集函數的使用
7.2 資料分組GROUP BY 與HAVING
group by
HAVING
注意
十二,MySQL資料庫資料的導入導出
1,資料導出
2,将資料庫中的表導出
3,資料導入
十三,MySQL資料庫權限管理
一,認識MySQL資料庫
1,什麼是資料庫
資料庫(Database)就是按照資料結構來組織,存儲和管理資料的倉庫
專業的資料庫是專門對資料進行建立,通路,管理,搜尋等操作的軟體,比起我們自己用檔案讀寫的方 式對象資料進行管理更加的友善,快速,安全
2,作用
- 對資料進行持久化的儲存
- 友善資料的存儲和查詢,速度快,安全,友善
- 可以處理并發通路
- 更加安全的權限管理通路機制
3,常見的資料庫
資料庫分兩大類,一類是 關系型資料庫。另一類叫做 非關系型資料庫。
- 關系型資料庫: MySQL(已被Oracle收購),Oracle,PostgreSQL,SQLserver。。。。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAnYldHL0FWby9mZvwFN4ETMfdHLkVGepZ2XtxSZ6l2clJ3LcV2Zh1Wa9M3clN2byBXLzN3btgHL9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CO1gjM2YTZ1YTZjZWMxImNzYzXwQTNzATM5AzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
- 非關系型資料庫:Redis記憶體資料庫,MongoDB文檔資料庫。。。
4,MySQL概述
資料庫:
表
5,MySQL基本操作
進入MySQL并切換資料庫
檢視表
檢視表結構
二,win10安裝MySQL和圖形工具
1,安裝MySQL
Windows安裝MySQL5.7.17
1)在MySQL官網 http://dev.mysql.com/downloads/mysql/ 上面下載下傳ZIP安裝包(第二個:Windows (x86, 64- bit), ZIP Archive)。
2)下載下傳完成後解壓,将其放到想要安裝的目錄下。 例如:D:\MySQL5.7\mysql-5.7.17-winx64
3)建立一個my.ini配置檔案,原始的my-default.ini配置檔案隻是個模版,不要在裡面改動。
my.ini的内容如下: (!!!注意basedir、datadir的值需要根據MySQL的目錄具體設定)
[mysql]
default-character-set=utf8
[mysqld]
port = 3306
basedir=D:\MySQL5.7\mysql-5.7.17-winx64
datadir=D:\MySQL5.7\mysql-5.7.17-winx64\data
max_connections=200
character-set-server=utf8
default-storage-engine=INNODB
explicit_defaults_for_timestamp=true
4)在安裝路徑下建立一個空的data檔案夾。
5)以管理者身份運作cmd,進入bin目錄,執行 mysqld --initialize-insecure --user=mysql 指令。不進行這一 步,安裝完成之後無法啟動服務。
6)依然在管理者cmd視窗的bin目錄下,執行 mysqld install 指令安裝。完成後會提示安裝成功。
7)依然在管理者cmd視窗的bin目錄下,執行 net start mysql 指令啟動MySQL服務。
8)修改環境變量,添加"D:\MySQL5.7\mysql-5.7.17-winx64\bin"。 (這樣就可以在任意目錄下使用MySQL)
9)在普通cmd視窗中,進入bin目錄,執行 mysql -u root -p 指令,預設沒有密碼,回車進入。
2,安裝navicate
三,Mac系統安裝MySQL資料庫
方法一:官網下載下傳安裝包安裝
方法二:使⽤Mac中的Homebrew進⾏mysql的安裝
1.下載下傳安裝mysql
安裝成功後界面
2,配置重新開機mysql
更換國内鏡像源位址
解除安裝MySQL
四,MySQL基本操作指令
1,簡單介紹
使用方法:
- 方式一: 通過在指令行敲指令來操作 ( 有助于指令的掌握)
- 方式二: 通過圖型界面工具,如 Navicat 等(在熟練掌握後再使用)
- 方式三:通過程式設計語言(python,php,java,go...)執行mysql指令
SQL ( Structure query language ) 結構化查詢語言
- SQL語言分為4個部分:DDL(定義)、DML(操作)、DQL(查詢)、DCL(控制)
SQL語句中的快捷鍵
- \G 格式化輸出(文本式,豎立顯示)
- \s 檢視伺服器端資訊
- \c 結束指令輸入操作
- \q 退出目前sql指令行模式
- \h 檢視幫助
2,操作資料庫步驟
1)通過指令行連接配接MySQL
2) SQL 語句可以換行, 要以分号結尾
3)指令不區分大小寫. 關鍵字和函數建議用大寫
4)如果提示符為 '> 那麼需要輸入一個'回車
5)指令打錯了換行後不能修改, 可以用 \c 取消
3,資料庫操作
檢視資料庫 show databases;
建立資料庫 create database 庫名 default charset=utf8;
删除資料庫 drop database 庫名;
打開資料庫 use 庫名;
4,資料表操作
資料庫管理系統中, 可以有很多庫, 每個資料庫中可以包括多張資料表
檢視表: show tables;
建立表: create table 表名(字段名1 類型,字段名2 類型)engine=innodb default charset=utf8;
建立表: 如果表不存在,則建立, 如果存在就不執行這條指令
create table if not exists 表名(字段1 類型,字段2 類型);
create table if not exists users(
id int not null primary key auto_increment,
name varchar(4) not null,
age tinyint,
sex enum('男','女')
)engine=innodb default charset=utf8;
删除表: drop table 表名;
表結構: desc 表名;
檢視建表語句:show create table users;
5,資料操作 增删查改
插入
- insert into 表名(字段1,字段2,字段3) values(值1,值2,值3);
- insert into 表名(字段1,字段2,字段3) values(a值1,a值2,a值3),(b值1,b值2,b值3);
查詢
- select * from 表名;
- select 字段1,字段2,字段3 from 表名;
- select * from 表名 where 字段=某個值;
修改
- update 表名 set 字段=某個值 where 條件;
- update 表名 set 字段1=值1,字段2=值2 where 條件;
- update 表名 set 字段=字段+值 where 條件;
删除
- delete from 表名 where 字段=某個值;
五,MySQL中的資料類型
資料類型是定義列中可以存儲什麼類型的資料以及該資料實際怎樣存儲的基本規則
資料類型限制存儲在資料列列中的資料。例如,數值資料類型列隻能接受數值類型的的資料
在設計表時,應該特别重視所用的資料類型。使用錯誤的資料類型可能會嚴重地影響應用程式的功能和性能。
更改包含資料的列不是一件小事(而且這樣做可能會導緻資料丢失)。
資料類型:整型、浮點型、字元串、日期等
1,字元串資料類型
最常用的資料類型是串資料類型。它們存儲串,如名字、位址、電話号碼、郵政編碼等。
不管使用何種形式的串資料類型,串值都必須括在引号内
有兩種基本的串類型,分别為定長串和變長串
1.1 定長串:char
接受長度固定的字元串,其長度是在建立表時指定的。 定長列不允許存儲多于指定長度字元的資料。
指定長度後,就會配置設定固定的存儲空間用于存放資料
char(7) 不管實際插入多少字元,它都會占用7個字元位置
1.2 變長串:varchar
存儲可變長度的字元串 varchar(7) 如果實際插入4個字元, 那麼它隻占4個字元位置,當然插入的資料長度不能超過7 個字元
既然變長資料類型這樣靈活,為什麼還要使用定長資料類型?
回答:因為性能,MySQL處理定長列遠比處理變長列快得多。
1.3 Text 變長文本類型存儲
2,數值類型
數值資料類型存儲數值。MySQL支援多種數值資料類型,每種存儲的數值具有不同的取值範圍。支援的取值範圍越 大,所需存儲空間越多
與字元串不一樣,數值不應該括在引号内
decimal(5, 2) 表示數值總共5位, 小數占2位
tinyint 1位元組(8位) 無符号0-255。有符号-128-127
int 4位元組。0-42億 , -21億,21億。
MySQL中沒有專門存儲貨币的資料類型,一般情況下使用DECIMAL(8, 2)
無符号與有符号數
所有數值資料類型(除BIT和BOOLEAN外)都可以有符号或無符号
有符号數值列可以存儲正或負的數值
無符号數值列隻能存儲正數。
預設情況為有符号,但如果你知道自己不需要存儲負值,可以使用UNSIGNED關鍵字
3,日期和時間類型
MySQL使用專門的資料類型來存儲日期和時間值
4,二進制資料類型(不常用)
二進制資料類型可存儲任何資料(甚至包括二進制資訊),如圖像、多媒體、字處理文檔等
六,MySQL中的類型限制和運算
1,字段限制
1)unsigned 無符号(給數值類型使用,表示為正數,不寫可以表示正負數都可以)
2)字段類型後面加括号限制寬度
- char(5). varchar(7) 在字元類型後面加限制 表示 字元串的長度
- int(4) 沒有意義,預設無符号的int為int(11),有符号的int(10)
- int(4) unsigned zerofill隻有當給int類型設定有前導零時,設定int的寬度才有意義。
3)not null 不能為空,在操作資料庫時如果輸入該字段的資料為NULL ,就會報錯
4)default 設定預設值
5)primary key 主鍵不能為空,且唯一.一般和自動遞增一起配合使用。
6)auto_increment 定義列為自增屬性,一般用于主鍵,數值會自動加1
7)unique 唯一索引(資料不能重複:使用者名)可以增加查詢速度,但是會降低插入和更新速度
2,主鍵
1)表中每一行都應該有可以唯一辨別自己的一列,用于記錄兩條記錄不能重複,任意兩行都不具有相同的主鍵值
2)應該總是定義主鍵 雖然并不總是都需要主鍵,但大多數資料庫設計人員都應保證他們建立的每個表具有一個主鍵,以便于以後的資料操縱和管理。
要求
- 記錄一旦插入到表中,主鍵最好不要再修改
- 不允許NULL
- 不在主鍵列中使用可能會更改的值。 (例如,如果使用一個名字作為主鍵以辨別某個供應商,當該供應商合并和更改其名字時,必須更改這個主鍵。)
- 自增整數類型:資料庫會在插入資料時自動為每一條記錄配置設定一個自增整數,這樣我們就完全不用擔心主鍵 重複,也不用自己預先生成主鍵
- 可以使用多個列作為聯合主鍵,但聯合主鍵并不常用。使用多列作為主鍵時,所有列值的組合必須是唯一的
3,MySQL運算符
MySQL的運算符
- 算術運算符: +、 -、 *、 /、 %
- 比較運算符: =、 >、 <、 >=、 <=、!=
- 資料庫特有的比較: in、not in、is null、is not null、like、between、and
- 邏輯運算符: and、or、not
- like: 支援特殊符号%和_ ;
其中%表示任意數量的任意字元,_表示任意一位字元
七,MySQL資料表操作詳解
1,資料庫操作
1.1 建立資料庫
# 連結mysql資料庫後,進入mysql後可以操作資料
# 1. 建立庫
create database if not exists tlxy default charset=utf8;
# 1. 資料庫 tlxy 如果不存在則建立資料庫,存在則不建立
# 2. 建立 tlxy 資料庫,并設定字元集為utf8
# 3. 無特殊情況都要求字元集為utf8或者utf8mb4的字元編碼
1.2 檢視所有庫
# 1. 檢視所有庫
show databases;
1.3 打開庫/進入庫/選擇庫
# use 庫名
use tlxy
1.4 删除庫
删庫有風險,動手需謹慎。
# 删除庫,那麼庫中的所有資料都将在磁盤中删除。
drop database 庫名
2,資料表操作
2.1 建立表
文法格式:
create table 表名(字段名,類型,【字段限制】,。。。);
執行個體:
# 以下建立一個 users 的表
create table users(
# 建立ID字段,為正整數,不允許為空 主鍵,自動遞增
id int unsigned not null primary key auto_increment,
# 建立 存儲 名字的字段,為字元串類型,最大長度 5個字元,不允許為空
username varchar(5) not null,
# 建立存儲 密碼 的字段,固定長度 32位字元, 不允許為空
# 資料庫在存儲使用者密碼時通常存儲的是加密後的密碼 使用md5加密算法後 密碼均為32位 是以這裡固定長度為32
password char(32) not null,
# 建立 年齡 字段,不允許為空,預設值為 20
age tinyint not null default 20
)engine=innodb default charset=utf8;
# 檢視表結構
desc users;
#檢視建表語句
show create table users;
檢視表結構
可以通過展示建表語句,複制,運作,來重建相同的資料庫
建立表的基本原則:
- 表名和字段名 盡可能的符合命名規範,并且最好能夠‘見名之意’
- 表中資料必須有唯一标示,即主鍵定義。無特殊情況,主鍵都為數字并自增即可
- 表中字段所對應的類型設定合理,并限制合理長度
- 表引擎推薦使用innodb,并無特殊情況都要求為utf8或者utf8mb4的字元編碼
2.2 修改表結構
文法格式:alter table 表名 action
添加字段
# 文法:alter table 表名 add 添加的字段資訊
# 在 users 表中 追加 一個 num 字段
alter table users add num int not null;
# 在指定字段後面追加字段 在 users 表中 age字段後面 添加一個 email 字段
# 由于資料一開始沒有email字段 添加後會設定預設值 空字元串
alter table users add email varchar(50) after age;
# 在指定字段後面追加字段,在 users 表中 age字段後面 添加一個 phone
alter table users add phone char(11) not null after age;
# 在表的最前面添加一個字段
alter table users add aa int first;
删除字段
# 删除字段 alter table 表名 drop 被删除的字段名
alter table users drop aa;
修改字段
文法格式: alter table 表名 change|modify 被修改的字段資訊
- change: 可以修改字段名,
- modify: 不能修改字段名。
# 修改表中的 num 字段 類型,使用 modify 不修改表名
alter table users modify num tinyint not null default 12;
# 修改表中的 num 字段 為 int并且字段名為 nn
alter table users change num nn int;
舉例:修改字段類型
修改字段類型後
# 注意:一般情況下,無特殊要求,不要輕易修改表結構
2.3 修改表名
文法:alter table 原表名 rename as
2.4 更改表中自增的值
# 在正常情況下,auto_increment 預設從1開始繼續遞增
alter table users auto_increment = 1000;
2.5 修改表引擎
# 推薦在定義表時,表引擎為 innodb。
# 通過檢視建表語句擷取目前的表引擎
mysql> show create table users\G;
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
# 直接檢視目前表狀态資訊
mysql> show table status from tlxy where name = 'users'\G;
*************************** 1. row ***************************
Name: users
Engine: InnoDB
# 修改表引擎語句
alter table users engine = 'myisam';
2.6 删除表
drop table 表名
八,MySQL資料庫中的表引擎
1,伺服器處理用戶端請求
其實不論用戶端程序和伺服器程序是采用哪種方式進行通信,最後實作的效果都是:
用戶端程序向伺服器程序發送 一段文本(MySQL語句),伺服器程序處理後再向用戶端程序發送一段文本(處理結果)。
那伺服器程序對客戶 端程序發送的請求做了什麼處理,才能産生最後的處理結果呢?
用戶端可以向伺服器發送增删改查各類請求,我們 這裡以比較複雜的查詢請求為例來畫個圖展示一下大緻的過程:
雖然查詢緩存有時可以提升系統性能,但也不得不因維護這塊緩存而造成一些開銷,比如每次都要去查詢緩存中檢索,查詢請求處理完需要更新查詢緩存,維護該查詢緩存對應的記憶體區域。
從MySQL 5.7.20開始,不推薦使用查詢緩存,并在MySQL 8.0中删除。
2,存儲引擎
MySQL 伺服器把資料的存儲和提取操作都封裝到了一個叫 存儲引擎 的子產品裡。
- 我們知道 表 是由一行一行的記錄 組成的,但這隻是一個邏輯上的概念,實體上如何表示記錄,怎麼從表中讀取資料,怎麼把資料寫入具體的實體存儲器上,這都是 存儲引擎 負責的事情。
- 為了實作不同的功能, MySQL 提供了各式各樣的 存儲引擎 ,不同存儲引擎管理的表具體的存儲結構可能不同,采用的存取算法也可能不同。
- 存儲引擎以前叫做 表處理器
為了管理友善,人們把 連接配接管理 、 查詢緩存 、 文法解析 、 查詢優化 這些并不涉及真實資料存儲的功能劃分為 MySQL server 的功能,把真實存取資料的功能劃分為 存儲引擎 的功能。
各種不同的存儲引擎向上邊的 MySQL server 層提供統一的調用接口(也就是存儲引擎API),包含了幾十個底層函數,像"讀取索引第一條内容"、"讀取 索引下一條内容"、"插入記錄"等等。
是以在 MySQL server 完成了查詢優化後,隻需按照生成的執行計劃調用底層存儲引擎提供的API,擷取到資料後傳回給用戶端就好了。
MySQL 支援非常多種存儲引擎:
存儲引擎 | 描述 |
ARCHIVE | 用于資料存檔(行被插入後不能再修改) |
BLACKHOLE | 丢棄寫操作,讀操作會傳回空内容 |
CSV | 在存儲資料時,以逗号分隔各個資料項 |
FEDERATED | 用來通路遠端表 |
InnoDB | 具備外鍵支援功能的事務存儲引擎 |
MEMORY | 置于記憶體的表 |
MERGE | 用來管理多個MyISAM表構成的表集合 |
MyISAM | 主要的非事務處理存儲引擎 |
NDB | MySQL叢集專用存儲引擎 |
3,MyISAM和InnoDB表引擎的差別
MyISAM | InnoDB | |
事務支援 |
|
|
存儲結構 |
|
|
表鎖差異 |
|
|
表主鍵 |
|
|
表的具體行數 |
|
|
CURD操作 |
|
|
外鍵 |
|
|
查詢效率 |
|
|
應用場景 |
|
|
九,MySQL中的字元集utf8
1,字元集簡介
我們知道在計算機中隻能存儲二進制資料,那該怎麼存儲字元串呢?當然是建立字元與二進制資料的映射關系了, 建立這個關系最起碼要搞清楚兩件事兒:
1. 你要把哪些字元映射成二進制資料?
也就是界定清楚字元範圍。
2. 怎麼映射?
将一個字元映射成一個二進制資料的過程也叫做 編碼 ,将一個二進制資料映射到一個字元的過程叫做 解 碼 。
人們抽象出一個 字元集 的概念來描述某個字元範圍的編碼規則
我們看一下一些常用字元集的情況:
ASCII 字元集
共收錄128個字元,包括空格、标點符号、數字、大小寫字母和一些不可見字元。由于總共才128個字元,所 以可以使用1個位元組來進行編碼,我們看一些字元的編碼方式:
'L' -> 01001100(十六進制:0x4C,十進制:76)
'M' -> 01001101(十六進制:0x4D,十進制:77)
ISO 8859-1 字元集
共收錄256個字元,是在 ASCII 字元集的基礎上又擴充了128個西歐常用字元(包括德法兩國的字母),也可以 使用1個位元組來進行編碼。這個字元集也有一個别名 latin1
GB2312 字元集
收錄了漢字以及拉丁字母、希臘字母、日文平假名及片假名字母、俄語西裡爾字母。其中收錄漢字6763個, 其他文字元号682個。同時這種字元集又相容 ASCII 字元集,是以在編碼方式上顯得有些奇怪:這種表示一個字元需要的位元組數可能不同的編碼方式稱為 變長編碼方式 。比方說字元串 '愛u' ,其 中 '愛' 需要用2個位元組進行編碼,編碼後的十六進制表示為 0xCED2 , 'u' 需要用1個位元組進行編碼,編碼後 的十六進制表示為 0x75 ,是以拼合起來就是 0xCED275 。
- 如果該字元在 ASCII 字元集中,則采用1位元組編碼。
- 否則采用2位元組編碼。
小貼士: 我們怎麼區分某個位元組代表一個單獨的字元還是代表某個字元的一部分呢?别忘了 ASCII 字 符集隻收錄128個字元,使用0~127就可以表示全部字元,是以如果某個位元組是在0~127之内的,就意 味着一個位元組代表一個單獨的字元,否則就是兩個位元組代表一個單獨的字元。
GBK 字元集
GBK 字元集隻是在收錄字元範圍上對 GB2312 字元集作了擴充,編碼方式上相容 GB2312 。
Unicode 字元集
收錄地球上能想到的所有字元,而且還在不斷擴充。這種字元集相容 ASCII 字元集,采用變長編碼方式,編 碼一個字元需要使用1~4個位元組,比方說這樣
'L' -> 01001100(十六進制:0x4C)
'啊' -> 111001011001010110001010(十六進制:0xE5958A)
小貼士: 其實準确的說,utf8隻是Unicode字元集的一種編碼方案,Unicode字元集可以采用utf8、 utf16、utf32這幾種編碼方案,utf8使用1~4個位元組編碼一個字元,utf16使用2個或4個位元組編碼一個 字元,utf32使用4個位元組編碼一個字元。更詳細的Unicode和其編碼方案的知識不是本書的重點,大家 上網查查哈~ MySQL中并不區分字元集和編碼方案的概念,是以後邊唠叨的時候把utf8、utf16、utf32 都當作一種字元集對待。
2,MySQL中的utf8和utf8mb4
我們上邊說 utf8 字元集表示一個字元需要使用1~4個位元組,但是我們常用的一些字元使用1~3個位元組就可以表示 了。而在 MySQL 中字元集表示一個字元所用最大位元組長度在某些方面會影響系統的存儲和性能,是以設計 MySQL 的大叔偷偷的定義了兩個概念:
- utf8mb3 :閹割過的 utf8 字元集,隻使用1~3個位元組表示字元。
- utf8mb4 :正宗的 utf8 字元集,使用1~4個位元組表示字元。
有一點需要大家十分的注意,在 MySQL 中 utf8 是 utf8mb3 的别名,是以之後在 MySQL 中提到 utf8 就意味着使用 1~3個位元組來表示一個字元,如果大家有使用4位元組編碼一個字元的情況,比如存儲一些emoji表情啥的,那請使 用 utf8mb4 。
3,字元集檢視
MySQL 支援好多好多種字元集,檢視目前 MySQL 中支援的字元集可以用下邊這個語句:
show charset;
十,MySQL中的DML操作-資料的增删改
1,添加資料
格式: insert into 表名[(字段清單)] values(值清單...);
--标準添加(指定所有字段,給定所有的值)
mysql> insert into stu(id,name,age,sex,classid) values(1,'zhangsan',20,'m','lamp138');
Query OK, 1 row affected (0.13 sec)
--指定部分字段添加值 (前提是其餘字段允許不先給出)
mysql> insert into stu(name,classid) value('lisi','lamp138');
Query OK, 1 row affected (0.11 sec)
-- 不指定字段添加值
mysql> insert into stu value(null,'wangwu',21,'w','lamp138');
Query OK, 1 row affected (0.22 sec)
-- 批量添加值
mysql> insert into stu values
-> (null,'zhaoliu',25,'w','lamp94'),
-> (null,'uu01',26,'m','lamp94'),
-> (null,'uu02',28,'w','lamp92'),
-> (null,'qq02',24,'m','lamp92'),
-> (null,'uu03',32,'m','lamp138'),
-> (null,'qq03',23,'w','lamp94'),
-> (null,'aa',19,'m','lamp138');
Query OK, 7 rows affected (0.27 sec)
Records: 7 Duplicates: 0 Warnings: 0
2,修改資料
格式:update 表名 set 字段1=值1,字段2=值2,字段n=值n... where 條件
-- 将id為11的age改為35,sex改為m值
mysql> update stu set age=35,sex='m' where id=11;
Query OK, 1 row affected (0.16 sec)
Rows matched: 1 Changed: 1 Warnings: 0
-- 将id值為12和14的資料值sex改為m,classid改為lamp92
mysql> update stu set sex='m',classid='lamp92' where id=12 or id=14 --等價于下面
mysql> update stu set sex='m',classid='lamp92' where id in(12,14);
Query OK, 2 rows affected (0.09 sec)
Rows matched: 2 Changed: 2 Warnings: 0
3,删除資料
格式:delete from 表名 [where 條件]
-- 删除stu表中id值為100的資料
mysql> delete from stu where id=100;
Query OK, 0 rows affected (0.00 sec)
-- 删除stu表中id值為20到30的資料
mysql> delete from stu where id>=20 and id<=30;
Query OK, 0 rows affected (0.00 sec)
-- 删除stu表中id值為20到30的資料(等級于上面寫法)
mysql> delete from stu where id between 20 and 30;
Query OK, 0 rows affected (0.00 sec)
-- 删除stu表中id值大于200的資料
mysql> delete from stu where id>200;
Query OK, 0 rows affected (0.00 sec)
十一,MySQL查詢
使用圖形界面建立表示例
1,選擇資料庫
2,添加字段、設定主鍵、屬性、是否自動遞增
3,修改資料庫引擎、字元集、排序規則
4,插入資料
5,檢視建表、插入資料操作對應的SQL語句
6,檢視對應的SQL語句
使用資料庫語句建立表示例
/*
Navicat Premium Data Transfer
Source Server : localhost_3306
Source Server Type : MySQL
Source Server Version : 80017
Source Host : localhost:3306
Source Schema : test
Target Server Type : MySQL
Target Server Version : 80017
File Encoding : 65001
Date: 14/01/2021 11:14:36
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for stu
-- ----------------------------
DROP TABLE IF EXISTS `stu`;
CREATE TABLE `stu` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`email` char(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`phone` char(11) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`age` tinyint(4) NOT NULL,
`sex` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`class_id` int(10) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of stu
-- ----------------------------
INSERT INTO `stu` VALUES (1, '張三', '[email protected]', '13781104321', 21, '男', 1);
INSERT INTO `stu` VALUES (null, '李四', '[email protected]', '13701104322', 22, '男', 1);
INSERT INTO `stu` VALUES (null, '王五', '[email protected]', '13701104323', 20, '女', 1);
INSERT INTO `stu` VALUES (null, '趙六', '[email protected]', '13701104324', 19, '男', 1);
INSERT INTO `stu` VALUES (null, '田七', '[email protected]' , '13701104325', 23, '女', 1);
INSERT INTO `stu` VALUES (null, '王六', '[email protected]', '13701184326', 23, '女', 1);
INSERT INTO `stu` VALUES (null, '熊大', '[email protected]', '13701104327', 25, '男', 2);
INSERT INTO `stu` VALUES (null, '照二', 'xiongereqq.com', '13701104328', 22, '男', 2);
INSERT INTO `stu` VALUES (null, '——', 'yiyi@qq. com', '13701104329', 19, '女', 2);
INSERT INTO `stu` VALUES (null, '岈呀', '[email protected]', '13701104320', 22, '男', 2);
SET FOREIGN_KEY_CHECKS = 1;
注:通過運作sql檔案可以正常建立表、并插入資料。
但通過指令行插入時,會報錯,應該是哪裡的字元編碼設定有問題
可以通過修改my.ini解決問題,參考連結@睡前來杯海飛絲【ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xD0\xA1\xC3\xF7' for column 'NAME' at row 1解決方】
1,檢索資料select
1.1 檢索單個列
select name from stu;
- 如果沒有明确排序查詢結果(下一 章介紹),則傳回的資料的順序沒有特殊意義。
- 傳回資料的順序可能是資料被添加到表中的順序,也可能不是。隻要傳回相同數目的行,就是正常的
1.2 檢索多個列
select name,id,phone from stu;
- 在選擇多個列時,一定要在列名之間加上逗号,但最後一個列名後不加。
- 如果在最後一個列名後加了逗号,将出現錯誤。
1.3 檢索所有列
select * from stu;
- 使用通配符一般,除非你确實需要表中的每個列,否則最好别使用*通配符。
- 雖然使用通配符可能會省事,不用明确列出所需列,但檢索不需要的列通常會降低檢索和應用程式的性能。
- 使用通配符有一個大優點。由于不明确指定列名(因為星号檢索每個列),是以能檢索出名字未知的列。
1.4 檢索有多少不同的行DISTINCT
select distinct class_id from stu;
- DISTINCT關鍵字,顧名思義,此關鍵字訓示MySQL隻傳回不同的值(可以用來去重)
- DISTINCT關鍵字應用于所有列而不僅是前置它的列。
- 如果給出SELECT DISTINCT vend_id, prod_price, 除非指定的兩個列都不同,否則所有行都将被檢索出來
1.5 限制結果LIMIT
select * from stu limit 3,4;
- 如果資料量到達千萬級别,一次select * 很可能會使伺服器當機,這時就需要使用limit控制一次取出的資料數量;
- LIMIT 3, 4的含義是從行3開始的4行.(跳過前3行,取4行)
- 替代文法LIMIT 4 OFFSET 3意為從行3開始取4行,就像LIMIT 3,4一樣。
1.6 使用完全限定的表名
主要用于多表查詢時,限定字段是從哪個表中取出的資料;
2,對檢索資料進行排序ORDER BY
2.1 排序資料ORDER BY
預設查詢出的資料,并不是随機排序的,如果沒有指定排序,資料一般将以它在底層表中出現的順序顯示
關系資料庫設計理論認為,如果不明确規定排序順序,則不應該假定檢索出的資料的順序有意義
通常,ORDER BY子句中使用的列将是為顯示所選擇的列。(意思是大多數情況下,隻需要将最終顯示的列進行排序)
但是,實際上并不一定要這樣,用非檢索的列排序資料是完全合法的。
2.2 按多列進行排序
當所選字段重複時,可以選擇參考多個字段進行再次排序;
select * from stu order by classid, age;
- 在需要對多列資料進行排序時,使用逗号分隔列名,井會按照前後順序依次對比排序
- order by的排序預設升序,可以使用DESC設定降序排列
select * from stu order by classid, age DESC;
- 以上語句就是先對lassid進行升序排序然後在結果中對age進行降序排序
2.3 注意
ORDER BY子句的位置,使用子句的次序不對将産生錯誤消息;
- FROM子句位于ORDER BY子句之前。
- LIMIT必須位于ORDER BY之後。
3,資料檢索條件過濾Where
3.1 WHERE用法
資料庫表一般包含大量的資料,很少需要檢索表中所有行。通常隻會根據特定操作或報告的需要提取表資料的子集。
隻檢索所需資料需要指定搜尋條件(search criteria),搜尋條件也稱為過濾條件(filter condition)
在SELECT語句中,資料根據WHERE子句中指定的搜尋條件進行過濾。
select name from stu where age = 22;
ORDER BY語句應放在WHERE語句之後
3.2 WHERE子句操作符
限定邊界(between包括邊界值)
使用 is null
3.3 AND與OR操作符
例如:我需要在資料庫中查詢出1期或2期的學員,并且要求是女生
select name from stu where class_id=18 or class_id =19 and sex='m'
以上語句不會按照預期檢索出正确的資料問題出在哪裡?
原因在于計算的次序。SQL在處理OR操作符前,優先處理AND操作符。
當SQL看到上述WHERE子句時,它了解是19期班級的所有女生,或者18期的所有學員,而不分性别。換句話說,由于AND在計算次序中優先級更高,操作符被錯誤地組合了
是以想要解決就需要提升優先級,使用圓括号明确地分組相應的操作符
select name from stu where (class_id=18 or class_id =19) and sex= 'm'
3.4 IN與NOT
IN操作符用來指定條件範圍,範圍中的每個條件都可以進行比對。
select name from stu where class_id in (1,2)
IN WHERE子句中用來指定要比對值的清單的關鍵字,功能與OR相當
為什麼要使用IN操作符?其優點具體如下。
- 在使用長的合法選項清單時,IN操作符的文法更清楚且更直覺。
- 在使用IN時,計算的次序更容易管理(因為使用的操作符更少)。
- IN操作符一般比OR操作符清單執行更快。
- IN的最大優點是可以包含其他SELECT語句,使得能夠更動态地建立WHERE子句。
NOT WHERE子句中用來否定後跟條件的關鍵字
select name from stu where class_id not in (18,19)
- 為什麼使用NOT?對于簡單的WHERE子句,使用NOT确實沒有什麼優勢。
- 但在更複雜的子句中,NOT是非常有用的。
- 例如,在與IN操作符聯合使用時,NOT使找出與條件清單不比對的行非常簡單。
4,Like與通配符
前面介紹的所有操作符都是針對已知值進行過濾的。但是,這種過濾方法并不是任何時候都好用。
例如,怎樣搜尋産品名中包含文本anvil的所有産品?用簡單的比較操作符肯定不行,必須使用通配符。
為在搜尋子句中使用通配符,必須使用LIKE操作符。
LIKE訓示MySQL,後跟的搜尋模式利用通配符比對而不是直接相等比對進行比較。
4.1 百分号(%)
通配符在搜尋串中,%表示任何字元出現任意次數
- select name from stu where name like 'a%'
- select name from stu where name like '%a'
- select nane from stu where name like '%a%'
4.2 下劃線(_)
通配符下劃線的用途與%樣,但下劃線隻比對單個字元而不是多個字元
使用通配符的技巧
MySQL的通配符很有用。
但這種功能是有代價的:通配符搜尋的處理一般要 比前面讨論的其他搜尋所花時間更長。
這裡給出一些使用通配符要記住的技巧
- 不要過度使用通配符。如果其他操作符能達到相同的目的,應該使用其他操作符。
- 在确實需要使用通配符時,除非絕對有必要,否則不要把它們用在搜尋模式的開始處。把通配符置于搜尋模式的開始處,搜尋起來是最慢的。
- 仔細注意通配符的位置。如果放錯地方,可能不會傳回想要的資料
4.3 了解MySql的正則REGEXP
所有種類的程式設計語言、文本編輯器、作業系統等都支援正規表達式
select name from stu where name regexp '[0-5]abc'
5,字段計算
5.1 簡介
存儲在資料庫表中的資料一般不是應用程式所需要的格式。下面舉幾個例子
- 如果想在一個字段中既顯示使用者名,又顯示班級号,但這兩個資訊一般包含在不同的表列中。
- 同時姓名、手機号和位址存儲在不同的列中(應該這樣),但快遞單列印程式卻需要把它們作為一個恰當格式的字段檢索出來。
- 列資料是大小寫混合的,但報表程式需要把所有資料按大寫表示出來。
- 物品訂單表存儲物品的價格和數量,但不需要存儲每個物品的總價格(用價格乘以數量即可)。為列印發票,需要物品的總價格。
- 需要根據表資料進行總數、平均數計算或其他計算
計算字段并不實際存在于資料庫表中。計算字段是運作時在SELECT語句内建立的
5.2 字段拼接concat
stu表包含使用者名和手機号碼資訊。假如要生成一個學生報表, 需要在學生的名字中按照name(phone)這樣的格式列出。
解決辦法是把兩個列拼接起來。在MySQL的SELECT語句中,可使用Concat()函數來拼接兩個列
select concat(name, '(', phone')') from stu
5.3 使用别名AS
SELECT語句拼接字段可以完成。但此新計算列的名字是什麼呢?實際上它沒有名字,它隻是一個值。
如果僅在SQL查詢工具中檢視一下結果, 這樣沒有什麼不好。
但是,一個未命名的列不能用于客戶機應用中,因為客戶機沒有辦法引用它。
為了解決這個問題,SQL支援列别名。别名(alias) 是一個字段或值的替換名。别名用AS關鍵字賦予
select concat(name, '(', phone')') from stu as name_phone from stu
6,常用函數介紹
官方文檔https://dev.mysql.com/doc/refman/5.7/en/string-functions.html
6.1 文本處理函數
select left('123456',2);
select left(name,1) from stu;
select substring('123456',2,3);
6.2 日期和時間處理函數
select now();
select date(now());
select time(now());
select time(now());
select addtime(now(),'2:2:2');
6.3 數值處理函數
7,聚集函數與GroupBy分組
7.1 聚集函數的使用
我們經常需要彙總資料而不用把它們實際檢索出來,為此MySQL提供了 專門的函數。
使用這些函數,MySQL查詢可用于檢索資料,以便分析和報表生成
- 确定表中行數(或者滿足某個條件或包含某個特定值的行數)。
- 獲得表中行組的和。
- 找出表列(或所有行或某些特定的行)的最大值、最小值和平均值。
上述例子都需要對表中資料(而不是實際資料本身)彙總。
是以,傳回實際表資料是對時間和處理資源的一種浪費
在使用count時,如果指定列名,則指定列的值為空的行被忽略,但如果COUNT()函數中用的是星号(*) ,則不忽略
select count(id),max(age),min(age),sum(age),avg(age) from stu;
select count(id) as num,max(age) as max_age,min(age) as min_age,sum(age) as sum_age,avg(age) as avg_age from stu;
使用别名時,也可以用空格代替as
7.2 資料分組GROUP BY 與HAVING
group by
SQL聚集函數可用來彙總資料。這使我們能夠對行進行計數,計算和與平均數,獲得最大和最小值而不用檢索所有資料
目前為止的所有計算都是在表的所有資料或比對特定的WHERE子句的資料上進行的。
例如我們需要擷取某個班級的學員人數:
select count(*) as nums from stu where class_id = 2
但如果要傳回每個班級的人數怎麼辦?
此時就需要使用分組了,分組允許把資料分為多個邏輯組,以便能對每個組進行聚集計算。
select class_id, count(*) as nums from stu group by class_id;
select class_id, count(*) as nums, avg(age) avg_age from stu group by class_id;
那麼如果需要傳回人數少于5人的班級怎麼辦?
或傳回班級人數大于5人的班級怎麼辦?
HAVING
除了能用GROUP BY分組資料外,MySQL還允許過濾分組,規定包括哪些分組,排除哪些分組。
例如,可能想要需要擷取班級人數小于等于5人的班級。。為得出這種資料,必須基于完整的分組而不是個别的行進行過濾
事實上,目前為止所學過的所有類型的WHERE子句都可以用HAVING來替代。
唯一的差别是WHERE過濾行,而HAVING過濾分組。
select class_id, count(*) as nums from stu group by class_id;
select class_id, count(*) as nums from stu group by class_id having nums >= 5;
注意
在使用group by進行分組時,按照标準的SQL模式,需要把select查詢中的所有列(除了聚集函數外)全部都列在group by後面
十二,MySQL資料庫資料的導入導出
1,資料導出
2,将資料庫中的表導出
3,資料導入
十三,MySQL資料庫權限管理
mysql中的root使用者是資料庫中權限最高的使用者,千萬不要用在項目中。
可以給不同的使用者,或者項目,建立不同的mysql使用者,并适當的授權,完成資料庫的相關操作,這樣就一定程度 上保證了資料庫的安全。
建立使用者的文法格式:
grant 授權的操作 on 授權的庫.授權的表 to 賬戶@登入位址 identified by '密碼';
示例:
#在mysql中 建立一個zhangsan 使用者,授權可以對chuange這個庫中的所有表進行添加和查詢的權限
grant select, insert on chuange.* to zhangsan@'%' identified by '123456';
#使用者lisi.密碼 123456 可以對chuange庫中的所有表有所有操作權限
grant all on chuange.* to lisi@'%' identified by '123456';
#删除使用者
drop user 'lisi'@'%';