MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]

MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]大圣网络2017-01-3109:19连接查询连接查询:将多张表(>=2)进行记录的连接(按照某个指定的条件进行数据拼接)。连接查询的意义:在用户查看数据的时候,需要显示的数据来自多张表.连接查询:join,使用方式:左表join右表;左表:在join关键字左边的表;右表:在join关键字右边的表连接查询分类:SQL中将连接查询分成

大家好,又见面了,我是你们的朋友全栈君。

 一、连接查询 

1、交叉连接:CROSS JOIN 把表A和表B的数据进行一个NM的组合,即笛卡尔积。如本例会产生44=16条记录,在开发过程中我们肯定是要过滤数据,所以这种很少用。

DROP TABLE IF EXISTS `t2`;
CREATE TABLE `t2` (
  `student_id` int(11) NOT NULL,
  `name` varchar(32) DEFAULT NULL,
  `major` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`student_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]

DROP TABLE IF EXISTS `t1`;
CREATE TABLE `t1` (
  `id` int(11) NOT NULL,
  `name` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]

SELECT *
FROM t1
CROSS JOIN t2

MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]

2、**内连接:**SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name
INNER JOIN 产生的结果是AB的交集 。
从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留.

基本语法:左表 [inner] join 右表 on 左表.字段 = 右表.字段; on表示连接条件: 条件字段就是代表相同的业务含义(如my_student.c_id和my_class.id)

字段别名以及表别名的使用: 在查询数据的时候,不同表有同名字段,这个时候需要加上表名才能区分, 而表名太长, 通常可以使用别名.

内连接可以没有连接条件: 没有on之后的内容,这个时候系统会保留所有结果(笛卡尔积)

内连接还可以使用where代替on关键字,但效率差很多。

DROP TABLE IF EXISTS `cms_manage`;
CREATE TABLE `cms_manage` (
  `id` int(11) NOT NULL,
  `admin_user` varchar(32) DEFAULT NULL,
  `login_count` int(11) DEFAULT NULL,
  `level` int(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]

DROP TABLE IF EXISTS `cms_level`;
CREATE TABLE `cms_level` (
  `id` int(11) NOT NULL,
  `level_name` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]

SELECT
	m.id,
	m.admin_user,
	m.login_count,
	l.level_name
FROM
	cms_manage as m
JOIN cms_level as l  ON m.level = l.id
  • MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]

3、外连接: 以某张表为主,取出里面的所有记录, 然后每条与另外一张表进行连接: 不管能不能匹配上条件,最终都会保留: 能匹配,正确保留; 不能匹配,其他表的字段都置空NULL.

外连接分为两种: 是以某张表为主: 有主表

left join: 左外连接(左连接), 以左表为主表

right join: 右外连接(右连接), 以右表为主表

基本语法: 左表 left/right join 右表 on 左表.字段 = 右表.字段;
修改成

MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]

SELECT
	m.id,
	m.admin_user,
	m.login_count,
	l.level_name
FROM
	cms_manage as m
LEFT JOIN cms_level as l  ON m.level = l.id
  • MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]

4、**自然连接:**略(基本不用自然连接)
**

二、联合查询

**
1、**联合查询:**将多次查询(多条select语句), 在记录上进行拼接(字段不会增加)

基本语法:多条select语句构成: 每一条select语句获取的字段数必须严格一致(但是字段类型无关)

Select 语句1

Union [union选项]

Select语句2…

Union选项: 与select选项一样有两个

All: 保留所有(不管重复)

Distinct: 去重(整个重复): 默认的

SELECT *
FROM t2
UNION
SELECT *
FROM t2

MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]

SELECT *
FROM t2
UNION all
SELECT *
FROM t2
  • MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]

联合查询只要求字段一样, 跟数据类型无关

SELECT *
FROM t1
UNION all
SELECT *
FROM t2
  • MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]

联合查询的意义:

  1. 查询同一张表,但是需求不同: 如查询学生信息, 男生身高升序, 女生身高降序.

  2. 多表查询: 多张表的结构是完全一样的,保存的数据(结构)也是一样的.

FROM t2 
WHERE `name`="大圣"
UNION all
SELECT *
FROM t2
WHERE `name`="aa"
  • MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]

Order by使用

在联合查询中: order by不能直接使用,需要对查询语句使用括号才行;另外,要orderby生效: 必须搭配limit: limit使用限定的最大数即可.

MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]

**

三、子查询

**
子查询: 查询是在某个查询结果之上进行的.(一条select语句内部包含了另外一条select语句).

子查询分类

子查询有两种分类方式: 按位置分类;和按结果分类

按位置分类: 子查询(select语句)在外部查询(select语句)中出现的位置

From子查询: 子查询跟在from之后

Where子查询: 子查询出现where条件中

Exists子查询: 子查询出现在exists里面

按结果分类: 根据子查询得到的数据进行分类(理论上讲任何一个查询得到的结果都可以理解为二维表)

标量子查询: 子查询得到的结果是一行一列

列子查询: 子查询得到的结果是一列多行

行子查询: 子查询得到的结果是多列一行(多行多列) (1,2,3出现的位置都是在where之后)

表子查询: 子查询得到的结果是多行多列(出现的位置是在from之后)

1、标量子查询

需求: 找到分类为科技的所有文章标题

MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]

SELECT title
FROM t22
WHERE category_id=(SELECT category_id FROM t11 WHERE name='科技')

列子查询

MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]

行子查询

MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]

表子查询

MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]

Exists子查询

MySQL数据高级查询之连接查询、联合查询、子查询[通俗易懂]

参考文章:MySQL数据高级查询之连接查询、联合查询、子查询

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130075.html原文链接:https://javaforall.net

(1)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • cmd命令怎么切换盘符_windows切换盘符命令

    cmd命令怎么切换盘符_windows切换盘符命令转载于:https://www.cnblogs.com/QMM2008/p/4003039.html

    2022年10月3日
    4
  • 妇产科护理学试题库及答案_妇产科护理学题库集各章节

    妇产科护理学试题库及答案_妇产科护理学题库集各章节试题一1.关于子宫的位置与形态,正确的为DA.位于盆腔下方B.形如扁梨形C.容积为2mlD.前与膀胱,后与直肠为邻E.子宫峡部非孕时长3cm2.保持子宫前倾位置的一对主要韧带是CA.圆韧带B.阔韧带C.主韧带D.骨盆漏斗韧带E.子宫骶骨韧带3.与后穹隆顶端贴接的部分为EA.宫颈口B.附件C.膀胱D.直肠E.直肠子宫陷凹4.关于骨盆外测量径线的描述,错误的是BA.髂棘间径为两侧髂前上棘外缘间的距离B.坐骨结节间径为两侧坐骨结节外缘间的距离C

    2025年7月10日
    4
  • idea激活码在哪输入2022【2022.01最新】2022.02.03

    (idea激活码在哪输入2022)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlCJ…

    2022年3月31日
    229
  • Jetson TX1 安装 ROS[通俗易懂]

    Jetson TX1 安装 ROS[通俗易懂]JetsonTX1安装ROS注意目前ROS只能支持32位的TX1,后面购买的TX1一般都预装64位Ubuntu。因此如果需要安装ROS需要重新刷TX1系统,否则只能等什么时候ROS官方更新了。目前请不用尝试在64位系统安装ROS,经过1周的折腾,尚未找到可行的方案。一、重新刷TX1系统1.在主机上设置由于TX1只提供了一个USB3.0接口,使用USB3.0HUB进行拓展USB。插好键盘鼠

    2022年6月16日
    52
  • Idea激活码永久有效Idea2021.3.2激活码教程-持续更新,一步到位

    Idea激活码永久有效Idea2021.3.2激活码教程-持续更新,一步到位Idea激活码永久有效2021.3.2激活码教程-Windows版永久激活-持续更新,Idea激活码2021.3.2成功激活

    2022年6月17日
    104
  • .apk反编译_apk反编译教程

    .apk反编译_apk反编译教程原文作者:[color=blue][b]lpohvbe[/b][/color]原文地址:[url]http://blog.csdn.net/lpohvbe/article/details/7981386[/url]本人接触不久,有错误望请各位神牛不吝赐教,仅仅希望把自己这段时间研究的东西分享一下,如果可以帮助到有需要的童鞋万感荣幸。欢迎评论转载,但请加上转载来源谢谢!请尊重开发者劳动成果!…

    2022年9月15日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号