第04章 SQL语句

本章节介绍如何使用SQL语句对数据库表中的“记录”做增删改查四类操作,也就是SQL的数据查询(DQL)。首先,我们需要准备一个完整的是“student”数据库。我们打开SQLyog创建“student”的数据库,如下图所示。

 我们在左边空白区域右击,选择“Create Database…”创建数据库菜单

点击“Create”创建按钮

创建成功。接下来,点击菜单栏“Tools”->“Restore From SQL Dump…”菜单

我们选择“student.sql”文件后,点击下面的“Execute”执行按钮。

这个脚本文件可以从这里下载:https://download.csdn.net/download/richieandndsc/89852048

继续点击“是”按钮

执行成功,点击“Done”取消弹框。

一共6张数据表。

这是班级表“class_info”

这是学生表“student_info”

这是学科表“subject_info”

这是考试类型表“type_info”

这是考试表“exam_info”

这是教师表“teacher_info”

接下来,我们先介绍Select查询语句,语法格式如下:

select 字段列表 from 表名 where 条件表达式 group by 字段 having 函数表达式 order by 字段 asc/desc;

就是从from表中查找满足where条件表达式的数据记录。

select 关键词后面是字段列表,多个字段之间使用逗号间隔,也可以包含聚合函数avg,count,max,min,sum,或者去重distinct函数等等。可以使用星号*通配符查询所有字段,as关键字可以为表名或字段名取别名。select 语句既可以完成简单的单表查询(单表查询),也可以完成复杂的连接查询和嵌套查询(多表查询)。

from关键词后面通常是表名,也可以是另一个select结果集(这就属于嵌套或子查询了)。

where关键词后面是条件表达式,主要是关系判断和逻辑判断等等。关系判断包括=等于,!=不等于,>大于,>=大于等于,<小于,<=小于等于操作符;逻辑判断包括and 且,or或操作符;还有空判断 ( is null , is not null )操作符;范围判断 ( between and, not between and,in, not in);模糊判断(like)。

group by 关键词是根据指定的字段进行分组,可以是单字段分组,也可以是多字段分组。

having语句一般配合group by语句,用来对分组进行过滤,过滤规则基本上也是关系判断。

order by关键字用于指定字段进行排序,asc是升序,desc是降序,一般是数字类型或字符类型字段进行排序。数字类型则按照数值大小排序,字母则按照ASCII码值排序。如果是中文的话,编码不同,排序不同。排序字段可以是单字段排序,也可以是多字段排序。

limit限制显示数量,经常用于分页,第一个参数代表记录位置,第二个参数代表记录长度。

接下来,接下来我们演示一些SQL语句:

查询所有记录:select * from `student_info`;

查询指定字段:select `stu_id`,`stu_name` from `student_info`;

根据条件查询,查询一班的所有学生:select `stu_id`,`stu_name` from `student_info` where `class_id` = 1;

逻辑判断,查询一班所有女性学生:select `stu_id`,`stu_name` from `student_info` where `class_id` = 1 and stu_sex = 0;

关系判断,查询一班年龄小于15岁的女性学生:select `stu_id`,`stu_name` from `student_info` where `class_id` = 1 and stu_sex = 0 and stu_age < 15;

空判断:select `stu_id`,`stu_name` from `student_info` where `class_id` is null;

没有查询到符合条件的数据,返回空。

范围判断,查询考试分数在90和100分之内的学生:select `stu_id`, `exam_score` from `exam_info` where `exam_score` between 90 and 100;

这个between…and也可以转化为大小判断的写法:select `stu_id`, `exam_score` from `exam_info` where `exam_score` >= 90 and `exam_score` <= 100;

同上面的数据记录是一样的,但是我们做了一个简单的排序。

范围查询,执行一些学生id进行查询:select `stu_id`, `exam_score` from `exam_info` where `stu_id` in (1,2,3,4);

模糊查询,查询名称以“小”开头的学生:select `stu_id`,`stu_name` from `student_info` where `stu_name` like '小%';

查询名称包含“王”的学生:select `stu_id`,`stu_name` from `student_info` where `stu_name` like '%王%';

接下来,我们介绍一些常用的聚合函数:

首先是count统计记录个数量

