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

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

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.mzph.cn/bicheng/73428.shtml

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

相关文章

手写一个简易版的tomcat

Tomcat 是一个广泛使用的开源 Servlet 容器&#xff0c;用于运行 Java Web 应用程序。深入理解 Tomcat 的工作原理对于 Java 开发者来说是非常有价值的。本文将带领大家手动实现一个简易版的 Tomcat&#xff0c;通过这个过程&#xff0c;我们可以更清晰地了解 Tomcat 是如何处理…

VSTO(C#)Excel开发8:打包发布安装卸载

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

如何逐步迭代衍生出一个网络安全产品

逐步迭代衍生出一个网络安全产品需要结合市场需求、技术趋势和用户反馈&#xff0c;通过系统化的开发和优化过程来实现。以下是逐步迭代的详细步骤&#xff1a; 1. 确定市场需求和产品定位 市场调研&#xff1a;分析当前网络安全市场的痛点和趋势&#xff0c;如云安全、零信任、…

uni-app打包h5并部署到nginx,路由模式history

uni-app打包有些坑&#xff0c;当时运行的基础路径填写了./&#xff0c;导致在二级页面刷新之后&#xff0c;页面直接空白。就只能换一个路径了&#xff0c;nginx也要跟着改&#xff0c;下面是具体步骤。 manifest.json配置web 运行路径写/h5/&#xff0c;或者写你们网站的目…

Ceph(1):分布式存储技术简介

1 分布式存储技术简介 1.1 分布式存储系统的特性 &#xff08;1&#xff09;可扩展 分布式存储系统可以扩展到几百台甚至几千台的集群规模&#xff0c;而且随着集群规模的增长&#xff0c;系统整体性能表现为线性增长。分布式存储的水平扩展有以下几个特性&#xff1a; 节点…

Linux驱动开发实战(五):Qt应用程序点RGB灯(保姆级快速入门!)

Linux驱动开发实战&#xff08;五&#xff09;&#xff1a;Qt应用程序点RGB灯&#xff08;保姆级快速入门&#xff01;&#xff09; 文章目录 Linux驱动开发实战&#xff08;五&#xff09;&#xff1a;Qt应用程序点RGB灯&#xff08;保姆级快速入门&#xff01;&#xff09;前…

Docker安装Kafka(内含zookeeper)

因为kafka是基于zookeeper做的&#xff0c;所以必须要有zookeeper 一、Zookeeper 1.拉取镜像 docker pull zookeeper:3.7.02.运行 docker run --restartalways \--log-driver json-file \--log-opt max-size100m \--log-opt max-file2 \--name zookeeper -p 2181:2181 \-v…

芯谷D8563TS实时时钟/日历芯片详解可替代PCF8563

概述 芯谷D8563TS是一款低功耗CMOS实时时钟/日历芯片&#xff0c;广泛应用于移动电话、便携式仪器、传真机和电池供电产品等领域。该芯片通过两线双向IC总线进行数据传输&#xff0c;最大总线速度为400 kbits/s。D8563TS内置了自动递增的字地址寄存器&#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 查…

MoonSharp 文档五

目录 13.Coroutines&#xff08;协程&#xff09; Lua中的协程 从CLR代码中的协程 从CLR代码中的协程作为CLR迭代器 注意事项 抢占式协程 14.Hardwire descriptors&#xff08;硬编码描述符&#xff09; 为什么需要“硬编码” 什么是“硬编码” 如何进行硬编码 硬编…

【初级篇】如何使用DeepSeek和Dify构建高效的企业级智能客服系统

在当今数字化时代,企业面临着日益增长的客户服务需求。使用Dify创建智能客服不仅能够提升客户体验,还能显著提高企业的运营效率。关于DIfy的安装部署,大家可以参考之前的文章: 【入门级篇】Dify安装+DeepSeek模型配置保姆级教程_mindie dify deepseek-CSDN博客 AI智能客服…

【网络编程】HTTP网络编程

13.1 HTTP 简介 HTTP(Hyper Text Transfer Protocol,超文本传输协议)是用于从万维网(WWW:World Wide Web) 服务器(简称Web 服务器)传输超文本到本地浏览器的传送协议&#xff0c;基于TCP/IP 通信协 议来传递数据 (HTML 文件、图片文件、查询结果等)。 13.2 HTTP 的工作原理 …

用Scrum敏捷的视角看《哪吒2》的创作

去年我们公司邀请Scrum中文网的老师培训了敏捷开发课程&#xff0c;让我对敏捷有了更深入的理解。前阵子我参加了scrum中文网的一个直播&#xff0c;老师分享了敏捷在个人领域或生活其他领域的应用&#xff0c;很有意思。因为我学习敏捷&#xff0c;除了应用到本身软件研发的工…

Docker+Flask 实战:打造高并发微服务架构

DockerFlask 实战&#xff1a;打造高并发微服务架构 今天我们要深入探讨一个非常热门且实用的主题&#xff1a;基于 Docker 部署 Python Flask 应用。Docker 作为当下最流行的容器化技术&#xff0c;已经广泛应用于各种开发和部署场景&#xff0c;尤其是在微服务架构中。而 Fl…

Linux find 命令完全指南

find 是 Linux 系统最强大的文件搜索工具&#xff0c;支持 嵌套遍历、条件筛选、执行动作。以下通过场景分类解析核心用法&#xff0c;涵盖高效搜索、文件管理及高级技巧&#xff1a; 一、基础搜索模式 1. 按文件名搜索&#xff08;精确/模糊匹配&#xff09; <BASH> f…

【量化策略】趋势跟踪策略

【量化策略】趋势跟踪策略 &#x1f680;量化软件开通 &#x1f680;量化实战教程 技术背景与应用场景 在金融市场中&#xff0c;趋势跟踪策略是一种基于市场趋势进行交易的量化投资方法。该策略的核心思想是“顺势而为”&#xff0c;即认为市场价格会沿着一定的方向持续移…

AI自动化、资本短视、三输与破局

当前AI应用中的一个深层矛盾&#xff1a;工程师使用AI将很专业的任务变成小白可以操作的工作&#xff0c;然后资本方给小白很少的钱把工程师裁掉了&#xff0c;然而小白不懂底层&#xff0c;出问题几乎无法修复。由此&#xff0c;技术普及与专业能力之间的断层引发了"三输…

Python数据分析之数据可视化

Python 数据分析重点知识点 本系列不同其他的知识点讲解&#xff0c;力求通过例子让新同学学习用法&#xff0c;帮助老同学快速回忆知识点 可视化系列&#xff1a; Python基础数据分析工具数据处理与分析数据可视化机器学习基础 四、数据可视化 图表类型与选择 根据数据特…

简述计算机网络中的七层模型和四层模型

在计算机网络中&#xff0c;网络协议栈的设计通常采用分层结构来处理不同的通信任务。常见的分层结构有OSI七层模型和TCP/IP四层模型。虽然它们的层次数量不同&#xff0c;但本质上都在解决如何有效地进行计算机间通信。本文将分别介绍这两种结构的功能和各层的协议。 一、OSI七…

2025高频面试算法总结篇【持续更新中】

文章目录 递归&回溯131. 分割回文串面试题 08.12. 八皇后 动态规划72编辑距离5. 最长回文子串279. 完全平方数300. 最长递增子序列 递归&回溯 131. 分割回文串 回溯思路&#xff1a; 临界条件&#xff1a; if (start s.length) > 保存 循环遍历这个字串 for (int…