超详细的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

如果你想获取全部字段,不想一个个写字段列表,那么可以用 * 表示全部,语法如下:

SELECT * FROM 表名;

注意: * 表示表中所有的字段,上面select命令表示取出满足条件的所有记录,如果不加where条件,即取出表中所有数据。

例如,查询student表中所有字段:

SELECT * FROM student;

select

2 查询不重复的记录

用distinct关键字来实现

SELECT DISTINCT 字段名 FROM 表名;

例如,获取student表中不同的教师id:

SELECT DISTINCT teacher_id FROM student;

select distinct

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表:

select where

(1)查询student表中,年龄大于18岁的记录:

SELECT * FROM student WHERE age > 18;

select where

(2)查询student表中,除了王武外的所有学生记录:

SELECT * FROM student WHERE name != "王武";
// 或者
SELECT * FROM student WHERE name <> "王武";

select where

(3)查询student表中,年龄在18到20岁之间的学生记录:

SELECT * FROM student WHERE age BETWEEN 18 AND 20;

select where

(4)查询student表中,名字叫李红和王武学生的记录:

SELECT * FROM student WHERE name IN ("李红", "王武");

select where

(5)查询student表中,姓李的所有学生记录:

SELECT * FROM student WHERE name LIKE "李%";
// 或者
SELECT * FROM student WHERE name LIKE "李_";

两者的区别是:_表示单个字符,如果有一个学生是“李小明”,那个这个学生就会查询不出来。但是%可以查询处理,表示不限字符长度。

select where

(6)查询student表中,没有分配老师的学生记录:

SELECT * FROM student WHERE teacher_id IS NULL;

select where

(7)查询student表中,学生年龄在18岁以上且分配的老师是蒋老师的记录:

SELECT * FROM student WHERE age >= 18 AND teacher_id = 2 ;

select where

(8)查询student表中,找出李小明和李明两位学生的记录:

SELECT * FROM student WHERE name = "李小明" OR name = "李明";
// 或者
SELECT * FROM student WHERE name IN ("李小明", "李明");

select where

(9)查询student表中,找出所有已经分配老师的学生记录:

SELECT * FROM student WHERE teacher_id IS NOT NULL;

select where

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(数据查询语言)中排序、分页功能详解

6 表连接

请访问SQL语句-DQL(数据查询语言)中表连接功能详解

目录

相关推荐
MySQL入门-什么是MySQL,什么是SQL超详细的 SQL 语句 DDL(数据定义语言)讲解MySQL中如何对表字段进行增加、删除、改名、类型修改SQL语句-DML(数据操作语言)对表记录的插入、更改、删除命令MySQL中的约束详解