MySQL数据库-DQL(多表查询)

多表设计

一对一

分析

人和身份证。一个人只有一个身份证,一个身份证只能对应一个人

实现原则

在任意一个表建立外键去关联另外一个表的主键。

SQL演示

-- 创建db5数据库
CREATE DATABASE db5;
-- 使用db5数据库
USE db5;

CREATE TABLE person(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20)
	
);

INSERT INTO person VALUES (1,'张三'),(2,'李四');

CREATE TABLE card(
	id INT PRIMARY KEY AUTO_INCREMENT,
	number VARCHAR(20) UNIQUE NOT NULL,
	pid INT UNIQUE,
	CONSTRAINT cp_fk1 FOREIGN KEY (pid) REFERENCES person(id)
);

INSERT INTO card VALUES (NULL,'12414',1),(NULL,'45344',2);

执行SQL后,我们可以在SQLyog的右上角的“新架构设计器”,将两个表拖入,如下所示:

MySQL数据库-DQL(多表查询)_第1张图片

该软件,会自动显示出2张表的关联关系——1:1

一对多

分析

例如:

用户订单。一个用户可以有多个订单!

商品分类商品。一个分类下可以有多个商品!

实现原则

多的一方建立外键约束,来关联一的一方主键

SQL演示

CREATE TABLE USER(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20)
);

INSERT INTO USER VALUES (NULL,'张三'),(NULL,'李四');

CREATE TABLE orderlist(
	id INT PRIMARY KEY AUTO_INCREMENT,
	number VARCHAR(20),
	uid INT,
	CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER (id) 
);

INSERT INTO orderlist VALUES (NULL,'hm001',1),
                            (NULL,'hm002',1),
                            (NULL,'hm003',2),
                            (NULL,'hm004',2);

 在多的一方建立外键约束,来关联一的一方主键。

订单表中的uid指向用户表的id。

在架构设计器中是 1 :n 的关系。

 MySQL数据库-DQL(多表查询)_第2张图片

注意:

uid是orderlist的,id是user的,在orderlist表(多的一方)中建立外键,去关联user表(少的一方)的主键。

CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER (id)

多对多

分析

学生课程,一个学生可以选择多个课程,一个课程也可以被多个学生选择

实现原则

需要借助第三张表中间表中间表至少包含两个列,这两个列作为中间表的外键,分别关联两张表的主键

MySQL数据库-DQL(多表查询)_第3张图片

SQL演示

学生表-student表,课程表-course表。

-- 创建student表
CREATE TABLE student(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20)
);
-- 添加数据
INSERT INTO student VALUES (NULL,'张三'),(NULL,'李四');

-- 创建course表
CREATE TABLE course(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(10)
);
-- 添加数据
INSERT INTO course VALUES (NULL,'语文'),(NULL,'数学');

中间表

sid 用于和student表的id进行外键关联

cid 用于和course表的id进行外键关联

-- 创建中间表
CREATE TABLE stu_course(
	id INT PRIMARY KEY AUTO_INCREMENT,
	sid INT, -- 用于和student表的id进行外键关联
	cid INT, -- 用于和course表的id进行外键关联
	CONSTRAINT sc_fk1 FOREIGN KEY (sid) REFERENCES student(id), -- 添加外键约束
	CONSTRAINT sc_fk2 FOREIGN KEY (cid) REFERENCES course(id)   -- 添加外键约束
);
-- 添加数据
INSERT INTO stu_course VALUES (NULL,1,1),(NULL,1,2),(NULL,2,1),(NULL,2,2);

在架构设计器中,结果如下: 

MySQL数据库-DQL(多表查询)_第4张图片

在多个数据表中要修改表数据怎么办?

答:添加级联关系——级联更新、级联删除

方法一

按照上述案例,我们先要删除外键约束

ALTER TABLE stu_course DROP FOREIGN KEY sc_fk1;

ALTER TABLE stu_course DROP FOREIGN KEY sc_fk2;

这时候,可以去架构设计器看一下(刷新一下!),可以发现表与表之间的“线”没有了

然后再重新添加外键约束,并在后面加上级联关系

ALTER TABLE stu_course ADD 
CONSTRAINT sc_fk1 FOREIGN KEY (sid) REFERENCES student(id) 
ON UPDATE CASCADE ON DELETE CASCADE;

ALTER TABLE stu_course ADD 
CONSTRAINT sc_fk2 FOREIGN KEY (cid) REFERENCES course(id) 
ON UPDATE CASCADE ON DELETE CASCADE;

然后再执行修改语句就可以了。

例如:

UPDATE student SET id=3 WHERE id=2;

student表中的id stu_course表中的 sid原来是2的都被改为3了。

MySQL数据库-DQL(多表查询)_第5张图片

MySQL数据库-DQL(多表查询)_第6张图片

方法二

当然了,如果需要,在建表的时候就可以直接添加级联

CREATE TABLE stu_course(
	id INT PRIMARY KEY AUTO_INCREMENT,
	sid INT, -- 用于和student表的id进行外键关联
	cid INT, -- 用于和course表的id进行外键关联
	CONSTRAINT sc_fk1 FOREIGN KEY (sid) REFERENCES student(id) 
ON UPDATE CASCADE ON DELETE CASCADE, -- 添加外键约束
	CONSTRAINT sc_fk2 FOREIGN KEY (cid) REFERENCES course(id) 
ON UPDATE CASCADE ON DELETE CASCADE   -- 添加外键约束
);

多表查询

数据准备

总述

