4-mysql基本用法

MySQL數(shù)據(jù)庫

課程目標(biāo):
1.如何使用MySQL數(shù)據(jù)庫,主要是講解基本的語法
2.如何設(shè)計(jì)數(shù)據(jù)庫?

第一章 數(shù)據(jù)庫簡介

數(shù)據(jù)庫的概念

在項(xiàng)目開發(fā)中,會存在很多的數(shù)據(jù),例如用戶注冊的信息,商品的信息,對于這些信息,都需要使用一定的工具保存起來,用來存儲項(xiàng)目開發(fā)中數(shù)據(jù)的工具被成數(shù)據(jù)庫。但是,光有數(shù)據(jù)還不行,還要有管理數(shù)據(jù)庫的工具,我們稱之為數(shù)據(jù)庫管理系統(tǒng)!

數(shù)據(jù)庫系統(tǒng) = 數(shù)據(jù)庫管理系統(tǒng) + 數(shù)據(jù)庫 + 數(shù)據(jù)庫管理員

DataBase System(DBS) = DataBase Management System(DBMS)+ DataBase Administrator(DBA)

官方定義:

數(shù)據(jù)庫:對大量信息進(jìn)行管理的高效解決方案,按照數(shù)據(jù)結(jié)構(gòu)來組織,存儲和管理數(shù)據(jù)的庫!

通常一個web項(xiàng)目(一個網(wǎng)站)會使用一個數(shù)據(jù)庫來存儲其所有的動態(tài)數(shù)據(jù)!知道了數(shù)據(jù)庫的功能后,那么在PHP進(jìn)行網(wǎng)站開發(fā)的時(shí)候,我們應(yīng)該選擇什么樣的數(shù)據(jù)庫呢?

常見數(shù)據(jù)庫分類

MySQL

開源、免費(fèi),對于個人以及中小型企業(yè)來說功能已經(jīng)綽綽有余。

image.png

MariaDB

MariaDB數(shù)據(jù)庫管理系統(tǒng)是MySQL的一個分支。

image.png

Percona

Percona Server為 MySQL 數(shù)據(jù)庫服務(wù)器進(jìn)行了改進(jìn),在功能和性能上較 MySQL 有著很顯著的提升。該版本提升了在高負(fù)載情況下的 InnoDB 的性能、為 DBA 提供一些非常有用的性能診斷工具;另外有更多的參數(shù)和命令來控制服務(wù)器行為。

image.png

Oracle
數(shù)據(jù)庫巨頭、企業(yè)級數(shù)據(jù)庫,歷史悠久、功能強(qiáng)大,企業(yè)級應(yīng)用需要付費(fèi)。

image.png

Sql Server
微軟的數(shù)據(jù)庫系統(tǒng)、企業(yè)級數(shù)據(jù)庫,歷史悠久、功能強(qiáng)大,企業(yè)級應(yīng)用需要付費(fèi)。

image.png

DB2
IBM DB2 是美國IBM公司開發(fā)的一套關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它主要的運(yùn)行環(huán)境為UNIX(包括IBM自家的AIX)、Linux、IBM i(舊稱OS/400)、z/OS,以及Windows服務(wù)器版本。

image.png

PostgreSQL
PostgreSQL是以加州大學(xué)伯克利分校計(jì)算機(jī)系開發(fā)的 POSTGRES,現(xiàn)在已經(jīng)更名為PostgreSQL。

image.png

什么是MySQL?

MySQL是目前最流行的關(guān)系型數(shù)據(jù)庫。由瑞典 MySQL AB 公司開發(fā),目前屬于 Oracle旗下公司。
MySQL開源免費(fèi)、性能好,雖然和一些企業(yè)級的大型數(shù)據(jù)庫相比功能有限,但是對于一般的中小型公司來說,它提供的功能已經(jīng)綽綽有余了!

image.png

關(guān)系型數(shù)據(jù)庫簡介

所謂的關(guān)系型數(shù)據(jù)庫,就是基于關(guān)系模型的數(shù)據(jù)庫。在我們進(jìn)行數(shù)據(jù)存儲的時(shí)候,是需要按照一定的格式進(jìn)行存儲的,如果是將數(shù)據(jù)保存在一個由行和列形成的二維數(shù)據(jù)表的結(jié)構(gòu)里面,并進(jìn)行統(tǒng)一管理的工具則稱為關(guān)系型數(shù)據(jù)庫。這里的二維數(shù)據(jù)表一般被稱為實(shí)體,表與表之間的關(guān)系被稱為實(shí)體關(guān)系。

1.什么是實(shí)體呢?
答:實(shí)體是觀念世界中描述客觀事物的概念,可以是具體的事物,比如一本書、一個人、一條街等,也可以是抽象的事物,比如一種感受、一個訂單等!

