SQL多表查询

多表查询分类:

  • 内连接查询
    • 显式内连接
    • 隐式内连接
  • 外连接查询
    • 左外连接
    • 右外连接
  • 子查询
  • 自关联查询

准备数据:

-- 创建user表
CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT,	-- 用户idNAME VARCHAR(20),			        -- 用户姓名age INT                             -- 用户年龄
);
-- 添加数据
INSERT INTO USER VALUES (NULL,'张三',23);
INSERT INTO USER VALUES (NULL,'李四',24);
INSERT INTO USER VALUES (NULL,'王五',25);
INSERT INTO USER VALUES (NULL,'赵六',26);-- 订单表
CREATE TABLE orderlist(id INT PRIMARY KEY AUTO_INCREMENT,	-- 订单idnumber VARCHAR(30),					-- 订单编号uid INT,    -- 外键字段CONSTRAINT ou_fk FOREIGN KEY (uid) REFERENCES USER(id)
);
-- 添加数据
INSERT INTO orderlist VALUES (NULL,'test001',1);
INSERT INTO orderlist VALUES (NULL,'test002',1);
INSERT INTO orderlist VALUES (NULL,'test003',2);
INSERT INTO orderlist VALUES (NULL,'test004',2);
INSERT INTO orderlist VALUES (NULL,'test005',3);
INSERT INTO orderlist VALUES (NULL,'test006',3);
INSERT INTO orderlist VALUES (NULL,'test007',NULL);-- 商品分类表
CREATE TABLE category(id INT PRIMARY KEY AUTO_INCREMENT,  -- 商品分类idNAME VARCHAR(10)                    -- 商品分类名称
);
-- 添加数据
INSERT INTO category VALUES (NULL,'手机数码');
INSERT INTO category VALUES (NULL,'电脑办公');
INSERT INTO category VALUES (NULL,'烟酒茶糖');
INSERT INTO category VALUES (NULL,'鞋靴箱包');-- 商品表
CREATE TABLE product(id INT PRIMARY KEY AUTO_INCREMENT,   -- 商品idNAME VARCHAR(30),                    -- 商品名称cid INT, -- 外键字段CONSTRAINT cp_fk FOREIGN KEY (cid) REFERENCES category(id)
);
-- 添加数据
INSERT INTO product VALUES (NULL,'华为手机',1);
INSERT INTO product VALUES (NULL,'小米手机',1);
INSERT INTO product VALUES (NULL,'联想电脑',2);
INSERT INTO product VALUES (NULL,'苹果电脑',2);
INSERT INTO product VALUES (NULL,'中华香烟',3);
INSERT INTO product VALUES (NULL,'玉溪香烟',3);
INSERT INTO product VALUES (NULL,'计生用品',NULL);-- 中间表
CREATE TABLE us_pro(upid INT PRIMARY KEY AUTO_INCREMENT,  -- 中间表iduid 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);
内连接:

查询原理:内连接查询的是两张表有交集的部分数据(有主外键关联的数据)

显式内连接

-- 内连接显示查询
-- 标准语法  INNER可写可不写
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;-- 查询用户姓名,年龄。和订单编号,标准查询格式
SELECTu.`name`,-- 姓名u.`age`,-- 年龄o.`number` -- 订单编号FROMUSER u -- 用户表INNER JOIN orderlist o -- 订单表ON u.`id` = o.`uid`;

隐式内连接:

-- 隐式内连接
-- 标准语法
SELECT 列名 FROM 表名1,表名2 WHERE 条件;-- 查询用户姓名,年龄。和订单编号
SELECTu.`name`,	-- 姓名u.`age`,	-- 年龄o.`number`	-- 订单编号
FROMUSER u,		-- 用户表orderlist o     -- 订单表
WHEREu.`id`=o.`uid`;
左外连接:

查询原理

查询左表的全部数据,和左右两张表有交集部分的数据

演示:

-- 标准语法   OUTER可写可不写
SELECT 列名 FROM 表名1 LEFT [OUTER] JOIN 表名2 ON 条件;-- 查询所有用户信息,以及用户对应的订单信息
SELECTu.`name`,-- 姓名u.`age`,-- 年龄o.`number` -- 订单编号FROMUSER u -- 用户表LEFT OUTER JOIN orderlist o -- 订单表ON u.`id` = o.`uid`;
右外连接:

