MySQL-查询数据库

Posted 旷世奇才李先生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL-查询数据库相关的知识,希望对你有一定的参考价值。

有志者,事竟成
文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。

文章目录


前言

查询数据是指从数据库中获取所需要的数据。查询数据是数据库操作中最常用,也是最重要的操作。用户可以根据自己对数据的需求,使用不同的查询方式。通过不同的查询方式,可以获得不同的数据。在mysql中是使用select语句来查询数据的。

一、连接查询

1.1 内连接查询

内连接查询是一种最常用的连接查询。内连接查询可以查询两个或两个以上的表。为了读者更好的理解,暂时只讲解两个表的连接查询。当两个表中存在表示相同意义的字段时,可以通过该字段来连接这两个表;当该字段的值相等时,就查询出该记录。

下面使用内连接的查询的方式查询employee表和department。在执行内连接查询之前,先分别查看employee表和department表中的记录,以便进行比较。查询结果如下:


查询结果显示,employee表和department表的d_id字段都是表示部门号。通过d_id字段可以将employee表和department表进行内连接查询。从employee表中查询出num、name、d_id、age和sex这几个字段。从department表中查询出d_name和function这两个字段。内连接查询的select语句如下:

select num,name,employee.d_id,age,sex,d_name,function 
from employee,department where employee.d_id=department.d_id;

1.2 外连接查询

外连接查询可以查询两个或两个以上的表。外连接查询也需要通过指定字段来进行连接。当该字段取值相等时,可以查询出该记录。而且,该字段取值不相等的记录也可以查询出来。外连接查询包括左连接查询和右连接查询。其基本语法如下:

select 属性名列表
	from 表名1 left | right join 表名2
	on 表名 1.属性名1 = 表名2.属性名2;

1、左连接查询
进行左连接查询时,可以查询出“表名1”所指的表中的所有记录。而“表名2”所指的表中,只能查询出匹配的记录。

下面使用左连接查询的方式查询employee表和department。两表通过d_id字段进行连接。左连接的select语句如下。

2、右连接查询

进行右连接查询时,可以查询出“表名2”所指的表中的所有记录。而“表名1”所指的表中,只能查询出匹配的记录。

下面使用右连接查询的方式查询employee表和department。两表通过d_id字段进行连接。右连接的select语句如下:

1.3 复合条件连接查询

在连接查询时,也可以增加其他的限制条件。通过多个条件的复合查询,可以使查询结果更加准确。例如,employee表和department表进行连接查询时,可以限制age字段的取值必须大于24。这样,可以更加准确的查询出年龄大于24岁的员工的信息。

下面使用内连接查询的方式查询employee表和department。并且employee表中的age字段的值必须大于24。内连接的select语句如下:

二、子查询

子查询是将一个查询语句嵌套在另一个查询语句中。内层查询语句的查询结果,可以为外层查询语句提供查询条件。因为在特定情况下,一个查询语句的条件需要另一个查询语句来获取。例如,现在需要从学生成绩表中查询计算机系学生的各科成绩。那么,首先就必须知道哪些课程是计算甲系学生选修的。因此,必须先查询计算机系学生选修的课程,然后根据这些课程来查询计算机系学生的各科成绩。通过子查询,可以实现多表之间的查询。子查询中可能包括in、not in、any、all、exists和not exists等关键字。子查询中还可能包含比较运算符,如“=”、“!=”、“>”和“<”等。本小节将详细讲解子查询的知识。

1、带in关键字的子查询

一个查询语句的条件可能落在另一个select语句的查询结果中,这可以通过in关键字来判断,例如,要查询哪些同学选择了计算甲系开设的课程。先必须从课程表中查询出计算机系开设了哪些课程。然后再从学生表中进行查询。如果学生选修的课程在前面查询出来的课程中,则查询出该同学的信息。这可以用带in关键字的子查询来实现。

