首页 > 数据库 >数据库(七)多表查询

数据库(七)多表查询

时间:2022-10-23 11:45:20浏览次数:93  
标签:多表 -- 连接 数据库 外键 查询 dept emp id

前言

本文为在霍格沃兹测试开发学社的学习经历分享,希望有志同道合的小伙伴可以一起交流技术,一起进步~

多表查询

概念

  • 多表就是在数据库设计中使用多张表格来实现数据存储的要求

  • 在实际的项目开发中,数据量大而且复杂,需要分库分表

  • 分表:按照一定的规则,对源有的数据库和表进行拆分

  • 表与表之间可以通过外键建立连接

多表的优点:

  • 简化数据

  • 提高复用性

  • 方便权限控制

  • 提高系统的稳定性和负载能力

-- eid员工ID(自增主键)
-- ename 员工姓名
-- age 年龄
-- gender 性别
-- dept_name 所在部门
-- dept_id 部门ID
-- dept_manager 部门主管
-- dept_location 所在地点

create table emp_part(
eid int primary key auto_increment,
ename varchar(20),
age int,
gender varchar(5),
dept_id int
);


insert into emp_part values(1,'张三',20,'男',1);
insert into emp_part(ename,age,gender,dept_id) values('李四',30,'女',1);
insert into emp_part(ename,age,gender,dept_id) values('王五',28,'女',1);
insert into emp_part(ename,age,gender,dept_id) values('赵六',25,'男',2);


create table emp_dept(
dept_id int primary key auto_increment,
dept_name varchar(10),
dept_manager varchar(10),
dept_location varchar(10)
);


insert into emp_dept values(1,'研发部','郭靖','北京');
insert into emp_dept values(2,'人事部','黄蓉','四川');

外键约束

  • 主键:可以唯一标识一条记录的列

  • 外键:从表中与主表的主键对应的字段

  • 主表:外键所指向的表,约束其他表的表

  • 从表:外键所在的表,被约束的表

  • 价值:建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性

示例:部门表里的部门id如果不存在,那在员工表就不应该出现不存在的部门id

主表就是部门表,从表就是员工表

建立外键约束

删除外键约束

注意:

  • 建立外键连接时,从表外键数据类型要与主表的主键保持一致

  • 删除数据时,需要先删除从表数据再删除主表的数据

  • 添加数据时,先添加主表数据,再添加从表数据

级联删除

例如:删除主键的部门信息以后,从表中对应部门的员工信息也一并删除

如果对员工信息进行删除,工作量会很大,所以可以用级联删除

-- 建立外键约束
alter table emp_part add CONSTRAINT emp_dept foreign key(dept_id) references emp_dept(dept_id)


-- 建立外键约束并指定可以级联删除
alter table emp_part add CONSTRAINT emp_dept foreign key(dept_id) references emp_dept(dept_id) on delete cascade;


-- 删除外键约束
alter table emp_part drop foreign key emp_dept;


-- 级联删除
delete from emp_dept where dept_id=1;

注意:如果已经有了外键约束但没指定级联删除,需要先把外键约束删掉,再重新添加带级联删除的外键约束

多表关系

一对多

  • 定义:主表的一条记录可以对应从表的多条记录

  • 例子:部门表、员工表

  • 建表原则:在一对多的关系中,多的表定位从表,设置外键指向主表

多对多

  • 定义:主表的多条记录可以对应从表的多条记录

  • 例子:商品信息表,客户表,订单表

  • 建表原则:需要建立第三张表作为中间表,中间表需要包含两张表的主键

一对一

  • 定义:从表的一条记录对应主表的一条记录

  • 例子:员工信息表与身份证表,联系方式

  • 建表原则:这种对应关系的数据,通常放在单表中

内连接查询

  • 内连接(INNER JOIN):使用比较运算符进行表间某些列数据的比较操作,并列出这些表中与连接条件相匹配的数据行,组合成新的记录。匹配上显示,匹配不上则不显示

  • 例子:比如使用外键=主键这个条件过滤掉无效的数据

  • 按语法结构分为:隐示内连接和显示内连接

例子:

SELECT
    *
FROM
    emp_part,
    emp_dept
WHERE
    emp_dept.dept_id = emp_part.dept_id
    AND emp_dept.dept_id = 2;

隐示内连接

区分:没有明显出现内连接关键字 inner join  就是隐示内连接

