博客
关于我
mysql多表操作常用语法命令
阅读量:334 次
发布时间:2019-03-04

本文共 8126 字,大约阅读时间需要 27 分钟。

一、多表设计

1.一对一

  • 实现原则
    • 在任意一个表建立外键,去关联另外一个表的主键
  • 代码演示
-- 创建db5数据库CREATE DATABASE db5;-- 使用db5数据库USE db5;-- 创建person表CREATE TABLE person(	id INT PRIMARY KEY AUTO_INCREMENT,	NAME VARCHAR(20));-- 添加数据INSERT INTO person VALUES (NULL,'张三'),(NULL,'李四');-- 创建card表CREATE TABLE card(	id INT PRIMARY KEY AUTO_INCREMENT,	number VARCHAR(50),	pid INT UNIQUE,	CONSTRAINT cp_fk1 FOREIGN KEY (pid) REFERENCES person(id) -- 添加外键);-- 添加数据INSERT INTO card VALUES (NULL,'12345',1),(NULL,'56789',2);
  • 图解
    01

2.一对多

  • 分析
    • 用户和订单。一个用户可以有多个订单!
    • 商品分类和商品。一个分类下可以有多个商品!
  • 实现原则
    • 在多的一方,建立外键约束,来关联一的一方主键
  • 代码演示
/*	用户和订单*/-- 创建user表CREATE TABLE USER(	id INT PRIMARY KEY AUTO_INCREMENT,	NAME VARCHAR(20));-- 添加数据INSERT INTO USER VALUES (NULL,'张三'),(NULL,'李四');-- 创建orderlist表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);/*	商品分类和商品*/-- 创建category表CREATE TABLE category(	id INT PRIMARY KEY AUTO_INCREMENT,	NAME VARCHAR(10));-- 添加数据INSERT INTO category VALUES (NULL,'手机数码'),(NULL,'电脑办公');-- 创建product表CREATE TABLE product(	id INT PRIMARY KEY AUTO_INCREMENT,	NAME VARCHAR(30),	cid INT,	CONSTRAINT pc_fk1 FOREIGN KEY (cid) REFERENCES category(id)  -- 添加外键约束);-- 添加数据INSERT INTO product VALUES (NULL,'华为P30',1),(NULL,'小米note3',1),(NULL,'联想电脑',2),(NULL,'苹果电脑',2);
  • 图解
    02

3.多对多

  • 分析
    • 学生和课程。一个学生可以选择多个课程,一个课程也可以被多个学生选择!
  • 实现原则
    • 需要借助第三张表中间表,中间表至少包含两个列,这两个列作为中间表的外键,分别关联两张表的主键
  • 代码演示
-- 创建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,'数学');-- 创建中间表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);
  • 图解
    03

二、多表查询

1.多表查询-数据准备

  • 代码演示
-- 创建db6数据库CREATE DATABASE db6;-- 使用db6数据库USE db6;-- 创建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);-- 订单表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);-- 商品分类表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,'鞋靴箱包');-- 商品表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);-- 中间表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);
  • 架构器图解

04

2.多表查询-笛卡尔积查询

  • 有两张表,获取这两个表的所有组合情况
  • 要完成多表查询,需要消除这些没有用的数据
  • 多表查询格式
SELECT	列名列表FROM	表名列表WHERE	条件...
  • 笛卡尔积查询
-- 标准语法SELECT 列名 FROM 表名1,表名2,...;-- 查询user表和orderlist表SELECT * FROM USER,orderlist;

3.多表查询-内连接查询

  • 查询原理
    • 内连接查询的是两张表有交集的部分数据(有主外键关联的数据)
  • 显式内连接
-- 标准语法SELECT 列名 FROM 表名1 [INNER] JOIN 表名2 ON 条件;-- 查询用户信息和对应的订单信息SELECT * FROM USER INNER JOIN orderlist ON user.id=orderlist.uid;SELECT * FROM USER JOIN orderlist ON user.id=orderlist.uid;-- 查询用户信息和对应的订单信息,起别名SELECT * FROM USER u JOIN orderlist o ON u.id=o.uid;-- 查询用户姓名,年龄。和订单编号SELECT	u.`name`,	-- 姓名	u.`age`,	-- 年龄	o.`number`	-- 订单编号FROM	USER u          -- 用户表JOIN	orderlist o     -- 订单表ON 	u.`id` = o.`uid`;
  • 隐式内连接
-- 标准语法SELECT 列名 FROM 表名1,表名2 WHERE 条件;-- 查询用户姓名,年龄。和订单编号SELECT	u.`name`,	-- 姓名	u.`age`,	-- 年龄	o.`number`	-- 订单编号FROM	USER u,		-- 用户表	orderlist o     -- 订单表WHERE	u.`id`=o.`uid`;

