作者:在计算机行业找不到工作的大四失业者
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