MySQL连接查询、联合查询、子查询
参考地址:http://blog.csdn.net/u011277123/article/details/54863371
1.MySQL连接查询
连接查询:将多张表(>=2)进行记录的连接(按照某个指定的条件进行数据拼接)。
连接查询的意义: 在用户查看数据的时候,需要显示的数据来自多张表.
连接查询分类:SQL中将连接查询分成四类: 内连接,外连接,自然连接和交叉连接
1.1、交叉连接:
交叉连接: cross join, 从一张表中循环取出每一条记录, 每条记录都去另外一张表进行匹配: 匹配一定保留(没有条件匹配), 而连接本身字段就会增加(保留),最终形成的结果叫做: 笛卡尔积。基本用到的很少。
mysql> select * from tb_goods;
+----+--------------+-----------+
| id | name | parent_id |
+----+--------------+-----------+
| 1 | 家用电器 | 0 |
| 2 | 大家电 | 1 |
| 3 | 电脑 | 2 |
| 4 | 铅笔 | 0 |
| 5 | 耳机 | 4 |
| 6 | 可乐 | 3 |
+----+--------------+-----------+
6 rows in set (0.00 sec) mysql> select * from ying;
+------------+-----+
| id | age |
+------------+-----+
| 0000000032 | 0 |
| 0000000444 | 0 |
| 0000333333 | 0 |
| 0000000033 | 3 |
+------------+-----+
4 rows in set (0.00 sec) mysql> select * from tb_goods cross join ying;(在MySQL中cross join和inner join其实是一样的,所以select * from tb_goods inner join ying也是同样的效果)
+----+--------------+-----------+------------+-----+
| id | name | parent_id | id | age |
+----+--------------+-----------+------------+-----+
| 1 | 家用电器 | 0 | 0000000032 | 0 |
| 1 | 家用电器 | 0 | 0000000444 | 0 |
| 1 | 家用电器 | 0 | 0000333333 | 0 |
| 1 | 家用电器 | 0 | 0000000033 | 3 |
| 2 | 大家电 | 1 | 0000000032 | 0 |
| 2 | 大家电 | 1 | 0000000444 | 0 |
| 2 | 大家电 | 1 | 0000333333 | 0 |
| 2 | 大家电 | 1 | 0000000033 | 3 |
| 3 | 电脑 | 2 | 0000000032 | 0 |
| 3 | 电脑 | 2 | 0000000444 | 0 |
| 3 | 电脑 | 2 | 0000333333 | 0 |
| 3 | 电脑 | 2 | 0000000033 | 3 |
| 4 | 铅笔 | 0 | 0000000032 | 0 |
| 4 | 铅笔 | 0 | 0000000444 | 0 |
| 4 | 铅笔 | 0 | 0000333333 | 0 |
| 4 | 铅笔 | 0 | 0000000033 | 3 |
| 5 | 耳机 | 4 | 0000000032 | 0 |
| 5 | 耳机 | 4 | 0000000444 | 0 |
| 5 | 耳机 | 4 | 0000333333 | 0 |
| 5 | 耳机 | 4 | 0000000033 | 3 |
| 6 | 可乐 | 3 | 0000000032 | 0 |
| 6 | 可乐 | 3 | 0000000444 | 0 |
| 6 | 可乐 | 3 | 0000333333 | 0 |
| 6 | 可乐 | 3 | 0000000033 | 3 |
+----+--------------+-----------+------------+-----+
24 rows in set (0.00 sec)
1.2、内连接
内连接: [inner] join, 从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留.
基本语法:select * from tb_name1 inner join tb_name2 on tb_name.id = tb_name2.id; on表示连接条件: 条件字段就是代表相同的业务含义,如果没有on条件就是笛卡尔乘积,on可以使用where来代替,但是这样效率会比较低
mysql> select * from tt1;
+----+-------+--------+
| id | name | gender |
+----+-------+--------+
| 1 | xiong | 0 |
| 2 | ying | 0 |
| 3 | cai | 0 |
| 4 | zhang | 0 |
| 5 | li | 1 |
| 6 | wang | 1 |
+----+-------+--------+
6 rows in set (0.00 sec) mysql> select * from tt2;
+----+------+------+--------+
| id | age | name | gender |
+----+------+------+--------+
| 1 | 23 | a | 1 |
| 2 | 24 | b | 1 |
| 3 | 33 | c | 2 |
| 4 | 43 | d | 2 |
| 5 | 11 | d | 2 |
+----+------+------+--------+
5 rows in set (0.00 sec) mysql> select * from tt2 inner join tt1 on tt1.gender = tt2.gender;
+----+------+------+--------+----+------+--------+
| id | age | name | gender | id | name | gender |
+----+------+------+--------+----+------+--------+
| 1 | 23 | a | 1 | 5 | li | 1 |
| 2 | 24 | b | 1 | 5 | li | 1 |
| 1 | 23 | a | 1 | 6 | wang | 1 |
| 2 | 24 | b | 1 | 6 | wang | 1 |
+----+------+------+--------+----+------+--------+
4 rows in set (0.00 sec)
1.3、外连接:
以某张表为主,取出里面的所有记录, 然后每条与另外一张表进行连接: 不管能不能匹配上条件,最终都会保留: 能匹配,正确保留; 不能匹配,其他表的字段都置空NULL
1.3.1、左外连接 left join:以左表为主
mysql> select * from tt1;
+----+-------+--------+
| id | name | gender |
+----+-------+--------+
| 1 | xiong | 0 |
| 2 | ying | 0 |
| 3 | cai | 0 |
| 4 | zhang | 0 |
| 5 | li | 1 |
| 6 | wang | 1 |
+----+-------+--------+
6 rows in set (0.00 sec) mysql> select * from tt2;
+----+------+------+--------+
| id | age | name | gender |
+----+------+------+--------+
| 1 | 23 | a | 1 |
| 2 | 24 | b | 1 |
| 3 | 33 | c | 2 |
| 4 | 43 | d | 2 |
| 5 | 11 | d | 2 |
+----+------+------+--------+
5 rows in set (0.00 sec)
mysql> select * from tt2 left join tt1 on tt1.gender = tt2.gender;
+----+------+------+--------+------+------+--------+
| id | age | name | gender | id | name | gender |
+----+------+------+--------+------+------+--------+
| 1 | 23 | a | 1 | 5 | li | 1 |
| 2 | 24 | b | 1 | 5 | li | 1 |
| 1 | 23 | a | 1 | 6 | wang | 1 |
| 2 | 24 | b | 1 | 6 | wang | 1 |
| 3 | 33 | c | 2 | NULL | NULL | NULL |
| 4 | 43 | d | 2 | NULL | NULL | NULL |
| 5 | 11 | d | 2 | NULL | NULL | NULL |
+----+------+------+--------+------+------+--------+
7 rows in set (0.00 sec)
1.3.2、右外连接 left join:以右表为主
mysql> select * from tt1;
+----+-------+--------+
| id | name | gender |
+----+-------+--------+
| 1 | xiong | 0 |
| 2 | ying | 0 |
| 3 | cai | 0 |
| 4 | zhang | 0 |
| 5 | li | 1 |
| 6 | wang | 1 |
+----+-------+--------+
6 rows in set (0.00 sec) mysql> select * from tt2;
+----+------+------+--------+
| id | age | name | gender |
+----+------+------+--------+
| 1 | 23 | a | 1 |
| 2 | 24 | b | 1 |
| 3 | 33 | c | 2 |
| 4 | 43 | d | 2 |
| 5 | 11 | d | 2 |
+----+------+------+--------+
5 rows in set (0.00 sec)
mysql> select * from tt2 right join tt1 on tt1.gender = tt2.gender;
+------+------+------+--------+----+-------+--------+
| id | age | name | gender | id | name | gender |
+------+------+------+--------+----+-------+--------+
| 1 | 23 | a | 1 | 5 | li | 1 |
| 1 | 23 | a | 1 | 6 | wang | 1 |
| 2 | 24 | b | 1 | 5 | li | 1 |
| 2 | 24 | b | 1 | 6 | wang | 1 |
| NULL | NULL | NULL | NULL | 1 | xiong | 0 |
| NULL | NULL | NULL | NULL | 2 | ying | 0 |
| NULL | NULL | NULL | NULL | 3 | cai | 0 |
| NULL | NULL | NULL | NULL | 4 | zhang | 0 |
+------+------+------+--------+----+-------+--------+
8 rows in set (0.00 sec)
联合查询:
联合查询:将多次查询(多条select语句), 在记录上进行拼接(字段不会增加)
基本语法:多条select语句构成,每一条select语句获取的字段数必须严格一致(但是字段类型无关)【联合查询只要求字段一样, 跟数据类型无关,即使名字不同也可以】
另外联合查询默认是去重(distinct)的,如果需要显示全部则使用union all
联合查询的意义:
1. 查询同一张表,但是需求不同: 如查询学生信息, 男生身高升序, 女生身高降序.
2. 多表查询: 多张表的结构是完全一样的,保存的数据(结构)也是一样的.
mysql> select * from tt1;
+----+-------+--------+
| id | name | gender |
+----+-------+--------+
| 1 | xiong | 0 |
| 2 | ying | 0 |
| 3 | cai | 0 |
| 4 | zhang | 0 |
| 5 | li | 1 |
| 6 | wang | 1 |
+----+-------+--------+
6 rows in set (0.00 sec) mysql> select * from tt2;
+----+------+------+--------+
| id | age | name | gender |
+----+------+------+--------+
| 1 | 23 | a | 1 |
| 2 | 24 | b | 1 |
| 3 | 33 | c | 2 |
| 4 | 43 | d | 2 |
| 5 | 11 | d | 2 |
+----+------+------+--------+
5 rows in set (0.00 sec)
mysql> select id,name from tt1
-> union
-> select name,age from tt2;
+----+-------+
| id | name |
+----+-------+
| 1 | xiong |
| 2 | ying |
| 3 | cai |
| 4 | zhang |
| 5 | li |
| 6 | wang |
| a | 23 |
| b | 24 |
| c | 33 |
| d | 43 |
| d | 11 |
+----+-------+
11 rows in set (0.00 sec)
第二个表查询的内容直接连在第一个表查询结果的后面
order by的使用:
在联合查询中: order by不能直接使用,需要对查询语句使用括号才行;另外,要orderby生效: 必须搭配limit: limit使用限定的最大数即可.

