MySQL-查询数据库(一)

举报
小奇JAVA 发表于 2022/09/01 23:49:18 2022/09/01
【摘要】 有志者,事竟成 文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。 ...

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

在这里插入图片描述


前言

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

一、基本查询语句

MySQL中,select的基本语法形式如下:

select 属性列表
	from 表名和视图列表
	[where 条件表达式1]
	[group by 属性名1 [having 条件表达式2]]
	[order by 属性名2 [asc | desc]]

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

二、单表查询

单表查询是指从一张表中查询所需要的数据。查询数据时,可以从一张表中查询数据,也可以从多张表中同时查询数据。两者的查询方式有一定的区别。因为单表查询只在一张表上进行操作,所以查询比较简单。

1、查询所有字段

查询所有字段是指查询表中所有字段的数据。这种方式可以将表中所有字段的数据都查询出来。MySQL中有两种方式可以查询表中所有的字段。

1、列出表的所有字段

MySQL中,可以在select语句的“属性列表”中列出所要查询的表中的所有的字段。例如

下面用select语句查询employee表中的所有字段的数据。在执行select语句之前,先看一下employee表中的所有记录。记录显示如下;

在这里插入图片描述
上面可以看到,employee表中包含6个字段,分别是num、d_id、name、age、sex和homeadder。下面是要查询employee表的所有字段的select语句。

在这里插入图片描述

2、使用“*”查询所有字段

在MySQL中,select语句的“属性列表”中可以为“*”。其基本语法形式为:

select * from 表名;

  
 
  • 1

“*”可以表示所有的字段。这样就不用列出表中所有字段的名称了。但是,使用这种方式查询时,只能按照表中字段的顺序进行排列,不能改变字段的排列顺序。

2、查询指定字段

查询数据时,可以在select语句的“属性列表”中列出所要查询的字段。这种方式可以指定需要查询的字段,而不需要查询出所有的字段。

下面查询employee表中num、name、sex和homeaddr等4个字段的数据。select语句的代码如下:

在这里插入图片描述

3、查询指定记录

select语句中可以设置查询条件。用户可以根据自己的需要来设置查询条件,按条件进行查询。查询的结果必须满足查询条件。例如,用户需要查询d_id为1001的记录,那么可以设置“d_id=1001”为查询条件。这样查询结果中的记录就都会满足“d_id=1001”这个条件。where子句可以用来指定查询条件。其语法规则如下:

where 条件表达式

  
 
  • 1

其中,“条件表达式”参数指定select语句的查询条件

下面查询employee表中d_id为1001的记录。select语句的代码如下:

在这里插入图片描述

4、带IN关键字的查询

IN关键字可以判断某个字段的值是否在指定的集合中。如果字段的值在集合中,则满足查询条件,该记录将被查询出来;如果不在集合中,则不满足查询条件。其语法规则如下:

[not] in (元素1,元素2,...,元素n)

  
 
  • 1

其中,“not”是可选参数,加上not表示不在集合内满足条件;“元素n”表示集合中的元素,各元素之间用逗号隔开,字符型元素需要加上单引号。

下面使用in关键字进行查询。select语句的代码如下:

在这里插入图片描述

5、带between and的范围查询

between and关键字可以判断某个字段的值是否在指定的范围内。如果字段的值在指定范围内,则满足查询条件,该记录将被查询出来。如果不在指定范围内,则不满足查询条件。其语法规则如下:

[not] between 取值1 and 取值2

  
 
  • 1

其中,“not”是可选参数,加上not表示不在指定范围内满足条件;“取值1”表示范围的起始值;“取值2”表示范围的终止值。

下面使用between and关键字进行查询,查询条件是age字段的取值从15-25。select语句的代码如下:

select * from employee where  age between 15 and 25;

  
 
  • 1

代码执行如下:

在这里插入图片描述

6、带like的字符匹配查询

like关键字可以匹配字符串是否相等。如果字段的值与指定的字符串匹配,则满足查询条件,该记录将被查询出来。如果与指定的字符串不匹配,则不满足查询条件。其语法规则如下:

[not] like '字符串'

  
 
  • 1

其中,“not”是可选参数,加上not表示与指定的字符串不匹配时满足条件;“字符串”表示指定用来匹配的字符串,该字符串必须加单引号或者双引号。“字符串”参数的值可以是一个完整的字符串,也可以是包含百分号(%)或者下划线(_)的通配字符。但是%和_有很大的差别:

“%”可以代表任意长度的字符串,长度可以为0。例如,b%k表示以字母b开头,以字符k结尾的任意长度的字符串。该字符串可以代表bk、buk、book、break、bedrock等字符串。

