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