子查询:
子查询:子查询是在某个查询结果之上进行的.(一条select语句内部包含了另外一条select语句).
子查询分类:
子查询有两种分类方式: 按位置分类;和按结果分类
按位置分类: 子查询(select语句)在外部查询(select语句)中出现的位置
From子查询: 子查询跟在from之后
Where子查询: 子查询出现where条件中
Exists子查询: 子查询出现在exists里面
按结果分类: 根据子查询得到的数据进行分类(理论上讲任何一个查询得到的结果都可以理解为二维表)
标量子查询: 子查询得到的结果是一行一列
列子查询: 子查询得到的结果是一列多行
行子查询: 子查询得到的结果是多列一行(多行多列) (1,2,3出现的位置都是在where之后)
表子查询: 子查询得到的结果是多行多列(出现的位置是在from之后)
标量子查询:
需求: 找到分类为科技的所有文章标题
列子查询:
找出语文和数学都及格人的名字,表是这样的:
行子查询:
行子查询: 返回的结果可以是多行多列(一行多列)
需求:找出年龄最大且身高最高的人
方案一:
方案二:
表子查询:
表子查询: 子查询返回的结果是多行多列的二维表: 子查询返回的结果是当做二维表来使用
需求:找出每个人最好的成绩
Exists子查询:
Exists: 是否存在的意思, exists子查询就是用来判断某些条件是否满足(跨表), exists是接在where之后: exists返回的结果只有0和1.
需求:如果存在的话身高大于2米的人,列出表中所有数据
MySQL连接查询、联合查询、子查询的更多相关文章
- SQL连接、合并、子查询
		
