前言
SQL(Structured Query Language)是用于管理关系型数据库的标准语言,主要分为以下几类:
- 数据查询语言(DQL) :SELECT
- 数据操作语言(DML) :INSERT, UPDATE, DELETE
- 数据定义语言(DDL) :CREATE, ALTER, DROP
- 数据控制语言(DCL) :GRANT, REVOKE
- 事务控制语言(TCL) :COMMIT, ROLLBACK
基础SQL语句-数据查询语言
-
SELECT 语句(基础查询)
SELECT语句用于从数据库表中检索数据,是最常用的SQL语句。
基本语法:
SELECT column1, column2, ... FROM table_name;练习:
假设有一个students表,包含id, name, age, major列,请写出 --查询所有学生姓名和专业 select name, major from students; --查询所有学生信息 select * from students;- SQL关键字(如SELECT, FROM)通常建议大写以提高可读性,但小写也是可以正常执行的
-
SELECT 语句与WHERE语句
WHERE子句用于过滤记录,只返回满足指定条件的行。 基本语法:
SELECT column1, column2, ... FROM table_name WHERE condition;- WHERE子句必须放在FROM子句之后
- 可以使用比较运算符:=, <>, >, <, >=, <=
- 可以使用逻辑运算符:AND, OR, NOT
- 字符串值需要用单引号括起来
练习:
假设有一个students表,包含id, name, age, major列,请写出 --查询年龄大于20岁的学生姓名和专业 SELECT name, major FROM students WHERE age > 20 --查询主修"Computer Science"的所有学生信息 SELECT * FROM students WHERE major = 'Computer Science' --查询年龄在18到22岁之间(包含18和22)且主修不是"Mathematics"的学生姓名 SELECT name FROM students WHERE age >= 18 AND age <= 22 AND major <> 'Mathematics'- BETWEEN语法可以简化年龄范围查询:
age BETWEEN 18 AND 22 - 不等号也可以用
!=代替<>
-
ORDER BY排序子句
ORDER BY 子句用于对结果集进行排序,可以按一个或多个列排序,并指定升序(ASC)或降序(DESC)。 基本语法:
SELECT column1, column2, ... FROM table_name [WHERE condition] ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;- ASC 表示升序(默认,可省略),DESC 表示降序
- 可以按多列排序,先按第一个列排序,相同值再按第二个列排序
- 可以按列名、列序号(从1开始)或表达式排序
- NULL 值的排序位置取决于数据库系统(通常NULL被视为最小值)
练习:
使用`students`表(包含id, name, age, major列),请写出: --按学生年龄从大到小排序显示所有学生信息 SELECT * FROM students ORDER BY age DESC --查询主修"Computer Science"的学生,按姓名升序排列 SELECT * FROM students WHERE major='Computer Science' ORDER BY name ASC --先按专业升序排列,同专业再按年龄降序排列,显示姓名、专业和年龄 SELECT name, major, age FROM students ORDER BY major ASC, age DESC- ASC可以省略,因为它是默认排序方式
- 进阶知识:——待学
- 可以按SELECT子句中未包含的列排序
- 可以按列位置排序(如ORDER BY 2表示按第二列排序)
- NULL值的排序行为:通常NULL会排在最后(DESC时排在最前)
-
LIMIT/OFFSET子句(限制返回行数)
LIMIT和OFFSET用于分页查询,控制返回的行数和起始位置。 基本语法:
-- 限制返回行数 SELECT * FROM table_name LIMIT number; -- 分页查询(跳过前offset行,返回limit行) SELECT * FROM table_name LIMIT limit OFFSET offset; -- 替代语法(MySQL支持) SELECT * FROM table_name LIMIT offset, limit;- 不同数据库语法略不同
- OFFSET 0可省略
- 常用于分页显示数据
练习:
使用`students`表: --查询年龄最大的5名学生 SELECT * FROM students ORDER BY age DESC LIMIT 5 --查询第6到第15名学生(按姓名排序) SELECT * FROM students ORDER BY name LIMIT 10 OFFSET 5 -
聚合函数(COUNT, SUM, AVG等)
聚合函数对一组值执行计算并返回单个值,常与GROUP BY配合使用。
常用聚合函数:
COUNT()- 计数SUM()- 求和AVG()- 平均值MAX()- 最大值MIN()- 最小值
基本语法:
SELECT AGG_FUNC(column_name) FROM table_name [WHERE condition];- COUNT(*)计算所有行数,COUNT(column)计算非NULL值
- 聚合函数会忽略NULL值
- 可以与WHERE条件结合使用
练习:
使用`students`表: --计算主修"Mathematics"的学生人数 SELECT COUNT(*) FROM students WHERE major='Mathematics' --查询所有学生的平均年龄 SELECT AVG(age) FROM students --找出年龄最小的学生姓名和年龄(提示:需要子查询) SELECT name, age FROM students WHERE MIN(age) ×不能在WHERE子句中直接使用聚合函数 需要子查询:SELECT name, age FROM students WHERE age = (SELECT MIN(age) FROM students) 或 使用ORDER BY和LIMIT:SELECT name, age FROM students ORDER BY age ASC LIMIT 1-
聚合函数不能直接用在WHERE子句中,这是SQL的一个重要规则
-
要在条件中使用聚合结果,必须使用子查询——待学
-
获取极值对应的记录时,ORDER BY + LIMIT是更简洁的方案