1、DML语句
DML全称为Data Manipulation Language,表示数据操作语言。主要是对表数据的增删改查操作。因此DML只包括INSERT,UPDATA和DELETE
1.1、INSERT语句
sql
-- 需要注意,VALUES后的字段值必须与表名后的字段名一一对应
INSERT INTO 表名(字段名1, 字段名2, ..., 字段名n) VALUES(字段值1, 字段值2, ..., 字段值
n);
-- 需要注意,VALUES后的字段值必须与创建表时的字段顺序保持一一对应
INSERT INTO 表名 VALUES(字段值1, 字段值2, ..., 字段值n);
-- 一次性插入多条数据
INSERT INTO 表名(字段名1, 字段名2, ..., 字段名n) VALUES(字段值1, 字段值2, ..., 字段值
n),(字段值1, 字段值2, ..., 字段值n), ... , (字段值1, 字段值2, ..., 字段值n);
INSERT INTO 表名 VALUES(字段值1, 字段值2, ..., 字段值n), (字段值1, 字段值2, ..., 字段值
n), ..., (字段值1, 字段值2, ..., 字段值n);
eg:
sql
INSERT INTO course(`number`, name, score, `time`) VALUES (1, 'C++基础', 4, 40);
INSERT INTO course VALUES (2, '数据库', 3, 20);
INSERT INTO course(`number`, score, name, `time`) VALUES (3, 5, 'Jsp', 40);
INSERT INTO course(`number`, name, score, `time`) VALUES (4, 'Spring', 4, 5),(5,
'Spring Mvc', 2, 5);
INSERT INTO course VALUES (6, 'SSM', 2, 3), (7, 'Spring Boot', 2, 2);
1.2、 UPDATE语句
sql
UPDATE 表名 SET 字段名1=字段值1[,字段名2=字段值2, ..., 字段名n=字段值n] [WHERE 修改条件]
1.2.1、WHERE条件子句
在SQL语句中,条件的表示是使用关系运算符来表示,使用>,<,>=,<=,!=来表示;条件之间的连接通常是使用逻辑运算符来表示,通常使用AND来表示逻辑与(&&),使用OR来表示逻辑或(||)。
eg:
sql
WHERE time>10 && time<20;
WHERE time>20 and time<=50;
1.2.2、UPDATA语句
eg:
将数据库中的学分更改为5,学时更改为11
sql
UPDATA course SET score=5, 'time'=11 WHERE name='数据库';
1.3、DELETE语句
sql
DELETE FROM 表名 [WHERE 删除条件];
eg:删除课程表中课程编号为6的数据
sql
DELETE FROM course WHERE 'number'=6;
1.4、TRUNCATE语句
sql
-- 清空表中数据
TRUNCATE [TABLE] 表名;
eg:清空课程表数据
sql
TRUNCATE course;
1.5、DELETE与TRUNCATE区别
- DELETE语句根据条件删除表中数据,而TRUNCATE语句则是将表中数据全部清空;如果DELETE语句要删除表中所有数据,那么在效率上要低于TRUNCATE语句。
- 如果表中有自增长列,TRUNCATE语句会重置自增长的计数器,但DELETE语句不会。
- TRUNCATE语句执行后,数据无法恢复,而DELETE语句执行后,可以使用事务回滚进行恢复。
2、DQL语句
DQL全称是Data Query Language,表示数据查询语言。体现在数据的查询操作上,因此,DQL仅包括SELECT语句。
2.1、SELECT语句
sql
SELECT ALL/DISTINCT * | 字段名1 AS 别名1[,字段名1 AS 别名1, ..., 字段名n AS 别名n]
FROM 表名 WHERE 查询条件
解释 :ALL表示查询所有满足条件的记录,可以省略;DISTINCT表示去掉查询结果中重复的记录,AS可以给数据列、数据表取一个别名。
eg:从课程表中查询课程编号大于6的课程名称
sql
SELECT name FROM course WHERE 'number'>6;
eg:从课程表中查询课程名称为"C++基础"的学分和学时
sql
SELECT score , 'time' FROM course WHERE name='C++基础';
2.2、比较操作符
| 操作符 | 语法 | 说明 |
|---|---|---|
| IS NULL | 字段名 IS NULL | 如果字段的值为NULL,则条件满足 |
| IS NOT NULL | 字段名 IS NOT NULL | 如果字段的值不为NULL,则条件满足 |
| BETWEEN...AND | 字段名 BETWEEN 最小值 AND 最大值 | 如果字段的值在最小值与最大值之间(能够取到最小值和最大值),则条件满足 |
| LIKE | 字段名 LIKE '%匹配内容%' | 如果字段值包含有匹配内容,则条件满足 |
| IN | 字段名 IN(值1,值2,..., 值n) | 如果字段值在值1,值2, ...,值n中,则条件满足 |
eg:从课程表查询课程名为NULL的课程信息
sql
SELECT * FROM course WHERE name IS NULL;
eg:从课程表查询课程名不为NULL的课程信息
sql
SELECT * FROM course WHERE name IS NOT NULL;
eg:从课程表查询学分在2~4之间的课程信息
sql
SELECT * FROM course WHERE score BETWEEN 2 AND 4;
eg:从课程表查询课程名包含"V"的课程信息
sql
SELECT * FROM course WHERE name LIKE '%V%';
eg:从课程表查询课程名以"J"开头的课程信息
sql
SELECT * FROM course WHERE name LIKE 'J%';
eg:从课程表查询课程编号为1,3,5的课程信息
sql
SELECT * FROM course WHERE `number` IN (1, 3, 5);
2.3、分组
2.3.1、分组查询
sql
SELECT ALL/DISTINCT * | 字段名1 AS 别名1[,字段名1 AS 别名1, ..., 字段名n AS 别名n]
FROM 表名 WHERE 查询条件 GROUP BY 字段名1,字段名2,..., 字段名n
分组查询所得的结果只是该组中的第一条数据。
eg:从学生表查询成绩在80分以上的学生信息并按性别分组
sql
SELECT * FROM student WHERE score>80 GROUP BY sex
2.3.2、聚合函数
COUNT():统计满足条件总条数
eg:从学生表查询成绩在80分以上的学生人数
sql
SELECT COUNT(*) total FROM student WHERE score>80;
SUM():只能用于数值类型的字段或者表达式,计算该满足条件的字段值的总和
eg:从学生表查询不及格的学生人数和总成绩
sql
SELECT COUNT(*) totalCount, SUM(score) totalScore FROM student WHERE
score<60;
AVG():只能用于数值类型的字段或者表达式,计算该满足条件的字段值的平均值
eg:从学生表查询男生、女生、其他类型的学生的平均成绩
sql
SELECT sex, AVG(score) avgScore FROM student GROUP BY sex;
MAX():只能用于数值类型的字段或者表达式,计算该满足条件的字段值的最大值
eg:从学生表查询学生的最大年龄
sql
SELECT MAX(age) FROM student;
- MIN():只能用于数值类型的字段或者表达式,计算该满足条件的字段值的最小值
eg:从学生表查询学生的最低分
sql
SELECT MIN(score) FROM student;
2.3.3、分组查询结果筛选
sql
SELECT ALL/DISTINCT * | 字段名1 AS 别名1[,字段名1 AS 别名1, ..., 字段名n AS 别名n]
FROM 表名 WHERE 查询条件 GROUP BY 字段名1,字段名2,..., 字段名n HAVING 筛选条件
分组后如果还需要满足其他条件,则需要使用HAVING子句来完成。
eg:从学生表查询年龄在20~30之间的学生信息并按性别分组,找出组内平均分在80分以上的组
sql
SELECT * FROM student WHERE age BETWEEN 20 AND 30 GROUP BY sex HAVING avg(score)>80;
2.4、排序
sql
SELECT ALL/DISTINCT * | 字段名1 AS 别名1[,字段名1 AS 别名1, ..., 字段名n AS 别名n]
FROM 表名 WHERE 查询条件 ORDER BY 字段名1 ASC|DESC,字段名2 ASC|DESC,..., 字段名n
ASC|DESC
ORDER BY 必须位于WHERE 条件之后。
eg:从学生表查询年龄在18~30岁之间的学生信息并按成绩从高到低排列,如果成绩相同,则按年龄
从小到大排列
sql
SELECT * FROM student WHERE age BETWEEN 18 AND 30 ORDER BY score DESC, age ASC;
2.5、分页
sql
SELECT ALL/DISTINCT * | 字段名1 AS 别名1[,字段名1 AS 别名1, ..., 字段名n AS 别名n]
FROM 表名 WHERE 查询条件 LIMIT 偏移量, 查询条数
LIMIT的第一个参数表示偏移量,也就是跳过的行数。
LIMIT的第二个参数表示查询返回的最大行数,可能没有给定的数量那么多行。
eg:从学生表分页查询成绩及格的学生信息,每页显示3条,查询第2页学生信息
sql
SELECT * FROM student WHERE score>=60 LIMIT 3, 3;
注意 :如果一个查询中包含分组、排序和分页,那么它们之间必须按照分组->排序->分页的先后顺序排列。