外键约束

  • 外键指的是在从表中与主表的主键对应的那个字段
  • 使用外键约束可以让两张表之间产生一个对应关系,从而保证主从表的引用的完整性
  • 从表外键类型必须与主表主键类型一致 否则创建失败
  • 添加数据时, 应该先添加主表中的数据
  • 删除数据时,应该先删除从表中的数据

1.创建外键约束

  • 新建表时添加外键
    1. -- 语法:[CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名)
    2. CREATE TABLE table2(
    3. id INT PRIMARY KEY AUTO_INCREMENT,
    4. tid INT,
    5. FOREIGN KEY(tid) REFERENCES table1(id)
    6. );

注:外间约束名称可以省略由系统自动生成

  • 已有表添加外键
    1. -- 语法:ALTER TABLE 从表 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主 键字段名);
    2. ALTER TABLE table2 ADD FOREIGN KEY (tid) REFERENCES table1(id);

2.删除外键约束

  • 删除table2表的外键table4_ibfk_1
    1. -- 语法:ALTER TABLE 从表 DROP FOREIGN KEY 外键约束名称
    2. ALTER TABLE table2 DROP FOREIGN KEY table4_ibfk_1;

3.级联删除操作

  • 如果想实现删除主表数据的同时,也删除掉从表数据,可以使用级联删除操作

  • 关键字:ON DELETE CASCADE

    1. CREATE TABLE table2(
    2. id INT PRIMARY KEY AUTO_INCREMENT,
    3. tid INT,
    4. FOREIGN KEY(tid) REFERENCES table1(id)
    5. ON DELETE CASCADE
    6. );

连接查询

1.准备数据

  1. CREATE DATABASE db3_2 CHARACTER SET utf8;
  2. -- 分类表 (一方 主表)
  3. CREATE TABLE category (
  4. cid VARCHAR(32) PRIMARY KEY ,
  5. cname VARCHAR(50)
  6. );
  7. -- 商品表 (多方 从表)
  8. CREATE TABLE products(
  9. pid VARCHAR(32) PRIMARY KEY ,
  10. pname VARCHAR(50),
  11. price INT,
  12. flag VARCHAR(2),
  13. category_id VARCHAR(32),
  14. -- 添加外键约束
  15. FOREIGN KEY (category_id) REFERENCES category (cid)
  16. );
  17. -- 分类数据
  18. INSERT INTO category(cid,cname) VALUES('c001','家电');
  19. INSERT INTO category(cid,cname) VALUES('c002','鞋服');
  20. INSERT INTO category(cid,cname) VALUES('c003','化妆品');
  21. INSERT INTO category(cid,cname) VALUES('c004','汽车');
  22. -- 商品数据
  23. INSERT INTO products(pid, pname,price,flag,category_id) VALUES('p001','小米电视 机',5000,'1','c001');
  24. INSERT INTO products(pid, pname,price,flag,category_id) VALUES('p002','格力空 调',3000,'1','c001');
  25. INSERT INTO products(pid, pname,price,flag,category_id) VALUES('p003','美的冰 箱',4500,'1','c001');
  26. INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p004','篮球 鞋',800,'1','c002');
  27. INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p005','运动 裤',200,'1','c002');
  28. INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p006','T 恤',300,'1','c002');
  29. INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p007','冲锋 衣',2000,'1','c002');
  30. INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p008','神仙 水',800,'1','c003');
  31. INSERT INTO products (pid, pname,price,flag,category_id) VALUES('p009','大 宝',200,'1','c003');

2.内连接查询

  • 隐式内连接:from后面写多个表名使用where指定连接条件这种连接方式是隐式内连接
    1. -- 语法:SELECT 字段名 FROM 左表, 右表 WHERE 连接条件;
    2. SELECT * FROM products,category WHERE category_id = cid;
  • 显式内连接:使用 inner join …on 这种方式, 就是显式内连接
    1. -- 语法:SELECT 字段名 FROM 左表 [INNER] JOIN 右表 ON 条件
    2. -- INNER 可以省略
    3. SELECT * FROM products p JOIN category c ON p.category_id = c.cid;

内连接: inner join , 只获取两张表中 交集部分的数据.

3.外连接查询

  • 左外连接:
    1. -- 语法:SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件
    2. SELECT * FROM category c LEFT JOIN products p ON c.`cid`= p.`category_id`;
  • 右外连接:
    1. -- 语法:SELECT 字段名 FROM 左表 RIGHT [OUTER ]JOIN 右表 ON 条件
    2. SELECT * FROM products p RIGHT JOIN category c ON p.`category_id` = c.`cid`;

左外连接: left join , 以左表为基准 ,查询左表的所有数据, 以及与右表有交集的部分

右外连接: right join , 以右表为基准,查询右表的所有的数据,以及与左表有交集的部分

子查询

  • 一条select 查询语句的结果, 作为另一条 select 语句的一部分
  • 子查询必须放在小括号中
  • 子查询一般作为父查询的查询条件使用

1.作为查询条件

  • 语法格式
    1. SELECT 查询字段 FROM WHERE 字段=(子查询);
  • 示例 ```sql — 1.先查询出最高价格 SELECT MAX(price) FROM products;

— 2.将最高价格作为条件,获取商品信息 SELECT * FROM products WHERE price = (SELECT MAX(price) FROM products);

  1. <a name="7516917c"></a>
  2. #### 2.作为一张表
  3. -
  4. 语法格式
  5. ```sql
  6. SELECT 查询字段 FROM (子查询)表别名 WHERE 条件;
  • 示例 ```sql — 1.先查询分类表的数据 SELECT * FROM category;

— 2.将上面的查询语句 作为一张表使用 SELECT p.pname,p.price,c.cname FROM products p — 子查询作为一张表使用时 要起别名 才能访问表中字段 INNER JOIN (SELECT * FROM category) c ON p.category_id = c.cid WHERE p.price > 500;

  1. <a name="128c7f95"></a>
  2. #### 3.子查询结果单列
  3. -
  4. 语法格式
  5. ```sql
  6. SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);
  • 示例 ```sql — 1.先查询价格小于2000 的商品的,分类ID SELECT DISTINCT category_id FROM products WHERE price < 2000;

— 2.在根据分类的id信息,查询分类名称 SELECT * FROM category WHERE cid IN (SELECT DISTINCT category_id FROM products WHERE price < 2000); ```

更新时间:{docsify-updated}