在数据库管理中,SELECT
语句是 SQL 中最常用的语句之一,用于从数据库表中检索数据。
简单查询是 SELECT
语句的基础应用,基本语法为 SELECT 列名 FROM 表名;
。例如,假设有一个名为 students
的表,包含 student_id
、student_name
、age
等列,要查询所有学生的姓名,可使用如下语句:
SELECT student_name FROM students;
如果要查询多个列,列名之间用逗号隔开,如 SELECT student_id, student_name FROM students;
。若要查询表中的所有列,可以使用通配符 *
,即 SELECT * FROM students;
,不过在实际应用中,为了提高查询效率和避免不必要的数据传输,通常不建议在生产环境大量使用 *
。
WHERE
子句用于对查询结果进行条件筛选,语法为 SELECT 列名 FROM 表名 WHERE 条件;
。条件可以是比较运算符(如 =
、<>
、<
、>
等 )、逻辑运算符(AND
、OR
、NOT
)等的组合。比如,要从 students
表中查询年龄大于 18 岁的学生姓名,还可以使用逻辑运算符组合多个条件,例如查询年龄大于 18 岁且性别为 '男'
的学生信息:
SELECT student_name FROM students WHERE age > 18;
SELECT * FROM students WHERE age > 18 AND gender = '男';
GROUP BY
子句用于根据指定列对查询结果进行分组,语法是 SELECT 列名 FROM 表名 GROUP BY 分组列;
。通常会配合聚合函数(如 SUM
、COUNT
、AVG
等 )使用。例如,在 orders
表中有 order_id
、customer_id
、order_amount
等列,要按 customer_id
分组统计每个客户的订单数量:
SELECT customer_id, COUNT(order_id) AS order_count
FROM orders
GROUP BY customer_id;
HAVING
子句用于对 GROUP BY
分组后的结果进行筛选,语法为 SELECT 列名 FROM 表名 GROUP BY 分组列 HAVING 条件;
。它与 WHERE
子句的区别在于,WHERE
是在分组前对行进行筛选,而 HAVING
是在分组后对组进行筛选。例如,查询订单数量大于 3 的客户:
SELECT customer_id, COUNT(order_id) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) > 3;
ORDER BY
子句用于对查询结果进行排序,语法为 SELECT 列名 FROM 表名 ORDER BY 列名 [ASC|DESC];
,ASC
表示升序(默认 ),DESC
表示降序。比如,要按照学生成绩从高到低查询学生信息:
SELECT * FROM students ORDER BY score DESC;
LIMIT
子句用于限制查询结果返回的行数,语法为 SELECT 列名 FROM 表名 LIMIT [起始位置,] 数量;
。起始位置可选,不指定时默认从第 0 行开始。例如,只查询 students
表中前 5 条记录:
SELECT * FROM students LIMIT 5;
若要从第 3 条记录开始,查询 5 条记录:
SELECT * FROM students LIMIT 2, 5;
语法顺序一般是 SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY - LIMIT
。但执行顺序有所不同,首先执行 FROM
确定数据源,然后 WHERE
进行行筛选,接着 GROUP BY
分组,再是 HAVING
对分组结果筛选,之后 SELECT
选择列,随后 ORDER BY
排序,最后 LIMIT
限制返回行数。理解这种顺序有助于优化查询性能。
在 SQL 中,可以使用正则表达式进行模糊查询,通过 REGEXP
关键字实现。例如,在 students
表中查询姓名以 '张'
开头的学生:
SELECT * FROM students WHERE student_name REGEXP '^张';
PS:如果要查后面结尾字,可以加.*(|)$,这个要比like‘sth.%’好用一点喔。
连表操作(如内连接、外连接等 )允许从多个相关表中检索数据。内连接语法如 SELECT 列名 FROM 表1 INNER JOIN 表2 ON 表1.关联列 = 表2.关联列;
。例如,有 students
表和 scores
表,通过 student_id
关联,查询学生及其成绩信息:
SELECT students.student_name, scores.score
FROM students
INNER JOIN scores
ON students.student_id = scores.student_id;
了解 SELECT
语句中关键字的执行优先级,能帮助我们更准确地编写查询语句。一般来说,FROM
最先执行确定数据源,然后是 WHERE
筛选行,接着 GROUP BY
分组,HAVING
筛选组,之后是 SELECT
选取列,再是 DISTINCT
去重(如果有 ),ORDER BY
排序,最后 LIMIT
限制行数。具体执行顺序为:
子查询是在一个 SELECT
语句中嵌套另一个 SELECT
语句。子查询可以用于 WHERE
子句、FROM
子句等位置。例如,在 students
表中查询成绩高于平均成绩的学生:
SELECT * FROM students
WHERE score > (SELECT AVG(score) FROM students);
PS:同时条件还可以作为一个虚拟表,例如as为表t1,再进行和原来自身的表进行连接等操作,除了表与表之间连接,还可以自己与自己连接。