主頁 > 資料庫 > Mysql基礎篇(二)之函式和約束

Mysql基礎篇(二)之函式和約束

2023-07-04 09:20:09 資料庫

一. 函式

Mysql中的函式主要分為四類:字串函式、數值函式、日期函式、流程函式

1. 字串函式

常用函式如下:

函式 功能
CONCAT(S1, S2, ......Sn) 字串拼接,將S1,S2,.....Sn拼接成一個字串
LOWER(str) 將字串str全部轉為小寫
UPPER(str) 將字串str全部轉為大寫
LPAD(str, n, pad) 左填充,用字串pad對str的左邊進行填充,達到n個字串長度
RPAD(str, n, pad) 右填充,用字串pad對str的右邊進行填充,達到n個字串長度
TRIM(str) 去掉字串頭部和尾部的空格
SUBSTRING(str, start, len) 回傳字串str從start位置起的len個長度的字串

(1).案例1:將yun3k和com進行拼接

select concat('yun3k', 'com');

(2). 案例2:將YUN3k_com全部轉為小寫

select lower('YUN3k_com');

(3). 案例3:將yun3k_com全部轉為大寫

select upper('yun3k_com');

(4). 案例4:將yun3k左邊不滿足10位的全部填充'a'

select lpad('yun3k', 10, 'a');

(5). 案例5:將yun3k右邊不滿足10位的全部填充'b'

select rpad('yun3k', 10, 'b');

(6). 去除" yun3k com "的首尾空格

select trim(' yun3k com  ');

(7). 截取yun3k_com的前5位字串

select substring('yun3k_com', 1, 5);

(8). 將yun3k_emp表中的員工工號統一變為8位數,不足8位數的全部在前面補6

update yun3k_emp set workno = lpad(workno, 8, '6');

2. 數值函式

常見函式如下:

函式 功能
CEIL(x) 向上取整
FLOOR(x) 向下取整
MOD(x, y) 回傳x/y的模
RAND() 回傳0~1內的亂數
ROUND(x, y) 求引數x的四舍五入的值,保留y位小數

(1). 案例1:1.1向上取整

select ceil(1.1);

(2). 案例2:1.9向下取整

select floor(1.9);

(3). 案例3:7與4取模

select mod(7,4);

(4).案例4:獲取隨機小數

select rand();

(5). 案例5:2.334四舍五入保留2位小數

select round(2.324,2);

(6). 案例6:生成一個六位數的隨機驗證碼

思路:獲取亂數可以通過rand()函式,但是獲取出來的亂數是在0-1之間,所以可以在其基礎上乘以1000000,然后舍棄小數部分,如果長度不足6位,補0

select lpad(round(rand() * 1000000 , 0), 6, '0');

3. 日期函式

常見日期函式如下:

函式 功能
CURDATE() 回傳當前日期
CURTIME() 回傳當前時間
NOW() 回傳當前日期和時間
YEAR(date) 獲取指定date的年份
MONTH(date) 獲取指定date的月份
DAY(date) 獲取指定date的日期
DATE_ADD(date, INTERVAL expr type) 回傳一個日期/時間值加上一個時間間隔expr后的時間值
DATEDIFF(date1, date2) 回傳起始時間date1和結束時間date2之間的天數

(1).案例1:獲取當前日期

select curdate();

(2). 案例2:獲取當前時間

select curtime();

(3).案例3:獲取當前日期和時間

select now();

(4). 案例4:獲取當前年、月、日

select YEAR(now()), MONTH(now()), DAY(now());

(5). 案例5:當前時間分別增加50年,50月,50日

select date_add(now(), INTERVAL 50 YEAR), date_add(now(), INTERVAL 50 MONTH), date_add(now(), INTERVAL 50 DAY);

(6). 案例6:獲取當前時間與”2022-06-30”日期的差值

select datediff(now(), '2022-06-30');

(7). 案例7:查詢yun3k_emp表中所有員工的入職天數,并根據入職天數倒序排序

select name, datediff(curdate(), entrydate) as 'entrydays' from yun3k_emp order by entrydays desc;

4. 流程函式

常見流程函式如下:

函式 功能
IF(value, t, f) 如果value位true,則回傳t,否則回傳f
IFNULL(vales1, value2) 如果value不為空,回傳value1,否則回傳value2
CASE WHEN [val1] THEN [resl] ... ELSE [default] END 如果val1為true,回傳res1,... 否則回傳default默認值
CASE [expr] WHEN [val1] THEN [res1] ... ELSE [default] END 如果expr的值等于val1,回傳res1,... 否則回傳fault默認值

