当前位置: 首页 > wzjs >正文

广州营销策划公司排行驻马店seo

广州营销策划公司排行,驻马店seo,网站设计佛山顺德,网站建设公司排行榜摘要:本文围绕MySQL数据库操作展开,通过构建部门与员工管理、餐饮业务相关的数据库表,并填充测试数据,系统地阐述了多表查询的多种方式,包括内连接、外连接和不同类型的子查询,同时介绍了事务的处理以及索引…

摘要:本文围绕MySQL数据库操作展开,通过构建部门与员工管理、餐饮业务相关的数据库表,并填充测试数据,系统地阐述了多表查询的多种方式,包括内连接、外连接和不同类型的子查询,同时介绍了事务的处理以及索引的创建、查询和删除操作。

关键词:MySQL;多表查询;事务;索引

一、引言

在数据库管理与开发过程中,多表查询、事务管理以及索引优化是提升数据处理效率和数据完整性的关键技术。本文通过实际案例详细展示这些技术在MySQL数据库中的具体应用。

二、数据准备

2.1 部门与员工表的创建及数据插入

  1. 部门表(tb_dept:用于存储部门相关信息。
CREATE TABLE tb_dept(id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',name VARCHAR(10) 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());
  1. 员工表(tb_emp:通过 dept_id 与部门表关联,记录员工详细信息。
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 教研主管, 5 咨询师',entrydate DATE COMMENT '入职时间',dept_id INT UNSIGNED COMMENT '部门ID',create_time DATETIME NOT NULL COMMENT '创建时间',update_time DATETIME NOT NULL COMMENT '修改时间'
) COMMENT '员工表';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()),
-- 省略部分插入数据
(17, 'chenyouliang', '123456', '陈友谅', 1, '17.jpg', NULL, '2015 - 03 - 21', NULL, NOW(), NOW());

2.2 餐饮业务相关表的创建及数据插入

  1. 分类表(category:区分菜品分类与套餐分类。
CREATE TABLE category(id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',name VARCHAR(20) NOT NULL UNIQUE COMMENT '分类名称',type TINYINT UNSIGNED NOT NULL COMMENT '类型 1 菜品分类 2 套餐分类',sort TINYINT UNSIGNED NOT NULL COMMENT '顺序',status TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '状态 0 禁用,1 启用',create_time DATETIME NOT NULL COMMENT '创建时间',update_time DATETIME NOT NULL COMMENT '更新时间'
) COMMENT '分类';
  1. 菜品表(dish:记录菜品的各项属性,与分类表通过 category_id 关联。
CREATE TABLE dish(id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',name VARCHAR(20) NOT NULL UNIQUE COMMENT '菜品名称',category_id INT UNSIGNED NOT NULL COMMENT '菜品分类ID',price DECIMAL(8, 2) NOT NULL COMMENT '菜品价格',image VARCHAR(300) NOT NULL COMMENT '菜品图片',description VARCHAR(200) COMMENT '描述信息',status TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '状态, 0 停售 1 起售',create_time DATETIME NOT NULL COMMENT '创建时间',update_time DATETIME NOT NULL COMMENT '更新时间'
) COMMENT '菜品';
  1. 套餐表(setmeal:存储套餐信息,与分类表通过 category_id 关联。
CREATE TABLE setmeal(id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',name VARCHAR(20) NOT NULL UNIQUE COMMENT '套餐名称',category_id INT UNSIGNED NOT NULL COMMENT '分类id',price DECIMAL(8, 2) NOT NULL COMMENT '套餐价格',image VARCHAR(300) NOT NULL COMMENT '图片',description VARCHAR(200) COMMENT '描述信息',status TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '状态 0:停用 1:启用',create_time DATETIME NOT NULL COMMENT '创建时间',update_time DATETIME NOT NULL COMMENT '更新时间'
) COMMENT '套餐';
  1. 套餐菜品关联表(setmeal_dish:建立套餐与菜品之间的联系。
CREATE TABLE setmeal_dish(id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',setmeal_id INT UNSIGNED NOT NULL COMMENT '套餐id ',dish_id INT UNSIGNED NOT NULL COMMENT '菜品id',copies TINYINT UNSIGNED NOT NULL COMMENT '份数'
) COMMENT '套餐菜品中间表';
  1. 插入测试数据:向上述餐饮业务相关表插入大量测试数据,涵盖各类菜品、套餐及其关联信息。

三、多表查询操作

3.1 基本多表查询

通过连接 tb_emptb_dept 表,获取员工所属部门信息。

SELECT * FROM tb_emp, tb_dept WHERE tb_emp.dept_id = tb_dept.id;

3.2 内连接

  1. 隐式内连接:查询员工姓名及所属部门名称,可通过起别名提高可读性。
SELECT tb_emp.name, tb_dept.name FROM tb_emp, tb_dept WHERE tb_emp.dept_id = tb_dept.id;
SELECT e.name, d.name FROM tb_emp e, tb_dept d WHERE e.dept_id = d.id;
  1. 显式内连接:同样实现查询员工姓名及所属部门名称。
SELECT tb_emp.name, tb_dept.name FROM tb_emp JOIN tb_dept ON tb_emp.dept_id = tb_dept.id;

3.3 外连接

  1. 左外连接:获取员工表所有员工姓名及对应的部门名称,包括无部门员工。
SELECT e.name, d.name FROM tb_emp e LEFT JOIN tb_dept d ON e.dept_id = d.id;
  1. 右外连接:获取部门表所有部门名称及对应的员工名称,包括无员工部门。
SELECT e.name, d.name FROM tb_emp e RIGHT JOIN tb_dept d ON e.dept_id = d.id;
-- 等同于
SELECT e.name, d.name FROM tb_dept d LEFT JOIN tb_emp e ON e.dept_id = d.id;

3.4 子查询

  1. 标量子查询
    • 查询“教研部”的所有员工信息,先获取教研部 id,再查询该部门员工。
SELECT id FROM tb_dept WHERE name = '教研部';
SELECT * FROM tb_emp WHERE dept_id = (SELECT id FROM tb_dept WHERE name = '教研部');
- 查询在“方东白”入职之后的员工信息,先获取方东白入职时间,再查询晚于该时间入职的员工。
SELECT entrydate FROM tb_emp WHERE name = '方东白';
SELECT * FROM tb_emp WHERE entrydate > (SELECT entrydate FROM tb_emp WHERE name = '方东白');
  1. 列子查询:查询“教研部”和“咨询部”的所有员工信息,先获取两个部门 id,再查询对应部门员工。
SELECT id FROM tb_dept WHERE name = '教研部' OR name = '咨询部';
SELECT * FROM tb_emp WHERE dept_id IN (SELECT id FROM tb_dept WHERE name = '教研部' OR name = '咨询部');
  1. 行子查询:查询与“韦一笑”入职日期及职位都相同的员工信息,可通过两种方式实现。
SELECT entrydate, job FROM tb_emp WHERE name = '韦一笑';
-- 方式一
SELECT * FROM tb_emp WHERE entrydate = (SELECT entrydate FROM tb_emp WHERE name = '韦一笑') AND job = (SELECT job FROM tb_emp WHERE name = '韦一笑');
-- 方式二
SELECT * FROM tb_emp WHERE (entrydate, job) = (SELECT entrydate, job FROM tb_emp WHERE name = '韦一笑');
  1. 表子查询:查询入职日期在“2006 - 01 - 01”之后的员工信息及其部门名称,先获取符合日期条件的员工,再连接部门表获取部门名称。
SELECT * FROM tb_emp WHERE entrydate > '2006 - 01 - 01';
SELECT e.*, d.name FROM (SELECT * FROM tb_emp WHERE entrydate > '2006 - 01 - 01') e, tb_dept d WHERE e.dept_id = d.id;

3.5 餐饮业务多表查询需求

  1. 查询低价菜品信息:获取价格低于10元的菜品名称、价格及分类名称。
SELECT d.name, d.price, c.name
FROM dish d, category c
WHERE d.category_id = c.id AND d.price < 10;
  1. 查询特定价格与状态菜品信息:查询价格在10元(含)到50元(含)之间且状态为“起售”的菜品信息,包括无分类菜品。
SELECT d.name, d.price, c.name
FROM dish d LEFT JOIN category c ON d.category_id = c.id
WHERE d.price BETWEEN 10 AND 50 AND d.status = 1;
  1. 查询各分类最贵菜品信息:展示每个分类下最贵菜品的分类名称和价格。
SELECT c.name, MAX(d.price)
FROM dish d, category c
WHERE d.category_id = c.id
GROUP BY c.name;
  1. 查询特定条件分类名称:获取菜品状态为“起售”且菜品数量大于等于3的分类名称。
SELECT c.name, COUNT(*)
FROM dish d, category c
WHERE d.category_id = c.id AND d.status = 1
GROUP BY c.name
HAVING COUNT(*) >= 3;
  1. 查询套餐包含菜品信息:展示“商务套餐A”包含的菜品相关信息。
SELECT s.name, s.price, d.name, d.price, sd.copies
FROM setmeal s, setmeal_dish sd, dish d
WHERE s.id = sd.setmeal_id AND sd.dish_id = d.id AND s.name = '商务套餐A';
  1. 查询低于平均价格菜品信息:先计算菜品平均价格,再查询低于该平均价格的菜品。
SELECT AVG(price) FROM dish;
SELECT * FROM dish WHERE price < (SELECT AVG(price) FROM dish);

四、事务操作

4.1 事务处理流程

在删除部门及相关员工操作中,使用事务确保数据一致性。

-- 开启事务
START TRANSACTION;
-- 删除部门
DELETE FROM tb_dept WHERE id = 2;
-- 删除部门下的员工
DELETE FROM tb_emp WHERE dept_id = 2;
-- 提交事务
COMMIT;
-- 回滚事务(若中途出错)
ROLLBACK;SELECT * FROM tb_dept;
SELECT * FROM tb_emp;

五、索引操作

5.1 索引的创建、查询与删除

  1. 创建索引:为 tb_sku 表的 sn 字段和 tb_emp 表的 name 字段创建索引。
CREATE INDEX idx_sku_sn ON tb_sku(sn);
CREATE INDEX idx_emp_name ON tb_emp(name);
  1. 查询索引信息:查看 tb_emp 表的索引情况。
SHOW INDEX FROM tb_emp;
  1. 删除索引:删除 tb_emp 表中 name 字段的索引。
DROP INDEX idx_emp_name ON tb_emp;
http://www.dtcms.com/wzjs/606182.html

相关文章:

  • 宝安关于网站建设竞价运营是做什么的
  • 青海门户网站建设管理软件开发工程师
  • 宾馆酒店网站建设方案宿州网站建设零聚思放心
  • 海南做网站的公司做网站的为什么那么多骗子
  • 做婚恋网站要多少钱海珠商城网站建设
  • 泰兴企业网站建设企业网站广告
  • 太原建站模板源码没内容的网站怎么优化
  • 静态网站开发一体化课程公众号文章采集wordpress
  • 龙华网站 建设龙华信科怎样建立网站
  • 手机网站建设团队网络推广的基本手段
  • 厦门市翔安区建设局网站制作网页软件手机版
  • 使用oss做静态网站小程序直播功能
  • 深圳优定软件网站建设邯郸市住房和建设官方网站
  • php就是做网站吗办网站租服务器
  • 网站的建设费计入无形资产吗工程与建设期刊
  • 企业网站建设套餐价格韩国怎么出线
  • 长春网站设计策划书企业公司网站管理系统
  • 河南网站开发培训win7做网站
  • 安阳网站建设兼职wordpress管理员密码忘
  • 网站开发免费视频教程济南 建网站
  • 怎么投诉网站制作公司wordpress电影资源网站
  • 网站本身对网站打开速度有何影响wordpress nextapp插件
  • 网站优点缺点本单位二级网站建设管理制度
  • 网站开发如何跟客户沟通需求公司网站设计的内容有哪些
  • 长沙网站seo费用有限责任公司怎么注册
  • 企业网站建设服务电话中国职业技能培训中心官网
  • 厦门网站建设工作微信小程序卖货怎么注册
  • 网站推广只能使用在线手段进行。提升了自己的网站
  • 饮料公司网站模板网站设计与制作包括
  • 什么网站做外贸好旅游网站怎么做才能被关注