外键的作用?
保证数据的完整性,保证数据的安全操作.
-- 设置外键 : 建立真正的 多对一的关系;
-- 给从表设置外键,关联主表的主键
#格式: alter table 从表 add constraint `外键名称_fk` foreign key 从表(外键) references 主表(主键);
ALTER TABLE emp ADD CONSTRAINT `emp_dept_fk` FOREIGN KEY emp(did) REFERENCES dept(did);
1.笛卡尔积(查询两张表中的所有数据)
#需求1:查询分类表和商品表的所有信息.
SELECT * FROM category , products;
#使用条件过滤脏数据 (使用从表的外键 = 主表的主键)
SELECT * FROM category , products WHERE cid = category_id;
2.内连接查询
显式内连接 / 隐式内连接
结论:内连接执行多表查询的效果: 取两个表的交集内容,条件是两个表都符合的结果会被查出来.
显式内连接:
格式: select 字段 from 表A inner join 表B on 条件;
隐式内连接:
格式: select 字段 from 表A , 表B where 条件
#需求: 使用显式内连接查询 分类表和商品表的所有信息.
SELECT * FROM category INNER JOIN products ON cid=category_id;
#需求2: 建议起别名
SELECT * FROM category c INNER JOIN products p ON c.cid=p.category_id;
#需求3:使用隐式内连接查询两个表的数据
# 格式: select 字段 from 表A , 表B where 条件
SELECT * FROM category c , products p WHERE c.cid = p.category_id;
3.外连接
左外连接 / 右外连接
结论:
左外连接: 以左表为基准,会查出来左表所有的数据,以及关联的和右表的交集部分的数据.
右外连接: 以右表为基准,会查出来右表的所有数据,以及关联的和左表的交集部分的数据.
左外连接的格式:
select 字段 from 表1 left join 表2 on 条件.
右外连接的格式:
select 字段 from 表1 right join 表2 on 条件.
#需求1:使用左外连接查询商品和分类信息 (商品表示左表)
SELECT * FROM products p LEFT JOIN category c ON p.category_id = c.cid;
#为了让效果明显: 删除 product商品表中的香奈儿的 category_id null 和 内连接做对比.
/*
右外连接的格式:
select 字段 from 表1 right join 表2 on 条件.
*/
#需求2:使用右外连接查询商品和分类信息
# 这时以右边的category表为基准(它的数据都必须存在) 关联 product表进行查询
SELECT * FROM products p RIGHT JOIN category c ON p.category_id = c.cid;
#需求3:把右外连接的结果,使用左外连接实现
SELECT * FROM category c LEFT JOIN products p ON p.category_id = c.cid;
4.子查询:
查询语句中嵌套查询语句. 子查询
子查询:如果查到的结果是一个一行一列的,可以让该查询结果作为一个条件
子查询: 如果查询到的结果是一个多行1列的,可以让他作为一张表来使用. 作为条件.
子查询: 如果查询的结果是一个多行多列的,可以让该结果作为一张表. 对该表进行查询
子查询:不推荐使用; 因为查询效率太低.
# 需求: 1 子查询, 查询“化妆品”分类上架商品详情
#1.如果不用子查询
SELECT * FROM products p , category c WHERE p.category_id=c.cid AND c.cname='化妆品' AND flag=1;
#2.将上面的语句修改为子查询
# 如果查询的结果是一个一行一列的,让该结果作为一个条件.
#查询分类id , 分类名称为化妆品
SELECT cid FROM category WHERE cname='化妆品';
#使用子查询修改sql
SELECT * FROM products p , category c
WHERE p.category_id=c.cid
AND c.cid = (SELECT cid FROM category WHERE cname='化妆品')
AND flag = 1;
#让查询的结果作为一张表
#查询“化妆品”和“家电”两个分类上架商品详情
SELECT * FROM products p,category c
WHERE p.category_id = c.cid
AND (c.cname='化妆品' OR c.cname='家电');
#使用子查询来修改代码
#1.先查询分类表,查询分类为化妆品或家电cid的结果集
SELECT cid FROM category WHERE cname = '化妆品' OR cname='家电';
#2.上面两个表查询的结构在,cid = c001 ,c003里面选
SELECT * FROM products p ,category c
WHERE p.category_id = c.cid
AND flag = 1
AND c.cid IN (SELECT cid FROM category WHERE cname = '化妆品' OR cname='家电')
#3.如果查询的结果是一个多行多列的.
SELECT * FROM category WHERE cname = '化妆品' OR cname='家电';
#查询的时候 products category
SELECT * FROM products p , (SELECT * FROM category WHERE cname = '化妆品' OR cname='家电') c
WHERE p.category_id = c.cid AND flag=1;