(1). 案例1:if使用

select if(false, 'Ok', 'Error');

(2). 案例2:ifnull使用

select ifnull('Ok','Default');

select ifnull('','Default');

select ifnull(null,'Default');

(3). 案例3:查詢yun3k_emp表的員工姓名和作業地址(北京/上海 ---> 一線城市,其他 ---> 二線城市)

select name, (
	case workaddress when '北京' 
	then '一線城市' when '上海' 
	then '一線城市' 
	else '二線城市' end 
) as '作業地址' from yun3k_emp;

(4). 案例4:查詢yun3k_emp表中年齡為40以下的顯示為青年,年齡為40-60顯示為中年,年齡60歲以上顯示為老年

select id, age, (case 
	when age < 40 then '青年' 
	when age >=40 and age <=60 then '中年' 
	else '老年' end
) as "年齡" from yun3k_emp;

二. 約束

Mysql中的約束主要分類以下幾類:

約束 描述 關鍵字
非空約束 限制該欄位的資料不能為null NOT NULL
唯一約束 保證該欄位的所有資料都是唯一、不重復的 UNIQUE
主鍵約束 主鍵是一行資料的唯一標識,要求非空且唯一 PRIMARY KEY
默認約束 保存資料時,如果未指定該欄位的值,則采用默認值 DEFAULT
檢查約束(8.0.16版本之后) 保證欄位值滿足某一個條件 CHECK
外鍵約束 用來讓兩張表的資料之間建立連接,保證資料的一致性和完整性 FOREIGN KEY

注:約束是作用于表中欄位上的,可以在創建表/修改表的時候添加約束

1. 非空約束、唯一約束、主鍵約束、默認約束、檢查約束

(1). 案例1:根據需求,完成表結構的創建

欄位名 欄位含義 欄位型別 約束條件 約束關鍵字
id 唯一標識 int 主鍵并且自動增長 PRIMARY KEY,AUTO_INCREMENT
name 姓名 varchar(10) 不為空并且唯一 NOT NULL, UNIQUE
age 年齡 int 大于0并且小于等于120 CHECH
status 狀態 char(1) 如果沒有指定該值,默認為1 DEFAULT
gender 性別 char(1)
CREATE TABLE yun3k_user( 
	id int AUTO_INCREMENT PRIMARY KEY COMMENT 'ID唯一標識', 
	name varchar(10) NOT NULL UNIQUE COMMENT '姓名' , 
	age int check (age > 0 && age <= 120) COMMENT '年齡' , 
	status char(1) default '1' COMMENT '狀態', 
	gender char(1) COMMENT '性別' 
);

2. 外鍵約束

(1). 介紹

用來讓兩張表的資料之間建立連接,從而保證資料的一致性和完整性,

我們來看一個例子:

左側的emp表是員工表,里面存盤員工的基本資訊,包含員工的ID、姓名、年齡、職位、薪資、入職日期、上級主管ID、部門ID,在員工的資訊中存盤的是部門的ID dept_id,而這個部門的ID是關聯的部門表dept的主鍵id,那emp表的dept_id就是外鍵,關聯的是另一張表的主鍵,

準備資料

create table dept( 
	id int auto_increment comment 'ID' primary key, 
	name varchar(50) not null comment '部門名稱' 
)comment '部門表'; 

INSERT INTO dept (id, name) 
VALUES (1, '研發部'), (2, '市場部'),(3, '財務部'), 
(4, '銷售部'), (5, '總經辦'); 

create table emp( 
	id int auto_increment comment 'ID' primary key, 
	name varchar(50) not null comment '姓名', 
	age int comment '年齡', 
	job varchar(20) comment '職位', 
	salary int comment '薪資', 
	entrydate date comment '入職時間', 
	managerid int comment '直屬領導ID', 
	dept_id int comment '部門ID' 
)comment '員工表'; 

INSERT INTO emp (id, name, age, job,salary, entrydate, managerid, dept_id) 
VALUES (1, '金庸', 66, '總裁',20000, '2000-01-01', null,5),
(2, '張無忌', 20, '專案經理',12500, '2005-12-05', 1,1), 
(3, '楊逍', 33, '開發', 8400,'2000-11-03', 2,1),
(4, '韋一笑', 48, '開 發',11000, '2002-02-05', 2,1), 
(5, '常遇春', 43, '開發',10500, '2004-09-07', 3,1),
(6, '小昭', 19, '程 序員鼓勵師',6600, '2004-10-12', 2,1);