查询原理

查询右表的全部数据,和左右两张表有交集部分的数据

-- 基本语法   OUTER可写可不写
SELECT 列名 FROM 表名1 RIGHT [OUTER] JOIN 表名2 ON 条件;
-- 查询所有订单信息,以及订单所属的用户信息
SELECTu.`name`,	-- 姓名u.`age`,	-- 年龄o.`number`	-- 订单编号
FROMUSER u          -- 用户表
RIGHT OUTER JOINorderlist o     -- 订单表
ONu.`id`=o.`uid`;
子查询:
  • 查询语句中嵌套了查询语句,将嵌套的查询称为子查询!

子查询的结果是单行单列的

  • 可以将查询的结果作为另一条语句的查询条件,使用运算符进行判断!
-- 标准语法
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='李四';   -- 查询张三和李四用户的id
SELECT number,uid FROM orderlist WHERE uid=1 OR uid=2; -- 根据id查询订单
SELECT * FROM orderlist WHERE uid IN (SELECT id FROM USER WHERE NAME='张三' OR NAME='李四');

子查询-结果是多行多列的

可以作为一张虚拟表参与查询!

-- 标准语法
SELECT 列名 FROM 表名 [别名],(SELECT 列名 FROM 表名 [WHERE 条件]) [别名] [WHERE 条件];-- 查询订单表中id大于4的订单信息和所属用户信息
SELECT * FROM orderlist WHERE id > 4;SELECTu.name,o.number
FROMUSER u,(SELECT * FROM orderlist WHERE id > 4) o
WHEREo.uid = u.id;
自关联查询:

同一张表中有数据关联。可以多次查询这同一个表!
比如:在employee表中,猪八戒的上级是唐僧,那么猪八戒就是有自关联的,就是同一张表数据之间有一定的数据关联

-- 创建员工表
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查询左表的全部数据,和左右两张表交集部分数据,使用左外连接
*/
SELECTt1.name,	-- 员工姓名t1.mgr,		-- 上级编号t2.id,		-- 员工编号t2.name     -- 员工姓名
FROMemployee t1  -- 员工表
LEFT OUTER JOINemployee t2  -- 员工表
ONt1.mgr = t2.id;

多表查询练习:

1、查询用户的id、姓名、年龄、订单编号

/*
分析:user用户表:id、姓名、年龄  orderlist订单表:订单编号条件:user.id = orderlist.uid
*/SELECTu.id,u.`NAME`,u.age,o.number 
FROM`USER` u,orderlist o 
WHEREu.id = o.uid;

2、查询所有的用、用户的id、姓名、年龄、订单编号

/*
分析:user表:id、姓名、年龄  orderlist表:订单编号条件:user.id = orderlist.uid查询所有用户,使用左外连接
*/SELECTu.id,u.`NAME`,u.age,o.number 
FROM`USER` uLEFT INNER JOIN orderlist o ON u.id = o.uid;

3、查询所有的订单、用户的id、姓名、年龄、订单编号

/*
分析:user表:id、姓名、年龄 orderlist表:订单编号条件:user.id = orderlist.uid查询所有订单,使用右外连接
*/ SELECTu.id,u.`NAME`,u.age,o.number 
FROM`USER` uRIGHT OUTER JOIN orderlist o ON u.id = o.uid;

4、查询用户年龄大于23岁的信息、显示用户的id、姓名、年龄、订单编号

/*
分析:user表:id、姓名、年龄 orderlist表:订单编号条件:user.id = orderlist.uid AND user.age > 23;
*/SELECTu.id,u.`NAME`,u.age,o.number 
FROM`USER` u,orderlist o 
WHEREu.id = o.uid AND u.age > 23;

5、查询张三、李四用户的信息。显示用户的id、姓名、年龄。订单编号

/*
分析:user表:id、姓名、年龄 orderlist表:订单编号条件:user.id = orderlist.uid AND user.name IN ('张三','李四');
*/SELECTu.id,u.`NAME`,u.age,o.number 
FROM`USER` u,orderlist o 
WHEREu.id = o.uid AND u.`NAME` IN ( '张三', '李' );

6、查询商品分类的id、分类名称、分类下的商品名称

/*
分析:category表:商品分类的编号、分类名称product表:分类下的商品名称 条件:category.id = product.cid
*/SELECTc.id,c.`NAME`,p.cid 
FROMcategory c,product p 
WHEREc.id = p.cid;

