MySQL笔记2(函数,约束,多表查询,事务)

一、函数

  • 指一段可以直接被另一程序调用的程序或代码

1、字符串函数

在这里插入图片描述
用法:在这里插入图片描述

-- 函数演示
-- concat
select concat('Hello',' mysql');
-- lower
select lower('HEllo');
-- upper
select upper('HEllo');
-- lpad
select lpad('01',5,'-');
-- rpad
select rpad('01',5,'-');
-- trim
select trim(' Hello   mysql ');
-- substring
select substring('hello mysql',1,5);-- 索引从1开始

1.1、练习

-- 练习
-- 1、由于业务需求变更,企业员工的工号,统一为5位数,不足的全部在前面加0,比如1为00001
update emp set workno = lpad(workno,5,'0');

2、数值函数

在这里插入图片描述

-- 数值函数
select ceil(1.1);
select floor(1.1);
select mod(3,4);
select rand();
select round(2.345,2);

2.1、练习

-- 练习--通过数据库的函数,生成一个六位数的随机验证码
select lpad(round(rand()*1000000,0),6,'0');

3、日期函数

在这里插入图片描述

-- 日期函数
select curdate();
select curtime();
select now();
select year(now());
select month(now());
select day(now());
select date_add(now(),INTERVAL 70 DAY);
select datediff('2022-12-01','2022-11-01');

3.1、练习

-- 练习--查询所有员工的入职天数,并根据入职天数倒序排序
select name,datediff(curdate(),entrydate) as 'entrydays' from emp order by entrydays desc;

4、流程函数

在这里插入图片描述

-- 流程函数
-- if
select if(true ,'ok','error');
-- ifnull
select ifnull('','default');
select ifnull(null,'default');
-- case when then else and
-- 需求:查询emp表的员工姓名和工作地址(北京/上海---->一线城市,其他为二线城市)
select
    name,
      (case workadress when '北京' then '一线城市' when '上海' then '一线城市'else'二线城市'end)as '工作地址'
 from emp;

4.1、练习

-- 练习
-- >=85,优秀
-- >=60,及格
-- 否则不及格
create table score(
    id int comment 'ID',
    name varchar(20) comment '姓名',
    math int comment '数学',
    english int comment '英语',
    chinese int comment '语文'
)comment '学员成绩表';

insert into score(id, name, math,english, chinese) values (1,'TOM',67,88,95),
                                                     (2,'ROSE',23,66,98),
                                                     (3,'JACK',56,98,76);

select id,
       name,
     ( case when math>=85 then '优秀' when math>=60 then '及格' else '不及格' end) '数学',
     ( case when english>=85 then '优秀' when english>=60 then '及格' else '不及格' end) '英语',
     ( case when  chinese>=85 then '优秀' when  chinese>=60 then '及格' else '不及格' end) '语文'
       from score;

二、约束

1、概述

  1. 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据
  2. 目的:保证数据库中的数据的正确,有效和完整
  3. 分类:

在这里插入图片描述

  1. 注意:约束是作用于表中字段的,可以在创建表或修改表的时候添加约束。

2、约束演示

在这里插入图片描述
在这里插入图片描述

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) values ('TOM1',19,'1','男'),('TOM2',25,'0','男');
insert into user(name, age, status, gender) values ('TOM3',22,'1','男');

insert into user(name, age, status, gender) values (null,19,'1','男');-- 出错,有null
insert into user(name, age, status, gender) values ('TOM4',80,'1','男');
insert into user(name, age, status, gender) values ('TOM5',-1,'1','男');-- 出错
insert into user(name, age, status, gender) values ('TOM6',121,'1','男');-- 出错
insert into user(name, age, status, gender) values ('TOM7',120,'1','男');
insert into user(name, age, status, gender) values ('TOM7',120,'1','男');-- 出错,有两个TOM7
insert into user(name, age,  gender) values ('TOM8',120,'男');
insert into user(name, age,  gender) values ('TOM8',120,'男');-- 出错,有两个TOM8
insert into user(name, age,  gender) values ('TOM9',33,'男');

在这里插入图片描述
对于上述主键出现的序号不是单个增加的问题是因为:在插入数据的时候第二个TOM7,会因为先向数据库提供信息但由于对姓名有约束unique,只会向数据库反馈,然后运行的时候出错,但是数据库中已经会增加一个主键,从而使TOM8的主键是7,同理第二个TOM8也是一样,导致TOM9主键为9

3、外键约束

  • 外键用来让两张表的数据之间建立联系,从而保证数据的一致性和完整性
    在这里插入图片描述

1、添加外键语法
在这里插入图片描述

2、删除外键语法
在这里插入图片描述

