一.数据库操作-DQL
-- 准备测试数据
INSERT INTO tb_emp (id, username, password, name, gender, image, job, entrydate, create_time, update_time) VALUES
(1, 'jinyong', '123456', '金庸', 1, '1.jpg', 4, '2000-01-01', '2022-10-27 16:35:33', '2022-10-27 16:35:35'),
(2, 'zhangwuji', '123456', '张无忌', 1, '2.jpg', 2, '2015-01-01', '2022-10-27 16:35:33', '2022-10-27 16:35:37'),
(3, 'yangxiao', '123456', '杨逍', 1, '3.jpg', 2, '2008-05-01', '2022-10-27 16:35:33', '2022-10-27 16:35:39'),
(4, 'weiyixiao', '123456', '韦一笑', 1, '4.jpg', 2, '2007-01-01', '2022-10-27 16:35:33', '2022-10-27 16:35:41'),
(5, 'changyuchun', '123456', '常遇春', 1, '5.jpg', 2, '2012-12-05', '2022-10-27 16:35:33', '2022-10-27 16:35:43'),
(6, 'xiaozhao', '123456', '小昭', 2, '6.jpg', 3, '2013-09-05', '2022-10-27 16:35:33', '2022-10-27 16:35:45'),
(7, 'jixiaofu', '123456', '纪晓芙', 2, '7.jpg', 1, '2005-08-01', '2022-10-27 16:35:33', '2022-10-27 16:35:47'),
(8, 'zhouzhiruo', '123456', '周芷若', 2, '8.jpg', 1, '2014-11-09', '2022-10-27 16:35:33', '2022-10-27 16:35:49'),
(9, 'dingminjun', '123456', '丁敏君', 2, '9.jpg', 1, '2011-03-11', '2022-10-27 16:35:33', '2022-10-27 16:35:51'),
(10, 'zhaomin', '123456', '赵敏', 2, '10.jpg', 1, '2013-09-05', '2022-10-27 16:35:33', '2022-10-27 16:35:53'),
(11, 'luzhangke', '123456', '鹿杖客', 1, '11.jpg', 2, '2007-02-01', '2022-10-27 16:35:33', '2022-10-27 16:35:55'),
(12, 'hebiweng', '123456', '鹤笔翁', 1, '12.jpg', 2, '2008-08-18', '2022-10-27 16:35:33', '2022-10-27 16:35:57'),
(13, 'fangdongbai', '123456', '方东白', 1, '13.jpg', 1, '2012-11-01', '2022-10-27 16:35:33', '2022-10-27 16:35:59'),
(14, 'zhangsanfeng', '123456', '张三丰', 1, '14.jpg', 2, '2002-08-01', '2022-10-27 16:35:33', '2022-10-27 16:36:01'),
(15, 'yulianzhou', '123456', '俞莲舟', 1, '15.jpg', 2, '2011-05-01', '2022-10-27 16:35:33', '2022-10-27 16:36:03'),
(16, 'songyuanqiao', '123456', '宋远桥', 1, '16.jpg', 2, '2010-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:05'),
(17, 'chenyouliang', '12345678', '陈友谅', 1, '17.jpg', null, '2015-03-21', '2022-10-27 16:35:33', '2022-10-27 16:36:07'),
(18, 'zhang1', '123456', '张一', 1, '2.jpg', 2, '2015-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:09'),
(19, 'zhang2', '123456', '张二', 1, '2.jpg', 2, '2012-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:11'),
(20, 'zhang3', '123456', '张三', 1, '2.jpg', 2, '2018-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:13'),
(21, 'zhang4', '123456', '张四', 1, '2.jpg', 2, '2015-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:15'),
(22, 'zhang5', '123456', '张五', 1, '2.jpg', 2, '2016-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:17'),
(23, 'zhang6', '123456', '张六', 1, '2.jpg', 2, '2012-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:19'),
(24, 'zhang7', '123456', '张七', 1, '2.jpg', 2, '2006-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:21'),
(25, 'zhang8', '123456', '张八', 1, '2.jpg', 2, '2002-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:23'),
(26, 'zhang9', '123456', '张九', 1, '2.jpg', 2, '2011-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:25'),
(27, 'zhang10', '123456', '张十', 1, '2.jpg', 2, '2004-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:27'),
(28, 'zhang11', '123456', '张十一', 1, '2.jpg', 2, '2007-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:29'),
(29, 'zhang12', '123456', '张十二', 1, '2.jpg', 2, '2020-01-01', '2022-10-27 16:35:33', '2022-10-27 16:36:31');
-- ========================= DQL : 基本查询 =========================
-- 1.查询指定字段 name, entrydate 并返回
select name, entrydate from tb_emp;-- 2.查询返回所有字段
-- (推荐)
select id, username, password, name, gender, image, job, entrydate, create_time, update_time from tb_emp;-- (不推荐: 不直观,性能低)
select * from tb_emp;-- 3.查询所有员工的 name, entrydate, 并起别名(姓名, 入职日期)
select name '姓名', entrydate '入职日期' from tb_emp;-- 4.查询已有的员工关联了哪几种职业(不要重复)
-- distinct 去重复
select distinct job from tb_emp;
-- ========================= DQL : 条件查询 =========================
-- 1.查询 姓名 为 杨逍 的员工
select * from tb_emp where name='杨逍';-- 2.查询 id 小于等于 5 的 员工信息
select * from tb_emp where id <= 5;-- 3.查询 没有分配职务的 员工信息
select * from tb_emp where job is null;-- 4.查询 有职位的 员工信息
select * from tb_emp where job is not null;-- 5.查询 密码不等于 '123456' 的员工信息
select * from tb_emp where password != '123456';
select * from tb_emp where password <> '123456';-- 6.查询 入职日期 在'2000-01-01' (包含) 到 '2010-01-01' (包含) 之间的员工信息'
select * from tb_emp where entrydate between '2000-01-01' and '2010-01-01';select * from tb_emp where entrydate >= '2000-01-01' and entrydate <= '2010-01-01';-- 7.查询 入职日期在 '2000-01-01' (包含) 到 '2010-01-01' (包含) 之间 且性别为 女 的员工信息
select * from tb_emp where entrydate between '2000-01-01' and '2010-01-01' && gender = 2;select * from tb_emp where entrydate >= '2000-01-01' and entrydate <= '2010-01-01' and gender = 2;-- 8.查询 职位是 2 (讲师), 3(班主任), 4(教研主管) 的员工信息
select * from tb_emp where job between 2 and 4;select * from tb_emp where job = 2 or job = 3 or job = 4;select * from tb_emp where job in (2,3,4);-- 9.查询 姓名 为两个字的员工信息
select * from tb_emp where name like '__';-- 10.查询 姓 '张' 的员工信息
select * from tb_emp where name like '张%';
-- ========================= DQL : 条件查询 =========================
-- 聚合函数 : 不对null值运算
-- 1.统计企业员工数量
-- A.count(字段)
select count(id) from tb_emp;-- B.count(常量)
select count(0) from tb_emp;-- C.count(*) --推荐
select count(*) from tb_emp;-- 2.统计企业最早入职的员工 -- min
select min(entrydate) from tb_emp;-- 3.统计企业最晚入职的员工
select max(entrydate) from tb_emp;-- 4.统计企业员工 ID 的平均值 -- avg
select avg(id) from tb_emp;-- 5.统计企业员工 ID 之和 -- sum
select sum(id) from tb_emp;
面试题:
where与having区别:
1.执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而
having是分组之后对结果进行过滤。
2.判断条件不同:where不能对聚合函数进行判断,而having可以。
-- 分组
-- 分组查询:select 字段列表 from 表名 [ where 条件 ] group by 分组字段名 [ having 分组后过滤条件 ];
-- 1.根据性别分组, 统计男性和女性的员工数量
select gender,count(*) from tb_emp group by gender;-- 2.先查询入职时间在 '2015-01-01' (包含) 以前的员工, 并对结果根据职位分组, 获取员工数量大于等于2的职位
select job,count(*) from tb_emp where entrydate <= '2015-01-01' group by job having count(*) >= 2;
-- ========================= DQL : 排序查询 =========================
-- 条件查询:select 字段列表 from 表名 [ where 条件列表 ] [ group by 分组字段 ] order by 字段1 排序方式1 , 字段2 排序方式2 ......
-- ASC:升序(默认值) DESC:降序
-- 1.根据 入职时间,对员工进行升序排序
select * from tb_emp order by entrydate asc;
select * from tb_emp order by entrydate;-- 2.根据 入职时间,对员工进行降序排序
select * from tb_emp order by entrydate desc;-- 3.根据 入职时间,对公司的员工进行升序排序,入职时间相同,在按照 更新时间 进行降序排序
select * from tb_emp order by entrydate asc, update_time desc ;
select * from tb_emp order by entrydate, update_time desc ;
-- ========================= DQL : 分页查询 =========================
-- 分页查询:select 字段列表 from 表名 limit 起始索引, 查询记录数 ;
-- 1.从 起始索引0 开始查询员工数据, 每页显示5条记录
select * from tb_emp limit 0, 5;-- 2.查询 第1页 员工数据,每页展示5条记录
select * from tb_emp limit 0, 5;-- 3.查询 第2页 员工数据,每页展示5条记录
select * from tb_emp limit 5, 5;-- 3.查询 第3页 员工数据,每页展示5条记录
select * from tb_emp limit 10, 5;-- 公式: 起始索引 = (页 - 1) * 条
公式: 起始索引 = (页码 - 1) * 条数
-- 案例一: 按需求完成员工管理的条件分页查询 - 根据输入条件, 查询第一页数据, 每页展示10条记录
-- 输入条件;-- 姓名: 张-- 性别: 男-- 入职时间: 2000-01-01 2015-12-13
select *
from tb_emp
where name like '张%'and gender = 1and entrydate between '2000-01-01' and '2015-12-13'
order by update_time desc
limit 0,10;
-- 案例2-1: 根据需求,完成员工性别信息的统计 -- count
-- if(条件表达式,true取值,false取值)
select if(gender = 1, '男性员工','女性员工') '性别', count(*) '数量' from tb_emp group by gender;-- 案例2-2: 根据需求, 完成员工职位信息的统计
-- if嵌套 --经典屎山,不推荐
select if(job <= 2, if(job = 1, '班主任', '讲师'), if(job = 3, '教研主管', if(job = 4,'学工主管','未分配职位'))) '职位', count(*) '数量'
from tb_emp
group by job;-- case 表达式 when 值 1 then 结果1 when 值 2 then 结果2 when 值 3 then 结果3...else...end
select case job when 1 then '班主任' when 2 then '讲师' when 3 then '教研主管' when 4 then '学工主管' else '未分配职位' end '职位', count(*) '数量'
from tb_emp
group by job;
二.多表设计
1.一对多
-- ===========================================一对多=====================================
-- 员工
create table tb_emp
(id int unsigned primary key auto_increment comment 'ID',username varchar(20) not null unique comment '用户名',password varchar(32) default '123456' comment '密码',name varchar(10) not null comment '姓名',gender tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',image varchar(300) comment '图像',job tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管',entrydate date comment '入职时间',dept_id int unsigned comment '归属部门ID',create_time datetime not null comment '创建时间',update_time datetime not null comment '修改时间'
) comment '员工表';-- 新增部门
create table tb_dept
(id int unsigned primary key auto_increment comment 'ID',name varchar(20) not null unique comment '部门名称',create_time datetime not null comment '创建时间',update_time datetime not null comment '修改时间'
) comment '部门表';-- 插入测试数据
insert into tb_dept (id, name, create_time, update_time)
values (1, '学工部', now(), now()),(2, '教研部', now(), now()),(3, '咨询部', now(), now()),(4, '就业部', now(), now()),(5, '人事部', now(), now());INSERT INTO tb_emp
(id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time)
VALUES (1, 'jinyong', '123456', '金庸', 1, '1.jpg', 4, '2000-01-01', 2, now(), now()),(2, 'zhangwuji', '123456', '张无忌', 1, '2.jpg', 2, '2015-01-01', 2, now(), now()),(3, 'yangxiao', '123456', '杨逍', 1, '3.jpg', 2, '2008-05-01', 2, now(), now()),(4, 'weiyixiao', '123456', '韦一笑', 1, '4.jpg', 2, '2007-01-01', 2, now(), now()),(5, 'changyuchun', '123456', '常遇春', 1, '5.jpg', 2, '2012-12-05', 2, now(), now()),(6, 'xiaozhao', '123456', '小昭', 2, '6.jpg', 3, '2013-09-05', 1, now(), now()),(7, 'jixiaofu', '123456', '纪晓芙', 2, '7.jpg', 1, '2005-08-01', 1, now(), now()),(8, 'zhouzhiruo', '123456', '周芷若', 2, '8.jpg', 1, '2014-11-09', 1, now(), now()),(9, 'dingminjun', '123456', '丁敏君', 2, '9.jpg', 1, '2011-03-11', 1, now(), now()),(10, 'zhaomin', '123456', '赵敏', 2, '10.jpg', 1, '2013-09-05', 1, now(), now()),(11, 'luzhangke', '123456', '鹿杖客', 1, '11.jpg', 1, '2007-02-01', 1, now(), now()),(12, 'hebiweng', '123456', '鹤笔翁', 1, '12.jpg', 1, '2008-08-18', 1, now(), now()),(13, 'fangdongbai', '123456', '方东白', 1, '13.jpg', 2, '2012-11-01', 2, now(), now()),(14, 'zhangsanfeng', '123456', '张三丰', 1, '14.jpg', 2, '2002-08-01', 2, now(), now()),(15, 'yulianzhou', '123456', '俞莲舟', 1, '15.jpg', 2, '2011-05-01', 2, now(), now()),(16, 'songyuanqiao', '123456', '宋远桥', 1, '16.jpg', 2, '2010-01-01', 2, now(), now()),(17, 'chenyouliang', '123456', '陈友谅', 1, '17.jpg', NULL, '2015-03-21', NULL, now(), now());
2.一对一
-- ===========================================一对一=====================================
create table tb_user
(id int unsigned primary key auto_increment comment 'ID',name varchar(10) not null comment '姓名',gender tinyint unsigned not null comment '性别, 1 男 2 女',phone char(11) comment '手机号',degree varchar(10) comment '学历'
) comment '用户信息表';insert into tb_user
values (1, '白眉鹰王', 1, '18812340001', '初中'),(2, '青翼蝠王', 1, '18812340002', '大专'),(3, '金毛狮王', 1, '18812340003', '初中'),(4, '紫衫龙王', 2, '18812340004', '硕士');create table tb_user_card
(id int unsigned primary key auto_increment comment 'ID',nationality varchar(10) not null comment '民族',birthday date not null comment '生日',idcard char(18) not null comment '身份证号',issued varchar(20) not null comment '签发机关',expire_begin date not null comment '有效期限-开始',expire_end date comment '有效期限-结束',user_id int unsigned not null unique comment '用户ID',constraint fk_user_id foreign key (user_id) references tb_user (id)
) comment '用户信息表';insert into tb_user_card
values (1, '汉', '1960-11-06', '100000100000100001', '朝阳区公安局', '2000-06-10', null, 1),(2, '汉', '1971-11-06', '100000100000100002', '静安区公安局', '2005-06-10', '2025-06-10', 2),(3, '汉', '1963-11-06', '100000100000100003', '昌平区公安局', '2006-06-10', null, 3),(4, '回', '1980-11-06', '100000100000100004', '海淀区公安局', '2008-06-10', '2028-06-10', 4);
3.多对多
-- ======================================多对多=============================
create table tb_student
(id int auto_increment primary key comment '主键ID',name varchar(10) comment '姓名',no varchar(10) comment '学号'
) comment '学生表';insert into tb_student(name, no)
values ('黛绮丝', '2000100101'),('谢逊', '2000100102'),('殷天正', '2000100103'),('韦一笑', '2000100104');-- ------------------- -----------------create table tb_course
(id int auto_increment primary key comment '主键ID',name varchar(10) comment '课程名称'
) comment '课程表';insert into tb_course (name)
values ('Java'),('PHP'),('MySQL'),('Hadoop');-- ------------------- -----------------create table tb_student_course
(id int auto_increment comment '主键' primary key,student_id int not null comment '学生ID',course_id int not null comment '课程ID',constraint fk_courseid foreign key (course_id) references tb_course (id),constraint fk_studentid foreign key (student_id) references tb_student (id)
) comment '学生课程中间表';insert into tb_student_course(student_id, course_id)
values (1, 1),(1, 2),(1, 3),(2, 2),(2, 3),(3, 4);
4.案例
-- auto-generated definition
create table category
(id int unsigned auto_increment comment '主键id'primary key,name varchar(20) not null comment '分类名称',type tinyint unsigned not null comment '分类类型:1 菜品分类, 2 套餐分类',sort tinyint unsigned not null comment '排序',status tinyint unsigned default '0' not null comment '状态: 0 停用, 1 启用',create_time datetime not null comment '创建时间',update_time datetime not null comment '修改时间',constraint category_name_uindexunique (name)
)comment '分类表';
-- auto-generated definition
create table dish
(id tinyint unsigned auto_increment comment '主键id'primary key,name varchar(20) not null comment '菜品名称',category_id int unsigned not null comment '菜品分类id',price decimal(8, 2) unsigned not null comment '价格',image varchar(300) not null comment '图片',description varchar(200) null comment '描述',status tinyint unsigned default '0' not null comment '状态:0 停售, 1 启售',create_time datetime not null comment '创建时间',update_time datetime not null comment '修改时间',constraint dish_name_uindexunique (name)
)comment '菜品表';
-- auto-generated definition
create table setmeal
(id int unsigned auto_increment comment '主键id'primary key,name varchar(20) not null comment '套餐名称',category_id int unsigned not null comment '套餐分类',price decimal(8, 2) unsigned not null comment '价格',image varchar(300) not null comment '图片',description varchar(200) null comment '套餐描述',status tinyint unsigned default '0' not null comment '状态:0 停售, 1 启售',create_time datetime not null comment '创建时间',update_time datetime not null comment '修改时间',constraint setmeal_name_uindexunique (name)
)comment '套餐表';
-- auto-generated definition
create table setmeal_dish
(id int unsigned auto_increment comment '主键id'primary key,setmeal_id int unsigned not null comment '套餐id',dish_id int unsigned not null comment '菜品id',copies tinyint unsigned not null comment '菜品份数'
)comment '套餐菜品关系表';