超详细的DQL(数据查询语言)讲解
2023-12-11 14:48:24查询记录完整语法
语法如下:
SELECT [字段名1, 字段名2, ...字段名n] [, function_name] FROM 表名 WHERE 条件1, 条件2, ...条件n GROUP BY 分组字段列表 [WITH ROLLUP] HAVING 分组后条件列表 ORDER BY 排序字段列表 LIMIT 分页参数
查询功能
1 基础查询
SELECT 字段名1, ..., 字段名n FROM 表名;
字段列表之间用逗号(,)隔开。
你也可以给字段名起一个别名:
SELECT 字段名1 [AS] 别名1, ..., 字段名n [AS] 别名n FROM 表名;
注意:as 可以省略
例如,只查询student表中name和age字段:
SELECT name, age FROM student;
如果你想获取全部字段,不想一个个写字段列表,那么可以用 * 表示全部,语法如下:
SELECT * FROM 表名;
注意: * 表示表中所有的字段,上面select命令表示取出满足条件的所有记录,如果不加where条件,即取出表中所有数据。
例如,查询student表中所有字段:
SELECT * FROM student;
2 查询不重复的记录
用distinct关键字来实现
SELECT DISTINCT 字段名 FROM 表名;
例如,获取student表中不同的教师id:
SELECT DISTINCT teacher_id FROM student;
3 条件语句
3.1 语法
SELECT 字段列表 FROM 表名 WHERE 条件列表;
条件列表:支持联合查询,多个条件语句之间用 or and 等逻辑运算符进行联合查询
条件语句:字段、比较运算符组合而成
3.2 比较运算符
比较运算符 | 功能描述 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或者 != | 不等于 |
BETWEEN...AND... | 在某个范围之内(含最小,最大值) |
IN(...) | 在IN之后的列表中的值,多选一 |
LIKE 占位符 | 模糊匹配(_匹配单个字符,%匹配任意个字符) |
IS NULL | 是NULL |
3.3 逻辑运算符
逻辑运算符 | 功能描述 |
---|---|
AND 或者 && | 并且(多个条件同时成立) |
OR 或者 | 或者(多个条件一个成立就可) |
NOT 或者 ! | 非,不是 |
3.4 举例
创建student和teacher表:
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT "主键id",
name varchar(10) UNIQUE NOT NULL COMMENT "学生名称",
age INT COMMENT "学生年龄",
teacher_id INT COMMENT "学生辅导员id"
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO
student (name, age, teacher_id)
VALUES
("李红", 20, 1),
("刘涛", 10, 1),
("王武", 19, 2),
("李明", 18, null),
("李小明", 15, null);
CREATE TABLE teacher (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT "主键id",
name VARCHAR(10) UNIQUE NOT NULL COMMENT "辅导员名称"
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO teacher (name) VALUES ("王老师"), ("蒋老师");
ALTER TABLE student ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(id);
执行后,student表和teacher表:
(1)查询student表中,年龄大于18岁的记录:
SELECT * FROM student WHERE age > 18;
(2)查询student表中,除了王武外的所有学生记录:
SELECT * FROM student WHERE name != "王武";
// 或者
SELECT * FROM student WHERE name <> "王武";
(3)查询student表中,年龄在18到20岁之间的学生记录:
SELECT * FROM student WHERE age BETWEEN 18 AND 20;
(4)查询student表中,名字叫李红和王武学生的记录:
SELECT * FROM student WHERE name IN ("李红", "王武");
(5)查询student表中,姓李的所有学生记录:
SELECT * FROM student WHERE name LIKE "李%";
// 或者
SELECT * FROM student WHERE name LIKE "李_";
两者的区别是:_表示单个字符,如果有一个学生是“李小明”,那个这个学生就会查询不出来。但是%可以查询处理,表示不限字符长度。
(6)查询student表中,没有分配老师的学生记录:
SELECT * FROM student WHERE teacher_id IS NULL;
(7)查询student表中,学生年龄在18岁以上且分配的老师是蒋老师的记录:
SELECT * FROM student WHERE age >= 18 AND teacher_id = 2 ;
(8)查询student表中,找出李小明和李明两位学生的记录:
SELECT * FROM student WHERE name = "李小明" OR name = "李明";
// 或者
SELECT * FROM student WHERE name IN ("李小明", "李明");
(9)查询student表中,找出所有已经分配老师的学生记录:
SELECT * FROM student WHERE teacher_id IS NOT NULL;
4 聚合函数
语法如下:
SELECT 字段名列表, function_name FROM 表名 WHERE 条件列表 GROUP BY 分组字段列表 [WITH ROLLUP] HAVING 分组后条件列表
很多情况下,用户需要进行一些汇总,比如统计整个公司的人数,这时就需要用SQL的聚合操作。
function_name表示要做的聚合操作,也叫做聚合函数,常用的聚合函数包含:sum(求和)、count(*)(总记录数)、max(最大值)、min(最小值)。
GROUP BY 关键字表示要进行分类聚合的字段,比如,要按照性别分组学生数量,表示性别的字段名就需要放在 GROP BY 的后面。
WITH ROLLUP 可选,表示对分类聚合后的结果再进行汇总。
HAVING 表示对分类后的结果再进行条件的过滤。
WHERE 和 HAVING 区别:
- 执行时机不同:WHERE是分组之前进行过滤,不满足WHERE条件不进行分组,而HAVING是对分组后的结果进行过滤。
- 判断条件不同:WHERE不能对聚合函数进行判断,而HAVING可以
5 排序和分页
请访问SQL语句-DQL(数据查询语言)中排序、分页功能详解