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