MySQL再次基础 向初级工程师迈进

news2025/3/15 2:48:28

作者:在计算机行业找不到工作的大四失业者

Run run run ! ! !  

1、MySQL概述

 1.1数据库相关概念

  1.2MySQL数据库

2、SQL

 2.1SQL通用语法

  • SQL语句可以单行或多行书写,以分号结尾。
  • SQL语句可以使用空格/缩进来增强语句的可读性。
  • MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
  • 注释:单行注释:--注释内容 或#注释内容(MySQL特有),多行注释: /*注释内容 */ 

2.2 DDL 

数据定义语言

表的创建

 通过desc 查看表

通过show create table 来查询建表语句 。

 对于ENGINE=InnoDB,这个会在之后详细的讲解;CHARSET = utf8MB4 就是默认的字符集;COLLATE是它的一个排序规则。

数据类型

数值类型: 

字符串类型: 

日期类型: 

测试(根据需求创建表设计合理的数据类型和长度):

create table emp(
	id int comment '编号',
    workno varchar(10) comment '员工工号',
    workname varchar(10) comment '员工姓名',
    gender char(1) comment '性别',
    age tinyint unsigned comment '年龄',
    idcard char(18) comment '身份证号',
    entrydata date comment '入职时间'
)comment '员工表';

可以通过desc查看表的结构:
 

 查看建表语句,通过show create table

 DDL-表操作-修改

添加字段:

alter table emp add nickname varchar(20) comment '昵称';

 修改字段:

① 修改字段类型:

alter table emp modify nickname varchar(30);

② 修改字段名和字段类型:

alter table emp change nickname username varchar(30) comment '用户名';

将emp表的nickname字段修改为udername,类型为varchar(30)

删除字段:

alter table emp drop username;

将emp中的字段username删除。

修改表名:

alter table emp rename to employee;

将表名字修改为employee。 

 删除表:

drop table 表名;

2.3 DML

用于完成数据的增删改

  • insert 添加数据
  • update 修改数据
  • delete 删除数据

添加数据:

insert into employee values(1, '1', 'Itcast', '男', 10, '123456789101', '2000-01-01');

修改数据:

-- 修改id为1 的数据,将name修改为cce

update employee set workname = 'cce' where id = 1;
select * from employee;


-- 修改id为1 的数据,将name修改为cce,gender 修改为女

update employee set workname = 'cce', gender = '女' where id = 1;
select * from employee;


-- 将所有的员工入职日期修改为2008-01-01

SET SQL_SAFE_UPDATES = 0;
update employee set entrydata = '2008-01-01';
select * from employee;

删除数据:

insert into employee values(2, '2', 'cce1', '男', 10, '123456789134', '2004-01-01');
delete from employee where gender = '女';
select * from employee;

2.4 DQL

DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记录。查询关键字:SELECT。

2.4.1基本查询


-- 1.查询指定字段 name,workno,age 返回

select workname, workno, age from emp; 

-- 2.查询所有字段返回

select * from emp; 

-- 3.查询所有员工的工作地址,起别名

select workaddress as '工作地址' from emp; 

-- 4.查询公司员工的上班地址(不要重复)

select distinct workaddress as '工作地址' from emp; 

2.4.2 条件查询 where

--1.查询年龄等于 88 的员工

select * from emp where age = 88;

--2.查询年龄小于 20 的员工信息

select * from emp where age < 20;

--3.查询年龄小于等于 20 的员工信息

select * from emp where age <= 20;

--4.查询没有身份证好的员工信息

select * from emp where idcard is null;

--5.查询有身份证号的员工信息

select * from emp where idcard is not null;

--6.查询年龄不等于 88 的员工信息

select * from emp where age !=88;

--7.查询年龄在15岁(包含)到20岁(包含)之间的员工信息

select * from emp where age >=15 and age <=20;

--8.查询性别为女且年龄小于 25岁的员工信息

select * from emp where gender = '女' and age <25;

--9,查询年龄等于18或20或40 的员工信息

select * from emp where age in(18,20,40);

--10.查询姓名为两个字的员工信息

select * from emp where workname like '__';

-- 11.查询身份证号最后一位是X的员工信息

select * from emp where idcard like '%X';

2.4.3 聚合函数 count max min avg sum

-- 1.统计该企业员工数量

select count(*) from emp;

-- 2.统计该企业员工的平均年龄

select avg(age) from emp;