實(shí)體反應(yīng)到數(shù)據(jù)庫中,就是一張一張的二維表,比如我們現(xiàn)在的教室至少就有三種實(shí)體集:學(xué)生實(shí)體、教室實(shí)體、教師實(shí)體!于是,也就對應(yīng)著數(shù)據(jù)庫中的三張表:學(xué)生表、教師表、教室表!

image.png

思考:
假如為一個酒店管理系統(tǒng)設(shè)計(jì)一個數(shù)據(jù)庫,需要哪些數(shù)據(jù)表?

客房表 員工表 客戶表 訂單表 物資表等

非關(guān)系型數(shù)據(jù)庫簡介

我們說的MySQL數(shù)據(jù)庫是關(guān)系型數(shù)據(jù)庫,現(xiàn)在也存在很多非關(guān)系型數(shù)據(jù)庫NOSQL:Not Only SQL!其主要的特點(diǎn)如下:

  1. 使用鍵值對保存和表示數(shù)據(jù)庫(有點(diǎn)類似于數(shù)組),沒有行和列的表結(jié)構(gòu)
  2. 不在使用SQL語句做查詢
  3. 保存數(shù)據(jù)的介質(zhì)是內(nèi)存,所以數(shù)據(jù)庫運(yùn)行效率比關(guān)系型數(shù)據(jù)庫高的多(關(guān)系型數(shù)據(jù)庫保存數(shù)據(jù)庫的介質(zhì)是在磁盤
  4. 運(yùn)行之后,會進(jìn)行數(shù)據(jù)同步(將內(nèi)存中的數(shù)據(jù)寫入到磁盤)

我們以后會學(xué)習(xí)一款非關(guān)系型數(shù)據(jù)庫:MongoDB,它是非關(guān)系型數(shù)據(jù)庫中最強(qiáng)大,而且最像關(guān)系型數(shù)據(jù)庫的一款產(chǎn)品!

MongoDB

非關(guān)系型的文檔數(shù)據(jù)庫。

image.png

Redis數(shù)據(jù)庫

非關(guān)系型數(shù)據(jù)庫。

image.png

第二章 MySQL軟件架構(gòu)

啟動、關(guān)閉、重啟

MySQL數(shù)據(jù)庫是一個C/S架構(gòu)的軟件,使用之前需要先啟動MySQL服務(wù)器端,然后就可以使用MySQL客戶端來連接服務(wù)器進(jìn)行操作。我們使用的PHPstudy集成開發(fā)環(huán)境提供了圖形化的操作界面,按照下面的操作即可。

image.png

MySQL客戶端連接MySQL服務(wù)器

注意:同qq、微信、游戲客戶端一樣,也需要賬號和密碼等認(rèn)證信息才能連接上數(shù)據(jù)庫服務(wù)器!
注意:
MySQL的客戶端有很多,除了軟件自身攜帶的一個,PHP也要扮演MySQL客戶端的角色,另外,還有很多圖形化用戶界面的客戶端工具,比如phpmyadmin、Navicat for MySQL等。

  1. 切換到MySQL安裝目錄下的bin目錄,使用命令行客戶端工具進(jìn)行連接
image.png

2.可以使用MySQL的客戶端程序連接到MySQL服務(wù)器上進(jìn)行操作

mysql -uroot -P3306 -hlocalhost -p

image.png

注意:也可以省略掉主機(jī)和端口號,缺省值為localhost和3306

mysql -uroot -p
注意:PHPstudy中,MySQL的超級管理員root的密碼為 root

image.png

操作流程概圖

image.png

MySQL的幫助命令

我們可以通過輸入help或者\(yùn)h來顯示MySQL的幫助信息!

image.png

MySQL的注釋符

MySQL的注釋也分成了單行注釋和多行注釋:

單行注釋:

注釋內(nèi)容

-- 注釋內(nèi)容(注意,兩個—之后有一個空格)

多行注釋:
/* 注釋內(nèi)容 */

演示效果:

image.png

第三章 SQL語言

什么是SQL?

SQL:結(jié)構(gòu)化查詢語言(Structured Query Language)簡稱SQL,是一種特殊的編程語言,主要用在關(guān)系型數(shù)據(jù)庫中用來對數(shù)據(jù)進(jìn)行查詢、添加、修改、刪除等操作。

分類

思考:
如果現(xiàn)在要往一個數(shù)據(jù)庫里面存放數(shù)據(jù),需要有哪些準(zhǔn)備工作?
1.要創(chuàng)建一個新的數(shù)據(jù)庫
2.再創(chuàng)建一張數(shù)據(jù)表
3.定義這張表的結(jié)構(gòu)(有哪些字段,字段是什么類型,有沒有主鍵等)

所以,數(shù)據(jù)庫的第一種操作語言就是DDL

DDL

DDL:Data Definition Language,數(shù)據(jù)定義語言!
主要是用來定義和維護(hù)數(shù)據(jù)庫的各種對象(比如庫、表、索引和視圖等),也可以說操作的層次是在數(shù)據(jù)庫和表的邏輯結(jié)構(gòu)和存儲結(jié)構(gòu)上面,并沒有對表中的實(shí)際的數(shù)據(jù)進(jìn)行操作!

主要的操作關(guān)鍵字:create、drop、alter等

DML

DML:Data manipulation Language,數(shù)據(jù)操作語言
主要是對表中的記錄進(jìn)行增刪改查的操作!

其中,“查詢”部分,又稱為DQL(Data Query Language),數(shù)據(jù)查詢語言!

主要的操作關(guān)鍵字:insert、delete、update、select等

DCL

DCL:Data Control Language,數(shù)據(jù)控制語言

主要是對數(shù)據(jù)庫進(jìn)行統(tǒng)一控制和統(tǒng)一管理的工作,比如并發(fā)控制、存取控制、安全控制等;具體的有:數(shù)據(jù)庫的權(quán)限管理,數(shù)據(jù)的備份與恢復(fù)等!

例如:常見的查詢操作
mysql > select * from sh_admin;

image.png

第四章 數(shù)據(jù)庫操作

一個數(shù)據(jù)庫軟件中的數(shù)據(jù)是以庫、表、記錄的結(jié)構(gòu)進(jìn)行保存的,在數(shù)據(jù)庫里面有如下的幾個概念:庫、表、記錄、字段。需要注意的是:
1.MySQL中可以創(chuàng)建多個庫
2.每個庫中可以創(chuàng)建多張表
3.每個表中可以保存多條記錄
4.每條記錄由多個字段組成

概念的介紹:
1.庫:創(chuàng)建一個數(shù)據(jù)庫,里面可以管理多張表
2.表:不同的數(shù)據(jù)保存在不同的表里面。比如:用戶表、商品表、欄目表
3.記錄:表中可以存在多條記錄。比如:網(wǎng)站注冊功能實(shí)際上就是向用戶表中插入一條記錄
4.字段:每個記錄由多個字段組成。比如:每個用戶有:用戶名、密碼、年齡、email、手機(jī)等字段

對于一個數(shù)據(jù)庫的操作,基本可以分為如下幾個:

  1. 創(chuàng)建數(shù)據(jù)庫
  2. 查看都有哪些數(shù)據(jù)庫
  3. 刪除數(shù)據(jù)庫,注意:數(shù)據(jù)庫中所有的表都會全都刪除,慎用?。。?/li>
  4. 切換數(shù)據(jù)庫,使用哪個數(shù)據(jù)
  5. 查看數(shù)據(jù)庫中的表

創(chuàng)建數(shù)據(jù)庫(增)

語法:

create database DatabaseName[數(shù)據(jù)庫選項(xiàng)]
其中,關(guān)于數(shù)據(jù)庫選項(xiàng),主要是設(shè)置字符集和校對規(guī)則,關(guān)于該知識點(diǎn),在字符集這章進(jìn)行講解。

實(shí)操演示:

image.png

每當(dāng)在創(chuàng)建一個數(shù)據(jù)庫,則會在數(shù)據(jù)庫的data目錄創(chuàng)建一個與之同名的文件夾。

image.png

數(shù)據(jù)庫命名規(guī)則:

  1. 數(shù)據(jù)庫名是否區(qū)分大小寫取決于當(dāng)前的操作系統(tǒng)!我們的原則是:就認(rèn)為區(qū)分大小寫!
  2. 原則上數(shù)據(jù)庫名可以使用任意的字符,甚至是中文,但是一些特殊字符,比如純數(shù)字,特殊符號,以及mysql內(nèi)部的關(guān)鍵字,應(yīng)該使用標(biāo)識符限定符反引號來包裹?。ǚ匆柧褪擎I盤左上角,破浪線``),告知服務(wù)器此處只是一個名字,而不是特殊的操作!