接下來,我們可以做一個測驗,洗掉id為1的部門資訊,

結果,我們看到洗掉成功,而洗掉成功之后,部門表不存在id為1的部門,而emp表中還有很多員工關聯的是id為1的部門,此時就出現了資料的不完整性,而要想解決這個問題就得通過資料庫的外鍵約束,

(2). 語法

  1. 添加外鍵
CREATE TABLE 表名( 
	欄位名 資料型別, 
	... 
	[CONSTRAINT] [外鍵名稱] FOREIGN KEY (外鍵欄位名) 
	REFERENCES 主表 (主表列名) 
);
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵欄位名) REFERENCES 主表 (主表列名) ;

案例1:為emp表的dept_id欄位添加外鍵約束,關聯dept表的主鍵id,

alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept (id);

添加外建約束之后,我們再到dept表(父表)洗掉id為1的記錄,此時將會報錯,不能洗掉或更新父表記錄,

  1. 洗掉外建
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;

案例1:洗掉emp表的外鍵fk_emp_dept_id,

alter table emp drop foreign key fk_emp_dept_id;

  1. 洗掉/更新行為

添加了外鍵之后,再洗掉父表資料時產生的約束行為,我們就稱為洗掉/更新行為,具體的洗掉/更新行為有以下幾種:

行為 說明
NO ACTION 當在父表中洗掉/更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不允許洗掉/更新,(與RESTRICT一致)默認行為
RESTRICT 當在父表中洗掉/更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不允許洗掉/更新,(與NO ACTION一致)默認行為
CASCADE 當在父表中洗掉/更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有,則也洗掉/更新外鍵在子表中的記錄,
SET NULL 當在父表中洗掉對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則設定子表中該外建值為null(這就要求該外鍵允許取null),
SET DEFAULT 父表有變更時,子表將外鍵列設定成一個默認的值(Innodb不支持),

陳述句如下:

ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵欄位) REFERENCES 主表名 (主表欄位名) ON UPDATE CASCADE ON DELETE CASCADE;

案例1:CASCAED使用

alter table emp add constraint fk_emp_dept_id foreign key (dept_id)
references dept(id) on update cascade on delete cascade;

修改父表(dept)id為1的記錄,將id改為6

update dept set id = 6 where id = 1;

我們發現,原來在子表中dept_id值為1的記錄,現在也變成了6,這就是cascade級聯的效果,

洗掉父表id為6的記錄

delete from dept where id = 6;

我們發現,父表的資料洗掉成功了,但是子表中關聯的記錄也被級聯洗掉了,

案例2:SET NULL使用

在進行測驗之前,我們先需要洗掉上面建立的外鍵 fk_emp_dept_id,然后再通過資料腳本,將emp、dept表的資料恢復了,

alter table emp drop foreign key fk_emp_dept_id;

alter table emp add constraint fk_emp_dept_id foreign key (dept_id)
references dept(id) on update set null on delete set null;

接下來,我們洗掉父表(dept)id為5的資料,發現父表(dept)的記錄是可以正常洗掉的,父表(dept)的資料洗掉之后,再打開子表emp,我們發現子表emp的dept_id欄位原來dept_id為5的資料,現在都置為NULL了,

delete from dept where id = 5;

這就是SET NULL這種洗掉/更新行為的效果

更多mysql學習請關注微信公眾號”云哥技術yun3k”,回復”mysql學習”,免費領取mysql全套學習資料,

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/556572.html

標籤:其他

上一篇:Mysql基礎篇(一)之DDL、DML、DQL、DCL

下一篇:返回列表

