MySQL数据库学习笔记,超详细!!(2)

Java小白开始学习MySQL数据库,一方面,跟着视频学习,并记录下学习笔记,方便以后复习回顾。另一方面,发布学习笔记来约束自己,学习路程还很遥远,继续加油坚持!!!希望能帮助到大家!

本次更新MySQL的函数,MySQL中的函数主要分为以下四类: 字符串函数、数值函数、日期函数、流程函数;MySQL的约束,约束时作用于表中列上的规则,用于限制加入表的数据。

上期链接MySQL数据库学习笔记,超详细!!(1)

另外还有我的牛客Java专项练习笔记专栏Spring框架学习专栏也在同步更新,希望大家多多关注,一起学习!!!

3. 函数

MySQL中的函数主要分为以下四类: 字符串函数、数值函数、日期函数、流程函数。

3.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,strat,len)

返回从字符串str从start位置起的len个长度的字符串

案例:

-- concat : 字符串拼接
select concat('Hello' , 'MySQL');   ----> Hello MySQL

-- lower : 全部转小写
select lower('Hello');                 ----> hello

-- upper : 全部转大写
select upper('Hello');                 ----> HELLO

-- lpad : 左填充
select lpad('01', 5, '-');             ----> ---01

-- rpad : 右填充
select rpad('01', 5, '-');             ----> 01---

-- trim : 去除空格
select trim(' Hello  MySQL ');         ----> Hello  MySQL

-- substring : 截取子字符串
select substring('Hello MySQL',1,5);   ----> Hello

3.2 数值函数

函数

功能

CEIL(x)

向上取整

FLOOR(x)

向下取整

MOD(x,y)

返回x/y的模

RAND()

返回0~1内的随机数

ROUND(x,y)

求参数x的四舍五入的值,保留y位小数

案例:

-- ceil:向上取整
select ceil(1.1);       ----> 2

-- floor:向下取整
select floor(1.9);      ----> 1

-- mod:取模
select mod(7,4);        ----> 3

-- rand:获取随机数
select rand();          ----> 0.33234

-- round:四舍五入
select round(2.344,2);  ----> 2.34
通过数据库的函数,生成一个六位数的随机验证码。
思路: 获取随机数可以通过rand()函数,但是获取出来的随机数是在0-1之间的,所以可以在其基础
上乘以1000000,然后舍弃小数部分,如果长度不足6位,补0
select lpad(round(rand()*1000000 , 0), 6, '0');

3.3 日期函数

函数

功能

CURDATE()

返回当前日期

CURTIME()

返回当前时间

NOW()

返回当前日期和时间

YEAR(date)

获取指定date的年份

MONTH(date)

获取指定date的月份

DAY(date)

获取指定date的日期

DATE_ADD(date, INTERVAL exprtype)

返回一个日期/时间值加上一个时间间隔expr后的 时间值

DATEDIFF(date1,date2)

返回起始时间date1 和 结束时间date2之间的天 数

案例:

-- curdate:当前日期
select curdate();

-- curtime:当前时间
select curtime();

-- now:当前日期和时间
select now();

-- YEAR , MONTH , DAY:当前年、月、日
select YEAR(now());
select MONTH(now());
select DAY(now());

-- date_add:增加指定的时间间隔
select date_add(now(), INTERVAL 70 YEAR );

-- datediff:获取两个日期相差的天数
select datediff('2021-10-01', '2021-12-01');
查询所有员工的入职天数,并根据入职天数倒序排序。
思路: 入职天数,就是通过当前日期 - 入职日期,所以需要使用datediff函数来完成。
select name, datediff(curdate(), entrydate) as 'entrydays' from emp order by
entrydays desc;

3.4 流程函数

函数

功能

IF(value,t,f)

如果value为true,则返回t,否则返回f

IFNULL(value1,value2)

如果value1不为空,返回value1,否则返回value2

CASE WHEN [val1] THEN [res1] ... ELSE [default] END

如果val1为true,返回res1,... 否则返回default默认值

CASE [expr] WHEN [val1] THEN [res1] ... ELSE [default] END

如果expr的值等于val1,返回res1,... 否则返回default默认值

案例:

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

-- ifnull
select ifnull('Ok','Default');                    ----> Ok
select ifnull('','Default');                      ----> ''
select ifnull(null,'Default');                    ----> Default

-- case when then else end
-- 需求: 查询emp表的员工姓名和工作地址 (北京/上海 ----> 一线城市 , 其他 ----> 二线城市)
select
    name,
    (case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else
    '二线城市' end) as '工作地址'
from emp;
-- 统计班级各个学员的成绩:>=85,展示优秀;>=60,展示及格;否则,展示不及格
select
    id,
    name,
    (case when math > = 85 then '优秀' when math > = 60 then '及格' else '不及格' end) as '数学',
    (case when english > = 85 then '优秀' when english > = 60 then '及格' else '不及格' end) as '英语',
    (case when chinese > = 85 then '优秀' when chinese > = 60 then '及格' else '不及格' end) as '语文'