查看數(shù)據(jù)庫(查)

對于數(shù)據(jù)庫的查看,我們可以查看MySQL幫我們管理了哪些數(shù)據(jù)庫,同時(shí)我們也可以查看數(shù)據(jù)庫創(chuàng)建的語句。

語法:

show databases;

實(shí)操演示:

image.png

語法:

show create database DatabaseName;

實(shí)操演示:

image.png

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

語法:

drop database DatabaseName

注意:
刪除數(shù)據(jù)庫一定要慎重!因?yàn)檎麄€數(shù)據(jù)庫文件夾都會被刪除,其中包括所有的數(shù)據(jù)表以及數(shù)據(jù)表中所有的數(shù)據(jù)!過程默認(rèn)的是不可逆的!

實(shí)操演示:

image.png

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

需要注意:數(shù)據(jù)庫的名并不能通過SQL語句進(jìn)行修改,只能修改數(shù)據(jù)庫的數(shù)據(jù)庫選項(xiàng)信息,如果確實(shí)要修改,我們到時(shí)候可以使用其他的強(qiáng)大的客戶端直接圖形化界面修改即可。

第五章 數(shù)據(jù)表操作

一個庫里面可以有多個表,數(shù)據(jù)都是數(shù)據(jù)在表中的,所以我們在操作數(shù)據(jù)之前需要先創(chuàng)建表,然后把數(shù)據(jù)存到表中,所以在操作數(shù)據(jù)表之前,應(yīng)該選擇默認(rèn)的數(shù)據(jù)庫!有如下兩種方式:

1.顯示的指定數(shù)據(jù)庫
2.隱式的指定數(shù)據(jù)庫

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

語法:
create table 表名
(
字段名1 字段類型 其他屬性 ,
字段名2 字段類型 其他屬性 ,
........ ........ ......... ,
字段名n 字段類型 其他屬性
)engine=引擎名 default charset=編碼;

1.每個字段都必須指定數(shù)據(jù)類型,字段與數(shù)據(jù)類型之間以空格分隔!
2.字段與字段之間用逗號分隔,但最后一個字段不能有逗號!
3.表選項(xiàng)其實(shí)就是規(guī)定表的字符集(默認(rèn)的是utf8)和存儲引擎(暫時(shí)用默認(rèn),后面講)
4.表名的命名規(guī)則和庫名基本一樣!

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

關(guān)鍵字:show
1.查看當(dāng)前數(shù)據(jù)庫下有哪些數(shù)據(jù)表
2.查看數(shù)據(jù)表的創(chuàng)建語句
3.查看數(shù)據(jù)表的表結(jié)構(gòu)

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

關(guān)鍵字:drop

如果刪除一個不存儲的表,會報(bào)錯,所以,還有一個比較完整的語法形式,也就是說,在刪除之前會進(jìn)行一次判斷,判斷這張表是否存在,如果存在就刪除,如果不存在,這條sql指令既不執(zhí)行也不其作用!

  1. 清空表中數(shù)據(jù),表還在,只清空數(shù)據(jù),并且id會重置
    語法:truncate tableName;

3.刪除表及表中數(shù)據(jù)
語法:dorp table tableName;

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

思考:
表中有哪些地方可以修改?
1.表名
2.字段類型,字段名、增加字段、刪除字段等,統(tǒng)稱為列定義
3.表選項(xiàng)

添加一個字段
alter table 表名 add 新字段名 新字段類型 其他屬性
刪除一個字段
alter table 表名 drop column 字段名;

修改表字段【change:字段名也修改 , modify:字段名不改】
alter table 表名 change 原字段名 新字段名 新字段類型 其他屬性;【修改字段名、類型、屬性】

alter table 表名 modify 原字段名 親字段類型 其他屬性;【只修改類型、屬性】
修改表名
alter table 原表名 rename 新表名;

字段屬性

使用字段屬性,可以更詳細(xì)、準(zhǔn)確定義表中的字段,一般也起到約束作用,常見的字段屬性如下:

1.not null:字段不能為空,如果一個字段是必須要添加的就使用這個,一般都需要使用這個屬性約束
2.signed:稱為有符號數(shù),代表可以出現(xiàn)負(fù)數(shù),如果是unsigned,稱為無符號數(shù)據(jù),代表只能只有正數(shù),同時(shí)該約束只能用在數(shù)字類型上
3.default:默認(rèn)值,可以為某些字段設(shè)置默認(rèn)值,當(dāng)插入數(shù)據(jù)是,如果不填寫,則使用該默認(rèn)值進(jìn)行填充
4.comment:字段注釋
5.auto_increment:自增
a)一般表中都有個id字段,我們可以讓MySQL自動幫我們讓ID字段從1開始自動的增長
b)加這個屬性的如下要求的:
i.一個表中只能有一個自增字段
ii.字段類型必須是一個整數(shù)
iii.自增的字段必須設(shè)置成主鍵

字段類型

分類

和PHP一樣,MySQL也支持自己的一些數(shù)據(jù)類型,在MySQL中,數(shù)據(jù)都是保存在字段里面的,所以,MySQL數(shù)據(jù)類型其實(shí)就是字段類型或列類型!

MySQL中也有三大數(shù)據(jù)類型:

image.png

整數(shù)
整數(shù)類型有五種:tinyint、smallint、mediumint、int、bigint

image.png

需要注意的幾點(diǎn):

  1. 究竟選擇哪種類型?我們的原則是:夠用就行了!因?yàn)檎加玫膬?nèi)存越小,效率越高!
  2. 可以使用unsigned來控制是否有正負(fù),如果不寫,缺省值是有符號的!
  3. MySQL不會進(jìn)行類型的自動轉(zhuǎn)換!
  4. 可以指定數(shù)據(jù)顯示的最小寬度,以達(dá)到統(tǒng)一顯示的目的,一般使用zerofill來進(jìn)行前導(dǎo)零填充,如果指定的寬度比原數(shù)據(jù)的寬度小,不影響原數(shù)據(jù)的輸出!
  5. MySQL中其實(shí)也支持bool類型,但其實(shí)就是tinyint(1)的別名!

