数据库之多表数据记录查询
目录
一、连接查询
在关系型数据库管理系统中,通常一张表只会存储一个实体的相关信息,如果用户需要查询多张表中不同实体的数据,可以使用关键字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关键字合并查询结果时,两个语句查询的字段数量必须相同,否则系统会出现报错。
原文地址:https://blog.csdn.net/m0_73514785/article/details/140675801
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!