MySQL怎样查询数据(单表查询语句)——MySQL 5.7数据库


       数据检索是指从数据库中按照预定条件查询数据,及引用相关数据进行计算而获取所需信息的过程。

       MySQL是通过select语句查询实现数据检索的。


何云辉 CSDN

一、基本查询语句。

       select 语句是SQL语言从数据库中获取信息的一个基本语句。该语句可以实现从一个或多个数据库中的一个或多个表中查询信息,并将结果显示为另外一个二维表的形式,称之为结果集(result set)。
select语句的基本的语法格式可归纳如下:

select [all|distinct]selection_list 			
from  table_source       [where search_condition] 	 
[group by grouping_columns][with rollup]	
[having search_condition]
[order by order_expression [asc|desc]]	
[limit count]

1.使用select语句查询一个数据表。使用select语句时,首先要确定所要查询的列。“*”代表所有的列。

查询teaching数据库course表中的所有数据。

mysql> use teaching;
mysql> select * from  course;

在这里插入图片描述

2.查询表中的指定列。针对表中的多列进行查询,只要在select后面指定要查询的列名即可,多列之间用“,”分隔。

查询student表中的studentno、sname和phone数据。

  mysql> select studentno,sname,phone from student; 

在这里插入图片描述

3.可以从一个或多个表中获取数据。

       使用select语句进行查询,需要确定所要查询的数据在哪个表中,或在哪些表中,在对多个表进行查询时,同样使用“,”对多个表进行分隔。进行多表查询,主要采用多表连接或子查询的方式,也可以通过where子句中使用连接运算来确定表之间的联系,然后根据这个条件返回查询结果。


何云辉 CSDN

二、单表查询。

1.select…from 基本子句的使用。

       select子句的主要功能是输出字段或表达式的值,form子句的主要功能是指定数据源。这两个子句在进行数据库表查询时,都是必选项。
为字段取别名
       利用select语句查询数据时,输出项一般显示创建表时定义的字段名。MySQL可以为查询显示的每个输出字段或表达式取一个别名,以增加结果集的可读性。例如,可以用as关键字给字段取一个中文名。实现给select子句中的各项取别名其语法格式为:select项的原名 as 别名

在student表中查询出生日期在2001年以后的学生的学号、姓名、电话和年龄。
分析:可以通过as为列或表达式更改名称,增加可读性。

mysql> select  studentno as '学号',sname as '姓名',
	-> phone as '手机号',year(now())-year(birthdate) as  '年龄'
	-> from  student
	-> where   year(birthdate)>2001;

在这里插入图片描述

(1)使用谓词过滤记录

       如果希望一个列表没有重复值,可以利用distinct子句从结果集中除去重复的行。当使用distinct子句时,需要注意以下事项:

(1)选择列表的行集中,所有值的组合决定行的唯一性。
(2)数据检索包含任何唯一值组合的行,如果不指定distinct子句则将所有行返回到结果集中。

score表中查询期末成绩中有高于95的学生的学号和课程号,并按照学号排序。
分析:不管学生有几门课的成绩高于95,只要有一门就可以显示,利用distinct子句可将重复行消除。

   mysql> select  distinct studentno,courseno
       -> from   score
       -> where final>95
       -> order  by studentno;

在这里插入图片描述

2.使用where子句过滤结果集

(1)查询符合指定条件的记录数据。

       如果要从很多记录中查询出指定的记录,那么就需要一个查询的条件。设定查询条件应用的是where子句,通过where子句可以实现很多复杂的条件查询。在使用where子句时,需要使用一些比较运算符来确定查询的条件。

查询表student中入学成绩在800分以上的学生的学号、姓名和电话信息。
分析:本例中要求输出学号、姓名和电话信息,即为select子句输出表列数据源为表student,条件为入学成绩在800分以上。

mysql> select studentno,sname,phone
    -> from student
    -> where entrance>800;

在这里插入图片描述

(2)带in关键字的查询。

       in关键字可以判断某个字段的值是否在于指定的集合中。如果字段的值在集合中,则满足查询条件,该记录将被查询出来;如果不在集合中,则不满足查询条件。实际上,使用in搜索条件相当于用or连接两个比较条件,如“ xin(10,15)” 相当于表达式“ x=10 or x=15 ”。也可以使用not in关键词查询不在某取值范围内的记录行数据。

查询学号分别为的18135222201、18137221508和19123567897的学生学号、课程号、平时成绩和期末成绩。
分析:检索条件中枚举某些确定值的范围,一般可以利用 in关键字实现。

mysql> select studentno,courseno ,daily ,final
	-> from score
	-> where studentno in('18135222201','18137221508','19123567897');

