共计 4871 个字符,预计需要花费 13 分钟才能阅读完成。
MySQL 数据库连接查询 |
- 连接是关系数据库模型的主要特点。连接查询是关系数据库中最主要的查询,主要包括内连接、外连接等。通过连接运算可以实现多个表查询。当查询数据时,通过连接操作查询出存放在多个表中的不同实体信息。当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查询。如下将介绍多表之间的内连接查询、外连接查询以及复合条件连接查询。
内连接查询 |
内连接(inner join)使用比较运算符进行表间列数据的比较操作,并列出这些表中与连接条件相匹配的数据行,并组合成新的记录。新建学生表、班级表,在两个表之间实现连接查询。其中 tb_class 中的主键 id 为 tb_student 的外键,表结构如下:
表中数据如下:
表的连接查询语句为:SELECT tb_student.*,tb_class.name FROM tb_student,tb_class WHERE tb_student.classID=tb_class.id; 或 SELECT tb_student.*,tb_class.name FROM tb_student INNER JOIN tb_class ON tb_student.classID=tb_class.id;
如果在一个连接查询中,涉及到的两个表都是同一个表,这种查询称为自连接查询,自连接是一种特殊的内连接,它是指相互连接的表在物理上为同一张表,但可以在逻辑上分为两张表。如下是对 tb_student 表的查询,查询和 id 为 1 的学生为同一个班的同学:
外连接查询 |
连接查询将查询多个表中相关联的行,内连接时,返回查询结果集合中的仅是符合查询条件和连接条件的行。但有时需要包含没有关联的行中数据,即返回查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左连接)、右表(右连接)或两个边表中的所有数据行。外连接分为左外连接和右外连接;
- LEFT JOIN(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录
- RIGHT JOIN(右连接):返回包括右表中所有记录和左表中连接字段相等的记录
- LEFT JOIN 左连接
左连接的结果包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果行中右表的所有选择列表列均为空值。如下是学生表和班级表,查询所有学生所在班级的名称,包括还没有给分配班级的学生。
左连接语句为:SELECT tb_student.name,tb_class.name FROM tb_student LEFT OUTER JOIN tb_class ON tb_student.classID=tb_class.id;
- RIGHT JOIN 右连接
右连接是左连接的反向连接,将返回右表的所有行,如果右表的某行在左表中没有匹配项,左表将返回空值,如下图所示,tb_student 表中没有计算机 5 班的学生,故计算机 5 班前学生名为空。
更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2017-04/142501p2.htm
子查询 |
子查询是指一个查询语句嵌套在另一个查询语句内部的查询,在 SELECT 子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。子查询中常用的操作符有 ANY(SOME)、ALL、IN、EXISTS。子查询可以添加到 SELECT、UPDATE 和 DELETE 语句中,而且可以进行多层嵌套。子查询中也可以使用比较运算符,如“<”、“<=”、“>”、“>=”和“!=”等。本节将介绍如何在 SELECT 语句中嵌套子查询。
- 带 ANY、SOME 关键字的子查询
ANY 和 SOME 关键字是同义词,表示满足其中任一条件,他们允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件。ANY 关键字接在一个比较操作符的后面,表示若与子查询返回的任何值比较为 TRUE,则返回 TRUE。如下是是查询比学号为 1 学生最低成绩(86)高的所有成绩列表:
SQL 查询语句为:SELECT * FROM tb_score WHERE grade> ANY(SELECT grade FROM tb_score WHERE sID=1);
- 带 ALL 关键字的子查询
关键字 ALL 与 ANY 和 SOME 不同,使用 ALL 时需要同时满足内层查询的条件,例如,将如上的例子中的 ANY 改为 ALL,则查询比学号为 1 的学生成绩(86,90)都高的成绩,则如上可看出查询出结果为空。
- 带 EXISTS 关键字的子查询
EXISTS 关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行,如果至少返回一行,那么 EXISTS 的结果为 TRUE,此时外层查询语句将进行查询;如果子查询没有返回任何行,那么 EXISTS 返回的结果为 FALSE,此时外层语句将不进行查询。
- 带 IN 关键字的子查询
IN 关键字进行子查询时,内层查询语句金金返回一个数据列,这个数据列里的值将提供给外层查询语句进行比较操作。如下两条语句分别查询学生的语文成绩、查询 2 班学生的所有成绩:
查询学生语文成绩:SELECT sID,grade FROM tb_score WHERE cID IN (SELECT id FROM tb_course WHERE name=’ 语文 ’);
查询 2 班学生的所有成绩:SELECT sID,cID,grade FROM tb_score WHERE sID IN (SELECT id FROM tb_student WHERE classID=2);
合并查询 |
利用 UNION 关键字,可以给出多条 SELECT 语句,并将它们的结果组合成单个结果集。合并时两个表对应的列数和数据类型必须相同。各个 SELECT 语句之间使用 UNION 或 UNION ALL 关键字分隔。UNION 不使用关键字 ALL 执行时,删除重复记录,所有返回行都是唯一的;使用关键字 ALL 的作用是不删除重复行也不对结果进行自动排序。
如查询 1 号课程且大于 80 分和 4 号学生的成绩:SELECT sID,grade FROM tb_score WHERE grade>80 AND cID=1 UNION SELECT sID,grade FROM tb_score WHERE sID=4;SELECT sID,grade FROM tb_score WHERE grade>80 AND cID=1 UNION ALL SELECT sID,grade FROM tb_score WHERE sID=4;
正则表达式 |
正则表达式通常被用来检索或替换那些符合某个模式的文本内容,根据指定的匹配模式匹配文本中符合要求的特殊字符串。例如从一个文本文件中提取电话号码,查找一篇文章中重复淡出或者替换用户输入的某些敏感词语等等,这些地方都可以使用正则表达式。MySQL 中使用 REGEXP 关键字指定正则表达式的字符串匹配模式,如下表列出了 REGEXP 操作符中常用匹配列表。
选项 | 说明 | 例子 | 匹配值实例 |
^ | 匹配文本的开始字符 | ‘^b’ 匹配以字母 b 开头的字符串 | book,big,banana,bike |
$ | 匹配文本的结束字符 | ‘st$’ 匹配以 st 结尾的字符串 | test,resist,rest,persist |
. | 匹配任何单个字符 | ‘b.t’ 匹配任何 b 和 t 之间一个字符 | bit,bat,but,bite |
* | 匹配零个或多个在它前面的字符 | ‘f*n’ 匹配字符 n 前面有任意个字符 f | fn,fan,faan,fit |
+ | 匹配前面的字符 1 或多次 | ‘ba+’ 匹配以 b 开头后紧跟至少有一个 a | ba,bay,bare,battle |
< 字符串 > | 匹配包含指定的字符串的文本 | ‘ha’ | happy,hacker,hackman |
[字符集合] | 匹配字符集合中任何一个字符 | ‘[xz]’ 匹配 x 或者 z | dizzy,zebra,x-ray,extra |
[^] | 匹配不在括号中的任何字符 | ‘[^abc]’ 匹配任何不包含 a、b 和 c 的字符串 | desk,fox,file |
字符串 {n,} | 匹配前面的字符串至少 n 次 | b{2} 匹配两个或者更多个 b | bb,bbb���bbbb |
字符串 {n,m} | 匹配前面字符串至少 n 次,至多 m 次。如果 n =0,此参数为可选参数 | b{2,4} 匹配最少 2 个,最多 4 个 b | bb,bbb,bbbb |
选择学生表中 information 列中首字母为 z 的行:SELECT * FROM tb_student WHERE information REGEXP ‘^z’;
其它正则表达式的举例略,大家可以根据自己需求自行设计。
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-04/142501.htm
MySQL 数据库连接查询 |
- 连接是关系数据库模型的主要特点。连接查询是关系数据库中最主要的查询,主要包括内连接、外连接等。通过连接运算可以实现多个表查询。当查询数据时,通过连接操作查询出存放在多个表中的不同实体信息。当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查询。如下将介绍多表之间的内连接查询、外连接查询以及复合条件连接查询。
内连接查询 |
内连接(inner join)使用比较运算符进行表间列数据的比较操作,并列出这些表中与连接条件相匹配的数据行,并组合成新的记录。新建学生表、班级表,在两个表之间实现连接查询。其中 tb_class 中的主键 id 为 tb_student 的外键,表结构如下:
表中数据如下:
表的连接查询语句为:SELECT tb_student.*,tb_class.name FROM tb_student,tb_class WHERE tb_student.classID=tb_class.id; 或 SELECT tb_student.*,tb_class.name FROM tb_student INNER JOIN tb_class ON tb_student.classID=tb_class.id;
如果在一个连接查询中,涉及到的两个表都是同一个表,这种查询称为自连接查询,自连接是一种特殊的内连接,它是指相互连接的表在物理上为同一张表,但可以在逻辑上分为两张表。如下是对 tb_student 表的查询,查询和 id 为 1 的学生为同一个班的同学:
外连接查询 |
连接查询将查询多个表中相关联的行,内连接时,返回查询结果集合中的仅是符合查询条件和连接条件的行。但有时需要包含没有关联的行中数据,即返回查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左连接)、右表(右连接)或两个边表中的所有数据行。外连接分为左外连接和右外连接;
- LEFT JOIN(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录
- RIGHT JOIN(右连接):返回包括右表中所有记录和左表中连接字段相等的记录
- LEFT JOIN 左连接
左连接的结果包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果行中右表的所有选择列表列均为空值。如下是学生表和班级表,查询所有学生所在班级的名称,包括还没有给分配班级的学生。
左连接语句为:SELECT tb_student.name,tb_class.name FROM tb_student LEFT OUTER JOIN tb_class ON tb_student.classID=tb_class.id;
- RIGHT JOIN 右连接
右连接是左连接的反向连接,将返回右表的所有行,如果右表的某行在左表中没有匹配项,左表将返回空值,如下图所示,tb_student 表中没有计算机 5 班的学生,故计算机 5 班前学生名为空。
更多详情见请继续阅读下一页的精彩内容 :http://www.linuxidc.com/Linux/2017-04/142501p2.htm