MySQL数据库05——数据的查询(SELECT)
创始人
2024-05-24 20:34:42
0

SQL强大的在于它的查询,查询是最重要的操作之一。


查询最基础的语法

查看student表里面全部内容:

SELECT  *  FROM    student

 


整体语法格式

主要子句的语法格式归纳如下:

 SELECT     [DISTINCT | ALL] select_list

FROM       table_source

[WHERE     search_condition ]

 [GROUP BY  group_by_expression ]   

[HAVING     search_condition ]

[ORDER BY  order_expression [ ASC | DESC ] ]    

SELECT子句:必选子句。可选关键字DISTINCT用于去除查询结果集中的重复值所在的记录;关键字ALL用于返回查询结果集中的全部记录,它是默认的关键字,即当没有任何关键字时返回全部记录。select_list 为星号(*),或者用逗号分隔的字段名列表,或者引用字段名的表达式,或者其他表达式(常量或函数)。该子句决定了结果集中应该有什么字段。

FROM子句:必选子句。其中table_source可以是一个基本表名称,或者一个视图名称,或者为用逗号分隔的基本表名称列表,或者视图名列表,或者基本表名和视图名混合列表。该子句决定了要从哪个(哪些)数据源查询数据。

WHERE子句:可选子句。其中search_condition 为条件表达式。该子句用于指定查询条件,DBMS将满足条件的行显示出来(或者添加到结果集中)。

GROUP BY子句:可选子句。其中group_by_expression为一个字段名,或者用逗号分隔的字段名列表。该子句用于按group_by_expression分组(分类)查询到的数据。

ORDER BY子句:可选子句。该子句用于按order_expression排序查询结果。如果其后有ASC(默认值)则,按升序排序结果;如果其后有DESC,则按降序排序结果。如果没有该子句,查询结果将以添加记录时的顺序显示。

执行顺序

假设SELECT语句带有所有的子句,则其执行顺序为:

(1)FROM子句

(2)WHERE子句

(3)GROUP BY子句

(4)HAVING子句

(5)SELECT子句

(6)ORDER BY子句

来看一下它们的基本工作原理。SELECT语句的各子句中FROM子句是首先被执行的,通过FROM子句首先获得一个虚拟表,然后通过WHERE子句从刚才的虚拟表中获取满足条件的记录,生成新的虚拟表。将新虚拟表中的记录通过GROUP BY子句分组后得到更新的虚拟表,而后HAVING子句在最新的虚拟表中筛选出满足条件的记录组成另一个虚拟表。从上一步得到的虚拟表中,SELECT子句根据select_list,将指定的列提取出来组成更新的虚拟表,最后ORDER BY子句对其进行排序得出最终的虚拟表。通常,人们将最终的虚拟表称为查询结果集。


查询用法

查一列

查询一列,比如院线这一列:

SELECT  institute  FROM   student;

 查了后去重,可以看到有多少类,类似python里面的pandas库的df.uniques()

SELECT   DISTINCT institute  FROM   student;

 查多字段

SELECT  name,sex,origin  FROM   student;

 

查现有数据计算新数据

根据学生的id和他们的课程,计算他们每一节课的总共成绩(70%的考试和30%的平时)

SELECT  s_id,c_id,result1*0.7+result2*0.3  FROM   score;

查询后重新命名

SELECT  s_id,c_id,result1*0.7+result2*0.3 AS 总成绩 FROM   score;
SELECT  name AS 姓名,sex AS 性别,origin AS 来源地  FROM   student;

     

 

查询结果保存为新表

CREATE TABLE totalscore AS SELECT  s_id AS 学号,c_id AS 课号,result1*0.7+result2*0.3 AS 总成绩 FROM  score;
SELECT  *  FROM  totalscore ;

 连接字段

可以将字符串连接起来,然后在一列里面显示。

示例将姓名和地区连接,并且地区加上括号。

SELECT  CONCAT(name,'(',origin,')') AS 姓名和地区 FROM student

排序数据

使用ORDER BY 来安排

SELECT   ID AS 学号, name AS 姓名, origin AS 来源地, birthday AS 出生日期  
FROM   student  
ORDER BY  birthday; 

 还可以用origin排序,而且不用显示它:

SELECT  name AS 姓名, birthday AS 出生日期  FROM  student ORDER BY  origin 

 

设置排序方向

ASC是升序,DESC是降序。默认升序

从course表中,查询所有内容。要求将查询结果按照学分降序排序。

SELECT  * FROM  course ORDER BY  credit  DESC;

 

多字段排序

从Course表中,查询所有内容。要求将查询结果按照学分降序排序,当学分相同时按照课号升序排序。

SELECT  * FROM  course  ORDER BY   credit DESC, ID;

 

按字段位置排序

在实际应用中,有时也需要按字段位置排序。因为,SELECT关键字后并非都是字段名,也可能是表达式。如果希望按表达式的值排序,而又没有给表达式取别名,则可以按字段位置排序表达式。

TIMESTAMPDIFF(YEAR, birthday, CURDATE())的作用是返回“出生日期”字段值和当前系统时间的年份差值。CURDATE函数的返回值是当前系统时间。TIMESTAMPDIFF函数和CURDATE函数均为MySQL的函数。

SELECT  ID AS 学号, name AS 姓名, TIMESTAMPDIFF(YEAR, birthday, CURDATE())   
FROM     student
ORDER BY  3  DESC;

 上面的语句中,因为表达式TIMESTAMPDIFF(YEAR, birthday, CURDATE())在字段名列表中的位置是3,所以ORDER BY子句中的3 DESC,表示了使用表达式TIMESTAMPDIFF(YEAR, birthday, CURDATE())的值降序排序记录。

其实,本例除了使用位置排序以外,在ORDER BY子句后可以直接放变量表达式,重命名的也行。接放置表

SELECT   ID AS 学号, name AS 姓名, TIMESTAMPDIFF(YEAR, birthday, CURDATE())   AS 年龄
FROM       student
ORDER BY  年龄  DESC

运行结果同上。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...