SQL-DML、DQL查询数据
1 DML
DML主要是对数据进行增
(insert
)删
(delete
)改
(update
)操作。
1.1 添加数据
-
给指定列添加数据
INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…);
-
给全部列添加数据
INSERT INTO 表名 VALUES(值1,值2,…);
-
批量添加数据
INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…; -- 给所有列添加数据,列名的列表可以省略的 INSERT INTO 表名 VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;
1.2 修改数据
- 修改表数据
UPDATE 表名 SET 列名1=值1,列名2=值2,… [WHERE 条件] ;
注意:
- 修改语句中如果不加条件,
则将所有数据都修改
!- 像上面的语句中的中括号,表示在写sql语句中可以省略这部分
-
练习
-
将张三的性别改为女
update stu set sex = '女' where name = '张三';
-
将张三的生日改为 1999-12-12 分数改为99.99
update stu set birthday = '1999-12-12', score = 99.99 where name = '张三';
-
注意:如果update语句没有加where条件,则会将表中所有数据全部修改!
update stu set sex = '女';
-
1.3 删除数据
-
删除数据
DELETE FROM 表名 [WHERE 条件] ;
-
练习
-- 删除张三记录 delete from stu where name = '张三'; -- 删除stu表中所有的数据 delete from stu;
2 DQL
2.1 基础查询
-
查询多个字段
SELECT 字段列表 FROM 表名; SELECT * FROM 表名; -- 查询所有数据 但不建议使用
-
去除重复记录(
DISTINCT
)SELECT DISTINCT 字段列表 FROM 表名;
-
起别名(
AS
)AS: AS 也可以省略 但字段名与别名中间至少一个空格
2.2 条件查询 ( WHERE )
-
语法
SELECT 字段列表 FROM 表名 WHERE 条件列表;
-
条件
条件列表可以使用以下运算符
符号 功能 > 大于 < 小于 >= 大于等于 <= 小于等于 = 等于 <> 或 != 不等于 BETWEEN … AND … 在某个范围之内(都包含) IN(…) 多选一 LIKE 占位符 模糊查询 _
单个任意字符%
多个任意字符IS NULL 是 NULL IS NOT NULL 不是 NULL AND 或 &&
并且 OR 或 ||
或者 NOT 或 ! 非,不是
- 练习
-
查询年龄大于20岁的学员信息
select * from stu where age > 20;
-
查询年龄大于等于20岁 并且 年龄 小于等于 30岁 的学员信息
select * from stu where age >= 20 && age <= 30; select * from stu where age >= 20 and age <= 30;
上面语句中
&&
和and
都表示并且的意思。建议使用and
。也可以使用 between … and 来实现上面需求
select * from stu where age BETWEEN 20 and 30;
-
查询年龄不等于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值的比较不能使用 = 或者 != 。需要使用 is 或者 is not
select * from stu where english = null; -- 这个语句是不行的 select * from stu where english is null; select * from stu where english is not null;
2.3 模糊查询
模糊查询使用
like
关键字,可以使用通配符进行占位:(1)
_
: 代表单个任意字符(2)
%
: 代表任意个数字符
-
查询姓’马’的学员信息
select * from stu where name like '马%';
-
查询第二个字是’花’的学员信息
select * from stu where name like '_花%';
-
查询名字中包含 ‘德’ 的学员信息
select * from stu where name like '%德%';
2.4 排序查询 ( ORDER BY )
-
语法
SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1 [排序方式1],排序字段名2 [排序方式2] …;
-
排序方式
- ASC : 升序排列 (默认值)
- DESC : 降序排列
注意:
如果有多个排序条件,当前边的条件值一样时,才会根据第二条件进行排序 -
练习
-
查询学生信息,按照年龄升序排列
select * from stu order by age ;
-
查询学生信息,按照数学成绩降序排列
select * from stu order by math desc ;
-
查询学生信息,按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列
select * from stu order by math desc , english asc ;
-
2.5 聚合函数
-
概念
将一列数据作为一个整体,进行纵向计算。
-
聚合函数分类
函数名 功能 count(列名)
统计数量(一般选用不为null的列) max(列名)
最大值 min(列名)
最小值 sum(列名)
求和 avg(列名)
平均值 -
语法
SELECT 聚合函数名(列名) FROM 表;
-
练习
-
统计班级一共有多少个学生
select count(id) from stu;
上面语句根据某个字段进行统计,如果该字段某一行的值为null的话,将不会被统计。所以可以在count(*) 来实现。* 表示所有字段数据,一行中也不可能所有的数据都为null,所以建议使用 count(*)
select count(*) from stu;
-
查询数学成绩的最高分
select max(math) from stu;
-
2.6 分组查询( GROUP BY )
-
语法
SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤];
注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义
-
where
和having
区别执行时机不一样
:where 是分组之前进行限定,不满足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;
-
2.7 分页查询( LIMIT )
-
语法
SELECT 字段列表 FROM 表名 LIMIT 起始索引 , 查询条目数;
注意: 上述语句中的起始索引是从0开始
-
起始索引计算公式:
起始索引 = (当前页码 - 1) * 每页显示的条数
-
练习
-
从0开始查询,查询3条数据
select * from stu limit 0 , 3;
-
每页显示10条数据,查询第1页数据
select * from stu limit 0 , 10; select * from stu limit (1-1)*10 , 10;
-
每页显示10条数据,查询第2页数据
select * from stu limit 10 , 10; select * from stu limit (2-1)*10 , 10;
-
每页显示10条数据,查询第3页数据
select * from stu limit 20 , 10; select * from stu limit (3-1)*10 , 10;
-