日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql基础复习

發(fā)布時間:2023/12/16 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql基础复习 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

????????數(shù)據(jù)庫的基本操作

如何創(chuàng)建數(shù)據(jù)庫
數(shù)據(jù)庫的刪除操作
存儲引擎的了解及其工作原理和如何選擇
?1、創(chuàng)建數(shù)據(jù)庫

創(chuàng)建數(shù)據(jù)庫是在系統(tǒng)磁盤上劃分一塊區(qū)域用于數(shù)據(jù)的存儲和管理

?mysql安裝完成以后,將會在其data目錄下自動創(chuàng)建幾個必須的數(shù)據(jù)庫,可以使用 ?show ?databases語句查看。

通過執(zhí)行show databases ?可以看到 mysql ?安裝自帶的數(shù)據(jù)庫是:information_schema、mysql、performance_schema、sakila、test、word,其中mysql是必須的,此數(shù)據(jù)庫描述了用戶的訪問權限。

創(chuàng)建mysql數(shù)據(jù)庫的語法格式是: ?create database database_name,其中database_name是數(shù)據(jù)庫名稱。數(shù)據(jù)庫創(chuàng)建完成以后可以執(zhí)行 show ?create database ?查看數(shù)據(jù)庫的定義。

創(chuàng)建數(shù)據(jù)庫:create ?database ?database_name

查看數(shù)據(jù)庫:show ?create ?databases

查看數(shù)據(jù)庫的定義:show create database ?database_name

以上不在舉例

2、刪除數(shù)據(jù)庫

刪除數(shù)據(jù)庫是將已存在的數(shù)據(jù)庫從磁盤空間上清除,清除之后,數(shù)據(jù)庫中所有的數(shù)據(jù)也將一同被刪除。

mysql中刪除數(shù)據(jù)庫的語法是:drop database ?database_name,其中database_name 為數(shù)據(jù)庫名稱,若要刪除的數(shù)據(jù)庫不存在,則刪除出錯。是否刪除成功可執(zhí)行 ?show ?databases查看。

提示:使用 drop ?database命令要非常的謹慎,因為執(zhí)行此命令時,mysql不會給出任何的提醒確認信息,執(zhí)行命令后,數(shù)據(jù)庫中存儲的所有數(shù)據(jù)表和數(shù)據(jù)將一同被刪除,且不可恢復。

3、數(shù)據(jù)庫的儲存引擎

???數(shù)據(jù)庫存儲引擎是數(shù)據(jù)庫底層軟件組件,數(shù)據(jù)庫管理系統(tǒng)(DBMS)使用數(shù)據(jù)引擎進行創(chuàng)建、查詢、更新和刪除數(shù)據(jù)操作。不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水平等功能,使用不同的存儲引擎,還可以獲得特定的功能。現(xiàn)在許多不同的數(shù)據(jù)庫管理系統(tǒng)都支持多種不同的數(shù)據(jù)引擎。MySQL的核心就是存儲引擎。MySQL提供了多個不同的存儲引擎,包括處理事務安全表的引擎和處理非事務安全表的引擎。在mysql中,同一個服務器中可以針對具體的要求對每一張庫表使用不同的存儲引擎。

MySQL 5.7 支持存儲引擎:InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、Blackhole等。

可以使用 ?show ?engines ?命令查看系統(tǒng)所支持的存儲引擎。?

我通過navicat工具執(zhí)行 show ?engines命令,結果如下圖:

其中support列的值:YES表示此引擎可以使用,NO表示不可以被使用,default表示該引擎是當前默認存儲引擎。

簡述InnoDB和MyISAM存儲引擎:

InnoDB引擎

?InnoDB是事務型數(shù)據(jù)庫的首選引擎,支持事務安全表(ACID),支持行鎖定和外鍵,MySQL 5.5.5版本之后,InnoDB作為默認的存儲引擎,InnoDB的主要特性有:

InnoDB給MySQL提供了具有提交、回滾和崩潰恢復能力的事物安全(ACID兼容)存儲引擎。
InnoDB是為處理巨大數(shù)據(jù)量的最大性能設計。他的CPU效率可能是任何其他基于磁盤的關系數(shù)據(jù)庫引擎所不能匹配的。
InnoDB存儲引擎完全與MySQL服務器整合,InnoDB存儲引擎為在主內存中緩存數(shù)據(jù)和索引而維持它自己的緩沖池。InnoDB將它的表和索引存在一個邏輯表空間中,表空間可以包含數(shù)個文件(或原始磁盤分區(qū))?。這與MyISAM表不同,比如在MyISAM表中每個表被存在分離的文件中。
InnoDB支持外鍵完整性約束(foreign key)。存儲表中的數(shù)據(jù)時,每張表的存儲都按主鍵順序存放,如果沒有顯示在表定義時指定主鍵,InnoDB會為每一行生成一個6B的rowid,并以此作為主鍵。
InnoDB被用在眾多需要高性能的大型數(shù)據(jù)庫站點上。 ?InnoDB不創(chuàng)建目錄,使用InnoDB時,MySQL將在MySQL數(shù)據(jù)目錄下創(chuàng)建一個名為ibdata1的10MB大小的自動擴展數(shù)據(jù)文件,以及兩個名為ib_logfile0和ib_logfile1的5MB大小的日志文件。??
MyISAM引擎

MyISAM基于ISAM的存儲引擎,并對其進行擴展。它是在web、數(shù)據(jù)存儲和其他應用環(huán)境下最常用的存儲引擎之一。MyISAM擁有較高的插入、查詢速度,但不支持事務。在MySQL5.5.5之前的版本中,MyISAM是默認的存儲引擎。MyISAM主要特性有:

大文件(達63位文件長度)在支持大文件的文件系統(tǒng)和操作系統(tǒng)上被支持。
當把刪除、更新及插入操作混合使用的時候,動態(tài)尺寸的行產(chǎn)生更少的碎片。
每個MyISAM表最大的索引數(shù)是64,這可以通過重新編譯來改變。每個索引的最大的列數(shù)是16個。
blob和text列可以被索引。
null值被允許在索引列中,這個值占每個鍵的0~1個字節(jié)。
每個字符列可以有不同的字符集。
有varchar的表可以固定或動態(tài)記錄長度。
varchar和char列可以多達64KB。
使用MyISAM引擎創(chuàng)建數(shù)據(jù)庫,將產(chǎn)生3個文件。文件的名字以表的名字開始,擴展名指出文件類型:frm存儲表定義,數(shù)據(jù)文件的擴展名為.MYD(MYData),索引文件的擴展名是.MYI(MYIndex)。

?

存儲引擎的選擇

??不同的存儲引擎都有各自的特點,以適應不同的需求,下面是每種引擎可以提供的功能:

存儲引擎比較
功能?? ?InnoDB?? ?MyISAM?? ?Memory?? ?Archive
存儲限制?? ?64TB?? ?256TB?? ?RAM?? ?None
支持事務?? ?YES?? ?NO?? ?NO?? ?NO
支持全文索引?? ?NO?? ?YES?? ?NO?? ?NO
支持數(shù)索引?? ?YES?? ?YES?? ?YES?? ?NO
支持哈希索引?? ?NO?? ?NO?? ?YES?? ?NO
支持數(shù)據(jù)緩存?? ?NO?? ?N/A?? ?YES?? ?NO
支持外鍵?? ?YES?? ?NO?? ?NO?? ?NO
若要提供提交、回滾和崩潰恢復能力的事務安全(ACID兼容)能力,并要求實現(xiàn)并發(fā)控制,InnoDB是最好的選擇。
若數(shù)據(jù)表主要用來插入和查詢記錄的,MyISAM是最好的選擇,因為MyISAM引擎能提高較高的處理效率。
若只是臨時存放數(shù)據(jù)且量不大、也不需要較高的數(shù)據(jù)安全性,可以使用Memory引擎,MySQL中使用該引擎作為臨時表,存放查詢的中間結果。
若只有insert和select操作,可選擇Archive,Archive存儲引擎支持搞并發(fā)的插入操作,但是本身不是事務安全的。此引擎適合存儲歸檔數(shù)據(jù) 如記錄日志信息。
???????????????????????????????????數(shù)據(jù)表的基本操作

一、創(chuàng)建數(shù)據(jù)表

創(chuàng)建表
主鍵約束
外鍵約束
非空約束
唯一性約束
默認約束
主鍵自增
二、查看數(shù)據(jù)表結構