浮點(diǎn)數(shù)

float:小數(shù)
decimal:小數(shù)

字符串

varchar:0~65535字節(jié)
char:0~255字符

時(shí)間

date:2017-10-10
datetime:2017-10-10 10:10:10
int:存時(shí)間戳,不同的時(shí)區(qū)時(shí)間不一樣,所以最好數(shù)據(jù)庫中存時(shí)間戳,在顯示時(shí)再根據(jù)不同的時(shí)區(qū)轉(zhuǎn)化成時(shí)間格式

枚舉

enum

數(shù)據(jù)表操作

插入數(shù)據(jù)

單條記錄插入

1.只插入幾個字段的數(shù)字

2.為所有字段插入數(shù)據(jù),可以省略表名后面的小括號,ID給null就可以自增

批量數(shù)據(jù)插入

可以使用一個insert插入多條,這樣的性能比執(zhí)行多個insert要好的多,多個值用,隔開:
語法:
insert into tableName values
(valu11, value12, value13),
(valu22, value23, value24),
(valu32, value3, value34);

查詢數(shù)據(jù)

查詢語句

可以使用select 語句查詢出表中的數(shù)據(jù)。

語法:(【】中括號的部分代表可選項(xiàng),可以沒有)
select 字段1,字段2,.....
from 表名
【where 查詢條件
group by 分組字段名
order by 排序字段名 排序方式【asc|desc】
limit 起始記錄,記錄數(shù)】

字段操作

獲取所有字段的字段值

image.png

獲取部分字段的值,則將需要獲取的字段使用逗號進(jìn)行分割

image.png

條件查詢

  1. 、<、>=、<=、<>

  2. between ... and ...
  3. like是模糊查詢的意思,主要用在字符串查詢,可以使用通配符% 來匹配0~多個任意字符
  4. in 在某個范圍內(nèi)
  5. not in 不在某個范圍內(nèi)
  6. is null 和 is not null
  7. and 與操作,同時(shí)滿足多個條件時(shí)
  8. or 或操作只要有一條件滿足就取出數(shù)據(jù)

分組

可以使用group by 根據(jù)某一個字段分組。如果SQL語句上有where必須放到where后面
分組之后,只會返回該組中的第一條的記錄,一般分組是需要聚合函數(shù)一起配合使用的。

排序

可以使用order by 根據(jù)多個字段排序,如果有g(shù)roup by 要放在group by 的后面
排序方式:
asc:升序
desc:降序

先根據(jù)年齡降序排序,如果年齡相同的按分?jǐn)?shù)升序排序

限制記錄數(shù)

使用limit只取某幾條,limit 必須放在最后

語法:limit 【開始位置】,長度,其中開始位置是可選值,如果沒有填寫默認(rèn)是下標(biāo)為0開始獲取。

例如:
limit 5; 相對于:limit 0,5; 代表獲取前5條記錄
limit 5,10; 代表從第6條記錄開始取,取10條

聚合函數(shù)

需要注意的是,聚合函數(shù)一般在數(shù)據(jù)統(tǒng)計(jì)的時(shí)候使用,常見的聚合函數(shù)如下:

count:總的記錄數(shù)

sum:把某個字段所有的值求和

avg:求平均值

min:最小值

max:最大值

說明:如果沒有分組這幾個函數(shù)計(jì)算的是所有記錄的值,如果分組了,是對每個組進(jìn)行統(tǒng)計(jì)

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

修改

update可以修改1條或者多條記錄,修改了多少條主要取決于where后面的條件。

語法:
update 表名
set 字段1=值1,字段2=值2.......
where 條件語句

相關(guān)操作演示:
1.將用戶表名稱為 caoyang 的用戶的年齡改為24
2.將用戶表主鍵ID為12的用戶的名稱改為Andy
3.將用戶表主鍵ID為12的用戶的名稱改為Andy 郵箱改為gogery@163.com
4.把主鍵ID為1,3,5三條記錄的年齡都改為24

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

刪除

可以使用delete刪除一條或者多條記錄,取決于where后面的條件。

語法:
delete from 表名 where 條件語句;

相關(guān)操作演示:
1.刪除用戶表名稱為 caoyang 的用戶
2.刪除用戶表id為12的用戶
3.刪除用戶表id大于12的用戶
4.刪除用戶表中所有的數(shù)據(jù)
注意:刪除所有數(shù)據(jù)之后,如果再插入數(shù)據(jù),ID繼續(xù)自增不會從1開始,如果希望刪除所有數(shù)據(jù)之后ID重新從1開始,則需要使用使用 truncate 表名 來清空表中數(shù)據(jù)。

表結(jié)構(gòu)的設(shè)計(jì)