from score;

4. 约束

4.1 概述

  • 概念:约束时作用于表中列上的规则,用于限制加入表的数据

例如:可以给id列添加约束,让其值不能重复,不能为null值

  • 目的:约束的存在保证了数据库中数据的正确性、有效性和完整性

添加约束可以在添加数据的时候就限制不正确的数据,年龄是3000,数学成绩是-5分这样无效的数据,继而保障数据的完整性。

4.2 分类

约束

描述

关键字

非空约束

限制该字段的数据不能为null

NOT NULL

唯一约束

保证该字段的所有数据都是唯一、不重复的

UNIQUE

主键约束

主键是一行数据的唯一标识,要求非空且唯一

PRIMARY KEY

默认约束

保存数据时,如果未指定该字段的值,则采用默认

DEFAULT

检查约束(8版本新增)

保证字段值满足某一个条件

CHECK

外键约束

用来让两张表的数据之间建立连接,保证数据的一致性和完整性

FOREIGN KEY

注意:
约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。
一张表只能有**==一个主键约束==**

4.3 非空约束

非空约束用于保证列中所有的数据不能有null值

  • 添加约束

-- 创建表时添加非空约束
CREATE TABLE 表名(
   列名 数据类型 NOT NULL,
   …
); 

-- 建完表后添加非空约束
ALTER TABLE 表名 MODIFY 字段名 数据类型 NOT NULL;
  • 删除约束

ALTER TABLE 表名 MODIFY 字段名 数据类型;

4.4 唯一约束

唯一约束用于保证列中所有数据各不相同

  • 添加约束

-- 创建表时添加唯一约束
CREATE TABLE 表名(
   列名 数据类型 UNIQUE [AUTO_INCREMENT],
   -- AUTO_INCREMENT: 当不指定值时自动增长
   …
); 

-- 建完表后添加唯一约束
ALTER TABLE 表名 MODIFY 字段名 数据类型 UNIQUE;
  • 删除约束

ALTER TABLE 表名 DROP INDEX 字段名;

4.5 主键约束

主键是一行数据的唯一标识,要求非空且唯一,**==一张表只能有一个主键==**

  • 添加约束

-- 创建表时添加主键约束
CREATE TABLE 表名(
   列名 数据类型 PRIMARY KEY [AUTO_INCREMENT],
   …
); 

-- 建完表后添加主键约束
ALTER TABLE 表名 ADD PRIMARY KEY(字段名);
  • 删除约束

ALTER TABLE 表名 DROP PRIMARY KEY;

4.6 默认约束

保存数据时,未指定值则采用默认值

  • 添加约束

-- 创建表时添加默认约束
CREATE TABLE 表名(
   列名 数据类型 DEFAULT 默认值,
   …
); 

-- 建完表后添加默认约束
ALTER TABLE 表名 ALTER 列名 SET DEFAULT 默认值;
  • 删除约束

ALTER TABLE 表名 ALTER 列名 DROP DEFAULT;

4.7 约束演示

根据需求,完成表结构的创建。需求如下:

对应的建表语句:

CREATE TABLE user(
    id int AUTO_INCREMENT PRIMARY KEY COMMENT 'ID唯一标识',
    name varchar(10) UNIQUE NOT NULL COMMENT '姓名',
    age int CHECK(age > 0 && age < = 120) COMMENT '姓名',
    ststus char(1) DEFAULT '1' COMMENT '状态',
    gender char(1) COMMENT '性别'
);

4.8 外键约束

4.8.1 介绍

外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性。

如何理解上面的概念呢?如下图有两张表,员工表和部门表:

员工表中的dep_id字段是部门表的id字段关联,也就是说1号学生张三属于1号部门研发部的员工。现在要删除1号部门,就会出现错误的数据(员工表中属于1号部门的数据)。而我们上面说的两张表的关系只是我们认为它们有关系,此时需要通过外键让这两张表产生数据库层面的关系,这样要删除部门表中的1号部门的数据将无法删除。

4.8.2 语法
  • 添加外键

-- 创建表时添加外键约束
CREATE TABLE 表名(
   列名 数据类型,
   …
   [CONSTRAINT] [外键名称] FOREIGN KEY(外键列名) REFERENCES 主表(主表列名) 
); 

-- 建完表后添加外键约束
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);

案例:

-- 部门表
CREATE TABLE dept(
	id int primary key auto_increment,
	dep_name varchar(20),
	addr varchar(20)
);
-- 员工表 
CREATE TABLE emp(
	id int primary key auto_increment,
	name varchar(20),
	age int,
	dep_id int,

	-- 添加外键 dep_id,关联 dept 表的id主键
	CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)	
);
  • 删除外键

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
删除外键:
alter table emp drop FOREIGN key fk_emp_dept;
4.8.3 删除/更新行为

添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行为有以下几种:

行为

说明

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;

案例

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

-- set null
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references
dept(id) on update set null on delete set null ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值