”只能表示单个字符。例如,b_k表示以字母b开头,以字母k结尾的3个字符。中间的“”可以代表任意一个字符。字符串可以代表bok、bak和buk等字符串。

下面使用like关键字来匹配一个完整的字符串‘Aric’。select语句的代码如下:

select * from employee where name like '赵六';

  
 
  • 1

代码执行如下:

在这里插入图片描述
结果显示,查询出name字段的取值是赵六的记录。其他不满足条件的记录都被忽略掉了。此处的like与等于号(=)是等价的。可以直接换成“=”,查询结果是一样的。代码的执行结果如下:

在这里插入图片描述

结果可以看出,使用like关键字和使用“=”的效果是一样的。但是,这只对匹配一个完整的字符串这种情况有效。如果字符串中包含了通配符,就不能这样进行替换了。

下面使用like关键字来匹配带有通配符‘%’的字符串‘北京%’。select语句的代码如下:

select * from employee where homeaddr like '北京%';

  
 
  • 1

代码执行如下:

在这里插入图片描述

7、查询空值

is null关键字可以用来判断字段的值是否为空值(null)。如果字段的值是空值,则满足查询条件,该记录将被查询出来。如果字段的值不是空值,则不满足查询条件。其语法规则如下:

is [not] null

  
 
  • 1

其中,“not”是可选参数,加上not表示字段不是空值时满足条件。

下面使用is null关键字来查询work表中info字段为空值的记录。select语句的代码如下:

select * from work where info is null;

  
 
  • 1

代码执行如下:

在这里插入图片描述

8、带AND的多条件查询

and关键字可以用来联合多个条件进行查询。使用and关键字时,只有同时满足所有查询条件的记录会被查询出来。如果不满足这些查询条件的其中一个,这样的记录将被排除掉。and关键字的语法规则如下:

条件表达式1 and 条件表达式2 [...and 条件表达式n]

  
 
  • 1

其中,and可以连接两个条件表达式。而且,可以同时使用多个and关键字,这样可以连接更多的条件表达式。

下面使用and关键字来查询employee表中d_id为1001,而且sex为‘男’的记录。select语法的代码如下:

select * from employee where d_id=1001 and sex like '男';

  
 
  • 1

代码执行如下:

在这里插入图片描述

9、带or的多条件查询

or关键字也可以用来联合多个条件进行查询,但是与and关键字不同。使用or关键字时,只要满足这几个查询条件的其中一个,这样的记录将会被查询出来。如果不满足这些查询条件中的任何一个,这样的记录将被排除掉。or关键字的语法规则如下:

条件表达式1 or 条件表达式2 [...or 条件表达式n]

  
 
  • 1

其中,or可以用来连接两个条件表达式。而且,可以同时使用多个or关键字,这样可以连接更多的条件表达式。

下面使用or关键字来查询employee表中d_id为1001,或者sex为‘男’的记录。select语句的代码如下:

select * from employee where d_id=1001 or sex like '男';

  
 
  • 1

在这里插入图片描述
结果显示,num的值为3和4的记录d_id不等于1001。但是,这两条记录的sex字段为“男”。这两条记录也被查询出来。这说明,使用or关键字时,只要满足多个条件中的其中一个,就可以被查询出来。

10、查询结果不重复

如果表中的某些字段上没有唯一性约束,这些字段可能存在这重复的值。例如,employee表中的d_id字段就存在着重复的情况。

在这里插入图片描述
employee表中有两条记录的d_id的值为1001。select语句中可以使用distinct关键字来消除重复的记录。其语法规则如下:

select distinct 属性名

  
 
  • 1

其中,“属性名”参数表示要消除重复记录的字段的名词。

下面使用distinct关键字来消除d_id字段中的重复记录。带distinct关键字的select语句如下:

select distinct d_id from employee;

  
 
  • 1

在执行该select语句之前,先查看d_id字段的实际情况。代码执行如下:

在这里插入图片描述

结果显示,存在两条值为1001的记录,下面使用带distinct关键字的select语句。代码执行如下:

在这里插入图片描述
结果显示,d_id字段只有一条值为1001的记录。这说明,使用distinct关键字消除了重复的记录。

11、对查询结果排序

从表中查询出来的数据可能是无序的,或者其排序顺序不是用户所期望的顺序。为了使查询结果的顺序满足用户的需求,可以使用order by关键字对记录进行排序。其语法规则如下:

order by 属性名 [asc | desc]

  
 
  • 1

