实验5 数据查询
数据查询是数据库的核心操作,SQL语言提供了SELECT语句,让其对数据库中的数据进行查询。SELECT语句的主要功能是从数据库中检索行,并将查询结果以表格的形式返回。
【实验目的】
①掌握用SELECT语句进行简单查询。
②掌握用SELECT语句进行集合查询。
③掌握用SELECT语句进行连接查询。
④掌握用SELECT语句进行嵌套查询。
【知识要点】
(1)查询数据的语法格式
SELECT
[ALL | DISTINCT | DISTINCTROW]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr] ...
[into_option]
[FROM table_references
[PARTITION partition_list]]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]
[HAVING where_condition]
[WINDOW window_name AS (window_spec)
[, window_name AS (window_spec)] ...]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[into_option]
[FOR {UPDATE | SHARE}
[OF tbl_name [, tbl_name] ...]
[NOWAIT | SKIP LOCKED]
| LOCK IN SHARE MODE]
[into_option]
into_option: {
INTO OUTFILE 'file_name'
[CHARACTER SET charset_name]
export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name] ...
}
table_references:
escaped_table_reference [, escaped_table_reference] ...
escaped_table_reference: {
table_reference
| {OJ table_reference}
}
table_reference: {
table_factor
| joined_table
}
table_factor: {
tbl_name [PARTITION (partition_names)]
[[AS] alias] [index_hint_list]
| [LATERAL] table_subquery [AS] alias [(col_list)]
| (table_references)
}
joined_table: {
table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]
| table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
| table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
}
join_specification: {
ON search_condition
| USING (join_column_list)(https://www.daowen.com)
}
join_column_list:
column_name [, column_name] ...
index_hint_list:
index_hint [, index_hint] ...
index_hint: {
USE {INDEX|KEY}
[FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
| {IGNORE|FORCE} {INDEX|KEY}
[FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
}
index_list:
index_name [, index_name] ...
说明:
SELECT用于检索从一个或多个表中选择的行,可以包括UNION语句和子查询。
SELECT语句中常用的子句:
①每个select_expr表示要检索的列,必须至少有一个select_expr。
②table_references表示要从中检索行的一个或多个表。
一些常用连接示例如下:
◇ SELECT * FROM table1, table2;
其中table1和table2做乘法运算。
◇ SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;
其中table1和table2做内连接,也称为自然连接。
◇ SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id;
其中table1和table2做左外连接。
◇ SELECT * FROM table1 LEFT JOIN table2 USING (id);
其中table1和table2做左外连接。
◇ SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id LEFT JOIN table3 ON table2.id = table3.id;
其中table1和table2做左外连接后,再与table3做左外连接。
◇ SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id;
其中table1和table2做右外连接。
◇ SELECT * FROM table1 CROSS JOIN table2;
其中table1和table2做交叉连接,即乘法运算。
③where_condition是一个表达式,对于要选择的每行,其计算结果为true。如果没有该子句,则选择所有行。在where_condition表达式中,可以使用MySQL支持的任何函数和运算符,但聚合函数除外。
④SELECT 还可用于检索在不引用任何表的情况下计算行。
⑤如果有GROUP BY子句,则将查询结果按group_by_expression的值进行分组,属性列值相等的元组为一组,每个组产生的结果为表中的一条记录。通常在每组中使用聚合函数,分组的附加条件用HAVING短语给出,只有满足指定条件的组才予以输出。
⑥如果有ORDER BY子句,查询结果则要按order_expression的值的升序或降序排序。
⑦LIMIT子句限制查询结果的行数。
语法格式为:[LIMIT {[offset,] row_count | row_count OFFSET offset}]
offset指定查询结果的第一行的偏移量,默认为0,表示查询结果的第1行,row_count指定查询结果的行数。
⑧into_option:允许将查询结果存储在变量中或写入文件。
SELECT ... INTO var_name 选择列值并将其存储到变量中。
SELECT ... INTO OUTFILE将选定的行写入文件,可以指定列和行终止符以生成特定的输出格式,也可用LOAD DATA …INFILE语句恢复数据。
SELECT ... INTO DUMPFILE将单行写入文件而不设置任何格式。
⑨聚合函数对一组值进行计算,并返回单个值。为了进一步方便用户,增强检索功能,SQL提供了许多聚合函数,常用的聚合函数功能如下:
• COUNT([ALL | DISTINCT]*|〈列名〉):统计元组个数或一列中值的个数。
• SUM([ALL | DISTINCT]〈列名〉):计算一列值的总和(此列必须是数值型),空值将被忽略。
• AVG([ALL | DISTINCT]〈列名〉):计算一列值的平均值(此列必须是数值型),空值将被忽略。
• MAX([ALL | DISTINCT]〈列名〉):求一列值中的最大值,空值将被忽略。
• MIN([ALL | DISTINCT]〈列名〉):求一列值中的最小值,空值将被忽略。
聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用。聚合函数只能在以下位置作为表达式使用:
• SELECT 语句的选择列表(子查询或外部查询)。
• HAVING 子句。
⑩常用的查询条件,使用SELECT语句中的WHERE子句,可以选择满足条件的全部或部分元组。WHERE子句可以使用的条件表达式见表5.1。
表5.1 常用的查询条件

(2)查询分类
查询可以分为简单查询、集合查询、连接查询和嵌套查询。
①简单查询是指在数据库中仅涉及一个表的查询。
②集合查询是指多个SELECT语句的结果可进行集合操作。MySQL中只支持集合并(UNION)操作,不支持集合交(INTERSECT)和差(EXCEPT)操作。
集合并语句格式:
SELECT ...
UNION [ALL | DISTINCT] SELECT ...
[UNION [ALL | DISTINCT] SELECT ...]
③连接查询是指一个查询同时涉及两个以上的表,是关系数据库中最主要的查询。主要包括等值连接查询、非等值连接查询、自身连接查询、外连接查询和复合条件连接查询。
连接查询可由WHERE子句中的连接条件实现,其格式通常为:
SELECT select_expr1,select_expr2 …
FROM table1,table2…
WHERE where_condition1 AND where_condition2 …;
④在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。SQL语言允许多层嵌套查询,通常可以使用谓词IN或NOT IN、量化比较谓词θ ANY或θ ALL以及EXISTS或NOT EXISTS进行嵌套查询。