溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

mysql有沒(méi)有數(shù)組

發(fā)布時(shí)間:2023-04-13 14:34:05 來(lái)源:億速云 閱讀:146 作者:iii 欄目:MySQL數(shù)據(jù)庫(kù)

這篇文章主要介紹“mysql有沒(méi)有數(shù)組”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“mysql有沒(méi)有數(shù)組”文章能幫助大家解決問(wèn)題。

MySQL中無(wú)數(shù)組類型,通常將數(shù)組元素按某個(gè)字符分割以字符串形式存儲(chǔ)。MYSQL中沒(méi)有數(shù)組的原因是因?yàn)榇蠖鄶?shù)人并不真正需要它。關(guān)系數(shù)據(jù)庫(kù)使用關(guān)系工作,并且大多數(shù)情況下,最好是為每個(gè)“信息位”分配一行表。例如,可能認(rèn)為“我想要一個(gè)東西列表”,而是創(chuàng)建一個(gè)新表,將一個(gè)表中的行與另一個(gè)表中的行相關(guān)聯(lián);這樣可以表示“M:N”關(guān)系。數(shù)據(jù)庫(kù)可以索引這些行;而數(shù)組通常不會(huì)編入索引。

1. MySQL中以字符串的形式存儲(chǔ)數(shù)組

MySQL中無(wú)數(shù)組類型,通常將數(shù)組元素按某個(gè)字符分割以字符串形式存儲(chǔ)

1.1. 求數(shù)組中元素的個(gè)數(shù)

方法:按指定符號(hào)分割字符串,返回分割后的元素個(gè)數(shù)。方法很簡(jiǎn)單,就是看字符串中存在多少個(gè)分隔符號(hào),然后再加一,就是要求的結(jié)果。

CREATE function Get_StrArrayLength 
(
@str varchar(1024), --要分割的字符串
@split varchar(10) --分隔符號(hào)
)
returns int
as
begin
declare @location int
declare @start int
declare @length int
set @str=ltrim(rtrim(@str))
set @location=charindex(@split,@str)
set @length=1
while @location<>0
begin
set @start=@location+1
set @location=charindex(@split,@str,@start)
set @length=@length+1
end
return @length
end

調(diào)用示例:

select  Get_StrArrayLength('78,1,2,3',',')

返回值:

4

1.2. 得到數(shù)組中指定位置的元素

方法:按指定符號(hào)分割字符串,返回分割后指定索引的第幾個(gè)元素(注意索引從1開(kāi)始),象數(shù)組一樣方便

CREATE function Get_StrArrayStrOfIndex 
(
@str varchar(1024), --要分割的字符串
@split varchar(10), --分隔符號(hào)
@index int --取第幾個(gè)元素
)
returns varchar(1024)
as
begin
declare @location int
declare @start int
declare @next int
declare @seed int
set @str=ltrim(rtrim(@str))
set @start=1
set @next=1
set @seed=len(@split)
set @location=charindex(@split,@str)
while @location<>0 and @index>@next
begin
set @start=@location+@seed
set @location=charindex(@split,@str,@start)
set @next=@next+1
end
if @location =0 select @location =len(@str)+1
--這兒存在兩種情況:1、字符串不存在分隔符號(hào) 2、字符串中存在分隔符號(hào),跳出while循環(huán)后,@location為0,那默認(rèn)為字符串后邊有一個(gè)分隔符號(hào)。
return substring(@str,@start,@location-@start)
end

調(diào)用示例:

select  Get_StrArrayStrOfIndex('8,9,4',',',2)

返回值:

9

1.3. 結(jié)合以上兩個(gè)函數(shù),遍歷數(shù)組中的元素

方法:結(jié)合上邊兩個(gè)函數(shù),象數(shù)組一樣遍歷字符串中的元素

declare @str varchar(50) 
set @str='1,2,3,4,5'
declare @next int
set @next=1
while @next<=Get_StrArrayLength(@str,',')
begin
print Get_StrArrayStrOfIndex(@str,',',@next)
set @next=@next+1
end

調(diào)用結(jié)果:

1
2
3
4
5

2.MySQL中存儲(chǔ)數(shù)組(list)的示例

我在MySQL中有兩個(gè)表。表Person具有以下列:

id | name | fruits

水果列可以包含空或像(‘a(chǎn)pple’,’orange’,’banana’)或(‘strawberry’)等的字符串?dāng)?shù)組。第二個(gè)表是Table Fruit,有以下三列:

____________________________
fruit_name | color  | price
____________________________
apple      | red    | 2
____________________________
orange     | orange | 3
____________________________
...,...

那么我應(yīng)該如何設(shè)計(jì)第一個(gè)表中的fruits列,以便它可以容納從第二個(gè)表中的fruit_name列獲取值的字符串?dāng)?shù)組?由于MySQL中沒(méi)有數(shù)組數(shù)據(jù)類型,我該怎么辦呢?

最佳答案:

正確的方法是使用多個(gè)表,并在查詢中加入它們。

例如:

CREATE TABLE person (
`id` INT NOT NULL PRIMARY KEY,
`name` VARCHAR(50)
);
 
