MySQL表設(shè)計(jì)和聚合函數(shù)以及正則表達(dá)式示例詳解
一、第一范式(原子性)
要求:每列的值必須是不可再分的原子值。
例如:出生日期這一列存了某年某月某日,但是把出生日期這列可以拆分為年,月,日,三列,這樣的列就不具有原子性。
二、第二范式(消除部分依賴)
要求:在滿足第一范式的基礎(chǔ)上,非主鍵列必須完全依賴整個(gè)主鍵(不能僅依賴主鍵的一部分)。
正例:
學(xué)生表:
學(xué)號(hào),年齡,姓名。
學(xué)生選修成績(jī)表:
學(xué)號(hào),課程編號(hào),成績(jī)。
在學(xué)生表中,學(xué)號(hào)作為主鍵,通過(guò)學(xué)號(hào),可以知道年齡,通過(guò)學(xué)號(hào)也可以知道姓名。這就是完全依賴。
在學(xué)生選修成績(jī)表中,學(xué)號(hào)和課程編號(hào)作為復(fù)合主鍵,通過(guò)這個(gè)復(fù)合主鍵可以唯一確定學(xué)生的成績(jī)。
反例:
學(xué)生選修課成績(jī)表:
學(xué)號(hào),姓名,年齡,課程名,學(xué)分,成績(jī)。
這個(gè)表中學(xué)號(hào)作為主鍵,只有姓名和年齡完全依賴于學(xué)號(hào)主鍵,學(xué)分這個(gè)字段依賴于課程名,成績(jī)字段依賴于課程名和學(xué)號(hào)這樣的復(fù)合主鍵,所以這個(gè)表只能滿足部分依賴。
三、第三范式(消除傳遞依賴)
要求:在滿足第二范式的基礎(chǔ)上,非主鍵列必須直接依賴主鍵,不能通過(guò)其他非主鍵列間接依賴(消除傳遞依賴)。
反例:
學(xué)生表:學(xué)號(hào),姓名,年齡,所在院校,學(xué)院電話,學(xué)院地址。
這個(gè)表中學(xué)號(hào)作為主鍵,只有姓名和年齡和學(xué)號(hào)是強(qiáng)相關(guān)的。
院校電話和院校地址是和所在院校強(qiáng)相關(guān)的。
存在的傳遞關(guān)系:
學(xué)號(hào)->所在院校->學(xué)院電話->院校地址。
解決辦法就是將學(xué)生表一分為二。
學(xué)生表:
學(xué)號(hào),年齡,姓名,學(xué)院編號(hào)
學(xué)院表:
學(xué)院編號(hào),學(xué)員名,學(xué)院電話,學(xué)院地址
用學(xué)院編號(hào)作為外鍵將兩張表聯(lián)系起來(lái)。
總結(jié):
| 范式 | 核心目標(biāo) | 常見(jiàn)問(wèn)題示例 | 解決方案 |
|---|---|---|---|
| 1NF | 列原子性 | 地址字段存復(fù)合信息 | 拆分列 |
| 2NF | 消除部分主鍵依賴 | 表的主鍵是組合鍵,非主鍵列依賴部分主鍵 | 拆分表 |
| 3NF | 消除非主鍵間的傳遞依賴 | 非主鍵列依賴其他非主鍵列 | 拆分表,建立外鍵關(guān)聯(lián) |
四、表設(shè)計(jì)
一對(duì)一模型:

或者:

一對(duì)多:

在n端加入另一張表的主鍵。
多對(duì)多:

例如學(xué)生運(yùn)動(dòng)會(huì)的模型如下:
(1)有若干個(gè)班級(jí),每個(gè)班級(jí)包括班級(jí)號(hào)、班級(jí)名、專業(yè)、人數(shù)。
(2)每個(gè)班級(jí)有若干個(gè)運(yùn)動(dòng)員,運(yùn)動(dòng)員只能屬于一個(gè)班,包括運(yùn)動(dòng)員號(hào)、姓名、性別、年齡。
(3)有若干個(gè)比賽項(xiàng)目,包括項(xiàng)目號(hào)、名稱、比賽地點(diǎn)。
(4)每個(gè)運(yùn)動(dòng)員可參加多個(gè)比賽項(xiàng)目,且每個(gè)項(xiàng)目可有多人參加。
(5)要求能夠公布每個(gè)比賽項(xiàng)目的運(yùn)動(dòng)員名次與成績(jī)。
(6)要求能夠公布各個(gè)班級(jí)團(tuán)體總分的名次和成績(jī)。
E-R圖:

關(guān)系模型:
運(yùn)動(dòng)員(運(yùn)動(dòng)員號(hào),班級(jí)號(hào),姓名,性別,年齡)
班級(jí)(班級(jí)號(hào),班級(jí)名,專業(yè),人數(shù))
比賽項(xiàng)目(項(xiàng)目號(hào),比賽地點(diǎn),名稱)
比賽(項(xiàng)目號(hào),運(yùn)動(dòng)員號(hào),成績(jī),名次)
五、聚合函數(shù)
| 函數(shù)名 | 作用描述 | 是否忽略 NULL | 示例代碼(含 GROUP BY) |
|---|---|---|---|
| COUNT() | 統(tǒng)計(jì)行數(shù)或列值個(gè)數(shù) | 是(COUNT(*)除外) | SELECT city, COUNT(*) FROM users GROUP BY city; |
| SUM() | 求數(shù)值列總和 | 是 | SELECT user_id, SUM(amount) FROM orders GROUP BY user_id; |
| AVG() | 求數(shù)值列平均值 | 是 | SELECT category, AVG(price) FROM products GROUP BY category; |
| MAX() | 返回列最大值 | 是 | SELECT user_id, MAX(order_date) FROM orders GROUP BY user_id; |
| MIN() | 返回列最小值 | 是 | `SELECT user_id, MIN(order_date) FROM |
| COUNT(DISTINCT) | 統(tǒng)計(jì)去重后的行數(shù) | 是 | SELECT COUNT(DISTINCT city) FROM users; |
| HAVING | 對(duì)聚合結(jié)果二次過(guò)濾 | — | SELECT user_id, SUM(amount) AS total FROM orders GROUP BY user_id HAVING total>1000; |
六、正則表達(dá)式
| 維度 | 符號(hào)/語(yǔ)法 | 作用說(shuō)明(一句話) | 示例片段 |
|---|---|---|---|
| 字符集 | [a-z] | 任意單個(gè)小寫字母 | [a-z] |
[A-Z0-9] | 任意大寫字母或數(shù)字 | [A-Z0-9] | |
[^abc] | 除 a、b、c 外的任意單個(gè)字符 | [^abc] | |
[[:alnum:]] | 任意字母或數(shù)字(POSIX 類) | [[:alnum:]] | |
| 元字符 | . | 匹配除換行外的任意單個(gè)字符 | a.c → abc, a3c |
^ | 匹配字符串開頭 | ^abc | |
$ | 匹配字符串結(jié)尾 | xyz$ | |
\ | 轉(zhuǎn)義保留字符,使其按字面匹配 | \. 匹配真實(shí)點(diǎn) | |
| | 邏輯“或” | cat|dog | |
| 量詞 | * | 前一項(xiàng) 0 次或多次 | ab*c → ac, abc |
+ | 前一項(xiàng) 1 次或多次 | ab+c → abc, abbc | |
? | 前一項(xiàng) 0 次或 1 次 | ab?c → ac, abc | |
{n} | 前一項(xiàng)恰好 n 次 | a{3} → aaa | |
{n,m} | 前一項(xiàng) n 到 m 次 | a{2,4} → aa, aaa | |
{n,} | 前一項(xiàng)至少 n 次 | a{2,} → aa, aaaa |
示例1:查找 11 位手機(jī)號(hào)
SELECT * FROM users
WHERE phone REGEXP ‘^1[3-9][0-9]{9}$';
示例二: 查找郵箱格式
SELECT * FROM users
WHERE email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$';
示例三:查找 18 位身份證號(hào)
SELECT * FROM users
WHERE id_card REGEXP '^[0-9]{17}[0-9Xx]$';
示例四:查找包含至少 1 個(gè)大寫字母的密碼字段
SELECT * FROM users WHERE password REGEXP '[A-Z]';
完結(jié)。
總結(jié)
到此這篇關(guān)于MySQL表設(shè)計(jì)和聚合函數(shù)以及正則表達(dá)式示例詳解的文章就介紹到這了,更多相關(guān)MySQL表設(shè)計(jì)和聚合函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql數(shù)據(jù)庫(kù)增量備份的思路和方法
MySQL數(shù)據(jù)庫(kù)增量備份,在這之前修改我們的數(shù)據(jù)庫(kù)配置文件/etc/my.cnf開啟bin-log日志功能即可,下面小編給大家分享Mysql數(shù)據(jù)庫(kù)增量備份的思路詳解,一起看看吧2017-09-09
windows 安裝解壓版 mysql5.7.28 winx64的詳細(xì)教程
這篇文章主要介紹了windows 安裝解壓版 mysql5.7.28 winx64的詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
淺談開啟magic_quote_gpc后的sql注入攻擊與防范
通過(guò)啟用php.ini配置文件中的相關(guān)選項(xiàng),就可以將大部分想利用SQL注入漏洞的駭客拒絕于門外2012-01-01