查看表結構
查看表詳情結構語句,即建表語句
三、修改表結構

修改表名
修改字段的數(shù)據(jù)類型
修改字段名
添加字段
刪除字段
修改字段的排列位置
修改表的存儲引擎
刪除表的外鍵約束
四、刪除數(shù)據(jù)表

刪除未被關聯(lián)的表
刪除被其他關聯(lián)的主表
一、創(chuàng)建數(shù)據(jù)表

1.1、表的創(chuàng)建:

數(shù)據(jù)表屬于數(shù)據(jù)庫,建表之前,應使用 ?use database_name ?選擇將要建表的數(shù)據(jù)庫。

建表語法格式:

create table ?<表名>(
? ? 字段名1,數(shù)據(jù)類型 [列級別的約束條件] [默認值],
? ? 字段名2,數(shù)據(jù)類型 [列級別的約束條件] [默認值],
? ? ......
?
? ? [表級別的約束條件]
?

使用create table 創(chuàng)建表時,要注意:

表名稱不區(qū)分大小寫,但不能使用MySQL中的關鍵字,如:drop 、alter、insert等。、
若創(chuàng)建多個列,需要逗號隔開。
命令查看數(shù)據(jù)庫中所有的表: ?show tables

1.2、主鍵約束

??主鍵又稱主碼,是表中一列或多列的組合。主鍵約束(primary key)要求主鍵列的數(shù)據(jù)唯一且不允許為空。主鍵能夠唯一地標識表中的一條記錄,可以結合外鍵來定義不同數(shù)據(jù)表之間的關系,并且可以加快數(shù)據(jù)庫查詢速度。主鍵分為兩種類型:單字段主鍵和多字段聯(lián)合主鍵。

單字段主鍵:由一個字段組成

語法格式:1、 字段名 ?數(shù)據(jù)類型 primary key [默認值] ??????2、[constraint<約束名>] primary key [字段名]

示例:id為主鍵

//單主鍵 ?格式1
create table user(
? ? id int(11) primary key,
? ? name varchar(20),
? ? phone ?varchar(11) ? ?
)
//單主鍵格式2
create table ?student(
? ? id int(11),
? ? name varchar(20),
? ? phone varchar(11),
? ? primary key(id)
)
多字段聯(lián)合主鍵:由多個字段組成

格式:primary ?key [字段1,字段2,...,字段n]

示例:name和phone作為聯(lián)合主鍵

create table ?test(
? ? name varchar(20),
? ? phone varchar(11),
? ? address varchar(50),
? ? primary key(name,phone)
)
1.3、外鍵約束

?外鍵釋義:

是表中的一個字段,可以不是本表的主鍵,但是對應另一個表的主鍵。
外鍵的主要作用是保證數(shù)據(jù)的一致性和完整性,定義外鍵后,不允許刪除另一個表中的具有關聯(lián)關系的行。
外鍵是用來在兩個表的數(shù)據(jù)之間建立連接,可以是一列或多列。
一個表可以有一個或多個外鍵
外鍵對應的是參照完整性,一個表的外鍵可以為空值,若不為空值,則每一個外鍵值必須等于另一個表中主鍵的某個值。
語法格式:

constraint ??外鍵名 ??foreign ??key (字段名) ??references ??主表名(主鍵列名)

語法釋義:

外鍵名是定義外鍵約束的名稱,一個表中不能有相同的外鍵名稱。
字段名是子表需要添加外鍵約束的字段列。
主表名是被子表外鍵所關聯(lián)的表的名稱。
主鍵列名是是被子表外鍵所關聯(lián)的表的主鍵列。
實例:

a表中字段b_id作為外鍵關聯(lián)b表中的主鍵id,外鍵名是fk_a_b, ?

CREATE TABLE `a` (
? `id` int(10) NOT NULL,
? `name` varchar(20) NOT NULL,
? `b_id` int(10) DEFAULT NULL,
? PRIMARY KEY (`id`),
? KEY `fk_a_b` (`b_id`),
? CONSTRAINT `fk_a_b` FOREIGN KEY (`b_id`) REFERENCES `b` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
?
CREATE TABLE `b` (
? `id` int(10) NOT NULL,
? `name` varchar(20) NOT NULL,
? `address` varchar(50) DEFAULT NULL,
? PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
提示:

關聯(lián)是指關系型數(shù)據(jù)庫中,相關表之間的關聯(lián)。
是通過相容或相同的屬性或屬性組來表示的。
子表的外鍵必須關聯(lián)主表的主鍵,且關聯(lián)字段的數(shù)據(jù)類型必須匹配,若不匹配創(chuàng)建的時候就會報錯。
1.4非空約束

非空約束指字段的值不能為空,對于非空約束的字段,在添加數(shù)據(jù)沒有指定值,數(shù)據(jù)庫則會報錯。

語法格式:

??????字段名 數(shù)據(jù)類型 ?not null

實例:

創(chuàng)建test表,并指定name字段不能為空

CREATE TABLE `test` (
? `id` int(11) NOT NULL,
? `name` varchar(20) NOT NULL,
? PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
1.5 唯一性約束

唯一性約束要求該列唯一,允許為空,但是只能出現(xiàn)一個空值。唯一約束可以確保一列或者多列不出現(xiàn)重復值

語法格式:

?字段名 數(shù)據(jù)類型 ?unique ?????定義完列直接指定唯一約束

?constraint ?約束名 unique(字段名) ?定義完所有列之后指定唯一約束(可以多字段使用唯一性約束,這樣多字段確定一條數(shù)據(jù),即唯一)

實例:

//指定完列直接使用唯一約束 UNIQUE
create table test1(
id int(11) PRIMARY key,
name varchar(20) UNIQUE
)
//指定完所有列再使用唯一約束 ?約束名為aa?
create table test2(
id int(11) PRIMARY key,
address varchar(20),
CONSTRAINT aa UNIQUE(address)
)
//指定完所有列可以給多字段使用唯一約束 ?下面 約束名為cc ?則 test3表中name+phone 唯一
create table test3(
id int(11) PRIMARY key,
name varchar(20) NOT NULL,
phone VARCHAR(20) NOT null ,
CONSTRAINT cc UNIQUE(`name`,`phone`)
)
UNIQUE與PRIMARY KEY的區(qū)別:

一個表中可以多個字段聲明為unique,但是只能有一個primary key聲明。
聲明為primary key的列不允許有空值,但是聲明為unique的字段允許空值(null)存在。
1.6 默認約束

默認約束指定某列的默認值。

語法格式:

字段名 數(shù)據(jù)類型 default 默認值

實例:

address默認值為null,remark的默認值是‘1111’

create table test2(
id int(11) PRIMARY key,
address varchar(20) default null,
remark varchar(20) ?default '1111'
)
1.7 主鍵自增

主鍵自增:

系統(tǒng)自動生成字段的主鍵值
為表主鍵設置auto_increment關鍵字來實現(xiàn)
MySQL中auto_increment的初始值是1,每新增一條記錄,字段值自動加一
一個表只能有一個字段使用auto_increment約束,且該字段必須為主鍵的一部分
auto_increment約束的字段可以是任何整數(shù)類型
語法格式:

字段名 ?數(shù)據(jù)類型 auto_increment

實例:

create table exp(
id BIGINT(20) PRIMARY KEY auto_increment,
name VARCHAR(50) DEFAULT NULL
)
設置id為主鍵的時候執(zhí)行insert插入操作時不用管id字段

?

?

查看數(shù)據(jù)表結構

1.1查看表結構

語法格式:desc 表名 ?或者 describe ?表名

1.2查看表的詳細結構

語法格式: show ??create ?table ?表名

1.1實例:

desc test3

釋義:

field 表示字段
type 表示字段類型
null ?表示該列是否可以存儲null值
key ?表示該列是否已編制索引,PRI表示該列是主鍵的一部分;NUI表示該列是UNIQUE索引的一部分;MUL表示該列某個給定值允許出現(xiàn)多次
default ?表示該列是否有默認值,如果有的話值是多少
extra ?表示可以獲取的與給定列的有關附加信息,比如auto_increment等
1.2 實例:

show ?create ?table ?test3

釋義:簡單的說就是得到的是得到的建表語句,初次之外就是庫表的存儲引擎和編碼格式

修改數(shù)據(jù)表

修改表是指修改已存在數(shù)據(jù)表的結構,MySQL使用alter ?table 語句修改表。

常用修改表的操作:

修改表名
修改字段名
修改字段類型
增加字段
刪除字段
修改字段的位置
更改存儲引擎
刪除表的外鍵約束
等等.....
1.1修改表名

語法格式: alter ?table ?舊表名 ??rename ?to ?新表名

實例:將test3表名更改為test表名 ???????>>?alter ?table ?test3 ?rename ?to ?test

1.2 修改字段名

語法格式: alter ?table ?表名 ?change ?舊字段名 ??新字段名 ?新數(shù)據(jù)類型

舊字段指修改前的字段名
新字段名指修改后的字段名
新數(shù)據(jù)類型指修改后的字段類型(當然修改前后的字段類型可以一樣,但是不能為空)
實例:表test3,表結構如下圖

???????????

將name字段修改為address ?類型是字符串

alter ?table ?test3 ?change ?name ??address ?varchar(50)

結果:

將test3的phone字段的數(shù)據(jù)類型由varchar(20)修改為int(11)

alter table test3 change phone phone int(11)

備注: ?change ?不僅可以修改字段名也可以只修改字段類型,實現(xiàn)和modify同樣的效果。

1.3修改字段類型

語法格式:alter table 表名 modify 字段名 數(shù)據(jù)類型

??????????????或 alter ?table ?表名 change ?字段名a ?字段名a ?數(shù)據(jù)類型 ????????????????change上述已經(jīng)陳述過了

將test3表中的phone字段的數(shù)據(jù)類型由int(11)更改為varchar(11)

alter table test3 modify phone varchar(11)

change和modify的區(qū)別:

change不僅可以修改字段名,也可以修改字段的數(shù)據(jù)類型(修改前后的字段名一樣即可)
modify只可以修改字段的數(shù)據(jù)類型,不可以修改字段名,但是modify可以修改字段的位置(參照后面1.6)
1.4 增加字段?

語法格式:alter ?table ?表名 ?add ?新字段名 ?數(shù)據(jù)類型 ?[約束條件] [first | after ?已存在字段]

括號內為可選參數(shù)

實例:給test3表添加一個新字段name, 數(shù)據(jù)類型varchar(20),在phone字段后面

alter table test3 add name varchar(20) after phone

在test3的第一列添加 email字段,數(shù)據(jù)類型varchar(30),唯一約束

alter table test3 add email varchar(30) unique first

1.5刪除字段

語法格式: alter table 表名 drop 字段名

將test3中的email字段刪除

alter table test3?drop email

1.6 修改字段的位置

語法格式: alter table 表名 modify 字段名 數(shù)據(jù)類型 ?[first | after 已存在字段]

實例:將test3中的name字段放置id后面

alter table test3 modify name varchar(20) after id

1.7 修改存儲引擎

語法格式: alter table 表名 engine=<新的存儲引擎>

用show create table test3查看test3的存儲引擎,將InnoDB改為MyISAM

alter table test engine=MyISAM

1.8 外鍵的刪除

語法格式:alter table 表名 drop foreign key 外鍵名稱

刪除數(shù)據(jù)表

刪除數(shù)據(jù)表就是將數(shù)據(jù)庫中已存在的表從數(shù)據(jù)庫中刪除。

表的刪除主要分為兩種情況:

?????????????????????????????第一種:沒有被其他的表關聯(lián)

?????????????????????????????第二種:有被其他的表關聯(lián)

第一種 沒有被其他的表關聯(lián):

語法格式:drop table [if exists] 表1,...表n;

drop table 可以刪除多個沒有被其他表關聯(lián)的數(shù)據(jù)表
刪除多表時,之間用逗號隔開
若果要刪除的表不存在,則MySQL會包錯誤信息。參數(shù) if exists用于在刪除前判斷刪除的表是否存在,加上該參數(shù)刪除表時,若表不存在,sql可以順利執(zhí)行,但是會發(fā)出警告
第二種刪除被關聯(lián)的表

數(shù)據(jù)表如果存在關聯(lián)的情況下,若直接刪除父表,結果會顯示失敗。原因是直接刪除,將破壞表的參照完整性,若果必須刪除,可以先刪除與其關聯(lián)的子表,再刪除父表,只是這樣同時刪除了兩個表中的數(shù)據(jù)。但有的情況寫可能要保留子表,這事如要單獨刪除父表,只需將關聯(lián)的表的外鍵條件取消,然后就可以刪除父表。

語法格式:先刪除外鍵約束 ?alter table 表名 drop foreign key 外鍵名稱

??????????????????再刪除父表 ??drop ?table 表名

實例:

tb_dept的主鍵id被tb_emp的dept_id字段所關聯(lián),所以tb_dept是父表,tb_emp是從表。

刪除父表的的思想:

????????????????先刪除從表tb_emp的外鍵約束: alter table ?tb_emp drop foreign key fk_name

????????????????然后再刪除主表: drop table tb_dept

刪除外鍵約束的tb_emp表對象信息:

這樣在執(zhí)行刪除父表的命令就不會報錯誤信息。

???????????????????????????????????數(shù)據(jù)類型和運算符

?

常見的數(shù)據(jù)類型的概念和區(qū)別
如何選擇數(shù)據(jù)類型
常見的運算符和區(qū)別及其運用
數(shù)據(jù)類型的介紹:

數(shù)值數(shù)據(jù)類型:包括整數(shù)類型 tinyint、smallint、mediumint、int、bigint、浮點小數(shù)數(shù)據(jù)類型 float和double、定點小數(shù)類型 decimal
日期/時間類型:包括year、time、date、datetime、timestamp。
字符串類型:包括char、varchar、binary、varbinary、blob、text、emum、set等。字符串類型又分為文本字符串和二進制字符串。
整數(shù)類型

??????數(shù)據(jù)型數(shù)據(jù)類型主要用來存儲數(shù)字,MySQL提供了多種數(shù)值數(shù)據(jù)類型,不同的數(shù)據(jù)類型提供不同的取值范圍,可以存儲的值范圍越大,其所需要的存儲空間也會越大。MySQL主要提供的整數(shù)類型有:tinyint、smallint、mediumint、int、bigint。整數(shù)類型的屬性字段可以添加auto_increment自增約束條件。

下圖展示MySQL中的整數(shù)型的數(shù)據(jù)類型及取值范圍

類型名稱?? ?說明?? ?存儲需求?? ?有符號?? ?無符號
TINYINT?? ?很小的整數(shù)?? ?1個字節(jié)?? ?-128~127?? ?0~255
SMALLINT?? ?小的整數(shù)?? ?2個字節(jié)?? ?-32768~32767?? ?0~65535
MEDIUMINT?? ?中等大小的整數(shù)?? ?3個字節(jié)?? ?-8388608~8388607?? ?0~16777215
INT(INTEGER)?? ?普通大小的整數(shù)?? ?4個字節(jié)?? ?-2147483648~2147483647?? ?0~4294967295
BIGINT?? ?大整數(shù)?? ?8個字節(jié)?? ?-9223372036854775808~9223372036854775807?? ?0~18446744073709551615
???????????????實例:定義一個字段 tinyint(4)???????

?????????????????????????該聲明指明,在year字段中的數(shù)據(jù)一般只顯示4位數(shù)字的寬度。???

注意:4指的是顯示的寬度,與數(shù)據(jù)類型的取值范圍無關。顯示寬度只是指明MySQL最大可能顯示的數(shù)字個數(shù),數(shù)值的位數(shù)小于指定的寬度時會有空格填充;若大于指定寬度的值,只要不超過數(shù)據(jù)類型的取值范圍也可以存儲,而且也能夠顯示出來。

如果定義字段不指定整型數(shù)據(jù)類型所顯示的寬度,則系統(tǒng)會為每一種類型指定默認的寬度。

實例展示:創(chuàng)建test5時,未指定字段類型的寬度,用desc 查看顯示系統(tǒng)為每種類型加上了默認的顯示寬度

上圖可以看出,系統(tǒng)將添加不同的默認顯示寬度。這些顯示寬度能夠保證顯示每一種數(shù)據(jù)類型可以取到取值范圍內的所有值。

例如: TINYINT有符號和無符號的取值范圍是 -128~127和0~255,由于負號占了一個數(shù)字位,因此TINYINT默認顯示的寬度時4.同理其他整數(shù)類型的默認顯示寬度與其有符號數(shù)的最小值的寬度相同。

不同的整數(shù)類型有不同的取值范圍,并且需要不同的存儲空間,因此,應該根據(jù)實際需要選擇最合適的類型,這樣有利于提高查詢效率和節(jié)省存儲空間。

浮點數(shù)類型和定點數(shù)類型

MySQL用浮點數(shù)和定點數(shù)來表示小數(shù)。

浮點類型有兩種:單精度浮點類型 ?FLOAT 和雙精度浮點類型 DOUBLE。

定點類型只有一種:DECIMAL 。

浮點類型和定點類型都可以用(M,N)來表示,其中M稱為精度,表示總共的位數(shù);N表示小數(shù)的位數(shù)。

類型名稱?? ?說明?? ?存儲需求
FLOAT?? ?單精度浮點數(shù)?? ?4個字節(jié)
DOUBLE?? ?雙精度浮點數(shù)?? ?8個字節(jié)
DECIMAL(M,D)?? ?壓縮的“嚴格”定點數(shù)?? ?M+2 個字節(jié)
不論是浮點類型還是定點類型,如果用戶指定的精度超出精度范圍,則會四舍五入進行處理。

例如: ?定義 字段 ?X float(5,1) ?說明 X字段總長度5,有以為小數(shù)的 ?浮點類型數(shù)據(jù)

??現(xiàn)在 給 字段 X賦值5.12后,最終結果是5.1 ??四舍五入

?

日期與時間類型

MySQL中表示日期的數(shù)據(jù)類型主要有:DATETIME、DATE、TIMESTAMP、TIME、YEAR。

類型名稱?? ?日期格式?? ?日期范圍?? ?存儲需求
YEAR?? ?YYYY?? ?1901~2155?? ?1個字節(jié)
TIME?? ?HH:MM:SS?? ?-838:59:59~838:59:59?? ?3個字節(jié)
DATE?? ?YYYY-MM-DD?? ?1000-01-01~9999-12-3?? ?3個字節(jié)
DATETIME?? ?YYYY-MM-DD HH:MM:SS?? ?1000-01-01 00:00:00 ~ 9999-12-31 23:59:59?? ?8個字節(jié)
TIMESTAMP?? ?YYYY-MM-DD HH:MM:SS?? ?1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC?? ?4個字節(jié)
YEAR類型

year可以使用格式指定值

以4位字符串或者4位數(shù)字格式表示的year,范圍為“1901” ~ “2155”。輸入格式為“YYYY”或者 YYYY,例如輸入2019或者“2019”,插入到數(shù)據(jù)庫的值均為2019.
以2位字符串格式表示year,范圍為“00” ~ “99”。 “00” ~ “69” 范圍被轉換為2000~2069,“70” ~ “99” 范圍被轉換為 1970~1999。“0”與“00”的作用相同,插入到數(shù)據(jù)庫的值都是2000。
以2位數(shù)字表示的year,范圍為1~99。1~69范圍的值對應2001~2069,70~99范圍的值對應1970~1999。注意:在這里0值將被轉換為0000。而不是2000
TIME類型

TIME類型用于只需要時間信息的值,格式為HH:MM:SS,HH表示小時,MM表示分鐘,SS表示秒。TIME類型的取值范圍是-838:59:59 ~ 838:59:59.小時部分如此大的原因是TIME類型不僅可以用于表示一天的時間(必須大于24小時),還可能是某個事件過去的時間或兩個事件之間的時間間隔(可以大于24小時或者甚至為負)。

可以使用各種格式指定TIME的值:

'D HH:MM:SS' 格式的字符串。還可以使用下面任何一種'非嚴格'的語法:'HH:MM:SS'、'HH:MM'、'D HH:MM'、'D HH'、'SS',這里的D表示日,可以取0~34之間的值。在插入數(shù)據(jù)庫時,D被轉換為小時保存,格式為 ' D*24 + HH '。 ?
'HHMMSS'格式的、沒有間隔符的字符串或者HHMMSS格式的數(shù)值,假定是有意義的時間。例如: '101112' 被理解為 ' 10:11:12 ',但是'109712'是不合法的(它有一個沒有意義的分鐘部分),存儲時將變?yōu)?00:00:00 。
提示:為TIME列分配簡寫值時應注意:如果沒有冒號,MySQL解釋值時,假定最右邊的兩位表示秒。(MySQL解釋TIME值為過去的時間而不是當天的時間)。例如,讀者可能認為 ' 1112 '或者1112表示11:12:00(即11點12分),但是MySQL將他們解釋為 00:11:12(即11分12秒)。同樣 ' 12 ' 或者 12 被解釋為 00:11:12。相反,TIME值中如果使用冒號則肯定被看作當天的時間。也就是說,' 11:12?' 表示 11:12:00,而不是 00:11:12 。

實例:

字段及類型?? ?插入的值?? ?結果
date ?TIME?? ?'10:05:05'?? ?10:05:05
date ?TIME?? ?'23:23'?? ?23:23:00
date ?TIME?? ?'2 10:10'?? ?58:10:00
date ?TIME?? ?'10'?? ?00:00:10
date ?TIME?? ?'101112 '?? ?10:11:12
date ?TIME?? ?'101113'?? ?10:11:13
如果插入 ?107010,MySQL會報錯誤信息,因為其中有一個不合法的分鐘。

?

插入系統(tǒng)當前時間: CURRENT_TIME、NOW()

DATE類型

DATE類型用在僅需要日期值時,沒有時間部分。格式為 'YYYY-MM-DD',其中YYYY表示年,MM表示月,DD表示日。在給DATE類型字段賦值時,可以使用字符串類型或者數(shù)字類型的數(shù)據(jù)插入,只要符合DATE的日期格式即可。

可以用一下格式給DATE賦值:

'YYYY-MM-DD'或者 'YYYYMMDD' 字符串格式表示的日期,取值范圍為 '1000-01-01' ~ '9999-12-3'。例如,輸入'2019-05-05'或'20190505',插入數(shù)據(jù)庫的日期都是 2015-05-05。
'YY-MM-DD'或'YYMMDD' 字符串格式表示的日期,MySQL使用以下規(guī)則解釋兩位年值:'00~69'表示'2000~2069','70~99'表示'1970~1999'。
YY-MM-DD或YYMMDD數(shù)字格式表示的日期,與上述類似,00~69表示2000~2069,70~99表示1970~1999。
使用 CURRENT_DATE或NOW(),插入系統(tǒng)當前時間。
提示:MySQL允許 不嚴格 語法:任何標點符號都可以用作日期部分之間的間隔符。例如,'98-11-31'、'98.11.31'、'98/11/31'是等價的。這些值也可以正確地插入到數(shù)據(jù)庫。

DATETIME類型

DATATIME ?包含日期和時間信息的值,格式: YYYY-MM-DD HH:MM:SS ,分別表示年月日時分秒。在給DATETIME類型字段賦值時,可以用字符串或數(shù)字類型的數(shù)據(jù)插入,只要符合DATETIME的格式即可。

字符串格式: 'YYYY-MM-DD HH:MM:SS'或'YYYYMMDDHHMMSS',取值范圍為 '1000-01-01 00:00:00' ~ '999-12-323:59:59'。
字符串格式: 'YY-MM-DD HH:MM:SS'或'YYMMDDHHMMSS'','00~69'表示是2000~2069,'70~99'表示是1970~1999。
數(shù)字格式:YYYY-MM-DD HH:MM:SS或YYMMDDHHMMSS,00~69表示是2000~2069,70~99表示是1970~1999。
提示:MySQL也允許不嚴格的語法,雷同DATE。

TIMESTAMP類型

TIMESTAMP顯示的格式與DATETIME相同,取值范圍為 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07,其中 UTC為世界標準時間,因此在對此類型字段插入值時要保證在合法的取值范圍內。

TIMESTAMP典型實例:創(chuàng)建表test ??字段id,date

create table test(
? ? id int(11) primary key,
? ? date TIMESTAMP
)
執(zhí)行上述建表語句后,查看表的對象信息

CREATE TABLE `test` (
? `id` int(11) NOT NULL,
? `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
? PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
關注這句?`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,后面加粗部分是自動生成的, ?然后就是default current_timestamp 看著有點不合適,不過重點是紅色部分:ON UPDATE CURRENT_TIMESTAMP,這部分的作用就是當此表某行某一字段值發(fā)生變化時,此日期會自動更新為系統(tǒng)當前時間。

當然這個也可以去掉:

勾掉即可取消

?

然后就是說下timestamp時區(qū)的問題,UTC為世界標準時間,我們一般所在時區(qū)為東8區(qū)。

實例 在test ?插入一條數(shù)據(jù):

執(zhí)行 ?select * from test ?結果如下:

這個是東8區(qū)顯示的時間格式,現(xiàn)在執(zhí)行 ?set time_zone='+10:00',將東8區(qū)改成東10區(qū),在執(zhí)行查詢語句,結果是:

?

東10區(qū)比東8快了兩個小時......。請結合地理知識自嗨下吧

?

字符串類型

??字符串類型不僅可以存儲字符串數(shù)據(jù),還可以存儲其他數(shù)據(jù)(例如圖片和聲音的二進制數(shù)據(jù))。MySQL支持兩類字符型數(shù)據(jù):文本字符串和二進制字符串。

先說下 文本字符串:

類型名稱?? ?說明?? ?存儲需求
CHAR(M)?? ?固定長度非二進制字符串?? ?M字節(jié),1<= M <= 255
VARCHAR(M)?? ?變長非二進制字符串?? ?L+1字節(jié),在此 L<=M 和 1<= M <= 255
TINYTEXT?? ?非常小的非二進制字符串?? ?L+1字節(jié),在此 L < 2^8
TEXT?? ?小的非二進制字符串?? ?L+2字節(jié),在此 L < 2^16
MEDIUMTEXT?? ?中等大小的非二進制字符串?? ?L+3字節(jié),在此 L < 2^24
LONGTEXT?? ?大的非二進制字符串?? ?L+4字節(jié),在此 L < 2^32
ENUM?? ?枚舉類型,只能有一個枚舉字符串值?? ?1或2個字節(jié),取決于枚舉值的數(shù)目(最大值65535)
SET?? ?一個設置,字符串對象可以有零個或多個SER成員?? ?1、2、3、4或8個字節(jié),取決于集合成員的數(shù)量(最多64個成員)
?CHAR類型

???CHAR(M)是固定長度的非二進制字符串,在定義時指定字符串列長,M表示列長度,M的范圍:0~255個字符。當保存時在右側填充空格以達到指定的長度,當檢索到char值時,尾部的空格將被刪除掉。

VARCHAR類型

VARCHAR(M)是長度可變的字符串,M表示最大列長度,M的范圍是 0~65535。VARCHAR的最大實際長度由最長的行的大小和使用的字符集確定,而其實際占用的空間為字符串的實際長度加1。VARCHAR在值保存和檢索時尾部的空格仍保留(char在值保存時右邊保留空格,檢索時右邊空格被自動刪除)

TEXT類型

TEXT列保存非二進制字符串,如文章內容、評論等。當保存或查詢TEXT列的值時,不刪除尾部的空格。

TEXT分為44四類:

TINYTEXT ??最大長度為255字符的TEXT列。
TEXT ?最大長度為65535字符的TEXT列。
MEDIUMTEXT ?最大長度為16777215字符的TEXT列。
LONGTEXT ?最大長度為4294967295字符的TEXT列。
ENUM類型

ENUM是一個字符串對象,其值為表創(chuàng)建時在列規(guī)定中枚舉的一列值。

語法格式: 字段名稱 ENUM('值1','值2',...'值n')

釋義:字段名稱指將要定義的字段,值n指枚舉列表中的第n個值。

ENUM類型的字段在取值時,只能在指定的枚舉列表中取,而且一次只能取一個。
如果創(chuàng)建的成員中有空格時,其尾部的空格將自動被刪除。
ENUM值在內部用整數(shù)表示,每個枚舉值均有一個索引值,列表所允許的成員值從1開始編號,MySQL存儲的就是這個索引編號。
枚舉最多可以有65535個元素。
實例一:

定義ENUM類型的列('first','second','third'),該列可以取得值和每個值的索引如下圖所示

值?? ?索引
NULL?? ?NULL
''?? ?0
first?? ?1
second?? ?2
third?? ?3
ENUM值依照列索引順序排列,并且空字符串排在非空字符串前,NULL值排在其他所有的枚舉值前。

實例二:

該實例查看列成員的索引值。

CREATE TABLE `test` (
? `id` int(11) NOT NULL AUTO_INCREMENT,
? `name` enum('first','second','third') ,
? PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
?
insert into test values(null,'second');
insert into test values(null,'first');
insert into test values(null,'third');
insert into test values(null,null);
?
?
SELECT name,name+0 from test;
結果:

從上述例子可以得出:索引值得順序(大小)是跟聲明枚舉值得順序有關,跟插入值得順序無關。

提示:ENUM列總有一個默認值。如果將ENUM列聲明為NULL,NULL值則作為該列的一個有效值,并且默認值為NULL。如果ENUM列被聲明為NOT NULL,其默認值為允許的值列表的第一個元素。

?

實例三:

聲明枚舉值,插入值和索引效果一樣。

CREATE TABLE `test` (
? `id` int(11) NOT NULL AUTO_INCREMENT,
? `name` enum('first','second','third') ,
? PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
?
insert into test values(null,1);
insert into test values(null,'second');
insert into test values(null,3);
insert into test values(null,2);
?
SELECT name,name+0 from test;
結果:

實例四:

不在枚舉值范圍的值,插入報錯。

CREATE TABLE `test` (
? `id` int(11) NOT NULL AUTO_INCREMENT,
? `name` enum('first','second','third') ,
? PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
?
insert into test values(null,5);
?
執(zhí)行報出的錯誤信息:
?
[SQL]insert into test values(null,5);
[Err] 1265 - Data truncated for column 'name' at row 1
?
?
insert into test values(null,'aaa');
?
執(zhí)行報出的錯誤信息:
?
[SQL]insert into test values(null,5);
[Err] 1265 - Data truncated for column 'name' at row 1
?
?
不能插入不在枚舉范圍內的值或索引值
SET類型

SET是一個字符串對象,可以有零或多個值,SET列最多可以有64個成員,其值為表創(chuàng)建時規(guī)定的一列值,指定包括多個SET成員的SET列值時,各成員之間用逗號(,)間隔開。

語法格式:SET('值1','值2',...'值n')

?????SET與ENUM類型相同,SET值在內部用整數(shù)表示,列表中每一個值都有一個索引編號。當創(chuàng)建表時,SET成員值得尾部空格將自動被刪除。但與ENUM類型不同的是,ENUM類型的字段只能從定義的列值中選擇一個插入,而SET類型的列可從定義的列值中選擇多個字符的聯(lián)合。

?如果插入SET字段中列值有重復,MySQL自動刪除重復的值
插入SET字段的值得順序并不重要,MySQL會在存入數(shù)據(jù)庫時,按照定義的順序顯示
如果插入了不正確的值,默認情況下,MySQL將忽視這些值,并給出警告。
實例:

drop table ?if EXISTS test;
CREATE TABLE `test` (
? `id` int(11) NOT NULL AUTO_INCREMENT,
? `name` set('a','b','c','d') ,
? PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
?
insert into test values(null,'a');
insert into test values(null,'a,b,a');
insert into test values(null,'c,a,d');
insert into test values(null,'a,x,d');
//最后一個插入報出警告
[SQL]
insert into test values(null,'a,x,d');
[Err] 1265 - Data truncated for column 'name' at row 1
?
select * from test;
?結果:

?

二進制字符串類型

MySQL中的二進制數(shù)據(jù)類型有:

類型名稱?? ?說明?? ?存儲需求
BIT(M)?? ?位字符類型?? ?大約(M+7)/8個字節(jié)
BINARY(M)?? ?固定長度二進制字符串?? ?M個字節(jié)
VARBINARY(M)?? ?可變長度二進制字符串?? ?M+1字節(jié)
TINYBLOB(M)?? ?非常小的BLOB?? ?L+1 字節(jié),在此L<2^8
BLOB(M)?? ?小BLOB?? ?L+2字節(jié),在此L<2^16
MEDIUMBLOB(M)?? ?中等大小的BLOB?? ?L+3 字節(jié),在此L<2^24
LONGBLOB(M)?? ?非常大的的BLOB?? ?L+4字節(jié),在此L<2^32
二進制因為不熟悉,暫時不列舉實例 ?^_^

?

????????????????????????????????????????????????????????常見遠算符

????運算符連接表達式中各個操作數(shù),其作用是用來指明對操作數(shù)所進行的運算,遠算符是告訴MySQL執(zhí)行特定算術或邏輯操作的符號。運用運算符可以更加靈活地使用表中的數(shù)據(jù)。

??常見的運算符類型有:算術運算符、比較運算符、邏輯運算符、位運算符。

算術運算符?

?????????????????????????????????????????????????????????????????????????????????????MySQL中的算術運算符

運算符?? ?作用?? ?簡單實例
+?? ?加法運算?? ?字段名稱 + n
-?? ?減法運算?? ?字段名稱 - ?n
*?? ?乘法運算?? ?字段名稱 * n
/?? ?除法運算,返回商?? ?字段名稱 / n
%?? ?求余運算,返回余數(shù)?? ?字段名稱 % n
提示:

進行算術運算的時候注意 ?算術運算符的優(yōu)先級
進行除法運算時候,除數(shù)為0是沒有意義的,若被0除,則返回結果為NULL。
比較運算符

一個比較運算符的結果是1、0或者是NULL,比較運算符經(jīng)常在SELECT的查詢條件子句中使用。

???????????????????????????????????????????????????????????????????????????????????????MySQL中的比較運算符

運算符?? ?作用
=?? ?等于
<=>?? ?安全的等于
<>(!=)?? ?不等于
<=?? ?小于等于
>=?? ?大于等于
<?? ?小于
>?? ?大于
IS NULL?? ?判斷一個值是否為NULL
IS NOT NULL?? ?判斷一個值是否不為NULL
LEAST?? ?在有兩個或多個參數(shù)時,返回最小值
GREATEST?? ?在有兩個或多個參數(shù),返回最大值
BETWEEN AND?? ?判斷一個值是否落在兩個值之間
ISNULL?? ?與ISNULL作用一樣
IN?? ?判斷一個值是IN列表中的任意一個值
NOT IN?? ?判斷一個值不是IN列表中的任意一個值
LIKE?? ?通配符匹配
REGEXP?? ?正則表達式匹配
簡單的比較運算符跳過不舉實例了,找一些常用或不常見的舉些實例

等于運算符(=)

????等號運算符用來判斷數(shù)字、字符串和表達式是否相等。如果相等返回1否則返回0。

講述下比較規(guī)則:

若有一個或兩個參數(shù)為NULL,則比較運算的結果為NULL。
若同一個比較運算中的兩個參數(shù)都是字符串,則按照字符串進行比較。
若兩個參數(shù)均為整數(shù),則按照整數(shù)進行比較。
若一個字符串和數(shù)字進行相等判斷,則MySQL可以自動將字符串轉為數(shù)字進行比較。
安全等于運算符(<=>)

?????這個操作符和 = 操作符 執(zhí)行 相同的比較操作,不過<=>可以用來判斷NULL值。在兩個參數(shù)均為NULL時,其返回值為 1 而不為NULL;而當一個操作數(shù)為NULL時,其返回值為0而不為NULL。

實例:

不等于運算符(<> 或 !=)(常用)

???'<>' 或 '!=' 用于判斷數(shù)字、字符串、表達式不相等的判斷。如果不等,返回1,否則返回0。不等于運算符不能用于判斷空值NULL

IS NULL(ISNULL),IS NOT NULL 運算符(常用)

IS NULL(ISNULL)是檢驗一個值是否為NULL,若為NULL,返回值為1,否則返回值為 0。

IS NOT NULL 是檢驗一個值是否為非NULL,若是非NULL,返回值為1,否則返回值為 0 。

BETWEEN AND運算符(常用)

????語法格式: str ?between ?min ?and max?

若str大于等于min且小于等于max,則BETWEEN的返回值為1,否則返回值 0。 ?其實此運算符多用于 條件語句中

LEAST運算符

語法格式: LEAST(值1,值2,....,值n)

其中值n表示參數(shù)列表中的有n個值。作用是:在有兩個或多個參數(shù)的情況下,返回最小值。假如任意一個自變量為NULL,則LEAST()的返回值為NULL。

首先 ?參數(shù) 要滿足 有兩個或多個參數(shù)的情況下。
當參數(shù)中是整數(shù)或浮點數(shù)時,LEAST將返回其中最小的值。
當參數(shù)為字符串,返回字母表中順序最靠前的字符。
當參數(shù)中有NULL時,不能判斷大小,返回值為NULL。
GREATEST

???語法格式:GREATEST(值1,值2,....,值n)

其中n 表示參數(shù)列表有n個值。當有兩個或多個參數(shù)時,返回值為最大值。假如任意一個自變量為NULL,則GREATEST()的返回值為NULL。

首先 ?參數(shù) 要滿足 有兩個或多個參數(shù)的情況下。
當參數(shù)中是整數(shù)或浮點數(shù)時,GREATEST將返回其中最大的值。
當參數(shù)為字符串,返回字母表中順序最靠后的字符。
當參數(shù)中有NULL時,不能判斷大小,返回值為NULL。
IN 、NOT IN 運算符(常用)

多運用與 子查詢中,不多陳述。

LIKE運算符(常用)

LIKE運算符用來匹配字符串,語法格式:??str ?like 匹配條件。

若str有滿足匹配條件的,則返回值為 1 (true),反之返回 0(false)。

若str或匹配條件中,任意一個為NULL,則結果為NULL。

匹配條件中用到以下兩種通配符:

' % ' ,匹配任何數(shù)目的字符,甚至包括零字符
' _ ' ,只能匹配一個字符,也可以說是占位符
實例:?

'%a' ?匹配最后一位為a結尾的字符串。
'a%' ?匹配首位以a開頭的字符串。
'a__d' ?匹配以a開頭,以d結尾的四位字符串。
REGEXP運算符

regexp運算符用來匹配字符串,語法格式: str regexp 匹配條件?。

若str滿足匹配條件,返回 1(true),否則返回 0(false) 。

若str或匹配條件任意一個為NULL,則結果為NULL。

REGEXP運算符在進行匹配時,常用的有下面幾種通配符:

' ^?' ,匹配以該字符后面的字符開頭的字符串。 比如 '^a',匹配以a開頭的字符串。
' $ ',匹配以該字符后面的字符結尾的字符串。比如 'a$' ,匹配以a結尾的字符串。
' . ' ,匹配任意一個單字符。
'[...]' ,匹配在方括號內的任何字符。比如 '[a-zA-Z]'匹配a到z或A到Z的任意一個字符。比如'[0-9]'等。
' * ' ,匹配零個或多個在他前面的字符。比如 'x*' 匹配任何數(shù)量的 'x'字符,'[0-9]*' 匹配任何數(shù)量的數(shù)字,而'*'匹配任何數(shù)量的任何字符串。
實例:

'^y' ?>>> 匹配以y開頭的字符串。
'y$' >>> 匹配以y結尾的字符串。
'.xyz' 這個匹配這樣的:'axyz'、'axyzb'
正則表達式是一個可以進行復雜查詢的強大工具,相對于LIKE,字符串匹配。他可以使用更多的通配符類型,查詢結果更加靈活。

邏輯運算符

在MySQL中,所有邏輯運算符的求值所得結果均為TRUE、FALSE、NULL。

?????????????????????????????????????????????????????????????????????????????????MySQL中的邏輯運算符

運算符?? ?作用
NOT 或者 !?? ?邏輯非
AND 或者 &&?? ?邏輯與
OR 或者 ||?? ?邏輯或
XOR?? ?邏輯異或
NOT 或者 !

邏輯非運算符NOT或者!表示:

當操作數(shù)為 0 時,所得值為 1
當操作數(shù)為非零值時,所得值為 0
當操作數(shù)為NULL時,所得值為NULL
簡單理解:NOT 或 ! 后跟的字符串或者表達式 ?為0時,返回 1;為非零值時,返回 0;為NULL時,返回 NULL 。

實例:

???

前四對可知NOT和 ! 的返回值都相同,唯獨最后一個 NOT 1+1 和 !1+1 的值不同。。。這是因為牽扯的運算符的優(yōu)先級問題

NOT的優(yōu)先級低于 + 號,所以先計算+ 在執(zhí)行 NOT, 所以 NOT 1+1 =??NOT 2 = 0;

!的優(yōu)先級大于+號,所先執(zhí)行!1,在執(zhí)行+1,所以 !1+1 = 0+1=1 。

所以使用運算符時,在不清楚運算符的情況下,最好使用(),以保證運算結果的正確。

AND 或者 &&

邏輯與運算符AND或者&&表示:

所有操作數(shù)均為非零值且不為NULL時,返回值為 1?
當有一個或多個操作數(shù)為0時,返回值為 0
其余情況,返回值為NULL
實例:

有上圖可知AND和&&的作用相同, ?其實按照上述1、2、3一一對應就可以得到結果。

注意:AND運算符可以有多個操作數(shù),當多個操作數(shù)運算時,AND兩邊一定要使用空格隔開,不然會影響結果的正確性。

OR 或者 ||

邏輯或運算符OR或者||表示:

當兩個操作數(shù)均為非NULL值且任意一個操作數(shù)為非零值時,返回值為 1,否則返回 0
當有一個操作數(shù)為NULL且另一個操作數(shù)為非零值時,返回值為 1,否則為NULL
當兩個操作數(shù)均為NULL時,返回值為NULL
實例:

XOR

邏輯異或運算符XOR:

當任意一個操作數(shù)為NULL時,返回值為NULL,
對于非NULL操作數(shù),如果兩個操作數(shù)都是非零或者都是零值,返回值為0
若一個操作數(shù)為0值,另一個為非0值,返回結果為 1
實例:

提示: a XOR b 的計算等同于(a AND(NOT b))或者((NOT a)AND b)

?

位運算符

????????位運算符時是用來對二進制字節(jié)中的位進行測試、位移或者測試處理。

?????????????????????????????????????????????????????????????????????????????????MySQL中的位運算符

運算符?? ?作用
|?? ?位或
&?? ?位與
^?? ?位異或
<<?? ?位左移
>>?? ?位右移
~?? ?位取反,反轉所有比特
位或運算符(|)

位或運算的實質是將參與運算的幾個數(shù)據(jù),按對應的二進制數(shù)逐位進行邏輯或運算。對應的二進制位有一個或兩個為 1,則運算結果為1,否則為 0。

實例:

其實 ?位或(|)運算需要先學會 邏輯或(OR 或 ||)運算。

實例解析:9的二進制數(shù)值為1001,4的二進制數(shù)值為0100,2的二進制數(shù)值為0010.

????????????????先 ?1001與0100進行按位邏輯或運算得到二進制1101

????????????????在 用 二進制1101與0010進行邏輯或運算得到二進制1111

????????????????而 1111二進制轉換十進制就是15

位與運算符(&)

????位與運算的實質是將參與運算的幾個操作數(shù),按對應的二進制數(shù)逐位進行邏輯與運算。對應的二進制位都為1,則該位的運算結果為1,否則為0 。

位異或運算符(^)

位異或運算的實質是將參與運算的兩個參數(shù),按對應的二進制數(shù)逐位進行邏輯異或運算。對應位的二進制數(shù)不同時,對應位的結果為1,如果兩個對應位數(shù)都為0或者都為1,咋對應位的結果為0 。

位左移運算符(<<)

位左移運算符<<使指定的二進制的所有位都左移指定的位數(shù)。左移指定位數(shù)之后,左邊高位的數(shù)值將被移出并丟棄,右邊低位空出的位置用0補齊。

語法格式: str ?<< n ??釋義 str的二進制數(shù)值 ?左移 ?n ?位

實例: 4 << 2

位右移運算符(>>)

位右移運算符>>使指定的二進制值得所有位都右移指定的位數(shù)。右移指定位數(shù)之后,右邊低位的數(shù)值將被移出并丟棄,左邊高位空出的位置用0補齊。

語法格式: ?str ?>> ?n ???釋義: ?str的二進制右移n位

實例: ?16 >> 2

位取反運算符(~)

位取反運算的實質是將參數(shù),按二進制數(shù)逐位反轉。即二進制按位是1的變0,是0的變1。

實例: 1取反 ?????~1

?

來一張運算符的優(yōu)先級圖

優(yōu)先級?? ?運算符
最低?? ?=(賦值運算) ??:=
??? ?|| ????OR
XOR
&& ?AND
NOT
BETWEEN ?CASE ?WHEN ??ELSE
=(比較運算) <==> ??>= ??> ?<= ?< ?<> ?!= ??IS ?LIKE ??REGEXP ??IN
|
&
<< ???>>
- ??+
* ????/(DIV) ???%(MOD)
^
-(負號) ???~
最高?? ?!
?

????????????????????????????????????????????????????????????????MySQL函數(shù)

了解什么是MySQL的函數(shù)
數(shù)學函數(shù)
字符串函數(shù)
時間和日期函數(shù)
條件函數(shù)
系統(tǒng)信息函數(shù)
加密函數(shù)
其他特殊函數(shù)
?

什么是MySQL函數(shù)

函數(shù)表示對輸入?yún)?shù)值返回一個具有特定關系的值,MySQL提供了大量豐富的函數(shù),在進行數(shù)據(jù)庫管理以及數(shù)據(jù)的查詢和操作時將會經(jīng)常用到各種函數(shù)。通過對數(shù)據(jù)的處理,數(shù)據(jù)庫功能可以變得更加強大,更加靈活地滿足不同用戶的需求。

從功能上函數(shù)主要分為以下幾類:數(shù)學函數(shù)、字符串函數(shù)、日期和時間函數(shù)、條件判斷函數(shù)、系統(tǒng)信息函數(shù)、加密函數(shù)等。

接下來介紹不同函數(shù)的用法:

數(shù)學函數(shù)

數(shù)學函數(shù)主要用來處理數(shù)值數(shù)據(jù),主要的數(shù)學函數(shù)有:絕對值函數(shù)、三角函數(shù)(正余弦函數(shù)、正余切函數(shù))、對數(shù)函數(shù)、隨機函數(shù)等。在有錯誤產(chǎn)生時,數(shù)學函數(shù)將會返回空值NULL。

1、絕對值函數(shù) ?ABS(X)

ABS(X)返回X的絕對值

當然 ABS(X),X可以是數(shù)據(jù)表的字段名??

2、圓周率函數(shù) ?PI( )

PI()返回圓周率π的值。默認得顯示小數(shù)位數(shù)是6位。

3、平方根函數(shù) SQRT(X)

SQRT(X)返回非負數(shù)X的二次方根。

實例:列舉一些簡單便于口算的例子

注意:負數(shù)沒有平方根,所以返回NULL。

4、求余函數(shù) MOD(X,Y)

MOD(X,Y)返回x被y除后的余數(shù)。MOD()對于有小數(shù)部分的數(shù)值也起作用,它返回除法運算后的精確余數(shù)。

5、獲取證書的函數(shù) CEIL(X)、CEILING(X)和FLOOR(X)

CEIL(X)和CEILING(X)函數(shù)的意義相同,都是返回不小于x的最小整數(shù)值,返回值轉化為一個BIGINT,而FLOOR(X)返回不大于x的最大整數(shù)值,返回值轉化為一個BIGINT。

這個幾個函數(shù)向上還是向下取值,容易混淆。

個人記憶方法。。。floor 英文釋義有:地板、地板或者最小的 ?最低的 ?意思。 floor(X)取比x小且最接近的整數(shù),反之ceil(x)、ceiling(x)取比x大且最接近的整數(shù)。 ??記floor反推ceil和ceiling

6、獲取隨機數(shù)函數(shù) RAND( )和RAND(X)\

RAND(x)返回一個隨機浮點值v,范圍在0到1之間(即0<= v >= 1.0)。若指定參數(shù)X,則它被用作種子值,用來產(chǎn)生重復序列,若沒有指定參數(shù)x,則每次產(chǎn)生的隨機數(shù)值時不同的。

7、函數(shù) ROUND(X)、ROUND(X,Y)和TRUNCATE(X,Y)

ROUND(X)返回最接近于參數(shù)X的整數(shù),對X的值進行四舍五入。

ROUND(X,Y)返回最接近于參數(shù)X的數(shù),其值保留到小數(shù)點后面Y位,若Y為負值,則將保留Y值到小數(shù)點左邊Y位。

注意:y為負數(shù)時,保留的時候不進行四舍五入,正數(shù)的時候會進行四舍五入。

TRUNCATE(X,Y) 返回被舍去至小數(shù)點后y位的數(shù)字x。若y的值為0,則結果不帶有小數(shù)點或不帶有小數(shù)部分。若y為負數(shù),則截去(歸零)x小數(shù)點左起第y位開始后面所有低位的值。

提示:ROUND(X,Y)函數(shù)截取值的時候會四舍五入,TRUNCATE(X,Y)直接截取不會四舍五入。

8、負號函數(shù) SIGN(X)

SIGN(X)返回參數(shù)的符號,x的值為負、零或正時返回結果依次為-1、0或1。

9、冪運算函數(shù) POW(X,Y)、POWER(X,Y) 和 EXP(X)

POW(x,y)或POWER(x,y)函數(shù)返回x的y次乘方的結果值。

EXP(X)返回e的x乘方后的值。

10、對數(shù)運算函數(shù) LOG(X) 和 LOG10(X)

LOG(x)返回x的自然對數(shù),x相對于基數(shù)e的對數(shù)

對數(shù)定義域不能為負數(shù),因此LOG(-3)返回的結果為NULL

LOG10(x)返回x的基數(shù)為10的對數(shù)。

對數(shù)的定義域為非負,否則返回NULL

11、角度與弧度相互轉換的函數(shù) radians(x)和degrees(x)

radians(x)將參數(shù)x由角度轉化為弧度。

degrees(x)將參數(shù)x由弧度轉化為角度

還有一些 其他的函數(shù)

正弦函數(shù) ??SIN(X) 返回x的正弦,其中x為弧度值。

反正弦函數(shù) ASIN(X) 返回X的反正弦,即正弦x的值。若x不在-1到1的范圍之內,則返回NULL。

余弦函數(shù) COS(X) ?返回x的余弦,其中x為弧度。

反余弦函數(shù) ACOS(X) 返回x的反余弦,即余弦x的值。若x不在-1-1的范圍內,則返回NULL。

正切函數(shù) TAN(X) 返回x的正切,其中x為給定的弧度值。

反正切函數(shù) ATAN(X) 返回x的反正切,即正切的x的值。

余切函數(shù) ?COT(X) 返回x的余切。

字符串函數(shù)

字符串函數(shù)主要用來處理數(shù)據(jù)庫中的字符串數(shù)據(jù),MySQL中字符串函數(shù)有:計算字符串長度函數(shù)、字符串合并函數(shù)、字符串替換函數(shù)、字符串比較函數(shù)、查找指定字符串位置函數(shù)等。

1、計算字符串字符數(shù)的函數(shù) ?CHAR_LENGTH(str)

????char_length(str) 返回值為字符串str所包含的字符個數(shù)。

2、計算字符串長度的函數(shù) LENGTH(str)?

??返回值為字符串的字節(jié)長度,使用utf8編碼字符集時,一個漢字是3個字節(jié),一個數(shù)字或字母算一個字節(jié)。

?

看下 ?char_length(str)和 length(str) ?的區(qū)別:

除了漢字的字符串,字母和數(shù)字 ?計算結果兩者一樣。

3、合并字符串函數(shù) CONCAT(s1,s2,...) 、CONCAT_WS(x,s1,s2,...)

concat(s1,s2,...) 返回結果為連接參數(shù)產(chǎn)生的字符串,或許有一個或多個參數(shù)。

?????若有任何一個參數(shù)為NULL,則返回值為NULL。

?????若所有參數(shù)均為非二進制字符串,則結果為非二進制字符串。

?????若參數(shù)中有一個是二進制字符串,則結果為一個二進制字符串。

concat_ws(x,s1,s2,...) ?concat_ws代表concat with separator ,是concat()的特殊形式。第一個參數(shù)x是其他參數(shù)的分隔符,分隔符的位置放在要連接的兩個字符串之間。分隔符可以是一個字符串也可以是其他參數(shù)。如果分隔符為NULL,則結果為NULL。函數(shù)會忽略任何分隔符參數(shù)后的NULL值。

除此之外 還有一個函數(shù)?group_concat()

這個實戰(zhàn)用的比較多,實例看文章:https://blog.csdn.net/qq_35044419/article/details/79492746

4、字符串替換函數(shù) INSERT(s1,x,len,s2)

INSERT(s1,x,len,s2) 返回從s1串x(不是下標)位置開始,用s2字符串替換s1串len長度后的字符串。

若x的值超出字符串s1的長度,則返回原字符串s1。
若len的長度大于字符串s1的長度,則從s1起始位置x開始,截到結尾,再s2取填充。
若任意一個參數(shù)為NULL,則返回值為NULL。
實例:

a:從'abcdefg'第2位置開始,用'YYYYY'替換2個長度,即替換掉bc,則替換后結果是:'aYYYYYdefg'。

b:從'abcdefg'第2位置開始,用'YYYYY'替換4個長度,即替換掉bcde,則替換后的結果是:'aYYYYYfg'

c:從'abcdefg'第2位置開始,用'YYYYY'替換0個長度,即啥也不替換,則替換后的結果是:'abcdefg'

d和d1不解釋,0超出'abcdefg'的長度,返回原串

e:從'abcdefg'第2位置開始,用'YYYYY'替換10個長度,由于10大于'abcdefg'的長度,即從2位置開始替換的結尾,結果:'aYYYYY'

f:10超過'abcdefg'的長度,返回原串

g:任意一個參數(shù)為NULL,則返回NULL。

以上實例表達的很清晰。

5、字母大小寫轉換函數(shù)

LOWER(str) 、LCASE(str) 將字符串str中的字母字符全部轉換成小寫字母(大寫轉小寫,小寫不用變)。

UPPER(str) 、UCASE(str)將字符串str中的字母字符全部轉換成大寫字母(小寫轉成大寫,大寫不用變)。

不舉實例

6、獲取指定長度的字符串的函數(shù) LEFT(s,n) 和RIGHT(s,n)

LEFT(s,n)返回字符串s從左邊開始長度為n的字符串。

RIGHT(s,n)返回字符串從右邊開始長度為n的字符串。

實例:

實例不解釋

7、字符串填充函數(shù) LPAD(s1,len,s2)和RPAD(s1,len,s2)

LPAD(s1,len,s2) 返回字符串s1,其左邊由字符串s2填補到len字符長度,若s1的長度大于len,則返回值被縮短至len字符(即從s1的右邊開始縮短,直至長度等于len)

實例:

注意e和e1、f和f1、g和g1的結果。

RPAD(s1,len,s2) ?這個與LPAD(s1,len,s2)相反。

實例:

8、刪除空格的函數(shù)

LTRIM(str) 返回字符串str左側空格被刪除的字符串。

RTRIM(str) 返回字符串str右側空格被刪除的字符串。?

TRIM(str) ???返回字符串str兩側空格被刪除的字符串。

?

比較通俗易懂,不做實例。。。。

9、刪除指定字符串的函數(shù) TRIM(s1 FROM?s)

TRIM(s1 FROM s) 刪除字符串s中兩端所有的字符串s1。s1為可選項,在未指定的情況下刪除空格。

實例:

看結果,但是有點不解,結果中也有ab,不清楚這個函數(shù)怎么分割的兩端 ^_^

10、重復生成字符串的函數(shù) REPEAT(s,n)

REPEAT(s,n) 返回重復生成n次s的字符串

不做實例

11、空格函數(shù)SPACE(n)和REPLACE(s,s1,s2)

SPACE(s) 返回一個由n個空格組成的字符串。 ??不做實例

REPLACE(s,s1,s2) 返回由字符串s2替換s中所有的字符串s1的字符串。

12、比較字符串大小的函數(shù) STRCMP(s1,s2)

STRCMP(s1,s2) 比較字符串的大小

若s1與s2相同,則返回0
若s1小于s2,則返回-1
若s1大于s2,則返回1
不做實例

13、獲取子串的函數(shù) SUBSTRING(s,n,len)和MID(s,n,len)

substring(s,n,len) ?s是指字符串,n值開始截取的位置(正數(shù)時正向位置開始,負數(shù)時反向位置開始),len時截取的長度(省略時截取到結尾,若為小于1的數(shù),咱返回空串)。

mid(s,n,len)作用很substring(s,n,len)相同

實例:

14、匹配字符串開始位置的函數(shù)

LOCATE(str1,str)、POSITION(str1 IN str2)、INSTR(str,str1)三個函數(shù)的作用相同,返回字符串str1在字符串str中的開始位置。

以上實例可知,若str1在str中存在,則返回子串str1的開始位置,不存在則返回0
?

總結

以上是生活随笔為你收集整理的Mysql基础复习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。