连接:连接分为内连接.外连接.交叉连接 内连接和外连接都是在笛卡尔积的基础做一些修改. 合并查询:把两个相似的结果可以用union联合起来. mysql> select id,time from ...
 - 在MySQL中使用子查询和标量子查询的基本用法
		
一.MySQL 子查询 子查询是将一个 SELECT 语句的查询结果作为中间结果,供另一个 SQL 语句调用.MySQL 支持 SQL 标准要求的所有子查询格式和操作,也扩展了特有的几种特性.子查询没 ...
 - mysql优化---in型子查询,exists子查询,from 型子查询
		
in型子查询引出的陷阱:(扫更少的行,不要临时表,不要文件排序就快) 题: 在ecshop商城表中,查询6号栏目的商品, (注,6号是一个大栏目) 最直观的: mysql); 误区: 给我们的感觉是, ...
 - mysql加强(6)~子查询简单介绍、子查询分类
		
一.子查询简单介绍 1.什么是子查询? 一个查询之中嵌套了其他的若干查询. 在使用select 语句查询时,有时候where的查询条件中的限制条件不是一个确定的值,而是一个来自于另一个查询的结果. 子 ...
 - MySQL全面瓦解11:子查询和组合查询
		
概述 子查询是SQL查询中的重要一块,是我们基于多表之间进行数据聚合和判断的一种手段,使得我们的处理复杂数据更加的便捷,这一节我们主要来了解一下子查询. 先做一下数据准备,这边建立三张表:班级.学生. ...
 - in型子查询陷阱,exists子查询
		
