mysql函数、约束、多表查询命令

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;

 

 

​​​​​​​

猜你喜欢

转载自blog.csdn.net/yahid/article/details/123600228
今日推荐