1.函数
函数是指一段可以直接被另一端程序调用的程序或代码
mysql中的函数主要有字符串函数、数值函数、日期函数、流程函数
操作函数的语法:select 函数(参数);
1.字符串函数
mysql中内置了很多字符串函数,常用的几个如下:
函数 功能
coucat(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个长度的字符串
举例:
select concat('Hello','mysql'); 结果:Hello mysql
select lower('WANGLEI'); 结果:wanglei
select upper('wanglei'); 结果:WANGLEI
select lpad('WL',5,'*'); 结果:***WL
select rpad('王磊',8,'*'); 结果:王磊******
select trim(' 世界 你好 '); 结果:世界 你好
select substring('王磊平常心',1,2); 结果:王磊
案列:现在统一将学生的编号变成5位,不足5位的,在编号左边补0
修改数据:update
updata sheet set id = lpad(id,10,'*');
上面是修改之前表的数据
上面是修改之后的数据
2.数值函数
常见的数值函数如下:
函数 功能
ceil(x) 向上取整
floor(x) 向下取整
mod(x,y) 返回x/y的模
rand() 返回0~1内的随机数
round(x,y) 求参数x的四舍五入的值,保留y位小数
举例:
select ceil(1.5); 结果:2
select floor(1.9); 结果:1
select mod(7,5); 结果:2
select rand(); 结果:0.8341995001157742
select round(3.144,2); 结果:3.14
案列:通过数据库的函数,生成一个六位数的随机验证码
select lpad(round(rand()*1000000,0),6,'0');
结果:
090694、950872、482280...
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之间的天数
举例: 结果:
select curdate(); 2022-03-19
select curtime(); 21:43:26
select now(); 2022-03-19 21:43:57
select year(now()); 2022
select month(now()); 3
select day(now()); 19
select date_add(now(),interval 1 year); 2023-03-19 21:46:07
select datediff('2022-4-16','2022-3-17'); 30
举例:查询所有员工的入职天数,并根据入职天天输倒序排序
select name,datediff(curdate(),entrydata) as from sheet1 order by entryData desc;
排序之后的结果:
4.流程函数
流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率
函数 功能
if(value,t,f) 如果value为true,则返回t,否者返回f
ifnull(value1,calue2) 如果value1不为空,则返回value1,否者返回value2
case when [val1] then [res]... else [default] end
如果val1为true,返回res1...否者返回default
case [expr] when [val1] then [res1]...else [default] end
如果expr的值等于val1,返回res1,否者返回default默认值
举例:
select if(false,'true','wanglei'); 结果:wanglei
select ifnull('王磊','最强'); 结果:王磊
查询学生的姓名和籍贯(四川---->一线城市,其他---->二线城市)
select name,case birthplace when '四川' then '一线城市' else '二线城市' end from message
2.约束
约束:约束是作用于表中字段上的规则,用于限制存储在表中的数据
目的:保证数据库数据的正确性、有效性、完成性
分类:
约束 描述 关键字
非空约束 限制该字段的数据不能为null not null
唯一约束 保证该字段的所有数据都是唯一性、不重复的 unique
主键约束 主键是一行数据的唯一标识,要求非空且唯一 primary key
默认约束 保存数据时,如未指定该字段的值,则采用默认值 default
检测约束 保证字段值满足某一个条件 check
外键约束 让两张表的数据之间建立连接,保证数据的一致性和完整性 foreign key
注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束
案列:根据需求,完成表结构的创建
字段名 | 字段含义 | 字段类型 | 约束条件 | 约束关键字 |
id | ID唯一标识 | int | 主键,并且自动增长 | primary key,auto_increase |
name | 姓名 | varchar(10) | 不为空,并且唯一 | not null,unique |
age | 年龄 | int | 大于0,并且小于等于120 | check |
status | 状态 | char(1) | 如果没有指定该值,默认为1 | default |
gender | 性别 | char(1) | 无 |
create table user( id int primary key auto_increment comment '主键', 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 '性别' ) comment '用户表';
insert into user (name, age, status, gender) value ('王磊',23,1,'男'); insert into user (name, age, status, gender) value ('覃泽宏',25,0,'男'); insert into user (name, age, status, gender) value ('黄齐鹏',25,0,'男'); insert into user (name, age, status, gender) value ('尹朝龙',21,0,'男'); insert into user (name, age, gender) value ('啊资曲不',21,'男');
外键约束:外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性
有外键连接的表称为子表,外键连接的表称为父表
语法:
create table 表名(
字段名 数据类型
...
[constraint] [外键名称] foreign key (外键字段名) reference 主表 (主表列表)
);
或者:alter table 表名 add constraint 外键名称 foreign key (外键字段名) reference 主表 (主表列名);
删除外键语法:alter table 表名 drop foreign key 外键名称;
例子:为emp表的dept_id添加外键
insert into dept (id, name) values
(1,'研发部'),
(2,'市场部'),
(3,'财务部'),
(4,'销售部'),
(5,'总经办');
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);
添加外键:
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);
添加之后的结果:
外键约束删除/更新行为:
行为
说明
no action
当在父表中删除/更新对应记录时,首先检查该记录是否有对应的外键,如果有则不允许删除/更新
restrict
当在父表中删除/更新对应记录时,首先检查该记录是否有对应的外键,如果有则不允许删除/更新
cascade
当在父表中删除/更新对应记录时,首先检查该记录是否有对应的外键,如果有则也允许删除/更新外键在子表中的记录
set null
当在父表中删除/更新对应记录时,首先检查该记录是否有对应的外键,如果有则设置子表中该外键值为null
set default
父表变更时,子表将外键设置成一个默认值
语法:alter table 表名 add constraint 外键名称 foreign key (外键字段) references 主表名 (主表字段名) on update cascade on delete cascade;
多表查询:
多表关系、多表查询概述、内连接、外连接、自链接、子查询、多表查询案列
多表关系:项目开发中,在进行数据结构设计时,会根据业务需求和业务之间的关系,分析并设计表的结构,由于业务之间的关联,所以各个表结构之间也存在着这种联系,基本分为三种————一对多、多对多、一对一
1.一对多
案列:部门与员工之间的关系(关系:一个部门对应多个员工,一个员工对应一个部门)
实现:在多的一方建立外键,指向一的一方的主键
2. 多对多
案列:学生与课程的关系(关系:一个学生可以选修多门课程,一门课程也可以供多个学生选着)
实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
创建学生表
create table student(
id int auto_increment primary key comment '主键',
name varchar(10) comment '姓名',
number varchar(10) comment '学号'
) comment '学生表';
插入学生数据
insert into student values
(null,'黛绮丝','2000100101'),
(null,'谢逊','2000100102'),
(null,'音天邦','2000100103'),
(null,'韦一笑','2000100104');
创建课程表
create table course(
id int auto_increment primary key comment '主键ID',
name varchar(10) comment '课程名称'
) comment '课程表';
插入课程数据
insert into course values (null,'java'),(null,'PHP'),(null,'mysql'),(null,'Hadoop');
创建中间表
create table student_course(
id int auto_increment comment '主键' primary key ,
studentid int not null comment '学生ID',
courseid int not null comment '课程ID',
constraint fk_courseid foreign key (courseid) references course (id),
constraint fk_studentid foreign key (studentid) references student (id)
)comment '学生课程中间表';
插入中间表数据
insert into student_course values (null,1,1),(null,1,2),(null,1,3),(null,2,2),(null,2,3),(null,3,4);
一对一:
案列:用户与用户详情的关系(关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率)
实现:在任意一方加入外键,关联另一方的主键,并且设置成外键为唯一的(unique)
create table tb_user(
id int auto_increment primary key comment '主键ID',
name varchar(10) comment '姓名',
age int comment '年龄',
gender char(1) comment '性别',
phone char(11) comment '手机号'
)comment '用户基本信息表';
create table tb_user_edu(
id int auto_increment primary key comment '主键ID',
degree varchar(20) comment '学历',
major varchar(50) comment '小学',
middleschool varchar(50) comment '中学',
university varchar(50) comment '大学',
userid int unique comment '用户ID',
constraint fk_userid foreign key (userid) references tb_user(id)
)comment '用户教育信息表';
insert into tb_user(id, name, age, gender, phone) values
(null,'黄渤',45,'男','18800001111'),
(null,'冰冰',35,'女','18800002222'),
(null,'马云',55,'男','18800008888'),
(null,'李彦宏',40,'男','18800009999');
insert into tb_user_edu(id, degree, major, middleschool, university, userid) values
(null,'本科','舞蹈','静安区第一中学','北京舞蹈学院',1),
(null,'硕士','表演','朝阳区第一中学','北京电影学院',2),
(null,'本科','英语','杭州市第一小学','杭州师范大学',3),
(null,'本科','应用数学','阳泉第一小学','清华大学',4);
3.多表查询
多表查询分类
连接查询:内连接、外连接、子查询
内连接:相当于查询A、B交集部分数据
外连接:左外连接————查询左表所有数据,以及两张表交集部分数据,右外连接————查询右表所有数据,以及两张表交集部分数据
自链接:当前表与自身的连接查询,自链接必须使用别名
内连接查询语法:
隐式内连接:select 字段列表 from 表1,表2 where 条件;
显式内连接:select 字段名 from 表1 [inner] join 表2 on 连接条件;
隐式
select emp.name,dept.name from emp,dept where emp.dept_id = dept.id;
#显式
select emp.name,dept.name from emp inner join dept on emp.dept_id = dept.id;