内容正文:
第7章 数据查询
主要内容
7.1 SELECT语句
7.2 单表查询
7.3 连接查询
7.4 子查询
7.5 查询的集合操作
7.6 本章小结
7.1 SELECT语句
数据查询是指从数据库中获取所需的数据,是数据库中最常用也是最重要的操作。关系数据库管理系统使用SELECT语句从一个或多个表中查询数据。
语法格式:
SELECT [ALL | DISTINCT ] select_expr [, select_expr] ...
[FROM tbl_name[, tbl_name,…]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]
[HAVING having_condition]
[ORDER BY {col_name | expr | position} [ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]]
7.1 SELECT语句
说明:
SELECT子句:指定查询语句返回的列或表达式;
FROM子句:指定查询数据的来源,可以是表、视图、查询结果;
WHERE子句:限定选择行必须满足的一个或多个条件。where_condition是一个表达式,对于要选择的每一行,该表达式的计算结果为true。如果没有WHERE子句,将选择所有行;
GROUP BY子句:指定用于分组的列或表达式;
HAVING子句:指定返回的分组结果必须满足的条件;
ORDER BY子句:指定查询结果的排序方式;
LIMIT子句:限定查询结果包含的行数。
7.2 单表查询
7.2.1 挑选列
SELECT子句指示从表中检索哪些列,关键字SELECT后可以是*、字段列表、计算表达式。
1.查询表中指定列
在SELECT子句中指定要查看的一个或多个列的名称,如果查看多个列,列名之间用逗号分隔。
查询结果中列的显示顺序由SELECT子句指定,与表中的存储顺序无关。
7.2 单表查询
7.2.1 挑选列
1.查询表中指定列
【例7.1】查询所有学生的学号、姓名和性别。
在MySQL命令行客户端输入命令:
USE jwgl
SELECT sno, sname, ssex FROM student;
7.2 单表查询
7.2.1 挑选列
2.查询表中所有的列
SELECT子句中使用*可以获取表中所有列的值,而不需要指明各列的名称,通常在用户不清楚表中各列名称时使用。
查询结果中各列按照创建表时列的顺序显示。
【例7.2】查询所有学生的基本信息。
在MySQL命令行客户端输入命令:
SELECT * FROM student;
7.2 单表查询
7.2.1 挑选列
3.使用计算表达式
实际应用中用户所需要的结果需要对表中的列进行计算才能获得,这时可以在SELECT子句中使用各种运算符、函数对表中的列进行计算获取所需结果。
【例7.4】查询所有学生的学号、姓名和年龄。
在MySQL命令行客户端输入命令:
SELECT sno, sname, YEAR(SYSDATE())-YEAR(sbirthday)
FROM student;
7.2 单表查询
7.2.1 挑选列
4.改变列标题
查询结果中显示的各列的标题就是创建时定义的列名或者SELECT子句中使用的计算表达式。
在SELECT子句中,可以给列或计算表达式指定别名作为查询结果中的显示标题。
【例7.4】查询所有学生的学号、姓名和年龄,改变列标题。
在MySQL命令行客户端输入命令:
SELECT sno AS 学号, sname AS 姓名, YEAR(SYSDATE())-YEAR(sbirthday) AS 年龄
FROM student;
7.2 单表查询
7.2.1 挑选列
4.改变列标题
注意:
AS可以省略,但是建议在指定列别名时养成显式使用AS的习惯;
不允许在WHERE子句中使用列别名,因为在执行WHERE子句时可能尚未确定列的值;
别名可以在GROUP BY、ORDER BY或HAVING子句中使用。
7.2 单表查询
7.2.1 挑选列
5.消除重复行
查询数据有时会获得重复的数据,尤其是在挑选表中的部分列的时候。
可以在SELECT子句中使用DISTINCT从查询结果中删除重复的行,使查询结果更加简洁。
【例7.5】查询所有学生所属的专业。
在MySQL命令行客户端输入命令:
SELECT DISTINCT mno FROM student;
7.2 单表查询
7.2.2 选择行
WHERE子句用于过滤表中的数据,对FROM子句中指定的表中的行进行判断,只有满