Day13 Mysql多表查询

多表的查询介绍

  • 初始化数据
  • 实际项目中,数据保存于多个表,如果需要的数据来自多个表,就要使用多表查询
  • 查询的分类
  1. 交叉连接查询(了解)
  2. 内连接查询
    隐式内连接,显式内连接***
  3. 外连接查询
    左外连接, 右外连接
  4. 子查询
   #创建数据库
   create database web02;

   #使用数据库
   use web02;

   #省表
   create table province (
      pid int primary key auto_increment,
      pname varchar(20)
   );
   
   #市表
   create table city(
      cid int primary key auto_increment,
      cname varchar(20)
   );

   #添加外键字段
   alter table city add pid_fk int;

   #添加外键约束
   alter table city add foreign key(pid_fk) references province(pid);

   #省表添加数据
   insert into province values(1,'湖南'),(2,'广西');

   #市表添加数据
   insert into city values(1,'长沙',1),(2,'张家界',1),(3,'桂林',2),(4,'贵港',2);

一、交叉连接查询(了解)

  1. 什么交叉连接查询
    交叉连接查询是将两张表相乘: A和B —> A * B

  2. 什么是笛卡尔集
    两张表相乘的结果,不论数据是否正确
    在这里插入图片描述

  3. 多表查询的本质
    多表查询可以理解成在笛卡尔集的基础上进行条件筛选

  4. 案例:查询每个省以及该省的所有市

   select * from province,city;

二、内连接(关键字inner可以省略)

  1. 什么是内连接查询?
    求的是多张表的交集
    本质就是在笛卡尔集上加条件
  2. 分类
    隐式内连接:select * from A,B where 条件;
    显式内连接:select * from A inner join B on 条件;(效率更高)
   #隐式内连接
   select * from province p,city c where p.pid = c.pid_fk;
   
  #显式内连接
   select * from province p inner join city c on p.pid = c.pid_fk;

在这里插入图片描述
3. 区别
使用关键字 inner join
前者在笛卡尔集的基础上筛选,后者在原始表上筛选

三、外连接(关键字outer可以省略)

  1. 什么是外连接查询?
    两个表中选一个表将数据全部输出,另一个表没有对应数据则输出NULL。
  2. 分类
  • 左外连接
    select * from A left outer join B on 条件;
    以左表为主,左表中的数据全部输出,右表中如果没有同等的数据则补NULL
  • 右外连接
    select * from A right outer join B on 条件;
    以右表为主,右表中的数据全部输出,左表中如果没有同等的数据则补NULL
  1. 练习
   #在省表添加一行数据
   insert into province values (3,'广东');

   #左外连接
   select * from province p left outer join city c on p.pid = c.pid_fk;

在这里插入图片描述

#右外连接
select * from province p right outer join city c on p.pid = c.pid_fk; 

在这里插入图片描述

四、子查询

  1. 什么叫子查询?
    select的嵌套:一个select的查询结果作为另一个select查询语法的一部分。
  2. 案例
    在商品表中查询属于电子分类的商品
  select * from product where cid = 1select cid from category where cname='电子';
  #以上两句结合成一句
  select * from product where cid = (select cid from category where cname='电子');

猜你喜欢

转载自blog.csdn.net/qq_43639081/article/details/108766189