下面的id字段是员工信息表的外键,上面叫dept_id,但和部门表冲突,所以更改为id。如果字段名称相同时想要查找的话,需要表名.列名去分别指定。

显示内连接

SELECT
    dept_id,
    dept_location,
    ename
FROM
     emp_dept
    INNER JOIN emp_part ON dept_id=id
    AND dept_id = 1;

外连接查询

  • 概念:查询多个表中相关联的行,有时候需要包含没有关联的行中数据,即返回查询结果集合中不仅包含符合连接条件的行,还包括左表(左连接)、右表(右连接)中的所有数据行

  • 左外连接:使用LEFT OUTER JOIN ,OUTER 可以忽略

  • 右外连接:使用RIGHT OUTER JOIN ,OUTER 可以忽略

左连接时,想让哪个表的数据都显示出来,就让哪个放在左表中

  • 使用左连接的查询方式查询出所有部门员工的员工号,姓名,性别以及他们所在的部门名称和城市
-- 使用左连接的查询方式查询出所有部门员工的员工号,姓名,性别以及他们所在的部门名称和城市

SELECT
    eid,
    ename,
    gender,
    dept_name,
    dept_location
FROM
    emp_dept
    LEFT JOIN emp_part ON id = dept_id;

右连接时,想让哪个表的数据都显示出来,就让哪个放在右表中

-- 右连接的方式查询所有员工信息以及他们所在部门的名称和城市

SELECT
    eid,
    ename,
        age,
    gender,
    dept_name,
    dept_location
FROM
    emp_dept
    right JOIN emp_part ON id = dept_id;

总结:


数据库学习笔记目录导航


推荐阅读文章链接:接口测试经典面试题:Session、cookie、token有什么区别?_霍格沃兹测试开发学社的博客-CSDN博客

标签:多表,--,连接,数据库,外键,查询,dept,emp,id
From: https://www.cnblogs.com/joker108/p/16818224.html

相关文章

  • DQL-排序查询和聚合函数
    DQL-排序查询语法:orderby子句orderby排序字段1排序方式1,排序字段2排序方式2...排序方式:ASC:升序,默认的DESC:降序注意:如果有多个排序条件,则当前的条件......
  • 数据库(四)DQL
    DQL查询语言单表查询语法:select*from表名;字段查询select列名from表名;起别名去掉重复信息selectdistinct列名from表名;注意:distinct要放......
  • 数据库(五)聚合函数
    聚合函数概念用来做纵向运算的,可以针对某列的值进行运算,返回一个单一的值,可以计算平均工资等常见聚合函数:COUNT():统计指定列不为NULL的记录行数MAX():计算指定列......
  • # yyds干货盘点 # 盘点Python网络爬虫过程中xpath的联合查询定位一个案例
    大家好,我是皮皮。一、前言前几天在Python钻石交流群【髙鵬】问了一个​​Python​​网络爬虫的问题,提问截图如下:原始代码如下:importtimefromseleniumimportwebdriverfro......
  • 数据库(六)约束
    sql约束概念对表中的数据进行进一步的限制保证数据的正确性、有效性、完整性违反约束的不正确数据无法插入到表中常见约束主键:PRIMARYKEY非空:NOTNULL......
  • 数据库(三)DML
    DML操作语言插入语法格式:示例:--选择数据库为当前数据库USEhogwarts_stu;--创建表CREATETABLEuser(idint,namevarchar(20),ageint,sexchar(1......
  • 树状数组3区间查询区间修改
    Description要求使用树状数组完成区间之和查询,区间加上某一相同数值的操作。Solution树状数组是用来单点加,查前缀和的。若要实现区间加,可以将原数列差分,然后在l位置处+v......
  • 数据库(一)
    数据库基本概念是一个以某种有组织的方式存储的数据集合是存储和管理数据的仓库本质是一个文件系统DBMS(数据库管理系统)数据库分类关系型数据库(RDB)有关系......
  • 前后端分离项目(六):数据分页查询(前端视图)
    好家伙,该项目为vue2项目 本篇更新数据分页查询的前端部分先来看看最终效果  最终代码:<!--该组件为表单主要组件--><template><div><!--标题-->......
  • Django-静态文件配置,链接数据库,request对象方法
    目录-静态文件配置--含义--配置方法--动态解析---含义---实现---示例-pycharm链接MySQL-Django链接MySQL--代码配置--代码声明-request对象常用方法--示例......