CREATE TABLE fruits (
`fruit_name` VARCHAR(20) NOT NULL PRIMARY KEY,
`color` VARCHAR(20),
`price` INT
);
 
CREATE TABLE person_fruit (
`person_id` INT NOT NULL,
`fruit_name` VARCHAR(20) NOT NULL,
PRIMARY KEY(`person_id`, `fruit_name`)
);

person_fruit表包含一個(gè)人與其相關(guān)聯(lián)的每個(gè)水果的一行,并且有效地將人和水果表鏈接在一起。

1 | "banana"
1 | "apple"
1 | "orange"
2 | "straberry"
2 | "banana"
2 | "apple"

當(dāng)你想檢索一個(gè)人和他們的水果,你可以做這樣的事情:

SELECT p.*, f.*
FROM person p
INNER JOIN person_fruit pf
ON p.id = pf.person_id
INNER JOIN fruits f
ON pf.fruit_name = f.fruit_name

說(shuō)明一:

SQL中沒(méi)有數(shù)組的原因是因?yàn)榇蠖鄶?shù)人并不真正需要它。關(guān)系數(shù)據(jù)庫(kù)(SQL就是這樣)使用關(guān)系工作,并且大多數(shù)情況下,最好是為每個(gè)“信息位”分配一行表。例如,你可能認(rèn)為“我想要一個(gè)東西列表”,而是創(chuàng)建一個(gè)新表,將一個(gè)表中的行與另一個(gè)表中的行相關(guān)聯(lián)[1] 這樣,您可以表示M:N關(guān)系。另一個(gè)優(yōu)點(diǎn)是這些鏈接不會(huì)使包含鏈接項(xiàng)的行混亂。數(shù)據(jù)庫(kù)可以索引這些行。數(shù)組通常不會(huì)編入索引。

如果您不需要關(guān)系數(shù)據(jù)庫(kù),則可以使用例如鍵值存儲(chǔ)。

黃金法則是“[每個(gè)]非關(guān)鍵[屬性]必須提供關(guān)于密鑰,整個(gè)密鑰以及密鑰的事實(shí)?!?數(shù)組做得太多了。它有多個(gè)事實(shí),它存儲(chǔ)訂單(與關(guān)系本身無(wú)關(guān))。性能很差(見(jiàn)上文)。

想象一下,你有一張人桌,你有一張桌子,可以讓人打電話。現(xiàn)在你可以讓每個(gè)人都有他的電話列表。但每個(gè)人與許多其他事物有許多其他關(guān)系。這是否意味著我的人員表應(yīng)該包含他連接的每一件事物的數(shù)組?不,這不是這個(gè)人本身的屬性。

[1]:如果鏈接表只有兩列(每個(gè)表的主鍵),這沒(méi)關(guān)系!如果關(guān)系本身具有其他屬性,則應(yīng)在此表中將其表示為列。

說(shuō)明二:

MySQL 5.7現(xiàn)在提供JSON數(shù)據(jù)類型。這種新的數(shù)據(jù)類型提供了一種存儲(chǔ)復(fù)雜數(shù)據(jù)的便捷新方法:列表,字典等。

也就是說(shuō),rrays不能很好地映射數(shù)據(jù)庫(kù),這就是對(duì)象關(guān)系映射可能非常復(fù)雜的原因。歷史上,人們通過(guò)創(chuàng)建描述它們的表并將每個(gè)值添加為自己的記錄來(lái)在MySQL中存儲(chǔ)列表/數(shù)組。該表可能只有2或3列,或者可能包含更多列。如何存儲(chǔ)此類數(shù)據(jù)實(shí)際上取決于數(shù)據(jù)的特征。

例如,列表是否包含靜態(tài)或動(dòng)態(tài)條目數(shù)?該列表是否會(huì)保持較小,或者預(yù)計(jì)會(huì)增長(zhǎng)到數(shù)百萬(wàn)條記錄?這張桌子上會(huì)有很多讀物嗎?很多寫(xiě)作?很多更新?在決定如何存儲(chǔ)數(shù)據(jù)集合時(shí),這些都是需要考慮的因素。

此外,密鑰:價(jià)值數(shù)據(jù)存儲(chǔ)/文件存儲(chǔ),如Cassandra,MongoDB,Redis等也提供了一個(gè)很好的解決方案。請(qǐng)注意數(shù)據(jù)實(shí)際存儲(chǔ)的位置(如果存儲(chǔ)在磁盤(pán)或內(nèi)存中)。并非所有數(shù)據(jù)都需要位于同一數(shù)據(jù)庫(kù)中。某些數(shù)據(jù)無(wú)法很好地映射到關(guān)系數(shù)據(jù)庫(kù),您可能有理由將其存儲(chǔ)在其他位置,或者您可能希望使用內(nèi)存中的鍵:值數(shù)據(jù)庫(kù)作為存儲(chǔ)在磁盤(pán)某處或作為臨時(shí)存儲(chǔ)的數(shù)據(jù)的熱緩存像會(huì)話這樣的東西。

關(guān)于“mysql有沒(méi)有數(shù)組”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI