mysql 进阶 连表查询
复习了基础的增删改查,现在来进阶一点点,怎么连表查询。
首先我们要先设计表结构,比如创建 3 张表authors,book,publishers,设计这 3 张表的结构,比如 book.author_id 来源于 authors.id,而 publishers.book_id 来源于 book.id。
CREATE TABLE authors (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> nick_name VARCHAR(100),
-> age INT,
-> created_at DATETIME DEFAULT CURRENT_TIMESTAMP
-> );
CREATE TABLE book (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> author_id INT,
-> name VARCHAR(100),
-> FOREIGN KEY(author_id) REFERENCES authors(id)
-> )
CREATE TABLE publishers(
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> book_id INT,
-> name VARCHAR(100),
-> FOREIGN KEY(book_id) REFERENCES book(id)
-> );
自行分别给这 3 张表插入对应的数据

现在要实现一个连表查询语句,查询土豆写的所有书的出版社。
SELECT a.nick_name AS author, b.name AS book, p.name AS publisher FROM
-> authors a JOIN book b ON a.id = b.author_id
-> JOIN publishers p ON b.id = p.book_id;

Mysql join 默认时INNER JOIN,意思是只返回两边都有匹配的数据,我这里连表查询如果有一个为 null 那就查询不到出错了,所以要用另一个连表查询的 JOIN 类型,用LEFT JOIN,它的意思是返回查询左表的所有数据,即使右边没有匹配到也会返回 null。
已关联的表删除时要格外小心,不能直接从源头删除,否则数据库会出问题。
如果需要关联删除,则需要在建表的时候指定关联删除
FOREIGN KEY (author_id) REFERENCES authors(id) ON DELETE CASCADE
没有在建表时指定则需要删除时从最外面的表开始一个个的删除。