-- 外键约束
-- 准备工作
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 emp2(
    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 '员工表2';

insert into emp2(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 emp2 add constraint fk_emp2_dept_id foreign key (dept_id) references dept(id);

-- 删除外键
alter table emp2 drop foreign key fk_emp2_dept_id;

3.1、外键删除/更新行为

在这里插入图片描述

以cascad和setnull为例:
在这里插入图片描述

-- 外键删除更新行为
alter table emp2 add constraint fk_emp2_dept_id foreign key (dept_id) references dept(id) on update cascade  on delete cascade ;


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

三、多表查询

1、多表关系

1、概述

  • 基本上分为三种:一对多(多对一)
  • 多对多
  • 一对一

(1)一对多(多对一)

在这里插入图片描述

(2)多对多

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(3)一对一

在这里插入图片描述

create table tb_user(
    id int auto_increment primary key comment '主键ID',
    name varchar(10) comment '名字',
    age int comment '年龄',
    gender char(1) comment '1:男,2:女',
    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 '专业',
    primaryschool varchar(50) comment '小学',
    middleschool varchar(50) comment '中学',
    universary 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,'1','18800001111'),
           (null,'冰冰',35,'2','18800002222'),
           (null,'码云',55,'1','18800008888'),
           (null,'李彦宏',50,'1','18800009999');

insert into tb_user_edu(id, degree, major, primaryschool, middleschool, universary, userid) values
            (null,'本科','舞蹈','静安区第一小学','静安区第一中学','北京舞蹈学院',1),
            (null,'硕士','表演','朝阳区第一小学','朝阳区第一中学','北京电影学院',2),
            (null,'本科','英语','杭州市第一小学','杭州市第一中学','杭州师范大学',3),
            (null,'本科','应用数学','阳泉第一小学','阳泉区第一中学','清华大学',4);

2、多表查询概述

在这里插入图片描述
在这里插入图片描述
查询这两张表会出现无效的匹配(如下)
在这里插入图片描述

如何消除无效的笛卡尔积(如下),找出两张表外键关联的地方
在这里插入图片描述
在这里插入图片描述

3、多表查询分类

在这里插入图片描述

(1)内连接

1、语法
在这里插入图片描述

2、隐式内连接演示
在这里插入图片描述
起别名形式:
在这里插入图片描述
如果在emp表中有个人部门为null的不会在下表中显示,因为内连接是两表交替
在这里插入图片描述

3、显式内连接演示
在这里插入图片描述
省略inner
在这里插入图片描述
如果在emp表中有个人部门为null的不会在下表中显示,因为内连接是两表交替
在这里插入图片描述

(2)外连接

1、语法
在这里插入图片描述

2、左外连接演示,可省略outer
在这里插入图片描述
相对于内连接,外连接会显示没有部门的成员
在这里插入图片描述
在这里插入图片描述

3、右外连接演示
在这里插入图片描述
右外连接可变为左外连接
在这里插入图片描述

在这里插入图片描述

(3)自连接

1、语法
在这里插入图片描述

2、演示(一个内连接,一个外连接)
在这里插入图片描述

4、联合查询

  • 对于union查询,就是多次的查询结果合并起来,形成一个新的查询结果集

1、语法
在这里插入图片描述

2、注意
在这里插入图片描述

3、演示(下面一个代码能去重复)
在这里插入图片描述

5、子查询

(1)概念

  • SQL语句中嵌套select语句,称为嵌套查询,又称子查询

(2)分类

在这里插入图片描述

(3)标量子查询

1、概念
在这里插入图片描述

2、演示

(1)案例1
在这里插入图片描述
由两步变为一步:括号里的为子查询在这里插入图片描述

(2)案例2在这里插入图片描述
由两步变为一步:括号里的为子查询
在这里插入图片描述

(4)列子查询

1、概念
在这里插入图片描述

2、演示
(1)案例一
在这里插入图片描述
(2)案例2
在这里插入图片描述

(3)案例3

在这里插入图片描述

(5)行子查询

1、概念
在这里插入图片描述

2、演示
在这里插入图片描述

(6)表子查询

1、概念
在这里插入图片描述

2、演示
在这里插入图片描述
在这里插入图片描述

6、练习

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查询当中既有连接条件和查询条件,直接在连接条件后加and加查询条件,第六问
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第11问注意括号里的一步,重点
在这里插入图片描述
在这里插入图片描述

四、事务

1、简介

在这里插入图片描述
比如:银行转账
在这里插入图片描述
在这里插入图片描述

2、事务操作演示

1、第一种方式
在这里插入图片描述
当设置事务提交方式为0时,需要自己手动提交,如果程序没有错误,则需提交commit表中才能有数据改变。

如果中间有程序出现错误(如下),则需要使用回滚事务rollback将代码退回,这样就能避免数据出现问题

set autocommit = 0;-- 设置为手动提交

-- 转账操作(张三给李四转帐1000)
-- 1、查询张三账户余额
select * from account where name = '张三';
-- 2、将张三账户余额减1000
update account set money = money - 1000 where name = '张三';
程序执行错误 ...
-- 3、将李四账户加1000
update account set money = money + 1000 where name = '李四';
-- 提交事务
commit ;
-- 回滚事务;
rollback ;

2、第二种方式
在这里插入图片描述
原理跟上述一致

-- 方式二
-- 转账操作(张三给李四转帐1000)
start transaction ;
-- 1、查询张三账户余额
select * from account where name = '张三';
-- 2、将张三账户余额减1000
update account set money = money - 1000 where name = '张三';
程序执行错误 ...
-- 3、将李四账户加1000
update account set money = money + 1000 where name = '李四';

-- 提交事务
commit ;
-- 回滚事务
rollback ;

3、事务的四大特性

在这里插入图片描述

4、并发事务问题

在这里插入图片描述
脏读是B事务未提交;
不可重复读是A事务在B事务提交后,读取到的第二次与第一次不同;
幻读亦是B事务提交后。

5、事务隔离级别

✔是会出现这个问题,×是不会出现
在这里插入图片描述

语法:在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值