標籤雲
其他(162052) Python(38266) JavaScript(25520) Java(18286) C(15238) 區塊鏈(8275) C#(7972) AI(7469) 爪哇(7425) MySQL(7285) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5876) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4609) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2438) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) HtmlCss(1986) .NET技术(1985) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1882) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • Mysql基礎篇(二)之函式和約束

    # 一. 函式 **Mysql中的函式主要分為四類:字串函式、數值函式、日期函式、流程函式** ## 1. 字串函式 **常用函式如下:** | 函式 | 功能 | | | | | CONCAT(S1, S2, ......Sn) | 字串拼接,將S1,S2,.....Sn拼接成一個字串 | ......

    uj5u.com 2023-07-04 09:20:09 more
  • Mysql基礎篇(一)之DDL、DML、DQL、DCL

    # 一. SQL陳述句分類 **SQL陳述句,根據其功能,主要分為四類:DDL、DML、DQL、DCL。** | 分類 | 全稱 | 說明 | | | | | | DDL | Data Definition Language | 資料定義語言,用來定義資料物件(資料庫,表,欄位) | | DML | D ......

    uj5u.com 2023-07-04 09:17:10 more
  • sql server 資料庫自動備份

    一丶打開客戶端: 物件資源管理器->管理->維護計劃(右鍵點擊)->維護計劃向導 二丶打開后點擊下一步, 填寫名稱與說明并更改備份計劃 三丶點下一步, 選擇維護任務 四丶點擊下一步, 選擇需要備份的資料庫, 和備份檔案路徑 五丶點擊下一步, 選擇報告檔案保存路徑 六丶點擊下一步, 查看維護計劃, 沒 ......

    uj5u.com 2023-07-04 09:09:59 more
  • SQL Server中的NULL值處理:判斷與解決方案

    摘要: 在SQL Server資料庫中,NULL是表示缺少資料或未知值的特殊標記。處理NULL值是SQL開發人員經常遇到的問題之一。本文將介紹SQL Server中判斷和處理NULL值的不同方法,以及一些解決方案,幫助您更好地處理資料庫中的NULL值情況。 文章內容: 引言: 在資料庫開發中,經常會 ......

    uj5u.com 2023-07-04 09:04:44 more
  • 完全兼容DynamoDB協議!GaussDB(for Cassandra)為NoSQL注入新活力

    摘要:DynamoDB是一款托管式的NoSQL資料庫服務,支持多種資料模型,廣泛應用于電商、社交媒體、游戲、IoT等場景。 本文分享自華為云社區《完全兼容DynamoDB協議!GaussDB(for Cassandra)為NoSQL注入新活力》,作者:GaussDB 資料庫 。 DynamoDB是一 ......

    uj5u.com 2023-07-04 09:03:59 more
  • Mysql基礎篇(四)之事務

    # 一. 事務簡介 **事務是一組操作的集合,它是一個不可分隔的作業單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要么同時成功,要么同時失敗。** **就比如:張三給李四轉賬1000塊錢,張三銀行賬戶的錢減少了1000,而李四銀行賬戶的錢要增加1000。這一組操作就必須 ......

    uj5u.com 2023-07-04 09:02:16 more
  • Mysql基礎篇(三)之多表查詢

    # 一. 多表關系 - **一對多(多對一)** - **多對一** - **一對一** ## 1. 一對多 ### (1). 案例:部門與員工的關系 ### (2). 關系:一個部門對應多個員工,一個員工對應一個部門 ### (3). 實作:在多的一方建立外建,指向一的一方的主鍵 ![](http ......

    uj5u.com 2023-07-04 09:00:36 more
  • Mysql基礎篇(二)之函式和約束

    # 一. 函式 **Mysql中的函式主要分為四類:字串函式、數值函式、日期函式、流程函式** ## 1. 字串函式 **常用函式如下:** | 函式 | 功能 | | | | | CONCAT(S1, S2, ......Sn) | 字串拼接,將S1,S2,.....Sn拼接成一個字串 | ......

    uj5u.com 2023-07-04 08:58:35 more
  • Mysql基礎篇(一)之DDL、DML、DQL、DCL

    # 一. SQL陳述句分類 **SQL陳述句,根據其功能,主要分為四類:DDL、DML、DQL、DCL。** | 分類 | 全稱 | 說明 | | | | | | DDL | Data Definition Language | 資料定義語言,用來定義資料物件(資料庫,表,欄位) | | DML | D ......

    uj5u.com 2023-07-04 08:50:31 more
  • es 筆記二之基礎查詢

    > 本文首發于公眾號:Hunter后端 > 原文鏈接:[es筆記二之基礎查詢](https://mp.weixin.qq.com/s/VW0QCuW-ONEH-TRB2WF4GQ) 這一篇筆記介紹 es 的基礎查詢。 基礎查詢包括很多,比如排序,類似資料庫 limit 的操作,like 操作,與或非 ......

    uj5u.com 2023-07-03 07:52:54 more