-- 3.统计该企业员工的最大年龄

select max(age) from emp;

-- 4.统计该企业员工的最小年龄

select min(age) from emp;

-- 5.统计西安地区员工的年龄之和

select sum(age) from emp where workaddress = '西安';

2.4.4分组查询 group by

-- 1. 根据性别分组,统计性员工和女性员工的数量。

select gender, count(*) from emp group by gender;

-- 2. 根据性别分组,统计男性员工和女性员工的平均年龄。

select gender, avg(age) from emp group by gender;


-- 3. 查询年龄小于45的员工 ,并根据工作地址分组,获取员工数量大于等于3的工作地址。

select workaddress, count(*) 
from emp 
where age < 45 
group by workaddress 
having count(*) >= 3; 

在分组之间过滤使用where,在分组之后过滤使用having。

2.4.5排序查询 oder by

-- 1.根据年龄对公司的员工进行升序排序

select * from emp oder by age asc;

-- 2.根据入职时间,对员工进行降序排序

select * from emp oder by netrydate desc;

-- 3.根据年龄对公司的员工进行升序排序,年龄相同,再按照入职时间进行降序排序

select * from emp oder by age asc, entrydate desc;

2.4.6分页查询 limit

--1.查询第1页员工数据,每页展示10条记录

select * from emp limit 0,10;

也可以下面的

select * from emp limit 10;

--2.查询第2页员工数据,每页展示10条记录

select * from emp limit 10,10;

2.4.7 DQL语句的总结测试

1.查询年龄为20,21,22,23岁的女性员工信息。

select * from emp where gender = '女' and age in(20,21,22,23);

2.查询性别为男 ,并且年龄在 20-40 岁(含)以内的姓名为三个字的员工。

select * from emp 
where gender = '男' 
and age >=40 
and age <=40 
and workname like '___';

3.统计员工表中,年龄小于60岁的,男性员工和女性员工的人数。

select gender, count(*) 
from emp 
where age<60 
group by gender;

4.查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序。

select workname, age from emp 
where age <= 35
order by age asc, entrydate desc; 

5、查询性别为男,且年龄在20-40 岁(含)以内的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序。

select * from emp 
where gender = '男'
and age between 20 and 40
order by age asc, entrydate asc
limit 5;

2.4.8 DQL的执行顺序

2.5 DCL

管理用户:

在mysql中,其用户所拥有的权限信息都存放在系统数据库sysql中的user表

其user表中的内容如下

创建用户 itcast ,只能够在当前主机localhost访问,密码123456;

create user "itcast'@'localhost' identified by'123456';

创建用户 heima ,可以在任意主机访问该数据库,密码123456;

create user 'heima'@'%'identified by'123456';

修改用户 heima 的访问密码为1234;

alter user 'heima'@'%'identified with mysql_native_password by '1234';

删除itcast@localhost用户

drop user 'itcast'@'localhost;

权限控制:

--查询权限
show grants for 'heima'@'%';

--授子权限
grant all on itcast.* to 'heima'@'%';

-撤销权限
revoke all on itcast.* from 'heima'@'%';

3、函数

函数:是指一段可以直接被另一段程序调用的程序或代码。

字符串函数:

--concat
select concat('Hello',· MySQL');

--lower
select lower('Hello');

--upper
select upper('Hello');

--lpad将01填充到长度为5,使用-填充,结果:---01
select lpad('01',5,'-');

--rpad将01填充到长度为5,使用-填充,结果:01---
select lpad('01',5,'-');

--trim只去除头部和尾部的空格
select trim(' Hello MySQL ');

--substring,结果是Hello
select trim('Hello MySQL', 1, 5);

由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如:1号员工的工号应该为00001.

update emp 
set workno = lpad(workno,5,'0');

数值函数:
 

通过数据库的函数,生成一个六位数的随机验证码, 

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

日期函数:

 案例:查询所有员工的入职天数,并根据入职天数倒序排序。

select name, datediff(curdate(),entrydate) from emp;

流程控制函数:

case when then else end
-- 需求:查询emp表的员工姓名和工作地址(北京上海---->一线城市,其他----> 二线城市)

select
name
( case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end ) as '工作地址'
from emp; 

函数测试: 

4、约束

概念:

约束是作用于表中字段上的规则,用于限制存储在表中的数据,其目的是保证数据库中数据的正确、有效性和完整性。

约束演示:

依次使用的约束:

  • primary key, auto_increment
  • not null, unique
  • check
  • default
create table user(
    id int primary key auto_increment comment '主键',
    name varchar(10) not null nique comment '姓名',
    age int check( age> 0 && age <= 120 ) comment '年龄',
    status char(1) default '1' comment '状态',
    gender char(1) comment '性别'
)comment '用户表';

外键约束:

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

注意 : 目前上述的两张表,在数据库层面,并未建立外键关联,所以是无法保证数据的一致性和完整性的。 

5、多表查询

5.1多表关系

5.2多表查询概述

消除笛卡尔积

select * from emp, dept 
where emp.dept_id = dept.id;

 多表查询的分类:

5.3内连接

两张表的交集

-- 1.查询每一个员工的姓名,及关联的部门的名称(隐式内连接实现)

select emp.name, dept.name 
from emp, dept 
where emp.dept_id = dept.id;

-- 2.查询每一个员工的姓名,及关联的部门的名称(显式内连接实现)

select * from emp inner join dept 
on emp.dept_id = dept.id;

其中inner关键字可以被省略。

5.4外连接

--1.查emp表的所有数据,和对应的部门信息(左外连接)

select emp.*, dept.name from emp 
left outer join dept 
on emp.dept_id = dept.id;

左外连接会完全包含左表的信息。outer可以被省略。

--2.查询dept表的所有数据,和对应的员工信息(右外连接)

select dept.*, emp.* from emp 
right outer join dept 
on emp.dept_id = dept.id;

右外连接会完全包含右表的信息。outer可以被省略。

5.5自连接

-- 1.查询员工及其所属领导的名字

select e1.name, e2.name from emp e1, emp e2 
where e1.managerid = e2.id;

-- 2.查询所有员工emp及其领导的名字emp,如果员工没有领导,也需要查询出来

select e1.name, e2.name from emp e1 
left join emp e2 
on e1.managerid = e2.id;

5.6联合查询

-- 1、将薪资低于5000的员工,和年龄大于50 岁的员工全部查询出来

select * from emp where salary < 5000
union all
select * from emp where age > 50;

union 会去重。同时注意union的时候字段需要相同,两个合并的字段一致

5.7 子查询

标量子查询

-- 1.查询“销售部”的所有员工信息

--查询销售部门的id
select id from dept where name = "销售部"; 

--根据销售部门id信息再去查询员工信息
select * from emp where dept_id = "4";

合起来:

select * from emp 
where dept_id = (select id from dept where name = "销售部");

-- 2.查询在"方东白”入职之后的员工信息

--查询东方白入职之后的员工信息
select entrydate from emp where name = "方东白";

--查询指定入职日期之后入职的员工信息
select * from emp where entrydate > '2009-02-12';

合起来:

select * from emp 
where entrydate > (select entrydate from emp where name = "方东白");

列子查询:

-- 1.查询“销售部”和“市场部”的所有员工信息

select * from emp 
where dept_id 
in (select id from dept where name = "销售部" or name = "市场部");

-- 2.查询比财务部所有人工资都高的员工信息

--先找到财务部的id
select id from dept where name = "财务部";

--再找到财务部所有人的薪水
select salary from emp 
where dept_id = (select id from dept where name = "财务部");

--再找比财务部所有人工资都高的员工信息
select * from emp 
where salary > all(select salary 
from emp where dept_id = (select id 
from dept where name = "财务部"));

-- 3.查询比研发部其中任意一人工资高的员工信息

--找到研发部门的id
select id from dept where name = "研发部门";

--找到研发部门所有人的薪水
select salary from emp 
where dept_id = (select id from dept where name = "研发部门");

--找到比研发部门其中任意一个人工资高的员工信息
select * from emp where salary > any(select salary from emp 
where dept_id = (select id from dept where name = "研发部门"));

行子查询:

--1.查询与“张无忌”的薪资及直属领导相同的员工信息

--查询张无忌的薪资极其直属领导
select salary, manager_id 
from emp 
where name = "张无忌";

--薪资极其直属领导相同的员工信息
select * from emp 
where (salary,manager_id) = (select salary,manager_id 
from emp 
where name = "张无忌")

表子查询:

-- 1.查询与“鹿杖客",“宋远桥”的职位和薪资相同的员工信息

--查询鹿杖客和宋远桥的职位和薪资
select job,salary from emp 
where name = "鹿杖客" or name = "宋远桥";

--查询鹿杖客和宋远桥的职位和薪资相同的员工信息
select *from emp where (job,salary) 
in (select job,salary from emp 
where name = "鹿杖客" or name = "宋远桥")

-- 2.查询入职日期是“2006-01-01”之后的员工信息,及其部门信息

--查入职是“2006-01-01”之后的员工信息
select * from emp where entrydate > '2006-01-01';

--查入职是“2006-01-01”之后的员工信息极其部门
select * from 
(select * from emp where entrydate > '2006-01-01') e left join dept 
on e.dept_id = dept.id;

6、事务

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败

例如银行转账:

事务操作:

--设置为手动提交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;

事务的四大特定:

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
  • 隔离性(lsolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

并发事务问题:

事务的隔离级别:

至此你已经成为了一名初级工程师。

山高路远,别太功利导致忘了欣赏路边的风景!

享受它,感受自己的进步.........

2025/3/13

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2315187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 Doris 和 Hudi

作为一种全新的开放式的数据管理架构&#xff0c;湖仓一体&#xff08;Data Lakehouse&#xff09;融合了数据仓库的高性能、实时性以及数据湖的低成本、灵活性等优势&#xff0c;帮助用户更加便捷地满足各种数据处理分析的需求&#xff0c;在企业的大数据体系中已经得到越来越…

城市林业的无声革命:人工智能与古老生态学如何重新设计城市

城市林业的无声革命&#xff1a;人工智能与古老生态学如何重新设计城市 在摩天大楼的阴影下&#xff0c;一场静悄悄的变革正在发生——它融合了硅芯片与古老根系&#xff0c;算法与原住民智慧。 作者&#xff1a;保罗桑杜 作者利用 PicLumen 创建的图像 城市森林不再只是城市…

Linux第七讲:基础IO

Linux第七讲&#xff1a;基础IO 1.什么是文件2.文件操作的复习2.1文件基本操作复习2.2将信息输出到显示器&#xff0c;你有哪种方法2.3stdin、stdout、stderror2.4细节问题讲解 3.系统文件IO3.1open函数使用3.1.1理解标志位3.1.2权限问题3.1.3write和read接口介绍3.1.4谈谈fd以…

力扣热题 100:多维动态规划专题经典题解析

系列文章目录 力扣热题 100&#xff1a;哈希专题三道题详细解析(JAVA) 力扣热题 100&#xff1a;双指针专题四道题详细解析(JAVA) 力扣热题 100&#xff1a;滑动窗口专题两道题详细解析&#xff08;JAVA&#xff09; 力扣热题 100&#xff1a;子串专题三道题详细解析(JAVA) 力…

【Unity】在项目中使用VisualScripting

1. 在packagemanager添加插件 2. 在设置中进行初始化。 Edit > Project Settings > Visual Scripting Initialize Visual Scripting You must select Initialize Visual Scripting the first time you use Visual Scripting in a project. Initialize Visual Scripting …

Pytest自动化测试框架pytest-xdist分布式测试插件

平常我们功能测试用例非常多时&#xff0c;比如有1千条用例&#xff0c;假设每个用例执行需要1分钟&#xff0c;如果单个测试人员执行需要1000分钟才能跑完&#xff1b; 当项目非常紧急时&#xff0c;会需要协调多个测试资源来把任务分成两部分&#xff0c;于是执行时间缩短一…

文件解析漏洞靶场解析全集详解

lls解析漏洞 目录解析 在网站的下面将一个1.asp文件夹&#xff0c;在里面建一个2.txt文件在里面写入<% -now()%>这个显示时间的代码&#xff0c;再将文件名改为2.jpg。 发现2.jpg文件以asp形式执行 畸形文件解析 将2.jpg文件移到网站的下面与1.asp并列&#xff0c;将名…

【一次成功】Win10本地化单机部署k8s v1.31.2版本及可视化看板

【一次成功】Win10本地化单机部署k8s v1.31.2版本及可视化看板 零、安装清单一、安装Docker Desktop软件1.1 安装前<启用或关闭Windows功能> 中的描红的三项1.2 查看软件版本1.3 配置Docker镜像 二、更新装Docker Desktop三、安装 k8s3.1 点击启动安装3.2 查看状态3.3 查…

Vue项目搜索引擎优化(SEO)终极指南:从原理到实战

文章目录 1. SEO基础与Vue项目的挑战1.1 为什么Vue项目需要特殊SEO处理&#xff1f;1.2 搜索引擎爬虫工作原理 2. 服务端渲染&#xff08;SSR&#xff09;解决方案2.1 Nuxt.js框架实战原理代码实现流程图 2.2 自定义SSR实现 3. 静态站点生成&#xff08;SSG&#xff09;技术3.1…

【性能测试】Jmeter下载安装、环境配置-小白使用手册(1)

本篇文章主要包含Jmeter的下载安装、环境配置 添加线程组、结果树、HTTP请求、请求头设置。JSON提取器的使用&#xff0c;用户自定义变量 目录 一&#xff1a;引入 1&#xff1a;软件介绍 2&#xff1a;工作原理 3&#xff1a;安装Jmeter 4&#xff1a;启动方式 &#xf…

【Matlab仿真】如何解决三相交流信号源输出波形失真问题?

问题描述 如标题所示&#xff0c;在搭建simulink模型过程中&#xff0c;明明模型搭建的没有问题&#xff0c;但是输出的波形却不是理想的正弦波&#xff0c;影响问题分析。 问题分析 以三相交流信号源输出波形为例&#xff0c;输出信号理应为三相正弦量&#xff0c;但是仿真…

Fiora聊天系统本地化部署:Docker搭建与远程在线聊天的实践指南

文章目录 前言1.关于Fiora2.安装Docker3.本地部署Fiora4.使用Fiora5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 这个通讯软件泛滥的时代&#xff0c;每天都在刷着同样的朋友圈、看着千篇一律的表情包&#xff0c;是不是觉得有点腻了&#…

metersphere接口测试(1)使用MeterSphere进行接口测试

文章目录 前言接口文档单接口测试环境配置梳理接口测试场景测试接口 接口自动化怎么写复用性高的自动化测试用例 总结 前言 大汉堡工作第203天&#xff0c;本篇记录我第一次接触接口测试任务&#xff0c;最近有些懈怠啊~ 接口文档 首先就是接口地址&#xff0c;接口测试时用…

【实战ES】实战 Elasticsearch:快速上手与深度实践-8.2.2成本优化与冷热数据分离

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 8.2.2AWS OpenSearch Serverless 成本优化与冷热数据分离深度实践1. 成本构成分析与优化机会识别1.1 Serverless模式成本分布1.2 冷热数据特征分析数据特征矩阵 2. 冷热数据…

MTK Android12 安装app添加密码锁限制

提示&#xff1a;通过安装前输入密码的需求&#xff0c;来熟悉了解PMS 基本的安装流程 文章目录 一、需求实现需求原因提醒 二、UML图-类图三、参考资料四、实现效果五、需求修改点修改文件及路径具体修改内容 六、源码流程分析PMS的复杂性代码量实现aidl 接口PackageManagerSe…

[数据结构]堆详解

目录 一、堆的概念及结构 二、堆的实现 1.堆的定义 2堆的初始化 3堆的插入 ​编辑 4.堆的删除 5堆的其他操作 6代码合集 三、堆的应用 &#xff08;一&#xff09;堆排序&#xff08;重点&#xff09; &#xff08;二&#xff09;TOP-K问题 一、堆的概念及结构 堆的…

LInux中常用的网络命令

配置 IP 地址 1.1 配置 IP 地址 IP 地址是计算机在互联网中唯一的地址编码。每台计算机如果需要接入网络和其他计算机进行数据通信&#xff0c;就必须配置唯一的公网 IP 地址。 配置 IP 地址有两种方法&#xff1a; 1&#xff09;setup 工具 2&#xff09;vi /etc/sysconf…

怎么实现: 大语言模型微调案例

怎么实现: 大语言模型微调案例 目录 怎么实现: 大语言模型微调案例输入一个反常识的问题:首都在北京天安门之后对输出模型进行测试:首都在北京天安门微调代码:测试微调模型代码:微调输出模型结构输出模型参数大小对比Qwen 2.5_0.5:53MB输出模型:951MB 是一样的,没有进行…

深入理解 MySQL 锁:基于 InnoDB 的并发控制解析

在数据库并发访问管理中&#xff0c;MySQL 提供了强大的锁机制来保证数据的一致性和完整性。作为默认存储引擎的 InnoDB&#xff0c;为 MySQL 带来了细粒度的锁控制&#xff0c;使其成为高并发应用的理想选择。本文将深入探讨 MySQL 的锁类型、分类、应用场景及其对性能的影响&…