其中,“属性名”参数表示按照该字段进行排序;asc参数表示按升序的顺序进行排序;desc参数表示按降序的顺序进行排序。默认的情况下,按照asc方式进行排序。

下面查询employee表中的所有记录,按照age字段进行排序。带order by关键字的select语句如下:

select * from employee order by age;

  
 
  • 1

在这里插入图片描述

12、分组查询

group by关键字可以将查询结果按某个字段或多个字段进行分组。字段中值相等的为一组。其语法规则如下:

group by 属性名 [having 条件表达式] [with rollup]

  
 
  • 1

其中,“属性名”是指按照该字段的值进行分组;“having条件表达式”用来限制分组后的显示,满足条件表达式的结果将被显示;with rollup关键字将会在所有记录的最后加上一条记录。该记录是上面所有记录的总和。

group by关键字可以和group_concat()函数一起使用。group_concat()函数会把每个分组中指定字段值都显示出来。同时,group by关键字通常与集合函数一起使用。集合函数包括count()、sum()、avg()、max()和min()。其中,count()用来统计记录的条数;sum()用来计算字段值的总和;avg()用来计算字段的值的平均值;max()用来查询字段的最大值;min()用来查询字段的最小值。如果group by不与上述函数一起使用,那么查询结果就是字段取值的分组情况。字段中取值相同的记录为一组,但只显示该组的第一条记录。

1、单独使用group by关键字来分组

如果单独使用group by关键字,查询结果只显示一个分组的一条记录。

下面按employee表的sex字段进行分组查询,查询结果与分组前结果进行对比。先执行不带group by关键字的select语句。语句执行如下:

在这里插入图片描述

带有group by关键字的select语句的代码如下:

在这里插入图片描述

2、group by关键字与group_concat()函数一起使用

group by关键字与group_concat()函数一起使用时,每个分组中指定字段值都显示出来。

下面按employee表的sex字段进行分组查询。使用group_concat()函数将每个分组的name字段的值显示出来。select语句的代码如下:

select sex,group_concat(name) from employee group by sex;

  
 
  • 1

代码执行如下:
在这里插入图片描述

3、group by关键字与集合函数一起使用

group by关键字与集合函数一起使用时,可以通过集合函数计算分组中的总记录、最大值、最小值等。

下面按employee表的sex字段进行分组查询。sex字段取值相同的为一组。然后对每一组使用集合函数count()进行计算,求出每一组的记录数。select语句的代码如下:

select sex,count(sex) from employee group by sex;

  
 
  • 1

代码执行如下:
在这里插入图片描述
4、group by关键字与having一起使用

如果加上“Having 条件表达式”,可以限制输出的结果。只有满足条件表达式的结果才会显示。

下面按employee表的sex字段进行分组查询。然后显示记录数大于等于3的分组。select语句的代码如下:

在这里插入图片描述

5、按多个字段进行分组

MySQL中,还可以按多个字段进行分组。例如,employee表按照d_id字段和sex字段进行分组。分组过程中,先按照d_id字段进行分组。遇到d_id字段的值相等的情况时,再把d_id值相等的记录按照sex字段进行分组。

下面employee表按照d_id字段和sex字段进行分组。select语句如下:

select * from employee group by d_id,sex;

  
 
  • 1

代码执行如下:
在这里插入图片描述
6、group by关键字与with rollup一起使用
使用with rollup时,将会在所有记录的最后加上一条记录。这条记录是上面所有记录的总和。

下面按employee表的sex字段进行分组查询。使用count()函数来计算每组的记录数。并且加上with rollup。select语句如下:

select sex,count(sex) from employee group by sex with rollup;

  
 
  • 1

代码执行如下:

在这里插入图片描述

13、用limt限制查询结果的数量

查询数据时,可能会查询出很多的记录。而用户需要的记录可能只是很少的一部分。这样就需要来限制查询结果的数量。limt是MySQL中的一个特殊关键字。其可以用来指定查询结果从哪条记录开始显示。还可以指定一共显示多少条记录。limit关键字有两种使用方式。这两种方式分别是不指定初始位置和指定初始位置。

1、不指定初始位置

limit关键字不指定初始位置时,记录从第一条记录开始显示。显示记录的条数有limit关键字指定。其语法规则如下:

limit 记录数

  
 
  • 1

其中,“记录数”参数表示显示记录的条数。如果“记录数”的值小于查询结果的总记录数,将会从第一条记录开始,显示指定条数的记录。如果“记录数”的值大于查询结果的总记录数,数据库系统会直接显示查询出来的所有记录。

下面查询employee表的所有记录。但只显示前两条。select语句如下:

select * from employee limit 2;

  
 
  • 1

执行结果如下。

在这里插入图片描述
2、指定初始位置

limit关键字可以指定从哪条记录开始显示,并且可以指定显示多少条记录。其语法规则如下:

limit 初始位置,记录数

  
 
  • 1

其中,“初始位置”参数指定从哪条记录开始显示;“记录数”参数表示显示记录的条数。第一条记录的位置是0,第二条记录的位置是1。后面的记录依次类推。

下面查询employee表的所有记录,显示前两条记录。select语句如下:

select * from employee limit 1,2;

  
 
  • 1

执行结果如下。

结果中只显示了第2和第3条记录。这个例子可以看出,limt关键字可以指定从哪条记录开始显示,也可以指定显示多少条记录。

三、使用集合函数查询

集合函数包括count()、sum()、avg()、max()和min()。其中,count()用来统计记录的条数;sum()用来计算字段的值的总和;avg()用来计算字段的值的平均值;max()用来查询字段的最大值;min()用来查询字段的最小值。当需要对表中的记录求和、求平均值、查询最大值和查询最小值等操作时,可以使用集合函数。例如,需要计算学生成绩表中的平均成绩,可以使用avg()函数。group by关键字通常需要与集合函数一起使用。

1、count()函数

count()函数用来统计记录的条数。如果要统计employee表中有多少条记录,可以使用count()函数。如果要统计employee表中不同部门的人数,也可以使用count()函数。

下面使用count()函数统计employee表的记录数。select语句如下:

select count(*) from employee;

  
 
  • 1

执行结果如下:
在这里插入图片描述

结果显示employee表中共有4条记录。本例说明,count()函数计算出了employee表中的所有记录的总数。

下面使用count()函数统计employee表中不同d_id值的记录数。count()函数与goupe by关键字一起使用。select语句如下:

select d_id,count(*) from employee group by d_id;

  
 
  • 1

执行结果如下:

在这里插入图片描述
结果显示,employee表中d_id为1001的记录有两条;d_id为1002的记录有一条;d_id为1003的记录也是一条。从这个例子可以看出,表中的记录先通过group by关键字进行分组。然后,再计算每个分组的记录数。

2、sum()函数

sum()函数是求和函数。使用sum()函数可以求出表中某个字段取值的总和。例如,可以用sum()函数来求学生的总成绩。

下面使用sum()函数统计grade表中学号为1001的同学的总成绩。select语句如下:

select num,sum(score) from grade where num=1001;

  
 
  • 1

在执行该select语句之前,可以先查看学号为1001的同学的各科成绩。查询结果如下:

在这里插入图片描述
现在执行带sum()函数的select语句,来计算学生的总成绩。执行结果如下:

在这里插入图片描述
结果显示,学号为1001的同学的总成绩为350,正好是他各科成绩的总和。本列可以看出,使用sum()函数计算出了指定字段取值的总和。

sum()函数通常和group by关键字一起使用。这样可以计算出不同分组中某个字段取值的总和。

3、avg()函数

avg()函数是求平均值的函数。使用avg()函数可以求出表中某个字段取值的平均值。例如,可以用avg()函数来求平均年龄,也可以使用avg()函数来求学生的平均成绩。

下面使用avg()函数计算employee表中平均年龄(age)。select语句如下:

select avg(age) from employee;

  
 
  • 1

执行结果如下:
在这里插入图片描述

4、max()函数
max()函数是求最大值的函数。使用max()函数可以求出表中某个字段取值的最大值。例如,可以用max()函数来查询最大年龄,也可以使用max()函数来求各科的最高成绩。

下面使用max()函数查询employee表中的最大年龄(age)。select语句如下:

select max(age) from employee;

  
 
  • 1

执行结果如下:

在这里插入图片描述
结果显示,max()函数查询除了age字段的最大值为26。max()函数通常与group by字段一起使用,来计算每个分组的最大值。

5、min()函数

min()函数是求最小值的函数。使用min()函数可以求出表中某个字段取值的最小值。例如,可以用min()函数来查询最小年龄,也可以使用min()函数来求各科的最低成绩。

下面使用min()函数查询employee表中的最小年龄。select语句如下:

select min(age) from employee;

  
 
  • 1

在这里插入图片描述
结果显示,min()函数查询出来age字段的最小值为15。

四、总结

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

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

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

文章来源: xiaoqijava.blog.csdn.net,作者:旷世奇才李先生,版权归原作者所有,如需转载,请联系作者。

原文链接:xiaoqijava.blog.csdn.net/article/details/126396185

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。