制作一個項(xiàng)目的流程:

1.需求分析【明確都有哪些功能以及每個功能是什么樣的?】
2.找UI【用戶界面】設(shè)計(jì)師使用photoshop軟件做出效果圖
3.前端頁面設(shè)計(jì)師,使用HTML+CSS+JAVASCRIPT技術(shù)根據(jù)圖片制作成靜態(tài)頁
4.寫程序:
a)設(shè)計(jì)數(shù)據(jù)庫【建表】
b)選擇使用PHP框架
c)編碼完成表的操作
d)把數(shù)據(jù)庫中的數(shù)據(jù)和設(shè)計(jì)的頁面結(jié)合起來

根據(jù)需求設(shè)計(jì)表結(jié)構(gòu)是一個高級程序必備的能力:

注冊功能:
表名:用戶表-member
字段:用戶名,手機(jī),密碼,頭像,昵稱,年齡,性別等等

如果有人注冊了,原理就是PHP接收用戶提交的數(shù)據(jù)并且執(zhí)行SQL把數(shù)據(jù)插入到member表中:

如果有兩個人注冊了那么數(shù)據(jù)庫就有兩條記錄:

發(fā)表日志
表名:blog
字段:標(biāo)題,內(nèi)容,權(quán)限

其中user_id字段我們一般叫它是外鍵,用這個字段來關(guān)聯(lián)會員表!
說明:用哪個字段來關(guān)聯(lián)都可以,只是我們一般都是使用ID字段來關(guān)聯(lián)【因?yàn)樘攸c(diǎn):1. 每個ID都不同 2.簡單的數(shù)字】

會員表和日志表的關(guān)系
兩個表有三種關(guān)系:1:1 , 1:多 : 多對多。

現(xiàn)在會員表和日志表是1對多的關(guān)系:
1個會員 : 多個日志

練習(xí):
1再創(chuàng)建一個分類表,管理分類

  1. 把分類和日志關(guān)聯(lián)起來【寫日志時(shí)要選擇屬于哪個分類】
    總結(jié):現(xiàn)在我們要做的日志項(xiàng)目至少需要三個張表:會員表【注冊】、日志【發(fā)表日志】、分類表【管理日志分類】
    提示:a.會員和日志有關(guān)系。 b.日志和分類。 c.會員和分類。

總結(jié):以下三個表能完成:注冊/登錄、分類管理、日志管理。

思考:以上分類表和日志表是什么關(guān)系?
一個分類 : 多個日志 : 1:多
一個日志 :一個分類 : 1:1
總結(jié): 1:多

擴(kuò)展:兩個表的關(guān)系由功能決定。比如上面這個日志功能改成一個日志可以同時(shí)屬于多個分類。
一個分類 : 多個日志 : 1:多
一個日志 :多個分類 : 1:多
總結(jié): 多:多

練習(xí)1:如果再添加一個日志可以被評論的用戶評論的功能需要怎么修改表結(jié)構(gòu)?
練習(xí)2:如果再添加一個好友功能【比較難先不管】?

多表查詢
起別名
可以使用as起別名,as可以省略。

?字段起別名

簡寫:as可以省略,可以在字段后面加一個空格然后寫別名,最終顯示的是別名

?也可以為表起別名【現(xiàn)在看不出什么效果,先記住這個語法】

外連接
可以同時(shí)連接多個表:
語法:
select 字段
from 表1
left join 表2 on 連接條件
left join 表3 on 連接條件
.......
where 條件
group by 分組字段
order by 排序字段 asc|desc
limit 起始記錄,記錄條數(shù)

實(shí)例:以下三個表的數(shù)據(jù):寫SQL取出所有的日志,以及日志作者的名字

結(jié)果:

連用戶表把用戶名取出來了:

例2:以下表結(jié)構(gòu):寫SQL取出所有的日志,以及日志所在的分類的名字

這樣寫:

練習(xí)
以下三個表:

練習(xí)1:寫SQL語句取出所有的日志的ID和標(biāo)題,以及每個日志的作者的名字以及所在分類的名字。

左外連【用這種】
select a.id,a.title,b.username,c.type_name
from blog a
left join member b on a.user_id=b.id
left join type c on a.type_id=c.id

多個查詢
select a.id,a.title,b.username,c.type_name
from blog a,member b,type c
where a.user_id=b.id and a.type_id=c.id

多表查詢
語法:
select 字段
from 表1,表2,表3,.....
where 關(guān)聯(lián)條件
group by 分組字段
order by 排序字段 asc|desc
limit 起始記錄,記錄條數(shù)

以下例子就是blog連type表的寫法:【1. 所有表名直接用,隔開。 2,表的關(guān)聯(lián)寫到where里】

