首页 > 数据库 >【MySQL】多表的查询

【MySQL】多表的查询

时间:2023-03-08 22:13:16浏览次数:43  
标签:多表 -- 查询 dept department MySQL employee id

为什么需要多表查询

1、单表查询在WEB 要经过几次http交互,再不同表之间 才能查找到数据。会浪费很多时间,因此需要多表查询。

2、如果多张表合在一张表中,会导致 会多字段不能充分利率用,浪费存储空间。

3、程序读取的时候会读取过多的多余字段,导致内存浪费。

4、分表更利于并发

 

 

 

 多表查询的正确方式

1、多表查询的正确方式:需要有连接条件,如果不加连接条件会产生笛卡儿积错误

2、建议:从sql优化的角度,建议多表查询时,每个字段前都指明其所在的表。
SELECT employee.`name` , dept.name FROM employee,dept WHERE dept.id=employee.dept_id;

3、可以给表起别名,在SELECT和wHERE中使用表的别名。如果给表起了别名,一旦在SELECT或wHERE中使用表名的话,则必须使用表的别名,而不能再使用表的原名。

4、如果有n个表实现多表的查询,则需要至少n-1个连接条件

多表查询 案例

 

 部门

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for dept
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept`  (
  `id` int NOT NULL,
  `name` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES (1, '研发部');
INSERT INTO `dept` VALUES (2, '市场部');
INSERT INTO `dept` VALUES (3, '财务部');
INSERT INTO `dept` VALUES (4, '销售部');

SET FOREIGN_KEY_CHECKS = 1;

员工

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for employee
-- ----------------------------
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee`  (
  `id` int NOT NULL,
  `name` varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
  `dept_id` int NOT NULL,
  `age` int NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `fk_dept_id`(`dept_id` ASC) USING BTREE,
  CONSTRAINT `fk_dept_id` FOREIGN KEY (`dept_id`) REFERENCES `dept` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of employee
-- ----------------------------
INSERT INTO `employee` VALUES (1, '张无忌', 1, 20);
INSERT INTO `employee` VALUES (2, '杨逍', 2, 33);
INSERT INTO `employee` VALUES (3, '赵敏', 2, 18);
INSERT INTO `employee` VALUES (4, '常遇春', 2, 43);

SET FOREIGN_KEY_CHECKS = 1;

可以给表起别名,在SELECT和wHERE中使用表的别名。

SELECT emp.employee_id, dept.department_name, emp.department_id

FROM employees emp, departments dept
WHERE emp. department_idT = dept,department_id;

 #如果给表起了别名,一旦在SELECT或wHERE中使用表名的话,则必须使用表的别名,而不能再使用表的原名。

SELECT emp.employee_id, departments.department_name , emp. department_id
FROM employees emp , departments dept
WHER Eemp .department_id` = departments .department_id; 错误了,因为原名已经被覆盖了,只能使用dept.department_id; 

如果有n个表实现多表的查询,则需要至少n-1个连接条件

SELECT e.employee_id,e.last_name,d.department_name,1.city,e.department_id,1.location_id
FROM employees e,departments d,locations l
WHERE e. "department_idT = d. 'department_id`
AND d. " location_id= l.`location_id ;

 



标签:多表,--,查询,dept,department,MySQL,employee,id
From: https://www.cnblogs.com/cdaniu/p/17196373.html

相关文章

  • 字符串查询【华东师范大学考研机试题】
    字符串查询给你单词S和Q个询问。每次询问,你会得到正整数A,B,C和D。我们令单词X由S的第A到B个字母组成,单词Y由S的第C到D个字母组成。你需要回答......
  • 66.mysql的json语法
    Mysql的json语法:#创建json表createtablet_json(idintprimarykey,snamevarchar(20),infojson);#插入json数据insertintot_json(id,sname,info)values(1,'......
  • 【MySQL】排序和分页
    排序ORDERBY多列;#强调格式:WHERE需要声明在FROM后,ORDERBY之前。先排序Country 再排序CustomerName,默认是按ASC排序的。SELECT*FROMCustomersORDERBYCountr......
  • 2.安装mysql教程
    day1MySQL1.安装MySQLMySQL,本质上就是一个软件。推荐用5.7.31版本。1.1下载,安装5.7.31比较稳定https://downloads.mysql.com/archives/community/1.2配置mysql安......
  • C# Linq 查询汇总
    C#Linq查询汇总  阅读目录 分组取值、求和、计数 主从表关联,对应多条明细数据分组去重两表关联、排序、对象赋值、分组去重两个list关联(innerjoin)两......
  • MySQL查看数据库性能常用命令和实战教学
    MySQL查看数据库性能常用命令#列出MySQL服务器运行各种状态值showglobalstatus;#查询MySQL服务器配置信息语句showvariables;#慢查询showvariableslike'%sl......
  • sqlalchemy 基础查询操作
    in查询db.query(UserAccount#模型名称).filter(account_type.in_(['1','2','3'])).all()array_agg聚合查询db.query(func.min(UserAccount.username)#去重,......
  • Tkinter实现模糊查询
    importtkinterastkclassTest(): def__init__(self): self.root=tk.Tk() self.entry_value=tk.StringVar() self.entry1=tk.Entry(self.root,textv......
  • java 列表查询
    最常用的便是for循环查询:for(StudentRecordrecord:records){if(record.getYear()==yearSearch){System.out.println(record.getId()+""+record.g......
  • mysqlbinlog恢复数据实战
    binlog我们中文一般称作归档日志,如果大家看过松哥之前发的MySQL主从搭建,应该对这个日志有印象,当我们搭建MySQL主从的时候就离不开binlog(传送门:MySQL8主从复制踩坑指......