4.多表查询-外连接查询

  • 左外连接

    • 查询原理
      • 查询左表的全部数据,和左右两张表有交集部分的数据
    • 基本演示
    -- 标准语法SELECT 列名 FROM 表名1 LEFT [OUTER] JOIN 表名2 ON 条件;-- 查询所有用户信息,以及用户对应的订单信息SELECT	u.`name`,	-- 姓名	u.`age`,	-- 年龄	o.`number`	-- 订单编号FROM	USER u          -- 用户表LEFT OUTER JOIN	orderlist o     -- 订单表ON	u.`id`=o.`uid`;
  • 右外连接

    • 查询原理
      • 查询右表的全部数据,和左右两张表有交集部分的数据
    • 基本演示
    -- 基本语法SELECT 列名 FROM 表名1 RIGHT [OUTER] JOIN 表名2 ON 条件;-- 查询所有订单信息,以及订单所属的用户信息SELECT	u.`name`,	-- 姓名	u.`age`,	-- 年龄	o.`number`	-- 订单编号FROM	USER u          -- 用户表RIGHT OUTER JOIN	orderlist o     -- 订单表ON	u.`id`=o.`uid`;

5.多表查询-子查询

  • 子查询介绍

    • 查询语句中嵌套了查询语句。我们就将嵌套查询称为子查询!
  • 子查询-结果是单行单列的

    • 可以作为条件,使用运算符进行判断!
    • 基本演示
    -- 标准语法SELECT 列名 FROM 表名 WHERE 列名=(SELECT 聚合函数(列名) FROM 表名 [WHERE 条件]);-- 查询年龄最高的用户姓名SELECT MAX(age) FROM USER;              -- 查询出最高年龄SELECT NAME,age FROM USER WHERE age=26; -- 根据查询出来的最高年龄,查询姓名和年龄SELECT NAME,age FROM USER WHERE age = (SELECT MAX(age) FROM USER);
  • 子查询-结果是多行单列的

    • 可以作为条件,使用运算符in或not in进行判断!
    • 基本演示
    -- 标准语法SELECT 列名 FROM 表名 WHERE 列名 [NOT] IN (SELECT 列名 FROM 表名 [WHERE 条件]); -- 查询张三和李四的订单信息SELECT id FROM USER WHERE NAME='张三' OR NAME='李四';   -- 查询张三和李四用户的idSELECT number,uid FROM orderlist WHERE uid=1 OR uid=2; -- 根据id查询订单SELECT number,uid FROM orderlist WHERE uid IN (SELECT id FROM USER WHERE NAME='张三' OR NAME='李四');
  • 子查询-结果是多行多列的

    • 可以作为一张虚拟表参与查询!
    • 基本演示
    -- 标准语法SELECT 列名 FROM 表名 [别名],(SELECT 列名 FROM 表名 [WHERE 条件]) [别名] [WHERE 条件];-- 查询订单表中id大于4的订单信息和所属用户信息SELECT * FROM USER u,(SELECT * FROM orderlist WHERE id>4) o WHERE u.id=o.uid;

6.多表查询-自关联查询

  • 自关联查询介绍
    • 同一张表中有数据关联。可以多次查询这同一个表!
  • 自关联查询演示
-- 创建员工表CREATE TABLE employee(	id INT PRIMARY KEY AUTO_INCREMENT,	NAME VARCHAR(20),	mgr INT,	salary DOUBLE);-- 添加数据INSERT INTO employee VALUES (1001,'孙悟空',1005,9000.00),(1002,'猪八戒',1005,8000.00),(1003,'沙和尚',1005,8500.00),(1004,'小白龙',1005,7900.00),(1005,'唐僧',NULL,15000.00),(1006,'武松',1009,7600.00),(1007,'李逵',1009,7400.00),(1008,'林冲',1009,8100.00),(1009,'宋江',NULL,16000.00);-- 查询所有员工的姓名及其直接上级的姓名,没有上级的员工也需要查询/*分析:	员工姓名 employee表        直接上级姓名 employee表	条件:employee.mgr = employee.id	查询左表的全部数据,和左右两张表交集部分数据,使用左外连接*/SELECT	t1.name,	-- 员工姓名	t1.mgr,		-- 上级编号	t2.id,		-- 员工编号	t2.name     -- 员工姓名FROM	employee t1  -- 员工表LEFT OUTER JOIN	employee t2  -- 员工表ON	t1.mgr = t2.id;

转载地址:http://mybh.baihongyu.com/

你可能感兴趣的文章
MTCNN 人脸检测
查看>>
MyEcplise中SpringBoot怎样定制启动banner?
查看>>
MyPython
查看>>
MTD技术介绍
查看>>
MySQL
查看>>
MySQL
查看>>
mysql
查看>>
MTK Android 如何获取系统权限
查看>>
MySQL - 4种基本索引、聚簇索引和非聚索引、索引失效情况、SQL 优化
查看>>
MySQL - ERROR 1406
查看>>
mysql - 视图
查看>>
MySQL - 解读MySQL事务与锁机制
查看>>
MTTR、MTBF、MTTF的大白话理解
查看>>
mt_rand
查看>>
mysql -存储过程
查看>>
mysql /*! 50100 ... */ 条件编译
查看>>
mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
查看>>
mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
查看>>
mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
查看>>
mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
查看>>