7、查询所有的商品分类、商品分类的id、分类名称、分类下的商品名称

/*
分析:category表:商品分类的编号、分类名称 product:表分类下的商品名称 条件:category.id = product.cid查询所有的商品分类,使用左外连接
*/
SELECTc.id,c.NAME,p.NAME 
FROMcategory cLEFT OUTER JOIN product p ON c.id = p.cid;

8、查询所有的商品信息、商品分类的id、分类名称、分类下的商品名称

/*
分析:category表:商品分类的编号、分类名称product表:分类下的商品名称条件:category.id = product.cid查询所有的商品信息,使用右外连接
*/
SELECTc.id,c.NAME,p.NAME 
FROMcategory cRIGHT OUTER JOIN product pON c.id = p.cid;

9、查询所有的用户和该用户能查看的所有的商品、显示用户的id、姓名、年龄、商品名称

/*
分析:user表:用户的id、姓名、年龄us_pro中间表:product表:商品名称条件:us_pro.uid = user.id AND us_pro.pid = product.id
*/
SELECTu.id,u.NAME,u.age,p.NAME 
FROM`USER` u,product p,us_pro up 
WHEREup.uid = u.id AND up.pid = p.id;

10、查询张三和李四这两个用户可以看到的商品。显示用户的id、姓名、年龄、商品名称

/*
分析:user表:用户的id、姓名、年龄product表:商品名称us_pro中间表:条件:us_pro.uid = user.id AND us_pro.pid = product.id AND user.name IN ('张三','李四')
*/
SELECTu.id,u.NAME,u.age,p.NAME 
FROM`USER` u,product p,us_pro up 
WHEREup.uid = u.id AND up.pid = p.id AND u.`NAME`IN ( '张三', '李四' );

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572228.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP协议整理

一、概念 1.HTTP协议:即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和Web服务器之间互相通信的规则,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。它可以使浏览器更加高效,使网络传输减少。…

【DDD】--好文收藏

索引: 目录索引 发现一批好文,完整系列,攒~~ 随笔分类 - DDD - 『圣杰』 DDD理论学习系列(1)-- 通用语言 笔记: 通用语言: a) 简单,便于理解、传播。 b) 需要通用,能够准…

SQL存储过程、存储函数

概念: 存储过程和函数: 存储过程和函数是事先经过编译并存储在数据库中的一SQL语句的集合 存储过程和函数的好处: 存储过程和函数可以重复使用,减轻开发人员的工作量。类似于java中方法可以多次调用减少网络流量,存储…

meta http-equiv=X-UA-Compatible content=IE=edge,chrome=1 /

X-UA-Compatible是针对IE8新加的一个设置&#xff0c;对于IE8之外的浏览器是不识别的&#xff0c;这个区别与content"IE7"在无论页面是否包含<!DOCTYPE>指令&#xff0c;都像是使用了 Windows Internet Explorer 7的标准模式。而content"IEEmulateIE7&quo…

错误页跳转

错误页跳转的语法 <%page errorPage"出现错误跳转页面"%> <%page isErrorPage"true/false%>跳转到此页面进行处理错误 代码如下&#xff1a; <%page language"java" contentType"text/html" pageEncoding"GBK"%&g…

yum 安装mysql数据库

1、先查看是否有安装mysql&#xff0c;有的话通过yum remove mysql先卸载掉&#xff0c;卸载完成后执行 yum install -y mysql-server mysql mysql-deve 2、启动mysql服务 service mysqld start  //也可以通过/etc/init.d/mysqld start启动 3、设置为开机自启动 chkconfig m…

修改项目名称之后,访问不到项目的问题

转载于:https://www.cnblogs.com/Joke-Jay/p/7190187.html

Mysql锁机制详解

Mysql锁&#xff1a; 在多线程当中如果想保证数据的准确性是如何实现的呢&#xff1f;没错&#xff0c;通过同步实现。同步就相当于是加锁。加了锁以后有什么好处呢&#xff1f;当一个线程真正在操作数据的时候&#xff0c;其他线程只能等待。当一个线程执行完毕后&#xff0c;…

stanford-parser for C#