在这里插入图片描述

(3)带between and的范围查询。

       在where子句中,可以使用between搜索条件检索指定范围内的行。使用between搜索条件时,使用between搜索条件相当于用and连接两个比较条件,如“ x between 10 and 27” 相当于表达式“ x>=10 and x<=27 ”。由此可见,在生成结果集中,边界值也是符合条件的。检索条件指定排除某个范围的值,一般可以利用 not between关键字实现。

查询选修课程号为c05109 的学生学号和期末成绩,并且要求平时成绩在80到95之间。
分析:检索条件设置在某个的范围内,一般可以利用between关键字实现。

mysql> select studentno, final
	-> from score
	-> where courseno='c05109' and daily between 80 and 95;

在这里插入图片描述

(4)带like的字符匹配查询

       使用通配符结合的like搜索条件,通过进行字符串的比较来选择符合条件的行。当使用like搜索条件时,模式字符串中的所有字符都有意义,包括开头和结尾的空格。like主要用于字符类型数据。字符串内的英文字母和汉字都算一个字符。也可用通配符并使用 not like作为查询条件。
like属于较常用的比较运算符,通过它可以实现模糊查询。它有两种通配符:“%”和下划线“”:
“%”可以匹配一个或多个字符,可以代表任意长度的字符串,长度可以为0。
“­
”只匹配一个字符。

在student表中显示所有姓何或姓韩的学生的姓名、生日和Email。
分析:设置where条件实现上述要求,需要采用or和like等逻辑运算。Like 操作符可以和通配符一起将列的值与某个特定的模式作比较,列的数据类型可以是任何字符串类型。

mysql> select  sname, birthdate, Email
	-> from student
	-> where sname like '何%' or sname  like '韩%';

在这里插入图片描述

(5)用is null关键字查询空值。

       涉及空值的查询用null来表示。create table语句或alter table 语句中的null表明在列中允许存在被称为null的特殊数值,它不同于数据库中的其他任何值。在select语句中,where子句通常会返回比较的计算结果为真的行。那么,在where子句中,如何处理null的值的比较呢?为了取得列中含有null的行,MySQL语句包含了操作符功能is [not] null
一个字段值是空值或者不是空值,要表示为:“is null”或“is not null”。不能表示为:“=null”或“<>null”。
如果写成 “字段=null”或“字段<>null”,系统的运行结果都直接处理为null值,按照false处理而不报错。
where子句有以下通用格式: column is [not] null

在se_score表中添加成绩字段score,查询se_score表中学生的学号、课程号和成绩。
分析:学生选修课程表se_course中的成绩是允许空值,以此是否成绩为空值作为查询条件,即可查到学生的选课情况。

mysql> alter table se_course
    -> add score float(3,1) null AFTER teacherno;
mysql> select studentno, courseno,teacherno, score
    -> from se_course
    -> where score is null;

在这里插入图片描述

(6)带and的多条件查询。

       where子句的主要功能是利用指定的条件选择结果集中的行。符合条件的行出现在结果集中,不符合条件的行将不出现在结果集中。利用where子句指定行时,条件表达式中的字符型和日期类型值要放到单引号内,数值类型的值直接出现在表达式中。

在score表中显示期中高于90分、期末成绩高于85分的学生学号、课程号和成绩。
分析:设置where条件实现上述要求,需要采用and逻辑运算,将两个比较运算表达式连接起来。

mysql> select studentno,courseno,daily,final
    -> from score
    -> where daily >=90 and final >= 85;

在这里插入图片描述

(7)带or的多条件查询。

       带or的多条件查询,实际上是指只要符合多条件中的一个,记录就会被搜索出来;如果不满足这些查询条件中的任何一个,这样的记录将被排除掉。or可以用来连接两个条件表达式。而且,可以同时使用多个or关键字连接多个条件表达式。

查询计算机学院的具有高级职称教师的教师号、姓名和从事专业。
分析:where子句设置的条件包括部门和职称,其中高级职称又包括教授和副教授两类,需要包括orand两种逻辑运算。

mysql> select teacherno,tname, major
	-> from teacher
	-> where department='计算机学院' and (prof='副教授'or prof='教授');

在这里插入图片描述


何云辉 CSDN

3.使用order by子句对结果集排序

利用order by子句可以对查询的结果进行升序(asc)或降序(desc)排列。

       排序可以依照某个列的值,若列值相等则根据第二个属性的值,依此类推。
利用order by子句进行排序,需要注意如下事项和原则:

