Loading

MySQL多数据表操作与查询

外键

表与表之间存在“一对多”,“多对一”和“一对一”的关系
多个表之间的关系是通过主键和外键来维护的
外键既可以通过数据库来约束,也可以不设置约束,仅依靠应用程序的逻辑来保证。

# 类别表
create table category(
	cid int primary key auto_increment,
	cname varchar(32)
);

# 商品表
create table product(
	pid int primary key auto_increment,
	pname varchar(32),
	price int,
	category_id int
);

假设两张表“分类表”和“商品表”
为了表明商品属于哪个分类,通常情况下,我们将在商品表上添加一列,用于存放分类cid的信息,此列称为:外键

  • 外键特点:
    • 从表外键的值是对主表主键的引用。
    • 从表外键类型,必须与主表主键类型一致。
  • sql代码声明和删除外键约束
# 声明:
alter table 从表 add [constraint][外键名称] foreign key (从表外键字段名) references 主表 (主表的主键);
# 一个例子
# 添加外键
alter table product 
add constraint fk_product_category foreign key (category_id) references category(cid);

# 删除外键
alter table 从表 drop foreign key 外键名称

多表查询

初始数据如下:
表1:category
在这里插入图片描述
表2 :products
在这里插入图片描述

select * from A,B;

运行代码

select * from category,products

结果为笛卡尔积:
也就是表一的每个列分别和表二所有的列进行组合,产生了\(3*9=27\)个结果
在这里插入图片描述
下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。

在这里插入图片描述

内连接

内连接查询(使用的关键字 inner join -- inner可以省略)

  • 隐式内连接:select * from A,B where 条件;

  • 显示内连接:select * from A inner join B on 条件;

-- 隐式内连接
SELECT * FROM category c,products p WHERE c.cid = p.category_id;
-- 显示内连接
SELECT * FROM category c INNER JOIN products p on c.cid = p.category_id;

在这里插入图片描述

外连接

  • 左外连接:left outer join
    • select * from A left outer join B on 条件;
  • 右外连接:right outer join
    • select * from A right outer join B on 条件;

子查询

子查询:一条select语句结果作为另一条select语法一部分(查询条件,查询结果,表等)

-- 子查询 第一种(作为查询条件值使用)
select 
	* 
from
	products p
where
	p.category_id = (SELECT cid from category where cname='化妆品') -- 'c003'


-- 子查询 第二种(作为 一张表 使用)
select 
	p.*
FROM
	products p, (select * from category where cname='化妆品') c
WHERE
	p.category_id = c.cid;

posted @ 2021-03-30 09:48  克豪  阅读(122)  评论(0)    收藏  举报