在项目里用到C#对英文句子进行词性标注。比較成熟的英文词性标注软件是stanford-parser。它个C#版本号&#xff0c;也是借助于IKVM完毕JAVA-C#的转换。详细配置过程例如以下&#xff1a; 1、下载stanford-parser的jar包 http://nlp.stanford.edu/software/lex-parser.shtml 2…

保姆级Mycat操作详解

Mycat环境搭建&#xff1a; 下载&#xff1a;http://dl.mycat.org.cn/2.0/ 上传到虚拟机并解压 tar -zxvf mycat.tar.gz cd mycat ll授权&#xff1a;设置mycat权限 chmod -R 777 mycat环境变量&#xff1a;配置环境变量 # 编辑文件 vi /etc/profile # 添加内容&#xff…

百度陆奇最新内部演讲:如何成为一个优秀的工程师?

作者&#xff5c;陆奇 来源&#xff5c;百度 Family 一位工程师&#xff0c;如何才能称得上优秀&#xff1f;除了写得一手好 Code&#xff0c;什么样的工作态度和方法才是一个优秀工程师的必备&#xff1f;7 月 11 日&#xff0c;陆奇出席百度内部 Engineering Leadership Talk…

最常见的水平拆分规则

1.枚举法&#xff1a; <tableRule name"sharding-by-intfile"><rule><columns>user_id</columns><algorithm>hash-int</algorithm></rule></tableRule> <function name"hash-int" class"io.myca…

TestNG-详解preserve-order的作用与测试case的执行顺序

在TestNG xml配置文件中&#xff0c;关于<test>的配置里面&#xff0c;有一个属性叫preserve-order&#xff0c;一开始以为这个属性可以用来控制测试case(那些被Test注解标注的方法)的执行顺序&#xff0c;后来测试了一把&#xff0c;发现没有这种效果&#xff0c;最后上…

数据库连接JDBC

JDBC&#xff1a; JDBC&#xff08;Java DataBase Connectivity,java数据库连接&#xff09;是一种用于执行SQL语句的Java API&#xff0c;可以为多种关系型数据库提供统一访问&#xff0c;它是由一组用Java语言编写的类和接口组成的。其实就是java官方提供的一套规范(接口)。用…

【bzoj】 1412: [ZJOI2009]狼和羊的故事

Description “狼爱上羊啊爱的疯狂&#xff0c;谁让他们真爱了一场&#xff1b;狼爱上羊啊并不荒唐&#xff0c;他们说有爱就有方向&#xff0e;&#xff0e;&#xff0e;&#xff0e;&#xff0e;&#xff0e;” Orez听到这首歌&#xff0c;心想&#xff1a;狼和羊如此和谐&am…

计算机基础--网络

互联网协议 互联网协议的功能&#xff1a;定义计算机如何接入internet&#xff0c;以及接入internet的计算机通信的标准。 互联网协议按照功能不同分为osi七层或者tcp/ip五层或tcp/ip四层 每层常见物理设备 因为学习python编程只需要了解tcp/ip五层模型&#xff0c;所以我们只需…

万字详解数据库连接池

数据库连接池的概念 数据库连接是一种关键的、有限的、昂贵的资源&#xff0c;这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性&#xff0c;影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连…

Win Linux 双系统安装指南

双系统安装指南 环境说明 硬件&#xff1a;一块240G NVMe&#xff0c;一块240G SSD&#xff0c;一块2T的HDD。 系统&#xff1a;Linux Mint 18.2&#xff0c;Windows 10 Enterprise Version 1703 Update June 2017 分配&#xff1a;由于工作原因&#xff0c;我的主系统为Linux …

JDBC自定义框架

自定义JDBC框架&#xff1a; 定义必要的信息、获取数据库的连接、释放资源都是重复的代码&#xff0c;在操作JDBC时通常都是执行SQL语句就可以了&#xff0c;所以需要抽取出来一个模板类来封装一些方法&#xff08;Update、Query&#xff09;&#xff0c;专门执行增删改查的SQL…

SpingMVC 执行的流程

一&#xff1a;SpringMVC的开发步骤 ①&#xff1a;在web.xml文件中定义前端控制器DispatcherServlet来拦截用户请求。 由于Web应用是基于请求/响应结构的应用&#xff0c;所以不管哪个MVC Web框架&#xff0c;都需要在web.xml中配置该框架的核心Servlet或Filter&#xff0c;这…