in 型子查询引出的陷阱 select goods_id from goods where cat_id in (1,2,3) 直接用id,不包含子查询,不会中陷阱 题: 在ecshop商城表中,查询 ...
 - ylb:子查询(嵌套子查询)和子查询(相关子查询)
		
ylbtech-SQL Server:SQL Server-子查询(嵌套子查询)和子查询(相关子查询) SQL Server 子查询(嵌套子查询)和子查询(相关子查询). 1,ylb:1,子查询(嵌套 ...
 - 013.子查询和分页子查询(sql实例)
		
--1 子查询 如果子查询和表连接都实现的时候,推荐用表连接实现( 一般:能用表连接实现的就用表连接,有些情况用表连接不能 或者不易实现的再选择子查询) 系统:缓存,执行计划技术手段 --1 wher ...
 - mysql---where子查询、form子查询、exists子查询
		
1.什么是子查询? 当一个查询是另一个查询的条件时,称之为子查询. 2.子查询有什么好处? 子查询可以使用几个简单命令构造功能强大的复合命令. 那么,现在让我们一起来学习子查询. 3.where型的子 ...
 - 相关子查询和嵌套子查询 [SQL Server]
		
SQLServer子查询可以分为 相关子查询 和 嵌套子查询 两类.前提,假设Books表如下: 类编号 图书名 出版社 价格-------------- ...
 
随机推荐
- DCU IP Prefether
			
DCU IP Prefether 数据高速缓存单元预取I P 设置.如果设置为E n a b l e d,会预取I P 地址以改善网络连接和系统性能,所以建议选择E n a b l ed.选项:E n ...
 - EF Code-First 学习之旅 从已存在的数据库进行Code First
			
namespace EFDemo { using System; using System.Data.Entity; using System.ComponentModel.DataAnnotatio ...
 - git branch管理小结
			
神一样膜拜此链接下http://nvie.com/posts/a-successful-git-branching-model/对git branch模型管理,以下为我的学习心得: 一.branch动 ...
 - debug.js中的length的错误
			
记得昨天报了一个错,debug.js文件中的length未定义.前台不定位代码,后天也不报错,而debug.js是框架封装的文件,不是自己写的,无从得知是哪里的问题,而项目也已经重新启动过,无法撤销. ...
 - 分享知识-快乐自己:MYSQL之內链接 左链接 右链接 区别
			
MYSQL中可以通过内外键链接,将有关系的表中数据合并到一起进行条件筛选: 首先创建两个新表,数据如下: student 表数据: score 表数据: 可以看到students表中stu_id为16 ...
 - ORACLE expdp \ impdp \ exp \ imp
			
(转自:http://www.cnblogs.com/lanzi/archive/2011/01/06/1927731.html) EXPDP命令行选项1. ATTACH该选项用于在客户会话与已存在导 ...
 - 【Wannafly挑战赛10 - B】小H和密码(DP)
			
试题链接:https://www.nowcoder.com/acm/contest/72/B 题目描述 小H在击败怪兽后,被一个密码锁挡住了去路 密码锁由N个转盘组成,编号为1~N,每 ...
 - Java基础学习-extends继承(成员变量,局部变量,成员方法)
			
package extend; /*面向对象-继承: * 多个类的共同成员变量和成员方法.抽取到另一个类中(父类),我们多个类就可以访问到父类的成员了 * */ class Game{ String ...
 - Re-install Flyme or Native Google Android on Meizu MX4 Ubuntu (by quqi99)
			
作者:张华 发表于:2017-06-23 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) ## ...
 - [置顶]
        长谈:关于 View Measure 测量机制,让我一次把话说完
			
<倚天屠龙记中>有这么一处:张三丰示范自创的太极剑演示给张无忌看,然后问他记住招式没有.张无忌说记住了一半.张三丰又慢吞吞使了一遍,问他记住多少,张无忌说只记得几招了.张三丰最后又示范了一 ...