(1)默认情况下,结果集按照升序排列。也可以在输出项的后面加上关键字desc来实现降序输出。如果对含有null值的列进行排序时,如果是按升序排列,null值将出现在最前面,如果是按降序排列,null值将出现在最后。
(2)order by子句包含的列并不一定出现在选择列表中。
(3)order by子句可以通过指定列名、函数值和表达式的值进行排序。
(4)order by子句不可以使用textntextimage类型的列。
(5)在 order by 子句中可以同时指定多个排序项。

在student表中查询高于850分的学生学号、姓名和入学成绩,并按照入学成绩的降序排列。
分析:升序asc是默认值,而降序desc必须表明,也可以给字段取别名。

mysql> select studentno 学号,sname 姓名 ,entrance 入学成绩
-> from student
-> where entrance>850
-> order by entrance  desc;

在这里插入图片描述
在score表中查询总评成绩大于90分的学生的学号、课程号和总评成绩,并先按照课程号的升序、再按照总评成绩的降序排列。总评成绩计算公式如下:
总评成绩=daily0.2+final0.8
分析:本例利用表达式作比较和排序的依据。

mysql> select courseno 课程号,daily *0.2+ final*0.8 as '总评',studentno 学号
-> from score
-> where daily *0.2+ final*0.8>90
-> order by courseno, daily *0.2+ final*0.8 desc;

在这里插入图片描述

4.group by子句和having子句的使用

       group by子句可以将查询结果按属性列或属性列组合在行的方向上进行分组,每组在属性列或属性列组合上具有相同的聚合值。如果聚合函数没有使用 group by子句,则只为 select语句报告一个聚合值。
       将一列或多列定义成为一组,使组内所有的行在那些列中的数值相同。出现在查询的select 列表中的每一列都必须同时出现在group by子句中。

(1)使用group by关键字来分组。单独使用group by关键字,查询结果只显示每组的一条记录。

利用group by子句对score表数据分组,显示每个学生的学号和平均总评成绩。总评成绩计算公式如下:
总评成绩=daily0.3+final0.7
分析:通过学号分组,可以求出每个学生的平均总评成绩。avg()函数用于求平均值,round()函数用于对平均值的某位数据进行四舍五入。

mysql> select studentno 学号, round(avg(daily*0.3+final*0.7),2) as'平均分'
    -> from score
    -> group by studentno;

在这里插入图片描述

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

       使用group by关键字和group_concat()函数查询,可以将每个组中的所有字段值都显示出来。

使用group by关键字和group_concat()函数对score表中的studentno字段进行分组查询。可以查看选学该门课程的学生学号。

   mysql> select courseno 课程号,group_concat(studentno) 选课学生学号
       -> from score  
       -> group by courseno ;

在这里插入图片描述

(3)group by关键字与having一起使用。

       select 语句中的 wherehaving子句控制用数据源表中的那些行来构造结果集。wherehaving是筛选,这两个子句指定一系列搜索条件,只有那些满足搜索条件的行才用来构造结果集。
       having 子句通常与 group by 子句结合使用,尽管指定该子句时也可以不带 group byhaving 子句指定在应用 where 子句的筛选后要进一步应用的筛选。

查询选课在3门以上且各门课程期末成绩均高于75分的学生的学号及其总成绩,查询结果按总成绩降序列出。
分析:可以利用having 子句筛选分组结果,使之满足count(*)>=3的条件即可。

mysql> select studentno 学号,sum(daily*0.3+final*0.7) as '总分'
-> from score
-> where final>=75
-> group by studentno
-> having count(*)>=3
-> order by sum(daily*0.3+final*0.7) desc;

在这里插入图片描述

5.用limit限制查询结果的数量

(1)limit是用来限制查询结果的数量的子句。

       可以指定查询结果从哪条记录开始显示。还可以指定一共显示多少条记录。Limit可以指定初始位置,也可以不指定初始位置。

查询student表的学号、姓名、出生日期和电话,按照entrance进行降序排列,显示前3条记录。

mysql> select studentno,sname,birthdate,phone
-> from student  
-> order by entrance desc  
-> limit 3;

在这里插入图片描述

(2)使用limit还可以从查询结果的中间部分取值。

       首先要定义两个参数,参数1是开始读取的第1条记录的编号(注意在总查询结果中,第1条记录编号为0);参数2是要查询记录的个数。

查询score表中,期末成绩final高于85分的,按照平时成绩daily进行升序排列,从编号2开始,查询5条记录。

  mysql> select * from  score  
      -> where final>85  
      -> order by daily asc  
      -> limit 2,5;

在这里插入图片描述


何云辉 CSDN
发布了38 篇原创文章 · 获赞 15 · 访问量 1690

猜你喜欢

转载自blog.csdn.net/hyh17808770899/article/details/105116760