mysql有沒有數(shù)組

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

創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的磐安網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

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

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

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

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

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

CREATE function Get_StrArrayLength
(
@str varchar(1024), --要分割的字符串
@split varchar(10) --分隔符號
)
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ù)組中指定位置的元素

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

CREATE function Get_StrArrayStrOfIndex
(
@str varchar(1024), --要分割的字符串
@split varchar(10), --分隔符號
@index int --取第幾個元素
)
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、字符串不存在分隔符號 2、字符串中存在分隔符號,跳出while循環(huán)后,@location為0,那默認(rèn)為字符串后邊有一個分隔符號。
return substring(@str,@start,@location-@start)
end

調(diào)用示例:

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

返回值:

9

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

方法:結(jié)合上邊兩個函數(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中存儲數(shù)組(list)的示例

我在MySQL中有兩個表。表Person具有以下列:

id | name | fruits

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

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

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

最佳答案:

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

例如:

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表包含一個人與其相關(guān)聯(lián)的每個水果的一行,并且有效地將人和水果表鏈接在一起。

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

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

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

說明一:

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

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

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

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

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

說明二:

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

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

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

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

關(guān)于“mysql有沒有數(shù)組”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

當(dāng)前名稱:mysql有沒有數(shù)組
鏈接URL:http://muchs.cn/article44/jehhhe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司、軟件開發(fā)、品牌網(wǎng)站建設(shè)、企業(yè)建站關(guān)鍵詞優(yōu)化、

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)