SQL语句的查与删
🖋️ 作者:@Weiney
🔍 本文将介绍 SQL 中常见的查找(SELECT)和删除(DELETE)语句,帮助你熟练掌握数据查询与操作的基本技能。无论是查询特定条件下的数据,还是删除不需要的数据,本文将为你提供详细的指导和实用的示例。
摘要
💡 SQL 是处理和管理关系型数据库的关键工具。通过学习 SELECT 和 DELETE 语句,你可以灵活地查询需要的数据,并有效地管理数据库中的信息。
📌 在接下来的内容中,我们将深入探讨如何使用这些 SQL 语句,以及它们的用法和注意事项。让我们一起启程,探索 SQL 的奥秘吧!
💡 点击我学习另一篇文章《MySQL语句的学习【增与改】》
文章目录
- SQL语句的查与删
- 摘要
- 一、查询语句
- 1. 简单查询
- 2. 条件查询
- 3. 模糊查询
- 4. 范围查询
- 5. 非空查询
- 6. 排序查询
- 7. 分组和聚合
- (1)聚合
- (2)分组
- 8. 连接查询
- (1)内连接
- (2)左连接
- (3)右连接
- 二、删除语句
- 1. 删除表中所有数据
- 2. 删除表中满足条件的行
- 3. 删除表结构及数据
一、查询语句
1. 简单查询
select [字段] from [表名];
-
查询
学生表
中的所有列
select * from student;
-
查询
学生表
中的某些列,如学号
,姓名
,性别
select sno, sname, sgender from student;
-
可以为查询出的列名、表名
起别名
,便于简化查询语句select sno as '学号', sname as '姓名', sgender as '性别' from student; select sno, sname, sgender from student as 'stu';
2. 条件查询
select [字段] from [表名] where [条件];
-
查询
姓名为“张三”
的学生的所有信息
(单条件)select * from student where sname = '张三';
-
查询
性别为男
且出生日期大于等于2001年1月1日
的学生(多条件)select * from student where sgender = '1' and sbirthday >= '2001-01-01';
3. 模糊查询
select [字段] from [表名] where [字段] like [规则];
规则: % 代表任意 多个 任意字符, 可以为0个, _ 代表 一个 任意字符.
-
查询
姓张
的学生所有信息
select * from student where sname like '张%';
-
查询
姓张的三个字
的学生所有信息
select * from student where sname like '张__';
4. 范围查询
select [字段] from [表名] where [字段] between [数据1] and [数据2];
-
查询
出生年份在2001-01-01到2003-12-31
的学生所有信息
(连续范围查询)select * from student where sbirthday between '2001-01-01' and '2003-12-31';
-
查询
入学年份为2022和2024
的学生所有信息
(非连续范围查询)select * from student where enrollment in (2022, 2024);
5. 非空查询
select [字段] from [表名] where [字段] is not NULL;
-
查询
信息更新时间不为空
的学生所有信息
select * from student where updatetime is not NULL;
6. 排序查询
select [字段] from [表名] order by [字段1] asc/desc, [字段2] asc/desc;
-
按出生年月从大到小(降序)查询
学生所有信息
select * from student order by sbirthday desc;
-
按入学年份从小到大(升序)排序、入学年份相同时,按出生年月从大到小(降序)查询
学生所有信息
select * from student order by enrollment asc, sbirthday desc;
7. 分组和聚合
(1)聚合
select count(*) from [表名];
-
查询
入学年份为2023年
的学生个数
select count(*) from student where enrollment = '2023';
-
查询
最大(max)
、最小(min)的入学年份
select max(enrollment) from student; select min(enrollment) from student;
(2)分组
select [字段1], [字段2], [聚合函数] from [表名] group by [字段1],[字段2], [...];
-
查询
学生中各性别的人数
select sgender, count(*) from student group by sgender;
-
查询
每个年级中男生的总人数
select enrollment, sgender, count(*) from student group by enrollment, sgender having sgender = '1'; -- 对分组条件过滤,用having
8. 连接查询
(1)内连接
-
以一个学生表(students)和选课表(courses)为例
-
假设学生表
students
包含以下字段student_id
(学生ID)student_name
(学生姓名)- 其他学生相关的字段
-
选课表
courses
包含以下字段:course_id
(课程ID)course_name
(课程名称)student_id
(选课学生的学生ID,用来与学生表关联)- 其他课程相关的字段
-
现在,我们希望获取每个学生及其所选课程的信息:
SELECT stu.student_id, stu.student_name, courses.course_id, courses.course_name FROM students as stu INNER JOIN courses ON stu.student_id = courses.student_id;
SELECT stu.student_id, stu.student_name, stu.course_id, stu.course_name
: 这部分指定了我们希望从查询中获取的字段。我们选择了学生表中的学生ID和姓名,以及选课表中的课程ID和课程名称。FROM students as stu
: 指定了查询的主表是students
学生表并起别名stu。INNER JOIN courses ON stu.student_id = courses.student_id
: 这是内连接的语法。它告诉数据库系统要将students
表和courses
表通过他们的student_id
字段进行连接。这意味着只有在两个表中都存在匹配的student_id
时,才会将它们的记录组合成一个结果行。
-
结果:如果学生表中有学生ID为1和2的记录,而选课表中只有学生ID为1的学生选择了课程,那么只有学生ID为1的学生会出现在结果集中,同时显示他所选的课程信息。
-
内连接的特点
- 它只返回那些在连接条件中同时存在于两个表中的记录。换句话说,只有那些在学生表中有对应记录,并且在选课表中也有对应记录的学生才会出现在结果中。
-
现在我们来查询学号为"232100801"的学生所有课程的成绩(展示学号、姓名、课程号、成绩)
select stu.s_id, stu.s_name, ry_score.c_id, ry_score.score from ry_student as stu inner join ry_score on stu.s_id = ry_score.s_id where stu.s_id = '232100801';
(2)左连接
-
依旧以一个学生表(students)和选课表(courses)为例
-
现在,我们希望获取所有学生及他们选课的信息,即使有些学生没有选择任何课程:
SELECT students.student_id, students.student_name, courses.course_id, courses.course_name FROM students LEFT JOIN courses ON students.student_id = courses.student_id;
-
结果:如果学生表中有学生ID为1和2的记录,而选课表中只有学生ID为1的学生选择了课程,那么左连接查询将返回包含学生ID为1和2的学生信息,对于学生ID为1的学生,会显示他所选的课程信息;而对于学生ID为2的学生,由于没有选课信息,课程相关的字段会显示为 NULL。
-
左连接的特点
- 左连接会保留左表(即第一个表,在这里是学生表
students
)中的所有记录,无论右表中是否有匹配的记录。 - 如果左表中的记录在右表中找不到匹配的记录,则右表的相关字段会显示为 NULL。
- 左连接常用于需要保留左表所有数据,并且希望根据右表的匹配情况补充信息的情况下。
- 左连接会保留左表(即第一个表,在这里是学生表
-
查询所有学生的成绩表,即使该学生没有成绩
SELECT ry_student.s_id, ry_student.s_name, ry_score.c_id, ry_score.score FROM ry_student LEFT JOIN ry_score ON ry_student.s_id = ry_score.s_id;
(3)右连接
- 右连接与左连接相反,即保留右表所有记录,即使左表找不到匹配的记录。
二、删除语句
1. 删除表中所有数据
DELETE FROM [表名];
2. 删除表中满足条件的行
delete from [表名] where [条件]
-
删除
学号为202100801
的学生delete from student where sid = '202100801';
3. 删除表结构及数据
DROP TABLE [表名];