(1)用户表——user表

(2)订单表——orderlist表

orderlist表中设置了外键uid指向user表;user表与orderlist表是 1:n的关系

(3)商品分类表——category表

(4)商品表——product表

product表中设置了外键cid指向categroy表;categroy表与product表是 1:n的关系

(5)中间表——us_pro表

us_pro表中甚至连外键uid和pid,分别与user表和product表的主键进行关联。       

SQL语句

-- 创建db6数据库
CREATE DATABASE db6;
-- 使用db6数据库
USE db6;

-- (1)创建user表
CREATE TABLE USER(
	id INT PRIMARY KEY AUTO_INCREMENT,	-- 用户id
	NAME VARCHAR(20), 		         	-- 用户姓名
	age INT                             -- 用户年龄
);
-- 添加数据
INSERT INTO USER VALUES (1,'张三',23);
INSERT INTO USER VALUES (2,'李四',24);
INSERT INTO USER VALUES (3,'王五',25);
INSERT INTO USER VALUES (4,'赵六',26);


-- (2)订单表
CREATE TABLE orderlist(
	id INT PRIMARY KEY AUTO_INCREMENT,	-- 订单id
	number VARCHAR(30),					-- 订单编号
	uid INT,    -- 外键字段
	CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER(id)
);
-- 添加数据
INSERT INTO orderlist VALUES (1,'hm001',1);
INSERT INTO orderlist VALUES (2,'hm002',1);
INSERT INTO orderlist VALUES (3,'hm003',2);
INSERT INTO orderlist VALUES (4,'hm004',2);
INSERT INTO orderlist VALUES (5,'hm005',3);
INSERT INTO orderlist VALUES (6,'hm006',3);
INSERT INTO orderlist VALUES (7,'hm007',NULL);


-- (3)商品分类表
CREATE TABLE category(
	id INT PRIMARY KEY AUTO_INCREMENT,  -- 商品分类id
	NAME VARCHAR(10)                    -- 商品分类名称
);
-- 添加数据
INSERT INTO category VALUES (1,'手机数码');
INSERT INTO category VALUES (2,'电脑办公');
INSERT INTO category VALUES (3,'烟酒茶糖');
INSERT INTO category VALUES (4,'鞋靴箱包');


-- (4)商品表
CREATE TABLE product(
	id INT PRIMARY KEY AUTO_INCREMENT,   -- 商品id
	NAME VARCHAR(30),                    -- 商品名称
	cid INT, -- 外键字段
	CONSTRAINT cp_fk1 FOREIGN KEY (cid) REFERENCES category(id)
);
-- 添加数据
INSERT INTO product VALUES (1,'华为手机',1);
INSERT INTO product VALUES (2,'小米手机',1);
INSERT INTO product VALUES (3,'联想电脑',2);
INSERT INTO product VALUES (4,'苹果电脑',2);
INSERT INTO product VALUES (5,'中华香烟',3);
INSERT INTO product VALUES (6,'玉溪香烟',3);
INSERT INTO product VALUES (7,'计生用品',NULL);


-- (5)中间表
CREATE TABLE us_pro(
	upid INT PRIMARY KEY AUTO_INCREMENT,  -- 中间表id
	uid INT, -- 外键字段。需要和用户表的主键产生关联
	pid INT, -- 外键字段。需要和商品表的主键产生关联
	CONSTRAINT up_fk1 FOREIGN KEY (uid) REFERENCES USER(id),
	CONSTRAINT up_fk2 FOREIGN KEY (pid) REFERENCES product(id)
);
-- 添加数据
INSERT INTO us_pro VALUES (NULL,1,1);
INSERT INTO us_pro VALUES (NULL,1,2);
INSERT INTO us_pro VALUES (NULL,1,3);
INSERT INTO us_pro VALUES (NULL,1,4);
INSERT INTO us_pro VALUES (NULL,1,5);
INSERT INTO us_pro VALUES (NULL,1,6);
INSERT INTO us_pro VALUES (NULL,1,7);
INSERT INTO us_pro VALUES (NULL,2,1);
INSERT INTO us_pro VALUES (NULL,2,2);
INSERT INTO us_pro VALUES (NULL,2,3);
INSERT INTO us_pro VALUES (NULL,2,4);
INSERT INTO us_pro VALUES (NULL,2,5);
INSERT INTO us_pro VALUES (NULL,2,6);
INSERT INTO us_pro VALUES (NULL,2,7);
INSERT INTO us_pro VALUES (NULL,3,1);
INSERT INTO us_pro VALUES (NULL,3,2);
INSERT INTO us_pro VALUES (NULL,3,3);
INSERT INTO us_pro VALUES (NULL,3,4);
INSERT INTO us_pro VALUES (NULL,3,5);
INSERT INTO us_pro VALUES (NULL,3,6);
INSERT INTO us_pro VALUES (NULL,3,7);
INSERT INTO us_pro VALUES (NULL,4,1);
INSERT INTO us_pro VALUES (NULL,4,2);
INSERT INTO us_pro VALUES (NULL,4,3);
INSERT INTO us_pro VALUES (NULL,4,4);
INSERT INTO us_pro VALUES (NULL,4,5);
INSERT INTO us_pro VALUES (NULL,4,6);
INSERT INTO us_pro VALUES (NULL,4,7);

架构器图解

MySQL数据库-DQL(多表查询)_第7张图片

内连接查询

        

你可能感兴趣的:(MySQL学习笔记,Java全栈学习笔记,数据库,mysql,database)