本文共 2694 字,大约阅读时间需要 8 分钟。
为了进行数据操作,我们首先需要建立数据库表格和插入测试数据。
CREATE DATABASE day4;USE day4;CREATE TABLE department ( id INT UNSIGNED NOT NULL UNIQUE COMMENT '部门ID', name CHAR(20) COMMENT '部门名称');CREATE TABLE employee ( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '员工ID', name CHAR(12) NOT NULL COMMENT '员工姓名', gender ENUM('male', 'female') NOT NULL DEFAULT 'male' COMMENT '性别', age INT UNSIGNED COMMENT '年龄', dep_id INT UNSIGNED NOT NULL COMMENT '所属部门ID'); INSERT INTO department VALUES (100, '技术'), (101, '人事'), (102, '销售'), (103, '运营');INSERT INTO employee VALUES ('唐建华', 'male', 18, 100), ('黄淑珍', 'female', 48, 101), ('李畅', 'male', 38, 101), ('华桂珍', 'female', 28, 102), ('钟涛', 'male', 18, 100), ('廖婷婷', 'female', 18, 104); SELECT * FROM employee, department;
这种方法会生成大量冗余数据,通常不适用于实际场景。
内连表通过如下方式实现:
SELECT * FROM departmentINNER JOIN employee ON department.id = employee.dep_id;
注意事项: 会舍弃左表和右表不匹配的记录。
SELECT * FROM departmentLEFT JOIN employee ON department.id = employee.dep_id;
注意事项: 会保留左表全部数据,舍弃右表不匹配的记录。
SELECT * FROM departmentRIGHT JOIN employee ON department.id = employee.dep_id;
注意事项: 会保留右表全部数据,舍弃左表不匹配的记录。
由于 MySQL 不支持全外连表,我们可以使用 UNION 关键字实现类似效果:
SELECT * FROM departmentLEFT JOIN employee ON department.id = employee.dep_idUNIONSELECT * FROM departmentRIGHT JOIN employee ON department.id = employee.dep_id;
SELECT e.name AS员工名FROM department dINNER JOIN employee e ON d.id = e.dep_idWHERE d.name = '人事';
SELECT e.name AS员工名FROM department dINNER JOIN employee e ON d.id = e.dep_idWHERE d.name = '人事' AND e.age > 40;
SELECT e.name AS员工名, d.name AS部门名FROM department dINNER JOIN employee e ON d.id = e.dep_idWHERE e.age > 20;
SELECT d.name AS部门名, COUNT(e.id) AS人数FROM department dLEFT JOIN employee e ON d.id = e.dep_idGROUP BY d.name;
SELECT d.name AS部门名, COUNT(e.id) AS人数FROM department dLEFT JOIN employee e ON d.id = e.dep_idGROUP BY d.nameORDER BY 人数 DESC;
SELECT d.name AS部门名FROM department dWHERE d.id IN ( SELECT dep_id FROM employee GROUP BY dep_id HAVING AVG(age) > 25);
SELECT name AS 部门名FROM department dWHERE d.id NOT IN ( SELECT dep_id FROM employee GROUP BY dep_id HAVING COUNT(id) >= 1);
SELECT name AS 姓名, age AS 年龄FROM employeeWHERE age > ( SELECT AVG(age) FROM employee);
通过以上实践,可以更高效地操作多表数据库,并提升 SQL 查询性能。
转载地址:http://rvrqz.baihongyu.com/