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

embedded/2025/3/14 6:22:47/

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

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.ppmy.cn/embedded/172427.html

相关文章

基于小波分析法的行波测距判断故障及定位故障Matlab仿真

微♥&#xff1a;“电击小子程高兴的MATLAB小屋”获取巨额优惠 1.模型简介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2017Ra&#xff09;软件。建议采用matlab2017 Ra及以上版本打开。&#xff08;若需要其他版本可联系代为转换&#xff09; 2.建模&#xff1a…

如何从零编写自己的.NET IoT设备驱动

本文将以 NV3030B LCD 设备驱动为例详细介绍如何从零开始一个.NET IoT设备编写驱动。这里我们使用树莓派作为硬件平台&#xff0c;并参考.NET IOT 官方的 Ili934x TFT LCD 驱动库。 1. 背景 在前面的 《使用.NET玩转IOT的入门建议》 文章中&#xff0c;我们提到.NET IOT 开发驱…

市场价格波动的影响因素及交易策略优化

市场价格波动的影响因素及交易策略优化 在市场交易过程中&#xff0c;价格波动是不可避免的现象。不同的交易者会基于市场走势、技术分析和资金管理制定不同的交易策略。本文将分析市场价格波动的关键影响因素&#xff0c;并探讨优化交易策略的方法&#xff0c;以帮助交易者更有…

3.JVM-内部结构

1.栈结构 1.1 动态链接 栈中的对象指向堆中的实际引用 符号引用: 比如一个类的名称 直接引用: 具体堆中数据信息 1.2 方法返回 栈中上一层的结果和下一层的指令 1.3 操作数栈 1.4 局部变量 该线程中需要的变量 2. 虚拟机栈是如何工作 程序计数器:存当前执行到那一步 操作…

Windows 图形显示驱动开发-WDDM 3.0功能- IOMMU DMA 重新映射(一)

概述 直到 WDDM 3.0&#xff0c;Dxgkrnl 仅支持通过 1:1 物理重新映射实现 IOMMU 隔离&#xff0c;这意味着 GPU 访问的逻辑页被转换为相同的物理页码。 IOMMU DMA 重新映射允许 GPU 通过不再以 1:1 映射的逻辑地址访问内存。 相反&#xff0c;Dxgkrnl 能够提供逻辑上连续的地…

PGSQL基本使用

PGSQL基本使用 文章目录 PGSQL基本使用日期转换长度不够补数获取上下行取连续的开始和结束的值 日期转换 格式说明YYYY年MM月DD日hh2424小时制mi分钟ss秒 -- 日期字符串转指定日期字符串 -- 20250101123000 转为 2025-01-01 12:30:00 select to_char(to_timestamp(2025010112…

江科大51单片机笔记【15】直流电机驱动(PWM)

写在前言 此为博主自学江科大51单片机&#xff08;B站&#xff09;的笔记&#xff0c;方便后续重温知识 在后面的章节中&#xff0c;为了防止篇幅过长和易于查找&#xff0c;我把一个小节分成两部分来发&#xff0c;上章节主要是关于本节课的硬件介绍、电路图、原理图等理论…

vscode 好用插件

一、通用效率类 1. Auto Rename Tag 在编写 HTML 或 XML 代码时&#xff0c;当你修改一个标签的名称&#xff0c;它会自动同步修改对应的结束标签&#xff0c;节省了手动修改的时间&#xff0c;提高了代码的准确性和编写效率。 2. Bracket Pair Colorizer 为代码中的括号对…