JavaWeb开发-07-MySQL(二)

一.数据库操作-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 = 1
  and 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_uindex
        unique (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_uindex
        unique (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_uindex
        unique (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 '套餐菜品关系表';

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员希西子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值