外鏈和多表有啥區(qū)別?

  1. left join時(shí):【left join左邊的表是主表,那么主表中的數(shù)據(jù)一定會都取出來,右邊的是從表,如果有對應(yīng)的數(shù)據(jù)就取出來,如果沒有就返回null,但不會影響主表的數(shù)據(jù)】

2 . 多表用,號查詢時(shí)不是主、從關(guān)系,必須滿意where條件的數(shù)據(jù)才能取出來,因?yàn)?,5,6這三個日志的type_id=0,無法和type表相關(guān)聯(lián)所以無法滿足where條件所以就取不出來。

字符集

http://www.qqxiuzi.cn/bianma/guobiaoma.php

思考:首先,我們考慮下為什么會存在那么多的字符集?
答:其實(shí)這是一個歷史遺留的問題,如果全世界的字符集只有一個該多好,至少不會出現(xiàn)亂碼的問題。那么為什么會出現(xiàn)這么多呢,因?yàn)樵谟?jì)算機(jī)發(fā)展的過程中,因?yàn)槿藗兊恼Z言各不相同,需要將各種語言的文字編碼成計(jì)算機(jī)理解的二進(jìn)制編碼,則就存在了很多的字符集!
以中文為例:
gb2312:簡體中文最早的編碼,國標(biāo)碼,編碼了6000左右的漢字
gbk:對gb2312的一種擴(kuò)展,全面兼容gb2312,編碼了2萬多漢字
big5:俗稱大五碼,中國繁體字的編碼,主要是港澳臺使用

Unicode:全世界統(tǒng)一的編碼,編碼了100多萬個字符,但是所有的字符都是占用4個字節(jié)!
utf-8:全面兼容Unicode,對Unicode的一種改進(jìn),不同的字符占用不同的字節(jié)!

我們可以使用show charset;命令查看當(dāng)前MySQL服務(wù)器支持哪些字符集:


image.png

中文使用的最多的編碼有兩種:
gbk:一個漢字占用2個字節(jié)!
utf8:一個漢字占用3個字節(jié)!

思考:為什么會出現(xiàn)亂碼?
如果兩個軟件所采用的默認(rèn)字符集不同,又沒有進(jìn)行相應(yīng)的轉(zhuǎn)換或說明,就會出現(xiàn)亂碼!

思考:數(shù)據(jù)庫服務(wù)器中哪些地方需要設(shè)置字符集?
?安裝數(shù)據(jù)庫軟件的時(shí)候:我們選擇的是utf8
?創(chuàng)建新數(shù)據(jù)庫的時(shí)候:通過設(shè)置庫選項(xiàng)也可以設(shè)置字符集,default charset gbk|utf8|其他
?創(chuàng)建新數(shù)據(jù)表的時(shí)候:通過設(shè)置表選項(xiàng)也可以設(shè)置字符集,default charset gbk|utf8|其他
?定義表的字段的時(shí)候,也可以設(shè)置字符集(一般都不設(shè)置),default charset gbk|utf8|其他

注意:
以上都是數(shù)據(jù)庫系統(tǒng)自己內(nèi)部存放數(shù)據(jù)的時(shí)候設(shè)置的字符集,無論怎么設(shè)置,在服務(wù)器內(nèi)部都不會出現(xiàn)亂碼等字符集問題,因?yàn)榉?wù)器內(nèi)部不同的字符集之間會進(jìn)行自動轉(zhuǎn)換!

那么,為什么會出現(xiàn)亂碼呢?那是因?yàn)镸ySQL客戶端自身也有自己的字符編碼!

如果數(shù)據(jù)庫服務(wù)器與客戶端之間的默認(rèn)的字符集設(shè)置不一樣,互相通信的時(shí)候就會有亂碼產(chǎn)生!

比如:對于cmd下的客戶端,只支持gbk編碼:


image.png

此時(shí),我們應(yīng)該告知服務(wù)器當(dāng)前客戶端所采用的默認(rèn)的編碼格式:
通過命令:set names gbk;

那么服務(wù)器在發(fā)送給客戶端數(shù)據(jù)之前,首先就會將數(shù)據(jù)轉(zhuǎn)換為客戶端所支持的gbk編碼!

image.png

思考:
如果以后使用PHP操作MySQL,應(yīng)該怎么設(shè)置?
set names utf8;

思考:還有什么地方會出現(xiàn)亂碼?

image.png

解決:

image.png

所以,所謂的三碼合一(瀏覽器端、web服務(wù)器端、MySQL服務(wù)器編碼),不是指將三個地方默認(rèn)的字符集都統(tǒng)一成一致!而是通過某些命令使得它們在通信的時(shí)候能夠識別彼此!

校對規(guī)則
校對規(guī)則都基于字符集的,每一套字符集都有與之相關(guān)的校對規(guī)則!

概念
校對規(guī)則是指當(dāng)對字段進(jìn)行排序的時(shí)候,先后次序問題!

比如:a B c究竟應(yīng)該怎么排序呢?

