久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

mysql有沒有數(shù)組

189次閱讀
沒有評論

共計 3730 個字符,預(yù)計需要花費 10 分鐘才能閱讀完成。

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

MySQL 中無數(shù)組類型,通常將數(shù)組元素按某個字符分割以字符串形式存儲。MYSQL 中沒有數(shù)組的原因是因為大多數(shù)人并不真正需要它。關(guān)系數(shù)據(jù)庫使用關(guān)系工作,并且大多數(shù)情況下,最好是為每個“信息位”分配一行表。例如,可能認為“我想要一個東西列表”,而是創(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,那默認為字符串后邊有一個分隔符號。
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
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ù)情況下,最好是為每個“信息位”分配一行表。例如,你可能認為“我想要一個東西列表”,而是創(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))。性能很差(見上文)。

想象一下,你有一張人桌,你有一張桌子,可以讓人打電話。現(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)注丸趣 TV 行業(yè)資訊頻道,丸趣 TV 小編每天都會為大家更新不同的知識點。

向 AI 問一下細節(jié)

丸趣 TV 網(wǎng) – 提供最優(yōu)質(zhì)的資源集合!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2024-02-03發(fā)表,共計3730字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 梅州市| 喀喇| 海门市| 崇明县| 寻甸| 金堂县| 湾仔区| 武强县| 澜沧| 仙游县| 乌兰浩特市| 乌拉特中旗| 寿阳县| 曲麻莱县| 广州市| 门源| 汉川市| 延边| 凤山市| 准格尔旗| 尼勒克县| 泊头市| 宜城市| 松滋市| 江门市| 大足县| 扶沟县| 桃园县| 买车| 鄂温| 巴塘县| 增城市| 庐江县| 务川| 阿克苏市| 蓬安县| 林甸县| 佛山市| 清苑县| 佛坪县| 微山县|