MySQL数据库05——数据的查询(SELECT)

本文详细介绍了SQL查询的基础语法,包括SELECT、FROM、WHERE、GROUPBY、HAVING和ORDERBY子句的用法,以及查询的执行顺序。通过实例展示了如何进行单列查询、多字段查询、计算新数据、重命名字段、保存查询结果为新表、连接字段和排序数据等操作。
摘要由CSDN通过智能技术生成

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

运行结果同上。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阡之尘埃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值