不區(qū)分大小寫: a B c
區(qū)分大小寫:此時(shí)就要考慮字母的ASCII碼,應(yīng)該是:B(66) a c

也就是說,排序的規(guī)則不一樣,排列出來的效果肯定也不一樣!
再比如:如何是中文,該如何排序呢?(1. 姓的字母順序 2. 筆畫)
張三
李四
王五

image.png

我們可以通過show collation;命令來查看當(dāng)前數(shù)據(jù)庫有哪些排序規(guī)則:

image.png

如果只想看一utf8開頭的字符集,可以使用模糊查詢:
模糊查詢關(guān)鍵字:like
MySQL的通配符:
_ : 可以代表任意的單個字符
% :可以代表任意的字符

image.png

常見的有:
ci結(jié)尾的:不區(qū)分大小寫(針對英文)

cs結(jié)尾的:區(qū)分大小寫(針對英文)

bin結(jié)尾:二進(jìn)制編碼比較

注意:

  1. utf8不支持中文比較,但是gbk支持(比較拼音)
  2. 修改校對規(guī)則的語法為:
    mysql> alter database testdb collate utf8_bin;

由于校對規(guī)則都是基于字符集的,所以修改了相關(guān)校對規(guī)則之后,可能會自動的修改了默認(rèn)的字符集:

image.png

mysql> alter database testdb default collate latin1_danish_ci;

  1. 一般我們只需要了解校對規(guī)則的含義就行了,如果沒有特殊的要求,一般就使用默認(rèn)的校對規(guī)則,不需要刻意的去更改!

聯(lián)合查詢

關(guān)鍵字:union
語法形式
select 語句1
union [union選項(xiàng)]
select 語句2
union [union選項(xiàng)]
select 語句3
............

所謂的聯(lián)合查詢,就是將多個查詢結(jié)果進(jìn)行縱向上的拼接,也就是select語句2的查詢結(jié)果需要放在select語句1查詢結(jié)果的后面!很顯然,聯(lián)合查詢的結(jié)果總記錄數(shù)增加了,但是字段數(shù)量并沒有增加!

既然是多個查詢記錄的拼接,所以聯(lián)合查詢有一個最基本的語法,就是各個查詢語句結(jié)果的字段數(shù)應(yīng)該是一致的,比如,不能一個3列,另一個是4列!

這里的union選項(xiàng)跟以前學(xué)習(xí)的select選項(xiàng)的可選值是一樣的,只是默認(rèn)值不一樣:
all:顯示全部記錄
distinct:去重,也是默認(rèn)值?。╯elect選項(xiàng)的默認(rèn)值是all)

比如:

當(dāng)然,上面的查詢結(jié)果在實(shí)際應(yīng)用中毫無意義!
注意:
使用union查詢最重要的是所有select語句的字段數(shù)是一樣的,但是類型可以不一樣,而且永遠(yuǎn)只顯示第一個select語句的字段名,但是在實(shí)際的運(yùn)用中,通常各個select語句的字段類型保持一致!

那么,為什么要有union查詢?意義何在?
union應(yīng)用
union主要應(yīng)用在以下的幾種情形:
第一,獲得數(shù)據(jù)的條件,在同一個select語句中存在業(yè)務(wù)邏輯的沖突,或者很難在同一個邏輯中(同一個sql語句)實(shí)現(xiàn),這個時(shí)候,往往需要拆分成多個邏輯,也就是使用多條select語句分別實(shí)現(xiàn)!然后再將查詢的結(jié)果拼接到一起!
比如:
現(xiàn)在要查詢上面php_student表中,高老莊中的成績score最高的一個,以及花果山中score最低的一個,如何實(shí)現(xiàn)?

需要注意的地方:
1,聯(lián)合查詢中如果要使用order by子句,那么必須要對各個select語句加上一對括號()
2,如果聯(lián)合查詢中使用了order by子句,還必須搭配上limit子句才能生效!當(dāng)然,如果想顯示全部的數(shù)據(jù),常用的做法就是在limit的后面加上一個很多的數(shù),比如:99999

第二,如果一個項(xiàng)目的某個數(shù)據(jù)表的數(shù)據(jù)量特別的大,往往會導(dǎo)致數(shù)據(jù)查詢的效率比較低,此時(shí),可以采用某種方式或規(guī)律對數(shù)據(jù)表進(jìn)行“水平分割”,此時(shí),每張數(shù)據(jù)表的結(jié)構(gòu)是一樣的,只是存放的數(shù)據(jù)不一樣!

案例:
存儲手機(jī)用戶的信息?
首先,可以根據(jù)不同的市區(qū)放在不同的表中
然后,如果此時(shí)需要查詢某個省內(nèi)的所有潛在的vip客戶(月消費(fèi)在300元以上的),此時(shí),可以分別查詢各個市區(qū)的數(shù)據(jù),然后再進(jìn)行拼接(使用union查詢語句)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容