有志者,事竟成
文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。
查询数据是指从数据库中获取所需要的数据。查询数据是数据库操作中最常用,也是最重要的操作。用户可以根据自己对数据的需求,使用不同的查询方式。通过不同的查询方式,可以获得不同的数据。在MySQL中是使用select语句来查询数据的。
MySQL中,select的基本语法形式如下:
select 属性列表
from 表名和视图列表
[where 条件表达式1]
[group by 属性名1 [having 条件表达式2]]
[order by 属性名2 [asc | desc]]
单表查询是指从一张表中查询所需要的数据。查询数据时,可以从一张表中查询数据,也可以从多张表中同时查询数据。两者的查询方式有一定的区别。因为单表查询只在一张表上进行操作,所以查询比较简单。
查询所有字段是指查询表中所有字段的数据。这种方式可以将表中所有字段的数据都查询出来。MySQL中有两种方式可以查询表中所有的字段。
1、列出表的所有字段
MySQL中,可以在select语句的“属性列表”中列出所要查询的表中的所有的字段。例如
下面用select语句查询employee表中的所有字段的数据。在执行select语句之前,先看一下employee表中的所有记录。记录显示如下;
上面可以看到,employee表中包含6个字段,分别是num、d_id、name、age、sex和homeadder。下面是要查询employee表的所有字段的select语句。
2、使用“*”查询所有字段
在MySQL中,select语句的“属性列表”中可以为“*”。其基本语法形式为:
select * from 表名;
“*”可以表示所有的字段。这样就不用列出表中所有字段的名称了。但是,使用这种方式查询时,只能按照表中字段的顺序进行排列,不能改变字段的排列顺序。
查询数据时,可以在select语句的“属性列表”中列出所要查询的字段。这种方式可以指定需要查询的字段,而不需要查询出所有的字段。
下面查询employee表中num、name、sex和homeaddr等4个字段的数据。select语句的代码如下:
select语句中可以设置查询条件。用户可以根据自己的需要来设置查询条件,按条件进行查询。查询的结果必须满足查询条件。例如,用户需要查询d_id为1001的记录,那么可以设置“d_id=1001”为查询条件。这样查询结果中的记录就都会满足“d_id=1001”这个条件。where子句可以用来指定查询条件。其语法规则如下:
where 条件表达式
其中,“条件表达式”参数指定select语句的查询条件
下面查询employee表中d_id为1001的记录。select语句的代码如下:
IN关键字可以判断某个字段的值是否在指定的集合中。如果字段的值在集合中,则满足查询条件,该记录将被查询出来;如果不在集合中,则不满足查询条件。其语法规则如下:
[not] in (元素1,元素2,...,元素n)
其中,“not”是可选参数,加上not表示不在集合内满足条件;“元素n”表示集合中的元素,各元素之间用逗号隔开,字符型元素需要加上单引号。
下面使用in关键字进行查询。select语句的代码如下:
between and关键字可以判断某个字段的值是否在指定的范围内。如果字段的值在指定范围内,则满足查询条件,该记录将被查询出来。如果不在指定范围内,则不满足查询条件。其语法规则如下:
[not] between 取值1 and 取值2
其中,“not”是可选参数,加上not表示不在指定范围内满足条件;“取值1”表示范围的起始值;“取值2”表示范围的终止值。
下面使用between and关键字进行查询,查询条件是age字段的取值从15-25。select语句的代码如下:
select * from employee where age between 15 and 25;
代码执行如下:
like关键字可以匹配字符串是否相等。如果字段的值与指定的字符串匹配,则满足查询条件,该记录将被查询出来。如果与指定的字符串不匹配,则不满足查询条件。其语法规则如下:
[not] like '字符串'
其中,“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 '赵六';
代码执行如下:
结果显示,查询出name字段的取值是赵六的记录。其他不满足条件的记录都被忽略掉了。此处的like与等于号(=)是等价的。可以直接换成“=”,查询结果是一样的。代码的执行结果如下:
结果可以看出,使用like关键字和使用“=”的效果是一样的。但是,这只对匹配一个完整的字符串这种情况有效。如果字符串中包含了通配符,就不能这样进行替换了。
下面使用like关键字来匹配带有通配符‘%’的字符串‘北京%’。select语句的代码如下:
select * from employee where homeaddr like '北京%';
代码执行如下:
is null关键字可以用来判断字段的值是否为空值(null)。如果字段的值是空值,则满足查询条件,该记录将被查询出来。如果字段的值不是空值,则不满足查询条件。其语法规则如下:
is [not] null
其中,“not”是可选参数,加上not表示字段不是空值时满足条件。
下面使用is null关键字来查询work表中info字段为空值的记录。select语句的代码如下:
select * from work where info is null;
代码执行如下:
and关键字可以用来联合多个条件进行查询。使用and关键字时,只有同时满足所有查询条件的记录会被查询出来。如果不满足这些查询条件的其中一个,这样的记录将被排除掉。and关键字的语法规则如下:
条件表达式1 and 条件表达式2 [...and 条件表达式n]
其中,and可以连接两个条件表达式。而且,可以同时使用多个and关键字,这样可以连接更多的条件表达式。
下面使用and关键字来查询employee表中d_id为1001,而且sex为‘男’的记录。select语法的代码如下:
select * from employee where d_id=1001 and sex like '男';
代码执行如下:
or关键字也可以用来联合多个条件进行查询,但是与and关键字不同。使用or关键字时,只要满足这几个查询条件的其中一个,这样的记录将会被查询出来。如果不满足这些查询条件中的任何一个,这样的记录将被排除掉。or关键字的语法规则如下:
条件表达式1 or 条件表达式2 [...or 条件表达式n]
其中,or可以用来连接两个条件表达式。而且,可以同时使用多个or关键字,这样可以连接更多的条件表达式。
下面使用or关键字来查询employee表中d_id为1001,或者sex为‘男’的记录。select语句的代码如下:
select * from employee where d_id=1001 or sex like '男';
结果显示,num的值为3和4的记录d_id不等于1001。但是,这两条记录的sex字段为“男”。这两条记录也被查询出来。这说明,使用or关键字时,只要满足多个条件中的其中一个,就可以被查询出来。
如果表中的某些字段上没有唯一性约束,这些字段可能存在这重复的值。例如,employee表中的d_id字段就存在着重复的情况。
employee表中有两条记录的d_id的值为1001。select语句中可以使用distinct关键字来消除重复的记录。其语法规则如下:
select distinct 属性名
其中,“属性名”参数表示要消除重复记录的字段的名词。
下面使用distinct关键字来消除d_id字段中的重复记录。带distinct关键字的select语句如下:
select distinct d_id from employee;
在执行该select语句之前,先查看d_id字段的实际情况。代码执行如下:
结果显示,存在两条值为1001的记录,下面使用带distinct关键字的select语句。代码执行如下:
结果显示,d_id字段只有一条值为1001的记录。这说明,使用distinct关键字消除了重复的记录。
从表中查询出来的数据可能是无序的,或者其排序顺序不是用户所期望的顺序。为了使查询结果的顺序满足用户的需求,可以使用order by关键字对记录进行排序。其语法规则如下:
order by 属性名 [asc | desc]
其中,“属性名”参数表示按照该字段进行排序;asc参数表示按升序的顺序进行排序;desc参数表示按降序的顺序进行排序。默认的情况下,按照asc方式进行排序。
下面查询employee表中的所有记录,按照age字段进行排序。带order by关键字的select语句如下:
select * from employee order by age;
group by关键字可以将查询结果按某个字段或多个字段进行分组。字段中值相等的为一组。其语法规则如下:
group by 属性名 [having 条件表达式] [with rollup]
其中,“属性名”是指按照该字段的值进行分组;“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;
3、group by关键字与集合函数一起使用
group by关键字与集合函数一起使用时,可以通过集合函数计算分组中的总记录、最大值、最小值等。
下面按employee表的sex字段进行分组查询。sex字段取值相同的为一组。然后对每一组使用集合函数count()进行计算,求出每一组的记录数。select语句的代码如下:
select sex,count(sex) from employee group by sex;
代码执行如下:
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;
代码执行如下:
6、group by关键字与with rollup一起使用
使用with rollup时,将会在所有记录的最后加上一条记录。这条记录是上面所有记录的总和。
下面按employee表的sex字段进行分组查询。使用count()函数来计算每组的记录数。并且加上with rollup。select语句如下:
select sex,count(sex) from employee group by sex with rollup;
代码执行如下:
查询数据时,可能会查询出很多的记录。而用户需要的记录可能只是很少的一部分。这样就需要来限制查询结果的数量。limt是MySQL中的一个特殊关键字。其可以用来指定查询结果从哪条记录开始显示。还可以指定一共显示多少条记录。limit关键字有两种使用方式。这两种方式分别是不指定初始位置和指定初始位置。
1、不指定初始位置
limit关键字不指定初始位置时,记录从第一条记录开始显示。显示记录的条数有limit关键字指定。其语法规则如下:
limit 记录数
其中,“记录数”参数表示显示记录的条数。如果“记录数”的值小于查询结果的总记录数,将会从第一条记录开始,显示指定条数的记录。如果“记录数”的值大于查询结果的总记录数,数据库系统会直接显示查询出来的所有记录。
下面查询employee表的所有记录。但只显示前两条。select语句如下:
select * from employee limit 2;
执行结果如下。
limit关键字可以指定从哪条记录开始显示,并且可以指定显示多少条记录。其语法规则如下:
limit 初始位置,记录数
其中,“初始位置”参数指定从哪条记录开始显示;“记录数”参数表示显示记录的条数。第一条记录的位置是0,第二条记录的位置是1。后面的记录依次类推。
下面查询employee表的所有记录,显示前两条记录。select语句如下:
select * from employee limit 1,2;
执行结果如下。
结果中只显示了第2和第3条记录。这个例子可以看出,limt关键字可以指定从哪条记录开始显示,也可以指定显示多少条记录。
集合函数包括count()、sum()、avg()、max()和min()。其中,count()用来统计记录的条数;sum()用来计算字段的值的总和;avg()用来计算字段的值的平均值;max()用来查询字段的最大值;min()用来查询字段的最小值。当需要对表中的记录求和、求平均值、查询最大值和查询最小值等操作时,可以使用集合函数。例如,需要计算学生成绩表中的平均成绩,可以使用avg()函数。group by关键字通常需要与集合函数一起使用。
count()函数用来统计记录的条数。如果要统计employee表中有多少条记录,可以使用count()函数。如果要统计employee表中不同部门的人数,也可以使用count()函数。
下面使用count()函数统计employee表的记录数。select语句如下:
select count(*) from employee;
结果显示employee表中共有4条记录。本例说明,count()函数计算出了employee表中的所有记录的总数。
下面使用count()函数统计employee表中不同d_id值的记录数。count()函数与goupe by关键字一起使用。select语句如下:
select d_id,count(*) from employee group by d_id;
执行结果如下:
结果显示,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;
在执行该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;
4、max()函数
max()函数是求最大值的函数。使用max()函数可以求出表中某个字段取值的最大值。例如,可以用max()函数来查询最大年龄,也可以使用max()函数来求各科的最高成绩。
下面使用max()函数查询employee表中的最大年龄(age)。select语句如下:
select max(age) from employee;
执行结果如下:
结果显示,max()函数查询除了age字段的最大值为26。max()函数通常与group by字段一起使用,来计算每个分组的最大值。
5、min()函数
min()函数是求最小值的函数。使用min()函数可以求出表中某个字段取值的最小值。例如,可以用min()函数来查询最小年龄,也可以使用min()函数来求各科的最低成绩。
下面使用min()函数查询employee表中的最小年龄。select语句如下:
select min(age) from employee;
这里的相关内容还没有整理完毕,文章后面持续更新,建议收藏。
文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。
可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。