下面查询employee表中的记录。这些记录的d_id字段的值必须在department表中出现过。select语句如下:

2、带比较运算符的子查询

子查询可以使用比较运算符。这些比较运算符包括=、!=、>、>=、<、<=和<>等。其中,<>与!=是等价的。比较运算符在子查询时使用的非常广泛。如查询分数、年龄、价格和收入等。

下面从computer_stu表中查询获得一等奖学金的学生的学号、姓名和分数。各个等级的奖学金的最低分存储在scholarship表中。

先查看一下scholarship表和computer_stu表的记录,以便进行对比。scholarship表的查询结果如下:

查询结果显示,一等奖学金的最低分为90;二等奖学金的最低分为80;三等奖学金的最低分为70。下面是computer_stu表的查询结果。

查询结果显示表中每个同学的学号、姓名和分数。其中,学号为1002和1006的两个人的分数都大于90。下面来查询谁是一等奖学金的得主。首先必须从scholarship表中查询出一等奖学金要求的最低分。然后再从computer_stu表中查询哪些学生的分数高于这个最低分。select语句如下:

3、带exists关键字的子查询

exists关键字表示存在。使用exists关键字时,内层查询语句不返回查询的记录。而是返回一个真假值。如果内层查询语句查询到满足条件的记录,就返回一个真值(true),否则,将返回一个假值(false)。当返回的值为true时,外层查询语句将进行查询;当返回的为false时,外层查询语句不进行查询或者查询不出任何记录。

下面如果department表中存在d_id取值为1003的记录,则查询employeed表的记录。select语句如下:

4、带any关键字的子查询

any关键字表示满足其中任一条件。使用any关键字时,只要满足内层查询语句返回的结果中的任何一个,就可以通过该条件来执行外层查询语句。例如,需要查询哪些同学能够获得奖学金。那么,首先必须从奖学金表中查询出各种奖学金要求的的最低分。只要一个同学的成绩高于不同奖学金最低分的任何一个,这个同学就可以获得奖学金。any关键字通常与比较运算符一起使用。例如,>any表示大于任何一个值,=any表示等于任何一个值。

下面从computer_stu表中查询出哪些同学可以获得奖学金。奖学金的信息存储在scholarship表中。先查看一下computer_stu表和scholarship表。查询结果如下:


下面来查询到底谁能得奖学金。先需要从scholarship表中查询出各种奖学金的最低分。然后,从computer_stu表中查询哪些人的分数高于其中任何一个奖学金的最低分。select语句代码如下:

5、带all关键字的子查询

all关键字表示满足所有条件。使用all关键字时,只有满足内层查询语句返回的所有结果,才可以执行外层查询语句。例如,需要查询哪些同学能够获得一等奖学金。首先必须从奖学金表中查询出各种奖学金要求的最低分。因为一等奖学金要求的分数最高。只有当同学的成绩高于所有的奖学金最低分时,这个同学才可能获得一等奖学金。all关键字也经常与比较运算符一起使用。例如,>all表示大于所有值,<all表示小于所有值。

下面从computer_stu表中查询出哪些同学可以获得一等奖学金。奖学金的信息存储在scholarship表中。先需要从scholarship表中查询出各种奖学金的最低分。然后,从computer_stu表中查询哪些人的分数高于所有奖学金的最低分。select语句代码如下:

6、合并查询结果

合并查询结果是将多个select语句的查询结果合并到一起。因为某种情况下,需要将几个select语句查询出来的结果合并起来显示。例如,现在需要查询公司甲和公司乙这两个公司所有员工信息。这就需要从公司甲中查询出所有员工的信息,再从公司乙中查询出所有员工的信息。然后将两次的查询结果合并到一起。进行合并操作使用union和union all 关键字。

使用union关键字时,数据库系统会将所有的查询结果合并到一起,然后去除掉相同的记录。而union all关键字则只是简单的合并到一起。其语法规则如下:

select 语句 1
union | union all
select 语句 2
union | union all...
select 语句 n;

从上面可以知道,可以合并多个select语句的查询结果。而且,每个select语句之间使用union或union all关键字连接。

下面从department表和employee表中查询d_id字段的取值。然后通过union关键字将结果合并到一起。首先,先查看department表和employee表中d_id字段的取值。查询结果如下:


从查询结果可以看到,department表的d_id字段取值分别为1001、1002和1003。而employee表的d_id字段取值分别为1001、1002和1004。其中,d_id为1001的记录有两条。现在这两个表中的d_id字段的取值合并在一起。语句如下:

下面使用union all关键字将结果合并到一起。语句如下:

三、为表和字段取别名

在查询时,可以为表和字段取一个别名。这个别名可以代替其指定的表和字段。

1、为表取别名

基本形式如下:

表名 表的别名

下面为department表取个别名d。然后查询表中d_id字段取值为1001的记录。sql代码如下:

2、为字段取别名

基本形式如下:

属性名 [AS] 别名

执行代码结果如下:

四、使用正则表达式查询

1、查询以特定字符或字符串开头的记录

使用字符“^”可以匹配以特定字符或字符串开头的记录。

下面从info表name字段中查询以字母‘L’开头的记录。SQL代码如下:

select * from info where name regexp '^L';

2、查询以特定字符或字符串结尾的记录

使用字符“$”,可以匹配以特定字符或字符串结尾的记录。

下面从info表name字段中查询以字母c结尾的记录。sql代码如下:

3、用符号“.”来代替字符串中的任意一个字符

下面从info表name字段中查询以字母‘L’开头,以字母‘y’结尾,中间有两个任意字符的记录。sql代码如下:

4、匹配指定字符中的任意一个

使用方括号([])可以将需要查询字符组成一个字符集。只要记录中包含方括号中的任意字符,该记录将会被查询出来。例如,通过“[abc]”可以查询包含a、b和c等3个字母中的任何一个记录。

下面从info表name字段中查询包含c、e和o 3个字母中任意一个的记录。sql代码如下:

使用方括号([])可以指定集合的区间。如“[a-z]”表示从a-z的所有字母;“[0-9]”表示从0-9的所有数字;“[a-z0-9]”表示包含所有的小写字母和数字。

下面从info表name字段中查询包含数字或者字母a、b和c的记录。SQL代码如下:

5、匹配指定字符以外的字符

使用“[^字符集合]” 可以匹配指定字符以外的字符。

下面从info表name字段中查询包含’a’到‘w’字母和数字以外的字符的记录。SQL代码如下:

6、匹配指定字符串

正则表达式可以匹配字符串。当表中的记录包含这个字符串时,就可以将该记录查询出来。如果指定多个字符串时,需要用符号“|”隔开。只要匹配这些字符串中的任意一个即可。

下面从info表name字段中查询包含’ic’的记录。SQL代码如下:


下面从info表name字段中查询包含ic、uc和ab这3个字符串中任意一个记录。SQL代码如下:

7、使用“*”和“+”来匹配多个字符

正则表达式中,“*”和“+”都可以匹配多个该符号之前的字符。但是,“+”至少表示一个字符,而 * 可以表示0个字符。

下面从info表name字段中查询字母‘c’之前出现过‘a’的记录。SQL代码如下:

8、使用M或者M,N来指定字符串连续出现的次数

下面从info表name字段中查询出现过’a’3次的记录。SQL代码如下:

五、总结

这里的相关内容还没有整理完毕,文章后面持续更新,建议收藏。

文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。

可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。

以上是关于MySQL-查询数据库的主要内容,如果未能解决你的问题,请参考以下文章

mysql in型子查询陷阱

MySql子查询(wherefromexists)及连接查询(left joinright joininner joinunion join)

MariaDB存在的问题

mysql explain执行计划详解

mysql 数据操作 子查询 介绍

MySQL explain字段解释