欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Day13 Mysql多表查询

程序员文章站 2022-05-09 08:55:54
...

多表的查询介绍

  • 初始化数据
  • 实际项目中,数据保存于多个表,如果需要的数据来自多个表,就要使用多表查询
  • 查询的分类
  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. 什么是笛卡尔集
    两张表相乘的结果,不论数据是否正确
    Day13 Mysql多表查询

  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;

Day13 Mysql多表查询
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;

Day13 Mysql多表查询

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

Day13 Mysql多表查询

四、子查询

  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='电子');