单表查询
本文将向您介绍如何使用 SQL 语句进行 seekdb 中的单表查询操作。
前提条件
语法
请使用 SELECT 语句进行查询数据。
SELECT 语句单表查询的一般结构如下:
SELECT [ALL | DISTINCT | UNIQUE | SQL_CALC_FOUND_ROWS] select_list
FROM table_name
[ WHERE query_condition ]
[ GROUP BY group_by_condition ]
[ HAVING group_condition ]
[ ORDER BY column_list ][ASC | DESC]
[ LIMIT limit_clause ]
column_list:
column_name[,column_name...]
参数解释:
| 参数 | 说明 |
|---|---|
| select_list | 要检索的列的列表,可以是列名、表达式、聚合函数等。可以使用逗号分隔多个列。 |
| table_name | 要检索数据的表的名称。 |
| WHERE query_condition | 可选参数,用于指定检索的条件。只有符合条件的行才会被返回。 |
| GROUP BY group_by_condition | 可选参数,用于按照指定的列对结果进行分组。通常与聚合函数一起使用。 |
| HAVING group_condition | 可选参数,用于过滤分组后的结果集,只返回满足条件的分组。 |
| ORDER BY column_list | 可选参数,用于对结果集进行排序。可以指定一个或多个列进行排序。 |
| ASC | DESC |
| LIMIT limit_clause | 可选参数,用于限制返回的结果集的行 数。 |
| column_list | 用于指定要检索的列的参数,可以是单个列或多个列,用逗号分隔。 |
| column_name | 要检索的列的名称。 |
SELECT 关键字执行顺序简介
当 WHERE、GROUP BY、HAVING、ORDER BY、LIMIT 这些关键字一起使用时,先后顺序有明确的限制。关键字执行顺序如下:
-
执行
FROM找到表。 -
执行
WHERE指定约束条件。 -
执行
GROUP BY将取出的每条记录进行分组(聚合)。如果没有GROUP BY,则整体作为一组。 -
执行
HAVING将分组的结果进行筛选。 -
执行
SELECT。 -
执行
DISTINCT去重。 -
执行
ORDER BY将结果按条件升序或降序排序。 -
执行
LIMIT限制结果的条数。
WHERE 和 HAVING 的区别是,WHERE 是在分组前对数据进行筛选,而 HAVING 是在分组后的结果里进行筛选,最后返回整个 SQL 的查询结果。
创建测试表并添加测试数据
-
创建表
student。CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
gender TINYINT NOT NULL,
age INT NOT NULL,
score FLOAT NOT NULL,
enrollment_date DATE NOT NULL,
notes VARCHAR(50)
); -
向表
student中插入 10 条数据。INSERT INTO student (name, gender, age, score, enrollment_date, notes)
VALUES ('Emma', 0, 20, 85.0, '2021-09-01',NULL),
('William', 1, 21, 90.5, '2021-09-02','B'),
('Olivia', 0, 19, 95.5, '2021-09-03','A'),
('James', 1, 20, 87.5, '2021-09-03',NULL),
('Sophia', 0, 20, 91.5, '2021-09-05','B'),
('Benjamin', 1, 21, 96.5, '2021-09-01','A'),
('Ava', 0, 22, 89.5, '2021-09-06',NULL),
('Michael', 1, 18, 93.5, '2021-09-08','B'),
('Charlotte', 1, 19, 88.0, '2021-09-06',NULL),
('Ethan', 1, 20, 92.0, '2021-09-01','B'); -
创建表
fruit_order。CREATE TABLE fruit_order(
order_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '订单ID',
user_id BIGINT NOT NULL COMMENT '客户ID',
user_name VARCHAR(16) NOT NULL DEFAULT '' COMMENT '客户名称',
fruit_price DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '订单金额',
order_year SMALLINT NOT NULL COMMENT '下单年份'
) COMMENT '订单表'; -
向表
fruit_order中插入 10 条数据。INSERT INTO fruit_order(user_id, user_name,fruit_price,order_year)
VALUES (1011,'A1',13.11,'2019'),
(1011,'A1',22.21,'2020'),
(1011,'A1',58.83,'2020'),
(1022,'B2',23.34,'2019'),
(1022,'B2',12.22,'2019'),
(1022,'B2',14.66,'2021'),
(1022,'B2',34.44,'2021'),
(1033,'C3',51.55,'2020'),
(1033,'C3',63.66,'2021'),
(1034,'D4',53.62,'2021');
基本查询
在使用 SELECT 时,建议使用有意义的列别名和合适的列顺序,可以提高结果集的可读性、更好地组织和理解查询结果。
查询全部列
-
可以通过
SELECT * FROM student;语句将全部学生信息查询出来。 -
也可以手动列出所有字段,通过
SELECT id,name,gender,age,score,enrollment_date FROM student;语句将全部学生信息查询出来。
虽然使用 * 可以快速列出所有字段,但是使用手动列出所有字段在查询性能、代码的可读性和可维护性方面会更好。
示例 1:使用下面的 SQL 语句,查询表 student 中所有行的数据。
SELECT id, name, gender, age, score, enrollment_date, notes
FROM student;
或者
SELECT * FROM student;
返回结果如下:
+----+-----------+--------+-----+-------+-----------------+-------+
| id | name | gender | age | score | enrollment_date | notes |
+----+-----------+--------+-----+-------+-----------------+-------+
| 1 | Emma | 0 | 20 | 85 | 2021-09-01 | NULL |
| 2 | William | 1 | 21 | 90.5 | 2021-09-02 | B |
| 3 | Olivia | 0 | 19 | 95.5 | 2021-09-03 | A |
| 4 | James | 1 | 20 | 87.5 | 2021-09-03 | NULL |
| 5 | Sophia | 0 | 20 | 91.5 | 2021-09-05 | B |
| 6 | Benjamin | 1 | 21 | 96.5 | 2021-09-01 | A |
| 7 | Ava | 0 | 22 | 89.5 | 2021-09-06 | NULL |
| 8 | Michael | 1 | 18 | 93.5 | 2021-09-08 | B |
| 9 | Charlotte | 1 | 19 | 88 | 2021-09-06 | NULL |
| 10 | Ethan | 1 | 20 | 92 | 2021-09-01 | B |
+----+-----------+--------+-----+-------+-----------------+-------+
10 rows in set
查询指定列
在表中根据列名查找指定列数据。
示例 2:使用下面的 SQL 语句,查询表 student 中所有行的数据,返回每行的 id 和 name 列的数据。
SELECT id, name
FROM student;
返回结果如下:
+----+-----------+
| id | name |
+----+-----------+
| 1 | Emma |
| 2 | William |
| 3 | Olivia |
| 4 | James |
| 5 | Sophia |
| 6 | Benjamin |
| 7 | Ava |
| 8 | Michael |
| 9 | Charlotte |
| 10 | Ethan |
+----+-----------+
10 rows in set
查询经过计算的值和指定列别名
在查询中可以对指定列进行数据计算处理。
示例 3:使用下面的 SQL 语句,从表 student 中选择 id、name、age 和 age+5 四个列的数据,并为 age+5 这个计算结果列指定别名 age_plus_5。
SELECT id, name, age, age+5 AS age_plus_5
FROM student;
返回结果如下:
+----+-----------+-----+------------+
| id | name | age | age_plus_5 |
+----+-----------+-----+------------+
| 1 | Emma | 20 | 25 |
| 2 | William | 21 | 26 |
| 3 | Olivia | 19 | 24 |
| 4 | James | 20 | 25 |
| 5 | Sophia | 20 | 25 |
| 6 | Benjamin | 21 | 26 |
| 7 | Ava | 22 | 27 |
| 8 | Michael | 18 | 23 |
| 9 | Charlotte | 19 | 24 |
| 10 | Ethan | 20 | 25 |
+----+-----------+-----+------------+
10 rows in set
更多关于在查询中使用操作符和函数来对指定列进行数据处理的方法,请参见 **在查询中使用操 下面的章节。
数据过滤
要查询满足特定条件的数据时,可以通过在 SELECT 查询语句中添加一个 WHERE 子句来进行数据过滤。WHERE 子句后面可以包含一个或多个条件,这些条件用于筛选数据,只有满足 WHERE 条件的数据才会被返回。可以根据特定需求,通过灵活运用查询条件来过滤和检索目标数据。
在使用 WHERE 子句时,要确保条件正确和使用合适的运算符。
WHERE 子句常用的查询条件如下表所示。
| 查询条件类型 | 谓词 |
|---|---|
| 比较查询 | =,>,<,>=,<=,!=,<> |
| 逻辑查询(多重条件) | AND,OR,NOT |
| 模糊查询(字符匹配) | LIKE,NOT LIKE |
| 区间查询(确定范围) | BETWEEN AND,NOT BETWEEN AND |
| 指定集合查询 | IN,NOT IN |
| NULL 值查询 | IS NULL,IS NOT NULL |
更多有关查询条件运算符的详细信息,请参见 比较运算符。
比较条件查询
等于
等于(=):查询出指定列中和目标值相等的数据。如果值是字符串类型,需要用单引号或者双引号括起来。
示例 4:使用下面的 SQL 语句,查询表 student 中 gender 列等于 1 的所有行,并返回这些行中的 id、name 和 gender 列的数据。
SELECT id, name, gender
FROM student
WHERE gender = 1;
返回结果如下:
+----+-----------+--------+
| id | name | gender |
+----+-----------+--------+
| 2 | William | 1 |
| 4 | James | 1 |
| 6 | Benjamin | 1 |
| 8 | Michael | 1 |
| 9 | Charlotte | 1 |
| 10 | Ethan | 1 |
+----+-----------+--------+
6 rows in set
不等于
不等于包括 <> 和 != 两种写法。
示例 5:使用下面的 SQL 语句,查询表 student 中 gender 列不等于 1 的所有行,并返回这些行中的 id、name 和 gender 列的数据。
SELECT id, name, gender
FROM student
WHERE gender <> 1;
返回结果如下:
+----+--------+--------+
| id | name | gender |
+----+--------+--------+
| 1 | Emma | 0 |
| 3 | Olivia | 0 |
| 5 | Sophia | 0 |
| 7 | Ava | 0 |
+----+--------+--------+
4 rows in set
大于和小于
大于(>)和小于(<)将数值按照大小比较。如果比较的是字符,则按照 ASCII 码对应的值进行比较,比较时按照字符对应的位置逐一进行比较。
大于等于(>=)和小于等于(<=)与之类似。
示例 6:使用下面的 SQL 语句,查询表 student 中 score 列小于 90 的所有行,并返回这些行中的 id、name 和 score 列的数据。
SELECT id, name, score
FROM student
WHERE score < 90;
返回结果如下:
+----+-----------+-------+
| id | name | score |
+----+-----------+-------+
| 1 | Emma | 85 |
| 4 | James | 87.5 |
| 7 | Ava | 89.5 |
| 9 | Charlotte | 88 |
+----+-----------+-------+
4 rows in set