数据库之多表数据记录查询

目录

一、连接查询

1.内连接查询

1.普通内连接查询

2.自连接查询

2.外连接查询

1.左连接查询

2.右连接查询

3.复合条件连接查询

二、子查询

1.FROM子句中的子查询

2.WHERE子句中的子查询

1.使用IN关键字的子查询

2.使用ANY、SOME关键字的子查询

3.使用ALL关键字的子查询

4.使用EXISTS关键字的子查询

5.使用条件判断符的子查询

三、合并查询结果

1.使用UNION关键字的合并操作

2.使用UNION ALL关键字的合并操作


一、连接查询

在关系型数据库管理系统中,通常一张表只会存储一个实体的相关信息,如果用户需要查询多张表中不同实体的数据,可以使用关键字JOIN对表执行连接查询操作,但前提条件是,这些表中必须存在具有相同意义的字段。连接查询主要包括内连接查询和外连接查询。


1.内连接查询

内连接查询(INNER JOIN)是使用比较运算符对多个表间的某些列数据进行比较,并列出这些表中与连接条件相匹配的数据行,组合成新的记录。表之间的连接条件由表中具有相同意义的字段组成。

1.普通内连接查询

内连接查询的语法形式为:

SELECT {*|col_list} FROM table_name1

INNER JOIN table_name2 ON condition;

上述语句中,condition表示连接条件。

此处,SELECT语句与前面最大的区别在于:SELECT后面指定的列分别属于两个不同的表;同时,FROM子句列出了两个表,两个表之间的关系通过INNER JOIN指定;连接条件使用ON子句给出。


2.自连接查询

内连接查询中有一种特殊的查询,称为自连接查询,它是指连接查询中涉及的两张表在物理上是同一张表,但逻辑上可以看成两张表。

语法形式如下:

SELECT table_alias1.*,table_alias2.* FROM table_name AS table_alias1

INNER JOIN table_name AS table_alias2 ON condition;

上述语句的意义是,将一张表分别命名为table_alias1和table_alias2,然后使用这两个表名进行自连接查询。


2.外连接查询

外连接查询(OUTER JOIN)是以一张表为基表,根据连接条件,与另一张表的每一行进行匹配,如果没有匹配上,则在相关联的结果行中,另一张表的所有选择列均返回空值。

外连接查询通常分为两种:左连接查询(LEFT JOIN)和右连接查询(RIGHT JOIN)。

基本语法形式如下:

SELECT {*|col_list} FROM table_name1

{LEFT|RIGHT} [OUTER] JOIN table_name2 ON condition;

对于先创建表关系,之后才插入数据的表,在其中插入数据时需要先关闭外键约束,否则会插入不成功。

关闭表外键约束的语句为:

SET FOREIGN_KEY_CHECKS=0;

开启表外键约束的语句为:

SET FOREIGN_KEY_CHECKS=1;

1.左连接查询

在外连接查询语句中,LEFT JOIN关键字之前的表称为左表,左连接查询会以左表为基表,与另外一张表的每一行进行匹配,如果符合连接条件,则返回两张表相对应的行;如果不符合,则只返回左表中的行,并且其对应的行为一个空值。

2.右连接查询

在外连接查询语句中,RIGHT JOIN关键字之后的表称为右表,右连接查询会以右表为基表,与另外一张表的每一行进行匹配,如果符合连接条件,则返回两张表相对应的行;如果不符合,则只返回右表中的行,并且其对应的行为一个空值。


3.复合条件连接查询

复合条件连接查询是通过在连接查询中添加过滤条件,以达到限制查询结果和筛选数据的目的。


二、子查询

如果查询语句中嵌套了一个或若干个其他的查询语句,那么在整个语句中,外层查询称为主查询,内层查询称为子查询或嵌套查询。该类查询可以基于一个或多个表。在此类查询中,系统会先执行子查询,将子查询的结果作为主查询的过滤条件。

子查询可以应用在SELECT,UPDATE和DELETE语句中,并且大多数子查询会包含在FROM子句或WHERE子句中,在WHERE子句中通常与IN,ANY,ALL和EXISTS关键字搭配使用,也可以使用条件判断符。


1.FROM子句中的子查询

FROM子句中的子查询会生成一个临时表,由于FROM子句中的每个表都必须有一个名称,因此应该为临时表取一个别名。

语法形式如下:

SELECT {*|col_list} FROM(SELECT * FROM table_name) AS table_alias

[WHERE condition];

上述语句中,table_alias表示别名。


2.WHERE子句中的子查询

包含在WHERE子句中的子查询,其查询结果通常是单列数据,系统执行子查询后,子查询的结果会作为主查询的筛选条件。

1.使用IN关键字的子查询

当子查询返回的是一个数据集合,主查询需要返回符合集合中条件的记录时,可以使用IN关键字。

语法形式如下:

SELECT {*|col_list} FROM table_name1

WHERE col_name1 IN

(SELECT col_name2 FROM table_name2 [WHERE condition]);

上述语句中col_name1为表1中的字段,col_name2为表2中的字段。


2.使用ANY、SOME关键字的子查询

ANY和SOME是同义词,表示满足其中任意条件。该类查询会创建一个表达式对子查询的返回值列表进行比较,只要满足子查询中的任一个比较条件,就返回一个结果。

其语法形式如下:

SELECT {*|col_list} FROM table_name1

WHERE col_name1<any

(SELECT col_name2 FROM table_name2 [WHERE condition]);

其中,使用“=ANY”与使用关键字IN的效果实际上是相同的。


3.使用ALL关键字的子查询

使用关键字ALL的子查询,表示当一条记录符合子查询结果中所有的条件时,才会返回该数据。

其语法形式如下:

SELECT {*|col_list} FROM table_name1

WHERE col_name1>All

(SELECT col_name2 FROM table_name2 [WHERE 条件]);


4.使用EXISTS关键字的子查询

使用EXISTS关键字,系统会对子查询的返回结果进行判断,如果子查询至少返回一行记录,那么EXISTS的结果为TRUE,此时主查询语句将会执行;如果子查询没有返回任何记录,那么EXISTS的结果为FALSE,此时主查询语句将不会执行。

其语法形式如下:

SELECT {*|col_list} FROM table_name1

WHERE EXISTS(SELECT * FROM table_name2);

NOT EXISTS与EXISTS使用方法相同,返回的结果相反。


5.使用条件判断符的子查询

其语法形式如下:

SELECT {*|col_list} FROM table_name1

WHERE col_name1 operators

(SELECT col_name2 FROM table_name2);

上述语句中,operators表示条件判断符。


三、合并查询结果

合并查询结果就是使用UNION关键字,将多条查询语句的结果合并在一起显示。

1.使用UNION关键字的合并操作

单独使用UNION关键字的合并操作,查询结果集会合并在一起,并将重复的记录删除。

其语法形式如下:

SELECT {*|col_list} FROM table_name1

UNION SELECT {*|col_list} FROM table_name2;


2.使用UNION ALL关键字的合并操作

使用UNION ALL关键字的合并操作,查询结果集会直接合并在一起,并不会删除重复记录。

其语法形式如下:

SELECT {*|col_list} FROM table_name1

UNION ALL SELECT {*|col_list} FROM table_name2;

注:在使用UNION关键字合并查询结果时,两个语句查询的字段数量必须相同,否则系统会出现报错。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳阳大魔王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值