探討MySQL 約束下的查詢功能
一. 數(shù)據(jù)庫(kù)約束:
1.約束類型匯總:
約束類型 | 說(shuō)明 |
NULL約束 | 使用NOT NULL指定列不為 空 |
UNIQUE唯一約束 | 指定列為唯一的、不重復(fù)的 |
DEFAULT默認(rèn)值約 束 | 指定列為空時(shí)的默認(rèn)值 |
主鍵約束(primary key) | NOT NULL 和 UNIQUE 的 結(jié)合 |
外鍵約束 | 關(guān)聯(lián)其他表的主鍵或唯一鍵 語(yǔ)法:foreign key (列) references 主表(列) |
CHECK約束 | 保證列中的值符合指定的條件 |
1.1 NULL約束:
創(chuàng)建表時(shí),可以指定某列不為空:
DROP TABLE IF EXISTS student; CREATE TABLE student ( id INT NOT NULL, sn INT, name VARCHAR(50), qq_mail VARCHAR(50) );
1.2 DEFAULT:默認(rèn)值約束:
mysql> CREATE TABLE student ( -> id INT NOT NULL, -> name VARCHAR(20) DEFAULT '默認(rèn)為無(wú)名氏');
1.3 PRIMARY KEY:主鍵約束:
CREATE TABLE student2 ( -> id bigint primary key auto_increment, -> name VARCHAR(20) DEFAULT '默認(rèn)為無(wú)名氏');
這里還使用了auto_increment,在插入時(shí)不指定,可以讓id字段自增。
注意這里一個(gè)表不可以有多個(gè)主鍵,都是可以有復(fù)合主鍵
如下:
1.4 FOREIGN KEY:外鍵約束:
外鍵用于關(guān)聯(lián)其他表的主鍵或唯一鍵
語(yǔ)法:
foreign key (本表要關(guān)聯(lián)的字段) references 主表(列)
例子:創(chuàng)建班級(jí)表classes,id為主鍵;
創(chuàng)建學(xué)生表student,一個(gè)學(xué)生對(duì)應(yīng)一個(gè)班級(jí),一個(gè)班級(jí)對(duì)應(yīng)多個(gè)學(xué)生。使用id為主鍵, classes_id為外鍵,關(guān)聯(lián)班級(jí)表id。
create table student( -> id INT PRIMARY KEY auto_increment, -> class_id int, -> foreign key (class_id) references class (id) -> ); create table class( -> id INT PRIMARY KEY auto_increment, -> name varchar(50) -> );
注意:這里的class_id的類型,要和主表class的id類型一致這里都是(int)
不然會(huì)報(bào)類型不兼容錯(cuò)誤導(dǎo)致定義失敗
二. 表的設(shè)計(jì):
1.設(shè)計(jì)表的時(shí)候要遵循三大范式。
第一范式:表里的字段不可以再進(jìn)行拆分
第二范式:再滿足第一范式的基礎(chǔ)上,不存在非關(guān)鍵字段對(duì)任意候選鍵的部分函數(shù)依賴
(簡(jiǎn)單來(lái)說(shuō)就是非主鍵字段對(duì)任意主鍵,外鍵,唯一鍵的部分函數(shù)依賴)
小結(jié):一個(gè)表沒(méi)有復(fù)合主鍵就天然滿足第二范式
第三范式:再滿足第二范式的基礎(chǔ)上,不存在非關(guān)鍵字段對(duì)任意候選鍵的傳遞依賴
第三范式可以解決數(shù)據(jù)冗余,更新異常,插入異常,刪除異常等問(wèn)題
2.設(shè)計(jì)時(shí)表之間的三大關(guān)系:
一. 一對(duì)一:比如用戶和賬號(hào)信息,可以建立在一個(gè)表中
二. 一對(duì)多:一個(gè)班級(jí)有多個(gè)學(xué)生設(shè)計(jì)如下:
三. 多對(duì)多:一個(gè)學(xué)生可以選多門課,一門課可以被多個(gè)學(xué)生選
學(xué)生表和課程表是多對(duì)多的關(guān)系,這里通過(guò)課程表(關(guān)系表)關(guān)聯(lián)
三. 聚合查詢:
1.常見的統(tǒng)計(jì)總數(shù)、計(jì)算平局值等操作,可以使用聚合函數(shù)來(lái)實(shí)現(xiàn),常見的聚合函數(shù)有:
函數(shù) | 說(shuō)明 |
COUNT([DISTINCT] expr) | 返回查詢到的數(shù)據(jù)的 數(shù)量 |
SUM([DISTINCT] expr) | 返回查詢到的數(shù)據(jù)的 總和,不是數(shù)字沒(méi)有意義 |
AVG([DISTINCT] expr) | 返回查詢到的數(shù)據(jù)的 平均值,不是數(shù)字沒(méi)有意義 |
MAX([DISTINCT] expr) | 返回查詢到的數(shù)據(jù)的 最大值,不是數(shù)字沒(méi)有意義 |
MIN([DISTINCT] expr) | 返回查詢到的數(shù)據(jù)的 最小值,不是數(shù)字沒(méi)有意義 |
例子:
1.1COUNT:統(tǒng)計(jì)行數(shù)
統(tǒng)計(jì)班里有多少同學(xué):
1.2 SUM:
統(tǒng)計(jì)語(yǔ)文成績(jī)總分:
1.3 AVG:
統(tǒng)計(jì)語(yǔ)文平均分:
1.4 MAX:
語(yǔ)文最高分:
1.5 MIN
語(yǔ)文最低分:
2.GROUP BY子句:
2.1 SELECT 指定的字段必須是“分組依據(jù)字段”,其他字段若想出現(xiàn)在SELECT 中則必須包含在聚合函 數(shù)中。
2.2:語(yǔ)法:
select 需要分組的列, sum(column2), .. from table group by 需要分組的列
2.3:例子:
mysql> create table emp( -> id int primary key auto_increment, -> name varchar(20) not null, -> role varchar(20) not null, -> salary numeric(11,2) -> ); Query OK, 0 rows affected (0.07 sec) mysql> insert into emp(name, role, salary) values -> ('馬云','服務(wù)員', 1000.20), -> ('馬化騰','游戲陪玩', 2000.99), -> ('孫悟空','游戲角色', 999.11), -> ('豬無(wú)能','游戲角色', 333.5), -> ('沙和尚','游戲角色', 700.33), -> ('隔壁老王','董事長(zhǎng)', 12000.66); Query OK, 6 rows affected (0.04 sec)
查詢每個(gè)角色的最高工資:
3.HAVING條件語(yǔ)句:
GROUP BY 子句進(jìn)行分組以后,需要對(duì)分組結(jié)果再進(jìn)行條件過(guò)濾時(shí),不能使用 WHERE 語(yǔ)句,而需要用 HAVING
例子:查詢每個(gè)角色小于一萬(wàn)的最高工資:
四.聯(lián)合查詢:
1.實(shí)際開發(fā)中往往數(shù)據(jù)來(lái)自不同的表,所以需要多表聯(lián)合查詢。多表查詢是對(duì)多張表的數(shù)據(jù)取笛卡爾積。
笛卡爾積其實(shí)是個(gè)全排列的過(guò)程
語(yǔ)法:
select * from 表名 表名
如圖:
上面有很多無(wú)用數(shù)據(jù),我們可以通過(guò)連接條件過(guò)濾
2.內(nèi)連接:
寫法一:select 字段 from 表1 別名1 join 表2 別名2 on 連接條件 and 其他條件;
寫法二:select 字段 from 表1 別名1,表2 別名2 where 連接條件 and 其他條件;
例子:這里我們過(guò)濾一下上面的class和student的查詢
從圖可以看出兩個(gè)表的class_id有依賴關(guān)系,只要他們相等即可。
3.外連接:
外連接分為左外連接和右外連接。如果聯(lián)合查詢,左側(cè)的表完全顯示我們就說(shuō)是左外連接;右側(cè)的表完 全顯示我們就說(shuō)是右外連接
語(yǔ)法:
-- 左外連接,表1完全顯示 select 字段名 from 表名1 left join 表名2 on 連接條件;
-- 右外連接,表2完全顯示 select 字段 from 表名1 right join 表名2 on 連接條件;
如果是left join,就以左邊的表為基準(zhǔn)顯示;
如果是right join ,就以右邊的表為基準(zhǔn)顯示;
這里就是以右邊student表為基準(zhǔn)表顯示的
4.自連接:
自連接是指在同一張表連接自身進(jìn)行查詢
5.子查詢:
子查詢是指嵌入在其他sql語(yǔ)句中的select語(yǔ)句,也叫嵌套查詢。
分為:
5.1.單行子查詢:返回一行記錄的子查詢(返回一個(gè)對(duì)象)
例子:查詢與“韓立” 同學(xué)的同班同學(xué)
5.2.多行子查詢:返回多行記錄的子查詢(返回一個(gè)集合,包含多個(gè)對(duì)象);用到IN關(guān)鍵字
例子:在成績(jī)表中查詢彩兒和清漣同學(xué)的成績(jī)的成績(jī)信息
6.合并查詢:
在實(shí)際應(yīng)用中,為了合并多個(gè)select的執(zhí)行結(jié)果,可以使用集合操作符 union,union all。使用UNION 和UNION ALL時(shí),前后查詢的結(jié)果集中,字段需要一致也就是兩張表要完全一致。
6.1 UNION:
該操作符用于取得兩個(gè)結(jié)果集的并集。當(dāng)使用該操作符時(shí),會(huì)自動(dòng)去掉結(jié)果集中的重復(fù)行
例子:
6.2.nion all:
到此這篇關(guān)于探討MySQL中 “約束“ 下的查詢的文章就介紹到這了,更多相關(guān)mysql約束查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql中LAST_INSERT_ID()的函數(shù)使用詳解
從名字可以看出,LAST_INSERT_ID即為最后插入的ID值,有了這個(gè)實(shí)用的函數(shù),我們可以實(shí)現(xiàn)很多問(wèn)題,下面我們就來(lái)深入探討下。2015-03-03MySQL 表空間碎片的概念及相關(guān)問(wèn)題解決
這篇文章主要介紹了MySQL 表空間碎片的概念及相關(guān)問(wèn)題解決,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下2021-05-05關(guān)于Mysql子查詢的三個(gè)應(yīng)用場(chǎng)景
這篇文章主要介紹了關(guān)于Mysql子查詢的三個(gè)應(yīng)用場(chǎng)景,子查詢是在一個(gè)完整的查詢語(yǔ)句中,嵌套不同功能的小查詢,從而完成復(fù)雜查詢的一種編寫形式,需要的朋友可以參考下2023-07-07MySQL數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別詳解
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03mysql查詢條件not in 和 in的區(qū)別及原因說(shuō)明
這篇文章主要介紹了mysql查詢條件not in 和 in的區(qū)別及原因說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01MySQL 千萬(wàn)級(jí)數(shù)據(jù)量如何快速分頁(yè)
這篇文章主要介紹了MySQL 千萬(wàn)級(jí)數(shù)據(jù)量如何快速分頁(yè),幫助大家提高M(jìn)ySQL數(shù)據(jù)庫(kù)的性能,感興趣的朋友可以了解下2020-09-09