统计一班所有学生人数:select count(*) as total from `student_info` where `class_id` = 1;

查询结果为:一共“5”名学生。

接下来sum统计字段记录值的和,就是累加字段数值

累加一班所有学生年龄和:select sum(`stu_age`) as total from `student_info` where `class_id` = 1;

查询结果为:累加74岁。

接下来avg统计字段记录值的平均数:select avg(`stu_age`) from `student_info` where `class_id` = 1;

查询结果为,平均年龄“14.8”岁。

接下来max求某个字段记录值的最大值,查询最高的考试成绩:select max(`exam_score`) from `exam_info`;

接下来min求某个字段记录值的最小值,查询最低的考试成绩:select min(`exam_score`) from `exam_info`;

接下来按照班级分组,我们把学生按照班级分组:select * from `student_info` group by `class_id`;

分组查询的结果就是两条记录,没有实际的意义,通常搭配聚合函数使用。

统计每个班人数:select `class_id`, count(*) as total from `student_info` group by `class_id`;

查询结果为两条记录,也就是两个班级,一班有5人,二班有3人。

分组的操作就是将分组字段(class_id)进行重复值的合并,也就是多条重复记录合并为一条记录,在结果集中,这一条记录默认是重复记录中的第一条。由于剩余的记录在结果集中被合并掉,因此分组通常配合count,sum,max,min等函数来统计每个分组的信息。否则,分组就会跟去重(distinct)没有任何区别了。

在分组基础上增加having筛选,去掉1班的数据:select `class_id`, count(*) as total from `student_info` group by `class_id` having `class_id` > 1;

只剩下二班的人数了,having筛选是在分组字段的基础上进行操作的。

使用排序,查询学科为语文的考试成绩,并从大到小排列:select `stu_id`,`exam_score` from `exam_info` where `sub_id` = 1 order by `exam_score` desc;

多字段排序,先按照科目排序,科目相同的再按照分数排序:select `stu_id`,`exam_score` from `exam_info` where `sub_id` = 1 order by sub_id asc, `exam_score` desc;

接下来,我们介绍插入操作:向表中的所有字段插入值的方法有两种:一种是指定所有字段名,另一种是完全不指定宇段名。语法如下:

insert into 表名(字段1,字段2,……) values (字段1值,字段2值,……);

请注意,insert语句后面的列顺序可以不是定义表结构时候的顺序,但是后面的字段和字段值是一一对应的。自增属性的字段可以不用插入。当我们不指定表名后面的字段时候,就必须按照表结构的字段全部写入字段值。

指定字段插入:insert into `class_info`(`class_name`, `add_time`) values ('三班', '2022-04-01 09:00:00');

注意,insert语句返回的结果是影响的行数,也就是插入的记录条数。

我们点击“class_info”表名,然后点击“Table Data”就可以查看表中记录。

新数据已经插入进去了,如果没有的话,可以点击“Refresh”刷新按钮。

全字段插入:insert into `class_info` values (4,'四班', '2022-04-01 09:00:00');

mysql支持批量插入操作,也就是使用逗号间隔多个字段值,如下所示

insert into `class_info`(`class_name`, `add_time`) values ('五班', '2022-04-01 09:00:00'), ('六班', '2022-04-01 09:00:00');

返回结果为2,代表写入2条新数据。

insert 可以将 selec 语旬查询的结果插入到表中,其基本语法格式如下:

insert into 表名 (字段列表) select (字段列表) from 表名2 where 条件;

请注意,两个字段列表必须一致,该语句可以用于数据转移操作,例如:

insert into `class_info`(`class_name`, `add_time`) select `class_name`, `add_time` from `class_info2` where `class_id` = 6;

接下来,我们介绍修改操作,语法如下:

update 表名 set 字段1=数值1,字段2=数值2 where 条件;
例如:update `class_info` set `class_name` = '十班', `add_time` = ‘2022-12-12 09:00:00’ where `class_id` = 6;

update语句返回的结果也是影响的记录数,也就是修改记录的数量。

修改成功了。

最后介绍删除操作,语法如下:

delete from 表名 where 条件
例如:delete from `class_info` where `class_id` > 3;

delete返回的结果也是影响的记录数,也就是被删除的记录数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值