DQL查询基础的语法结构如下:
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段
HAVING
分组后条件
ORDER BY
排序字段
LIMIT
分页限定
说明 | 语法 |
---|---|
查询多个字段 | SELECT 字段列表 FROM 表名; SELECT * FROM 表名; -- 查询所有数据 |
去除重复记录 | SELECT DISTINCT 字段列表 FROM 表名; |
起别名 | 列名 AS 别名 (AS也可以省略) |
-- 先建立新的表
drop table if exists stu;
-- 创建stu表
CREATE TABLE stu (
id int,-- 编号
name varchar(20),-- 姓名
age int,-- 年龄
sex varchar(5),-- 性别
address varchar(100),-- 地址,
math double(5,2),-- 数学成绩,
english double(5,2),-- 英语成绩
hire_date date -- 入学时间
);
-- 添加数据
INSERT INTO stu(id,NAME,age,sex,address,math,english,hire_date)
VALUES
(1,'马运',55,'男','杭州',66,78,'1995-09-01'),
(2,'马花疼',45,'女','深圳',98,87,'1998-09-01'),
(3,'马斯克',55,'男','香港',56,77,'1999-09-02'),
(4,'柳白',20,'女','湖南',76,65,'1997-09-05'),
(5,'柳青',20,'男','湖南',86,NULL,'1998-09-01'),
(6,'刘德花',57,'男','香港',99,99,'1998-09-01'),
(7,'张学右',22,'女','香港',99,99,'1998-09-01'),
(8,'德玛西亚',18,'男','南京',56,65,'1994-09-02');
SELECT * FROM stu;
-- 基础查询
-- 查询name age两列
SELECT name,age FROM stu;
-- 查询所有列的数据,用*指代所有列的数据,但是不推荐使用
SELECT * FROM stu;
-- 查询地址信息,这时候查询出来的信息有重复记录
SELECT address FROM stu;
-- 去除重复可以通过DISTINCT关键字
SELECT DISTINCT address FROM stu;
-- 查询姓名,数学成绩,英语成绩,并用别名代替原有列名
-- 可以通过AS关键字来起别名,也可以省略
SELECT name AS 姓名,math 数学成绩,english 英语成绩 FROM stu;
SELECT 字段列表 FROM 表名 WHERE 条件列表;
符号 | 功能 |
---|---|
\>, \< |
大于, 小于 |
\>=, \<= |
大于等于, 小于等于 |
= |
等于 |
\<\> 或 != |
不等于 |
BETWEEN ... AND ... |
在某个范围内(都包含) |
IN(...) |
多选一 |
LIKE 占位符 |
模糊查询 _单个任意字符 %多个任意字符 |
IS NULL |
是NULL |
IS NOT NULL |
不是NULL |
AND 或 && |
并且 |
OR 或|| |
或者 |
NOT 或 ! |
非 |
解下来通过实际的需求来体验这些语句的作用
SELECT * FROM stu;
-- 查询年龄大于20岁的学院的信息
SELECT * FROM stu WHERE age > 20;
-- 查询年龄大于等于20的学员的信息
SELECT * FROM stu WHERE age >= 20;
-- 查询年龄大于等于20岁但是小于等于30岁的学员信息
SELECT id,name 姓名,age 年龄 FROM stu WHERE age>=20 AND age<=30;
SELECT * FROM stu WHERE age BETWEEN 20 AND 30;
-- 查询入学日期在1998-09-01到1999-09-01之间的学员信息
SELECT * FROM stu WHERE hire_date BETWEEN '1998-09-01' and '1999-09-01';
-- 查询年龄等于18岁的信息
SELECT * FROM stu WHERE age=18;
-- 查询年龄不等于18的学员信息
SELECT * FROM stu WHERE age != 18;
SELECT * FROM stu WHERE age <> 18;
-- 查询年龄等于18,20,22的信息
SELECT * FROM stu WHERE age=18 OR age=20 OR age=22;
SELECT * FROM stu WHERE age IN(18,20,22);
-- 查询英语成绩为NULL的信息(NULL值的比较不能使用=或!=)
SELECT * FROM stu WHERE english IS NULL;
-- 查询英语成绩不为NULL的信息
SELECT * FROM stu WHERE english IS NOT NULL;
LIKE 占位符
-- 模糊查询LIKE
-- 通配符 _ 代表单个任意字符
-- 通配符 % 代表多个任意字符
-- 查询姓马的学员信息
SELECT * FROM stu WHERE name LIKE '马%';
-- 查询名字第二个字是花的学员信息
SELECT * FROM stu WHERE name LIKE '_花%';
-- 查询名字中包含 德 的学员信息
SELECT * FROM stu WHERE name LIKE '%德%';
SELECT 字段列表 FROM 表名 ORDER BY 排序字段1 [排序方式1],排序字段2 [排序方式2] ...;
当有多个条件时,只有前边的条件一样的时候,才会根据后边的条件进行排序
-- 查询学员信息,按年龄进行升序排列
SELECT * FROM stu ORDER BY age ASC;
SELECT * FROM stu ORDER BY age; -- ASC是默认的,不进行指定也可以打到效果
-- 查询信息,按照数学成绩降序排列
SELECT * FROM stu ORDER BY math DESC;
-- 查询信息,按数学成绩降序排列,如果成绩一样,按英语成绩升序排列
SELECT * FROM stu ORDER BY math DESC,english ASC;
SELECT 函数名(列名) FROM 表;
函数名 | 作用 |
---|---|
count(列名) |
统计数量(一般选用不为NULL的列) |
max(列名) |
统计最大值 |
min(列名) |
统计最小值 |
sum(列名) |
求和 |
avg(列名) |
求平均 |
-- 聚合函数
-- 查班上一共有多少个学生 COUNT(expr)统计的列名不能为NULL
/*
count推荐的取值:
1.主键
2.*(新版MySQL中会计算效率最高的一列)
*/
SELECT COUNT(id) FROM stu;
SELECT COUNT(name) FROM stu;
-- COUNT(expr)统计的列名不能为NULL,空值是统计不到的会出错!!!
SELECT COUNT(english) FROM stu;
-- 查询数学成绩的最高分
SELECT MAX(math) FROM stu;
-- 查询数学成绩的最低分
SELECT MIN(math) FROM stu;
-- 查询数学成绩的平均分
SELECT AVG(math) FROM stu;
-- 查询英语成绩的最低分 注意NULL值不参与聚合函数的运算
SELECT MIN(english) FROM stu;
SELECT 字段列表 FROM 表名 [WHERE 分组前限定条件] GROUP BY 分组字段名 [HAVING 分组后条件过滤]
分组之后,查询的字段为聚合函数和分组字段,查询其他的字段无任何意义
WHERE
和HAVING
的区别WHERE
是分组之前进行限定,不满足WHERE
条件则不参与分组,HAVING
是分组之后对结果进行过滤WHERE
不能对聚合函数进行判断, HAVING
可以WHERE
> 聚合函数 > HAVING
-- 查询男同学和女同学各自的数学平均分
SELECT sex 性别,AVG(math) 平均分 FROM stu GROUP BY sex;
-- 查询男女各自的平均分以及各自的人数
SELECT sex 性别,AVG(math) 平均分,COUNT(*) 人数 FROM stu GROUP BY sex;
-- 查询男女各自的数学平均分,统计人数. 要求分数低于70分的人不参与分组
SELECT sex 性别,AVG(math) 数学均分,COUNT(*) 人数 FROM stu WHERE math>70 GROUP BY sex;
-- 查询男女各自的数学平均分,统计人数. 要求分数低于70分的人不参与分组,分组后人数大于2人的数据
SELECT sex 性别,AVG(math) 平均分,COUNT(*) 人数 FROM stu WHERE math>70 GROUP BY sex HAVING COUNT(*)>2;
SELECT 字段列表 FROM 表名 LIMIT 起始索引 , 查询条目数;
起始索引=(当前页码-1) * 每页显示的条数
rownumber
top
-- 从0开始查询3条数据
SELECT * FROM stu LIMIT 0,3;
-- 每页显示3条数据,查询第一页
SELECT * FROM stu LIMIT 0,3;
-- 每页显示3条数据,查询第二页
SELECT * FROM stu LIMIT 3,3;
-- 每页显示3条数据,查询第三页
SELECT * FROM stu LIMIT 6,6;
B站视频课程
笔记与源码文件