• JavaWeb开发-08-MySQL(三)


    一.多表查询

    1. -- ================================多表查询: 数据准备=====================================
    2. -- 部门管理
    3. create table tb_dept(
    4. id int unsigned primary key auto_increment comment '主键ID',
    5. name varchar(10) not null unique comment '部门名称',
    6. create_time datetime not null comment '创建时间',
    7. update_time datetime not null comment '修改时间'
    8. ) comment '部门表';
    9. 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());
    10. -- 员工管理
    11. create table tb_emp (
    12. id int unsigned primary key auto_increment comment 'ID',
    13. username varchar(20) not null unique comment '用户名',
    14. password varchar(32) default '123456' comment '密码',
    15. name varchar(10) not null comment '姓名',
    16. gender tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',
    17. image varchar(300) comment '图像',
    18. job tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师',
    19. entrydate date comment '入职时间',
    20. dept_id int unsigned comment '部门ID',
    21. create_time datetime not null comment '创建时间',
    22. update_time datetime not null comment '修改时间'
    23. ) comment '员工表';
    24. INSERT INTO tb_emp
    25. (id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time) VALUES
    26. (1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,now(),now()),
    27. (2,'zhangwuji','123456','张无忌',1,'2.jpg',2,'2015-01-01',2,now(),now()),
    28. (3,'yangxiao','123456','杨逍',1,'3.jpg',2,'2008-05-01',2,now(),now()),
    29. (4,'weiyixiao','123456','韦一笑',1,'4.jpg',2,'2007-01-01',2,now(),now()),
    30. (5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,now(),now()),
    31. (6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,now(),now()),
    32. (7,'jixiaofu','123456','纪晓芙',2,'7.jpg',1,'2005-08-01',1,now(),now()),
    33. (8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,now(),now()),
    34. (9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,now(),now()),
    35. (10,'zhaomin','123456','赵敏',2,'10.jpg',1,'2013-09-05',1,now(),now()),
    36. (11,'luzhangke','123456','鹿杖客',1,'11.jpg',5,'2007-02-01',3,now(),now()),
    37. (12,'hebiweng','123456','鹤笔翁',1,'12.jpg',5,'2008-08-18',3,now(),now()),
    38. (13,'fangdongbai','123456','方东白',1,'13.jpg',5,'2012-11-01',3,now(),now()),
    39. (14,'zhangsanfeng','123456','张三丰',1,'14.jpg',2,'2002-08-01',2,now(),now()),
    40. (15,'yulianzhou','123456','俞莲舟',1,'15.jpg',2,'2011-05-01',2,now(),now()),
    41. (16,'songyuanqiao','123456','宋远桥',1,'16.jpg',2,'2007-01-01',2,now(),now()),
    42. (17,'chenyouliang','123456','陈友谅',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());

     

     消除了无效的笛卡尔积

    1.内连接

    1. -- =======================内连接=====================
    2. -- A.查询员工的姓名,及所属的部门名称(隐式内连接)
    3. select tb_emp.name '姓名', tb_dept.name '所属部门' from tb_emp, tb_dept where tb_emp.dept_id = tb_dept.id;
    4. -- 起别名
    5. select e.name '姓名', d.name '所属部门' from tb_emp e, tb_dept d where e.dept_id = d.id;
    6. -- B.查询员工的姓名,及所属的部门名称(显式内连接)
    7. select tb_emp.name '姓名', tb_dept.name '所属部门' from tb_emp join tb_dept on tb_emp.dept_id = tb_dept.id;
    8. -- 起别名
    9. select e.name '姓名', d.name '所属部门' from tb_emp e join tb_dept d on e.dept_id = d.id;

     

    2.外连接 

    1. -- =======================外连接=====================
    2. -- A.查询所有员工的姓名,及所属的部门名称(左外连接) -- 左边的表所有值列出来(包含null)
    3. select e.name, d.name from tb_emp e left join tb_dept d on e.dept_id = d.id;
    4. -- =
    5. select e.name, d.name from tb_dept d right join tb_emp e on e.dept_id = d.id;
    6. -- B.查询所有员工的姓名,及所属的部门名称(右外连接) -- 右边的表所有值列出来(包含null)
    7. select e.name, d.name from tb_emp e right join tb_dept d on e.dept_id = d.id;
    8. -- =
    9. select e.name, d.name from tb_dept d left join tb_emp e on e.dept_id = d.id;

     3.子查询

     

     

    1. -- =======================子查询=========================
    2. -- 标量子查询
    3. -- A.查询 "教研部" 所有员工信息
    4. -- a.查询 教研部 的部门id
    5. select id from tb_dept where name = '教研部';
    6. -- b.在查询该部门id下的所以员工信息
    7. select * from tb_emp where dept_id = 2;
    8. -- 合并
    9. select * from tb_emp where dept_id = (select id from tb_dept where name = '教研部');
    10. -- B.查询在 "方东白" 入职之后的员工信息
    11. -- a.查询方东白的入职信息
    12. select entrydate from tb_emp where name = '方东白';
    13. -- b.查询在方东白入职之后的员工信息
    14. select * from tb_emp where entrydate > '2012-11-01';
    15. -- 合并
    16. select * from tb_emp where entrydate > (select entrydate from tb_emp where name = '方东白');

    1. -- 列子查询
    2. -- A.查询 "教研部" 和 "咨询部" 的所有员工信息
    3. -- a.查询 "教研部" 和 "咨询部" 的部门id
    4. select id from tb_dept where name = '教研部' or name = '咨询部';
    5. -- b.根据部门id,查询该部门下的员工信息
    6. select * from tb_emp where dept_id in (3,2);
    7. -- 合并
    8. select * from tb_emp where dept_id in (select id from tb_dept where name = '教研部' or name = '咨询部');

    1. -- 行子查询
    2. -- A. 查询与 "韦一笑" 的入职日期 及 职位相同的员工信息
    3. -- a.查询 韦一笑的入职日期和职位
    4. select entrydate,job from tb_emp where name = '韦一笑';
    5. -- b.查询与其入职日期和职位相同的员工信息
    6. select * from tb_emp where entrydate = '2007-01-01' and job = 2;
    7. -- 合并
    8. select * from tb_emp where (entrydate,job) in (select entrydate,job from tb_emp where name = '韦一笑');

    1. -- 表子查询
    2. -- A.查询入职日期是"2006-01-01"之后的员工信息, 及其部门名称
    3. -- a.查询入职入职日期是2006-01-01之后的员工信息
    4. select * from tb_emp where entrydate > '2006-01-01';
    5. -- b.查询这部分员工信息的部门名称
    6. select d.name,e.* from (select * from tb_emp where entrydate > '2006-01-01') e, tb_dept d where e.dept_id = d.id;

     4.案例

     

    1. -- 需求:
    2. # 1.查询价格低于 10元 的菜品的名称 、价格 及其 菜品的分类名称
    3. -- a.
    4. # select name,price from dish d where price < 10;
    5. # select c.name,d.price,d.name from (select * from dish where price < 10) d, category c where c.id = d.category_id;
    6. select c.name,d.price,d.name from category c, dish d where c.id = d.category_id and d.price < 10;
    7. # 2.查询所有价格在 10元(含)到50元(含)之间 且 状态为"起售"的菜品名称、价格及其分类名称 (即使菜品没有分类 , 也要将菜品查询出来)
    8. # select name,price from dish where price between 10 and 50 and status = 1;
    9. -- select d.name,d.price,c.name from (select * from dish where price between 10 and 50 and status = 1) d left join category c on c.id = d.category_id;
    10. select d.name, d.price, c.name
    11. from dish d
    12. left join category c on d.category_id = c.id
    13. where d.price between 10 and 50
    14. and d.status = 1;
    15. # 3.查询每个分类下最贵的菜品, 展示出分类的名称、最贵的菜品的价格
    16. select category_id,max(price) price from dish group by category_id;
    17. # select c.name, d.price
    18. # from (select category_id, max(price) price from dish group by category_id) d,
    19. # category c
    20. # where c.id = d.category_id;
    21. select c.name,max(d.price) from category c, dish d where c.id = d.category_id group by c.name;
    22. # 4.查询各个分类下 菜品状态为 "起售" , 并且 该分类下菜品总数量大于等于3 的 分类名称
    23. -- select category_id,count(category_id) from dish group by category_id;
    24. -- select category_id,count(category_id) count from dish group by category_id having count(category_id)>=3;
    25. -- select c.name,d.count from category c, (select category_id,count(category_id) count from dish group by category_id having count(category_id)>=3) d where c.id = d.category_id;
    26. select c.name, count(*)
    27. from category c,
    28. dish d
    29. where c.id = d.category_id
    30. and d.status = 1
    31. group by c.name
    32. having count(*) >= 3;
    33. # 5.查询出 "商务套餐A" 中包含了哪些菜品 (展示出套餐名称、价格, 包含的菜品名称、价格、份数)
    34. # select id, name, price from setmeal where name = '商务套餐A';
    35. #
    36. # select s.name,s.price from (select id, name, price from setmeal where name = '商务套餐A') s, setmeal_dish ssd where s.id = ssd.setmeal_id;
    37. #
    38. # select name, price from dish;
    39. # select d.name,d.price from dish d, setmeal_dish dsd where d.id = dsd.dish_id;
    40. #
    41. # select * from setmeal_dish;
    42. # select price from dish group by count(price);
    43. -- 表: setmeal, dish, setmeal_dish
    44. -- SQL:
    45. select s.name, s.price, d.name, d.price, sd.copies
    46. from setmeal s,
    47. dish d,
    48. setmeal_dish sd
    49. where s.id = sd.setmeal_id
    50. and d.id = sd.dish_id
    51. and s.name = '商务套餐A';
    52. # 6.查询出低于菜品平均价格的菜品信息 (展示出菜品名称、菜品价格)
    53. -- select avg(price) from dish;
    54. select name, price from dish where price <= (select avg(price) from dish);

    二.事务

    1.介绍 & 操作


    2.四大特性

    三.索引

    1.介绍

     


    2.结构


    3.语法

     

    1. -- =====================索引=====================
    2. -- 创建: 为tb_emp表的name字段建立一个索引
    3. create index idx_tb_emp on tb_emp(name);
    4. -- 查询: 查询tb_emp 表的索引信息
    5. show index from tb_emp;
    6. -- 删除: 删除tb_emp 表中name字段的索引
    7. drop index idx_tb_emp on tb_emp;

     

  • 相关阅读:
    CHS零壹视频恢复程序高级版视频修复OCR使用方法
    React(二):Redux基本使用方法
    Nacos作为配置中心
    什么是微服务?
    JSP 实习管理系统myeclipse开发mysql数据库网页模式java编程网页设计
    Java RPC调用: 远程过程调用的实现与应用
    2023年全球市场氮化铝外延片总体规模、主要生产商、主要地区、产品和应用细分研究报告
    WSL + Docker容器,Windows上最爽的开发体验
    Pair 和 Triple 应用实践/获取指定时间间隔
    java接口怎么写
  • 原文地址:https://blog.csdn.net/wangjh11234/article/details/133150079