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
运行结果同上。